Version in base suite: 4.19.98-1 Version in overlay suite: 4.19.118-1 Base version: linux_4.19.98-1 Target version: linux_4.19.118-1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/l/linux/linux_4.19.98-1.dsc Target file: /srv/mirrors/debian-buildd/pool/main/l/linux/linux_4.19.118-1.dsc Documentation/ABI/testing/sysfs-bus-iio | 2 Documentation/ABI/testing/sysfs-class-devfreq | 7 Documentation/admin-guide/kernel-parameters.txt | 10 Documentation/devicetree/bindings/bus/ti-sysc.txt | 1 Documentation/devicetree/bindings/net/fsl-fman.txt | 7 Documentation/devicetree/bindings/rng/omap3_rom_rng.txt | 27 Documentation/driver-api/device_link.rst | 63 Documentation/filesystems/porting | 7 Documentation/networking/nf_flowtable.txt | 2 Documentation/sound/hd-audio/index.rst | 1 Documentation/sound/hd-audio/models.rst | 2 Documentation/sound/hd-audio/realtek-pc-beep.rst | 129 MAINTAINERS | 2 Makefile | 6 arch/arc/boot/dts/axs10x_mb.dtsi | 1 arch/arc/include/asm/linkage.h | 2 arch/arc/plat-eznps/Kconfig | 2 arch/arm/Kconfig | 4 arch/arm/boot/dts/am335x-boneblack-common.dtsi | 5 arch/arm/boot/dts/am437x-idk-evm.dts | 4 arch/arm/boot/dts/am43x-epos-evm.dts | 2 arch/arm/boot/dts/am43xx-clocks.dtsi | 54 arch/arm/boot/dts/am571x-idk.dts | 4 arch/arm/boot/dts/am572x-idk-common.dtsi | 4 arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi | 25 arch/arm/boot/dts/aspeed-g5.dtsi | 2 arch/arm/boot/dts/at91-nattis-2-natte-2.dts | 7 arch/arm/boot/dts/at91sam9260.dtsi | 12 arch/arm/boot/dts/at91sam9261.dtsi | 6 arch/arm/boot/dts/at91sam9263.dtsi | 6 arch/arm/boot/dts/at91sam9g45.dtsi | 8 arch/arm/boot/dts/at91sam9rl.dtsi | 8 arch/arm/boot/dts/bcm2835-rpi-zero-w.dts | 1 arch/arm/boot/dts/bcm2835-rpi.dtsi | 2 arch/arm/boot/dts/dra7.dtsi | 3 arch/arm/boot/dts/dra76x.dtsi | 5 arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi | 5 arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi | 7 arch/arm/boot/dts/imx6qdl.dtsi | 5 arch/arm/boot/dts/imx6qp.dtsi | 1 arch/arm/boot/dts/imx7-colibri.dtsi | 1 arch/arm/boot/dts/iwg20d-q7-common.dtsi | 2 arch/arm/boot/dts/logicpd-som-lv-baseboard.dtsi | 2 arch/arm/boot/dts/logicpd-som-lv.dtsi | 26 arch/arm/boot/dts/lpc3250-phy3250.dts | 4 arch/arm/boot/dts/lpc32xx.dtsi | 10 arch/arm/boot/dts/ls1021a-twr.dts | 9 arch/arm/boot/dts/ls1021a.dtsi | 9 arch/arm/boot/dts/omap3-n900.dts | 50 arch/arm/boot/dts/omap5.dtsi | 1 arch/arm/boot/dts/ox810se.dtsi | 4 arch/arm/boot/dts/ox820.dtsi | 4 arch/arm/boot/dts/r8a7743.dtsi | 4 arch/arm/boot/dts/r8a7779.dtsi | 8 arch/arm/boot/dts/sama5d3.dtsi | 28 arch/arm/boot/dts/sama5d3_can.dtsi | 4 arch/arm/boot/dts/sama5d3_tcb1.dtsi | 1 arch/arm/boot/dts/sama5d3_uart.dtsi | 4 arch/arm/boot/dts/stihxxx-b2120.dtsi | 2 arch/arm/boot/dts/stm32f469-disco.dts | 8 arch/arm/boot/dts/stm32h743i-eval.dts | 1 arch/arm/boot/dts/sun8i-a23-a33.dtsi | 30 arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts | 2 arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts | 4 arch/arm/boot/dts/sun8i-h3-beelink-x2.dts | 4 arch/arm/boot/dts/sun8i-h3.dtsi | 15 arch/arm/boot/dts/sun9i-a80-optimus.dts | 4 arch/arm/common/mcpm_entry.c | 2 arch/arm/configs/qcom_defconfig | 1 arch/arm/include/asm/kvm_emulate.h | 22 arch/arm/include/asm/kvm_mmio.h | 2 arch/arm/include/asm/suspend.h | 1 arch/arm/kernel/head-nommu.S | 4 arch/arm/kernel/hyp-stub.S | 11 arch/arm/kernel/sleep.S | 12 arch/arm/kernel/vdso.c | 3 arch/arm/lib/copy_from_user.S | 2 arch/arm/mach-imx/Makefile | 2 arch/arm/mach-imx/common.h | 4 arch/arm/mach-imx/resume-imx6.S | 24 arch/arm/mach-imx/suspend-imx6.S | 14 arch/arm/mach-npcm/Kconfig | 2 arch/arm/mach-omap2/omap_hwmod.c | 2 arch/arm/mach-omap2/pdata-quirks.c | 12 arch/arm/mach-rpc/irq.c | 3 arch/arm/mach-stm32/Kconfig | 3 arch/arm/mach-tegra/sleep-tegra30.S | 11 arch/arm/mm/init.c | 2 arch/arm/net/bpf_jit_32.c | 52 arch/arm/plat-pxa/ssp.c | 6 arch/arm64/boot/Makefile | 2 arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 3 arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts | 2 arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 31 arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi | 1 arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts | 1 arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts | 2 arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts | 1 arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts | 17 arch/arm64/boot/dts/arm/juno-clocks.dtsi | 4 arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi | 2 arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts | 4 arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts | 4 arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi | 2 arch/arm64/boot/dts/qcom/msm8916.dtsi | 8 arch/arm64/boot/dts/qcom/msm8996.dtsi | 4 arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi | 2 arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts | 1 arch/arm64/boot/dts/renesas/r8a77995.dtsi | 2 arch/arm64/configs/defconfig | 1 arch/arm64/include/asm/alternative.h | 34 arch/arm64/include/asm/kvm_emulate.h | 37 arch/arm64/include/asm/kvm_mmio.h | 6 arch/arm64/include/asm/ptrace.h | 1 arch/arm64/include/uapi/asm/ptrace.h | 1 arch/arm64/kernel/armv8_deprecated.c | 2 arch/arm64/kernel/cpufeature.c | 54 arch/arm64/kernel/fpsimd.c | 20 arch/arm64/kernel/head.S | 2 arch/arm64/kernel/hibernate.c | 9 arch/arm64/kernel/process.c | 7 arch/arm64/kernel/ptrace.c | 21 arch/arm64/kernel/smp.c | 25 arch/arm64/kernel/vdso.c | 2 arch/arm64/kvm/debug.c | 6 arch/arm64/kvm/hyp/switch.c | 10 arch/arm64/kvm/inject_fault.c | 70 arch/ia64/kernel/signal.c | 60 arch/ia64/mm/init.c | 15 arch/m68k/amiga/cia.c | 9 arch/m68k/atari/ataints.c | 4 arch/m68k/atari/time.c | 15 arch/m68k/bvme6000/config.c | 20 arch/m68k/hp300/time.c | 10 arch/m68k/mac/via.c | 119 arch/m68k/mvme147/config.c | 18 arch/m68k/mvme16x/config.c | 21 arch/m68k/q40/q40ints.c | 19 arch/m68k/sun3/sun3ints.c | 3 arch/m68k/sun3x/time.c | 16 arch/microblaze/kernel/cpu/cache.c | 3 arch/mips/Makefile.postlink | 2 arch/mips/bcm63xx/Makefile | 6 arch/mips/bcm63xx/boards/board_bcm963xx.c | 20 arch/mips/bcm63xx/dev-dsp.c | 56 arch/mips/boot/Makefile | 2 arch/mips/cavium-octeon/octeon-irq.c | 3 arch/mips/include/asm/io.h | 14 arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h | 14 arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h | 5 arch/mips/kernel/setup.c | 2 arch/mips/kernel/vpe.c | 2 arch/mips/loongson64/loongson-3/platform.c | 3 arch/mips/mm/tlbex.c | 5 arch/nios2/kernel/nios2_ksyms.c | 12 arch/parisc/kernel/drivers.c | 4 arch/powerpc/Kconfig | 1 arch/powerpc/Makefile | 2 arch/powerpc/boot/4xx.c | 2 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi | 1 arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi | 1 arch/powerpc/include/asm/archrandom.h | 2 arch/powerpc/include/asm/book3s/64/hash-4k.h | 6 arch/powerpc/include/asm/book3s/64/hash-64k.h | 8 arch/powerpc/include/asm/book3s/64/pgtable.h | 4 arch/powerpc/include/asm/book3s/64/radix.h | 5 arch/powerpc/include/asm/drmem.h | 4 arch/powerpc/include/asm/kgdb.h | 5 arch/powerpc/include/asm/setjmp.h | 6 arch/powerpc/kernel/Makefile | 3 arch/powerpc/kernel/cacheinfo.c | 21 arch/powerpc/kernel/cacheinfo.h | 4 arch/powerpc/kernel/cputable.c | 4 arch/powerpc/kernel/dt_cpu_ftrs.c | 17 arch/powerpc/kernel/eeh_driver.c | 6 arch/powerpc/kernel/idle_book3s.S | 27 arch/powerpc/kernel/kgdb.c | 43 arch/powerpc/kernel/kprobes.c | 3 arch/powerpc/kernel/mce_power.c | 20 arch/powerpc/kernel/pci_dn.c | 15 arch/powerpc/kernel/prom_init.c | 2 arch/powerpc/kernel/signal.c | 17 arch/powerpc/kernel/signal_32.c | 28 arch/powerpc/kernel/signal_64.c | 26 arch/powerpc/kernel/vmlinux.lds.S | 6 arch/powerpc/kvm/book3s_64_vio.c | 1 arch/powerpc/kvm/book3s_hv.c | 19 arch/powerpc/kvm/book3s_pr.c | 4 arch/powerpc/mm/dump_hashpagetable.c | 2 arch/powerpc/mm/mem.c | 25 arch/powerpc/mm/pgtable-radix.c | 4 arch/powerpc/mm/tlb_nohash_low.S | 12 arch/powerpc/platforms/maple/setup.c | 34 arch/powerpc/platforms/powernv/memtrace.c | 2 arch/powerpc/platforms/powernv/pci-ioda.c | 48 arch/powerpc/platforms/powernv/pci.c | 18 arch/powerpc/platforms/pseries/hotplug-memory.c | 79 arch/powerpc/platforms/pseries/iommu.c | 43 arch/powerpc/platforms/pseries/lpar.c | 2 arch/powerpc/platforms/pseries/mobility.c | 10 arch/powerpc/platforms/pseries/vio.c | 2 arch/powerpc/sysdev/xive/common.c | 12 arch/powerpc/sysdev/xive/native.c | 4 arch/powerpc/sysdev/xive/spapr.c | 4 arch/powerpc/sysdev/xive/xive-internal.h | 7 arch/powerpc/xmon/Makefile | 3 arch/powerpc/xmon/xmon.c | 9 arch/riscv/kernel/module.c | 16 arch/riscv/kernel/vdso/Makefile | 3 arch/s390/Makefile | 4 arch/s390/boot/Makefile | 2 arch/s390/include/asm/page.h | 4 arch/s390/include/asm/qdio.h | 2 arch/s390/include/asm/timex.h | 2 arch/s390/kernel/diag.c | 2 arch/s390/kernel/kexec_elf.c | 2 arch/s390/kernel/mcount.S | 15 arch/s390/kernel/perf_cpum_sf.c | 1 arch/s390/kernel/processor.c | 5 arch/s390/kvm/interrupt.c | 6 arch/s390/kvm/kvm-s390.c | 6 arch/s390/kvm/vsie.c | 1 arch/s390/mm/gmap.c | 7 arch/s390/mm/hugetlbpage.c | 100 arch/s390/mm/init.c | 16 arch/s390/pci/pci_sysfs.c | 61 arch/sh/boards/mach-migor/setup.c | 1 arch/sh/include/cpu-sh2a/cpu/sh7269.h | 11 arch/sh/mm/init.c | 15 arch/sparc/include/uapi/asm/ipcbuf.h | 22 arch/sparc/kernel/vmlinux.lds.S | 6 arch/um/drivers/chan_kern.c | 52 arch/um/drivers/ubd_kern.c | 4 arch/um/include/asm/irq.h | 2 arch/um/kernel/irq.c | 4 arch/x86/Kconfig.debug | 2 arch/x86/boot/compressed/head_32.S | 2 arch/x86/boot/compressed/head_64.S | 4 arch/x86/boot/compressed/kaslr_64.c | 3 arch/x86/entry/calling.h | 15 arch/x86/entry/entry_32.S | 17 arch/x86/entry/vdso/vdso32-setup.c | 1 arch/x86/events/amd/core.c | 1 arch/x86/events/amd/uncore.c | 14 arch/x86/events/intel/ds.c | 2 arch/x86/events/intel/pt.c | 9 arch/x86/hyperv/hv_init.c | 6 arch/x86/include/asm/apic.h | 8 arch/x86/include/asm/frame.h | 49 arch/x86/include/asm/kvm_host.h | 12 arch/x86/include/asm/microcode_amd.h | 2 arch/x86/include/asm/mshyperv.h | 2 arch/x86/include/asm/msr-index.h | 2 arch/x86/include/asm/nmi.h | 1 arch/x86/include/asm/pgtable.h | 7 arch/x86/include/asm/pgtable_32.h | 2 arch/x86/include/asm/pgtable_types.h | 2 arch/x86/kernel/acpi/boot.c | 2 arch/x86/kernel/acpi/cstate.c | 3 arch/x86/kernel/apic/msi.c | 128 arch/x86/kernel/cpu/amd.c | 14 arch/x86/kernel/cpu/common.c | 2 arch/x86/kernel/cpu/intel_rdt.c | 2 arch/x86/kernel/cpu/intel_rdt.h | 1 arch/x86/kernel/cpu/intel_rdt_rdtgroup.c | 48 arch/x86/kernel/cpu/mcheck/mce_amd.c | 50 arch/x86/kernel/cpu/mcheck/mce_intel.c | 9 arch/x86/kernel/cpu/mshyperv.c | 10 arch/x86/kernel/cpu/tsx.c | 13 arch/x86/kernel/ftrace.c | 2 arch/x86/kernel/ftrace_32.S | 3 arch/x86/kernel/ftrace_64.S | 3 arch/x86/kernel/kgdb.c | 2 arch/x86/kernel/nmi.c | 20 arch/x86/kernel/sysfb_simplefb.c | 2 arch/x86/kvm/cpuid.c | 3 arch/x86/kvm/emulate.c | 28 arch/x86/kvm/hyperv.c | 10 arch/x86/kvm/i8259.c | 6 arch/x86/kvm/ioapic.c | 15 arch/x86/kvm/irq_comm.c | 2 arch/x86/kvm/lapic.c | 22 arch/x86/kvm/mmu.c | 78 arch/x86/kvm/mmutrace.h | 12 arch/x86/kvm/mtrr.c | 8 arch/x86/kvm/paging_tmpl.h | 27 arch/x86/kvm/pmu.h | 18 arch/x86/kvm/pmu_intel.c | 24 arch/x86/kvm/svm.c | 54 arch/x86/kvm/vmx.c | 244 arch/x86/kvm/x86.c | 128 arch/x86/kvm/x86.h | 2 arch/x86/lib/x86-opcode-map.txt | 2 arch/x86/mm/fault.c | 26 arch/x86/mm/init_32.c | 9 arch/x86/mm/init_64.c | 17 arch/x86/mm/pageattr.c | 8 arch/x86/mm/tlb.c | 3 arch/x86/platform/efi/efi.c | 41 arch/x86/platform/efi/efi_64.c | 79 arch/x86/xen/enlighten_pv.c | 7 block/bfq-cgroup.c | 9 block/bfq-iosched.c | 16 block/blk-ioc.c | 7 block/blk-lib.c | 23 block/blk-merge.c | 8 block/blk-settings.c | 3 crypto/af_alg.c | 6 crypto/algapi.c | 22 crypto/api.c | 3 crypto/internal.h | 1 crypto/pcrypt.c | 6 crypto/tgr192.c | 6 debian/README.source | 6 debian/changelog | 1844 ++ debian/config.defines.dump | 6 debian/config/amd64/config.cloud-amd64 | 1 debian/config/defines | 2 debian/config/kernelarch-mips/config | 2 debian/config/kernelarch-mips/config.boston | 1 debian/config/kernelarch-mips/config.octeon | 1 debian/control | 7050 +++++----- debian/control.md5sum | 30 debian/installer/modules/arm64/fb-modules | 1 debian/linux-headers-4.19.0-8-4kc-malta.postinst | 18 debian/linux-headers-4.19.0-8-5kc-malta.postinst | 18 debian/linux-headers-4.19.0-8-686-pae.postinst | 18 debian/linux-headers-4.19.0-8-686.postinst | 18 debian/linux-headers-4.19.0-8-alpha-generic.postinst | 18 debian/linux-headers-4.19.0-8-alpha-smp.postinst | 18 debian/linux-headers-4.19.0-8-amd64.postinst | 18 debian/linux-headers-4.19.0-8-arm64.postinst | 18 debian/linux-headers-4.19.0-8-armmp-lpae.postinst | 18 debian/linux-headers-4.19.0-8-armmp.postinst | 18 debian/linux-headers-4.19.0-8-cloud-amd64.postinst | 18 debian/linux-headers-4.19.0-8-itanium.postinst | 18 debian/linux-headers-4.19.0-8-loongson-3.postinst | 18 debian/linux-headers-4.19.0-8-m68k.postinst | 18 debian/linux-headers-4.19.0-8-marvell.postinst | 18 debian/linux-headers-4.19.0-8-mckinley.postinst | 18 debian/linux-headers-4.19.0-8-mips32r6.postinst | 18 debian/linux-headers-4.19.0-8-mips32r6el.postinst | 18 debian/linux-headers-4.19.0-8-mips64r6.postinst | 18 debian/linux-headers-4.19.0-8-mips64r6el.postinst | 18 debian/linux-headers-4.19.0-8-octeon.postinst | 18 debian/linux-headers-4.19.0-8-parisc-smp.postinst | 18 debian/linux-headers-4.19.0-8-parisc.postinst | 18 debian/linux-headers-4.19.0-8-parisc64-smp.postinst | 18 debian/linux-headers-4.19.0-8-powerpc-smp.postinst | 18 debian/linux-headers-4.19.0-8-powerpc.postinst | 18 debian/linux-headers-4.19.0-8-powerpc64.postinst | 18 debian/linux-headers-4.19.0-8-powerpc64le.postinst | 18 debian/linux-headers-4.19.0-8-powerpcspe.postinst | 18 debian/linux-headers-4.19.0-8-riscv64.postinst | 18 debian/linux-headers-4.19.0-8-rpi.postinst | 18 debian/linux-headers-4.19.0-8-rt-686-pae.postinst | 18 debian/linux-headers-4.19.0-8-rt-amd64.postinst | 18 debian/linux-headers-4.19.0-8-rt-arm64.postinst | 18 debian/linux-headers-4.19.0-8-rt-armmp.postinst | 18 debian/linux-headers-4.19.0-8-s390x.postinst | 18 debian/linux-headers-4.19.0-8-sh7751r.postinst | 18 debian/linux-headers-4.19.0-8-sh7785lcr.postinst | 18 debian/linux-headers-4.19.0-8-sparc64-smp.postinst | 18 debian/linux-headers-4.19.0-8-sparc64.postinst | 18 debian/linux-headers-4.19.0-9-4kc-malta.postinst | 18 debian/linux-headers-4.19.0-9-5kc-malta.postinst | 18 debian/linux-headers-4.19.0-9-686-pae.postinst | 18 debian/linux-headers-4.19.0-9-686.postinst | 18 debian/linux-headers-4.19.0-9-alpha-generic.postinst | 18 debian/linux-headers-4.19.0-9-alpha-smp.postinst | 18 debian/linux-headers-4.19.0-9-amd64.postinst | 18 debian/linux-headers-4.19.0-9-arm64.postinst | 18 debian/linux-headers-4.19.0-9-armmp-lpae.postinst | 18 debian/linux-headers-4.19.0-9-armmp.postinst | 18 debian/linux-headers-4.19.0-9-cloud-amd64.postinst | 18 debian/linux-headers-4.19.0-9-itanium.postinst | 18 debian/linux-headers-4.19.0-9-loongson-3.postinst | 18 debian/linux-headers-4.19.0-9-m68k.postinst | 18 debian/linux-headers-4.19.0-9-marvell.postinst | 18 debian/linux-headers-4.19.0-9-mckinley.postinst | 18 debian/linux-headers-4.19.0-9-mips32r6.postinst | 18 debian/linux-headers-4.19.0-9-mips32r6el.postinst | 18 debian/linux-headers-4.19.0-9-mips64r6.postinst | 18 debian/linux-headers-4.19.0-9-mips64r6el.postinst | 18 debian/linux-headers-4.19.0-9-octeon.postinst | 18 debian/linux-headers-4.19.0-9-parisc-smp.postinst | 18 debian/linux-headers-4.19.0-9-parisc.postinst | 18 debian/linux-headers-4.19.0-9-parisc64-smp.postinst | 18 debian/linux-headers-4.19.0-9-powerpc-smp.postinst | 18 debian/linux-headers-4.19.0-9-powerpc.postinst | 18 debian/linux-headers-4.19.0-9-powerpc64.postinst | 18 debian/linux-headers-4.19.0-9-powerpc64le.postinst | 18 debian/linux-headers-4.19.0-9-powerpcspe.postinst | 18 debian/linux-headers-4.19.0-9-riscv64.postinst | 18 debian/linux-headers-4.19.0-9-rpi.postinst | 18 debian/linux-headers-4.19.0-9-rt-686-pae.postinst | 18 debian/linux-headers-4.19.0-9-rt-amd64.postinst | 18 debian/linux-headers-4.19.0-9-rt-arm64.postinst | 18 debian/linux-headers-4.19.0-9-rt-armmp.postinst | 18 debian/linux-headers-4.19.0-9-s390x.postinst | 18 debian/linux-headers-4.19.0-9-sh7751r.postinst | 18 debian/linux-headers-4.19.0-9-sh7785lcr.postinst | 18 debian/linux-headers-4.19.0-9-sparc64-smp.postinst | 18 debian/linux-headers-4.19.0-9-sparc64.postinst | 18 debian/linux-image-4.19.0-8-4kc-malta-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-4kc-malta.postinst | 25 debian/linux-image-4.19.0-8-4kc-malta.postrm | 31 debian/linux-image-4.19.0-8-4kc-malta.preinst | 21 debian/linux-image-4.19.0-8-4kc-malta.prerm | 17 debian/linux-image-4.19.0-8-5kc-malta-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-5kc-malta.postinst | 25 debian/linux-image-4.19.0-8-5kc-malta.postrm | 31 debian/linux-image-4.19.0-8-5kc-malta.preinst | 21 debian/linux-image-4.19.0-8-5kc-malta.prerm | 17 debian/linux-image-4.19.0-8-686-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-686-pae-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-686-pae-unsigned.postinst | 25 debian/linux-image-4.19.0-8-686-pae-unsigned.postrm | 31 debian/linux-image-4.19.0-8-686-pae-unsigned.preinst | 21 debian/linux-image-4.19.0-8-686-pae-unsigned.prerm | 17 debian/linux-image-4.19.0-8-686-unsigned.postinst | 25 debian/linux-image-4.19.0-8-686-unsigned.postrm | 31 debian/linux-image-4.19.0-8-686-unsigned.preinst | 21 debian/linux-image-4.19.0-8-686-unsigned.prerm | 17 debian/linux-image-4.19.0-8-alpha-generic-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-alpha-generic.postinst | 25 debian/linux-image-4.19.0-8-alpha-generic.postrm | 31 debian/linux-image-4.19.0-8-alpha-generic.preinst | 21 debian/linux-image-4.19.0-8-alpha-generic.prerm | 17 debian/linux-image-4.19.0-8-alpha-smp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-alpha-smp.postinst | 25 debian/linux-image-4.19.0-8-alpha-smp.postrm | 31 debian/linux-image-4.19.0-8-alpha-smp.preinst | 21 debian/linux-image-4.19.0-8-alpha-smp.prerm | 17 debian/linux-image-4.19.0-8-amd64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-amd64-unsigned.postinst | 25 debian/linux-image-4.19.0-8-amd64-unsigned.postrm | 31 debian/linux-image-4.19.0-8-amd64-unsigned.preinst | 21 debian/linux-image-4.19.0-8-amd64-unsigned.prerm | 17 debian/linux-image-4.19.0-8-arm64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-arm64-unsigned.postinst | 25 debian/linux-image-4.19.0-8-arm64-unsigned.postrm | 31 debian/linux-image-4.19.0-8-arm64-unsigned.preinst | 21 debian/linux-image-4.19.0-8-arm64-unsigned.prerm | 17 debian/linux-image-4.19.0-8-armmp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-armmp-lpae-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-armmp-lpae.postinst | 25 debian/linux-image-4.19.0-8-armmp-lpae.postrm | 31 debian/linux-image-4.19.0-8-armmp-lpae.preinst | 21 debian/linux-image-4.19.0-8-armmp-lpae.prerm | 17 debian/linux-image-4.19.0-8-armmp.postinst | 25 debian/linux-image-4.19.0-8-armmp.postrm | 31 debian/linux-image-4.19.0-8-armmp.preinst | 21 debian/linux-image-4.19.0-8-armmp.prerm | 17 debian/linux-image-4.19.0-8-cloud-amd64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postinst | 25 debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postrm | 31 debian/linux-image-4.19.0-8-cloud-amd64-unsigned.preinst | 21 debian/linux-image-4.19.0-8-cloud-amd64-unsigned.prerm | 17 debian/linux-image-4.19.0-8-itanium-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-itanium.postinst | 25 debian/linux-image-4.19.0-8-itanium.postrm | 31 debian/linux-image-4.19.0-8-itanium.preinst | 21 debian/linux-image-4.19.0-8-itanium.prerm | 17 debian/linux-image-4.19.0-8-loongson-3-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-loongson-3.postinst | 25 debian/linux-image-4.19.0-8-loongson-3.postrm | 31 debian/linux-image-4.19.0-8-loongson-3.preinst | 21 debian/linux-image-4.19.0-8-loongson-3.prerm | 17 debian/linux-image-4.19.0-8-m68k-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-m68k.postinst | 25 debian/linux-image-4.19.0-8-m68k.postrm | 31 debian/linux-image-4.19.0-8-m68k.preinst | 21 debian/linux-image-4.19.0-8-m68k.prerm | 17 debian/linux-image-4.19.0-8-marvell-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-marvell.postinst | 25 debian/linux-image-4.19.0-8-marvell.postrm | 31 debian/linux-image-4.19.0-8-marvell.preinst | 21 debian/linux-image-4.19.0-8-marvell.prerm | 17 debian/linux-image-4.19.0-8-mckinley-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-mckinley.postinst | 25 debian/linux-image-4.19.0-8-mckinley.postrm | 31 debian/linux-image-4.19.0-8-mckinley.preinst | 21 debian/linux-image-4.19.0-8-mckinley.prerm | 17 debian/linux-image-4.19.0-8-mips32r6-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-mips32r6.postinst | 25 debian/linux-image-4.19.0-8-mips32r6.postrm | 31 debian/linux-image-4.19.0-8-mips32r6.preinst | 21 debian/linux-image-4.19.0-8-mips32r6.prerm | 17 debian/linux-image-4.19.0-8-mips32r6el-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-mips32r6el.postinst | 25 debian/linux-image-4.19.0-8-mips32r6el.postrm | 31 debian/linux-image-4.19.0-8-mips32r6el.preinst | 21 debian/linux-image-4.19.0-8-mips32r6el.prerm | 17 debian/linux-image-4.19.0-8-mips64r6-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-mips64r6.postinst | 25 debian/linux-image-4.19.0-8-mips64r6.postrm | 31 debian/linux-image-4.19.0-8-mips64r6.preinst | 21 debian/linux-image-4.19.0-8-mips64r6.prerm | 17 debian/linux-image-4.19.0-8-mips64r6el-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-mips64r6el.postinst | 25 debian/linux-image-4.19.0-8-mips64r6el.postrm | 31 debian/linux-image-4.19.0-8-mips64r6el.preinst | 21 debian/linux-image-4.19.0-8-mips64r6el.prerm | 17 debian/linux-image-4.19.0-8-octeon-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-octeon.postinst | 25 debian/linux-image-4.19.0-8-octeon.postrm | 31 debian/linux-image-4.19.0-8-octeon.preinst | 21 debian/linux-image-4.19.0-8-octeon.prerm | 17 debian/linux-image-4.19.0-8-parisc-smp.postinst | 25 debian/linux-image-4.19.0-8-parisc-smp.postrm | 31 debian/linux-image-4.19.0-8-parisc-smp.preinst | 21 debian/linux-image-4.19.0-8-parisc-smp.prerm | 17 debian/linux-image-4.19.0-8-parisc.postinst | 25 debian/linux-image-4.19.0-8-parisc.postrm | 31 debian/linux-image-4.19.0-8-parisc.preinst | 21 debian/linux-image-4.19.0-8-parisc.prerm | 17 debian/linux-image-4.19.0-8-parisc64-smp.postinst | 25 debian/linux-image-4.19.0-8-parisc64-smp.postrm | 31 debian/linux-image-4.19.0-8-parisc64-smp.preinst | 21 debian/linux-image-4.19.0-8-parisc64-smp.prerm | 17 debian/linux-image-4.19.0-8-powerpc-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-powerpc-smp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-powerpc-smp.postinst | 25 debian/linux-image-4.19.0-8-powerpc-smp.postrm | 31 debian/linux-image-4.19.0-8-powerpc-smp.preinst | 21 debian/linux-image-4.19.0-8-powerpc-smp.prerm | 17 debian/linux-image-4.19.0-8-powerpc.postinst | 25 debian/linux-image-4.19.0-8-powerpc.postrm | 31 debian/linux-image-4.19.0-8-powerpc.preinst | 21 debian/linux-image-4.19.0-8-powerpc.prerm | 17 debian/linux-image-4.19.0-8-powerpc64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-powerpc64.postinst | 25 debian/linux-image-4.19.0-8-powerpc64.postrm | 31 debian/linux-image-4.19.0-8-powerpc64.preinst | 21 debian/linux-image-4.19.0-8-powerpc64.prerm | 17 debian/linux-image-4.19.0-8-powerpc64le-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-powerpc64le.postinst | 25 debian/linux-image-4.19.0-8-powerpc64le.postrm | 31 debian/linux-image-4.19.0-8-powerpc64le.preinst | 21 debian/linux-image-4.19.0-8-powerpc64le.prerm | 17 debian/linux-image-4.19.0-8-powerpcspe-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-powerpcspe.postinst | 25 debian/linux-image-4.19.0-8-powerpcspe.postrm | 31 debian/linux-image-4.19.0-8-powerpcspe.preinst | 21 debian/linux-image-4.19.0-8-powerpcspe.prerm | 17 debian/linux-image-4.19.0-8-riscv64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-riscv64.postinst | 25 debian/linux-image-4.19.0-8-riscv64.postrm | 31 debian/linux-image-4.19.0-8-riscv64.preinst | 21 debian/linux-image-4.19.0-8-riscv64.prerm | 17 debian/linux-image-4.19.0-8-rpi-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-rpi.postinst | 25 debian/linux-image-4.19.0-8-rpi.postrm | 31 debian/linux-image-4.19.0-8-rpi.preinst | 21 debian/linux-image-4.19.0-8-rpi.prerm | 17 debian/linux-image-4.19.0-8-rt-686-pae-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postinst | 25 debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postrm | 31 debian/linux-image-4.19.0-8-rt-686-pae-unsigned.preinst | 21 debian/linux-image-4.19.0-8-rt-686-pae-unsigned.prerm | 17 debian/linux-image-4.19.0-8-rt-amd64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-rt-amd64-unsigned.postinst | 25 debian/linux-image-4.19.0-8-rt-amd64-unsigned.postrm | 31 debian/linux-image-4.19.0-8-rt-amd64-unsigned.preinst | 21 debian/linux-image-4.19.0-8-rt-amd64-unsigned.prerm | 17 debian/linux-image-4.19.0-8-rt-arm64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-rt-arm64-unsigned.postinst | 25 debian/linux-image-4.19.0-8-rt-arm64-unsigned.postrm | 31 debian/linux-image-4.19.0-8-rt-arm64-unsigned.preinst | 21 debian/linux-image-4.19.0-8-rt-arm64-unsigned.prerm | 17 debian/linux-image-4.19.0-8-rt-armmp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-rt-armmp.postinst | 25 debian/linux-image-4.19.0-8-rt-armmp.postrm | 31 debian/linux-image-4.19.0-8-rt-armmp.preinst | 21 debian/linux-image-4.19.0-8-rt-armmp.prerm | 17 debian/linux-image-4.19.0-8-s390x-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-s390x.postinst | 25 debian/linux-image-4.19.0-8-s390x.postrm | 31 debian/linux-image-4.19.0-8-s390x.preinst | 21 debian/linux-image-4.19.0-8-s390x.prerm | 17 debian/linux-image-4.19.0-8-sh7751r-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-sh7751r.postinst | 25 debian/linux-image-4.19.0-8-sh7751r.postrm | 31 debian/linux-image-4.19.0-8-sh7751r.preinst | 21 debian/linux-image-4.19.0-8-sh7751r.prerm | 17 debian/linux-image-4.19.0-8-sh7785lcr-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-sh7785lcr.postinst | 25 debian/linux-image-4.19.0-8-sh7785lcr.postrm | 31 debian/linux-image-4.19.0-8-sh7785lcr.preinst | 21 debian/linux-image-4.19.0-8-sh7785lcr.prerm | 17 debian/linux-image-4.19.0-8-sparc64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-sparc64-smp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-8-sparc64-smp.postinst | 25 debian/linux-image-4.19.0-8-sparc64-smp.postrm | 31 debian/linux-image-4.19.0-8-sparc64-smp.preinst | 21 debian/linux-image-4.19.0-8-sparc64-smp.prerm | 17 debian/linux-image-4.19.0-8-sparc64.postinst | 25 debian/linux-image-4.19.0-8-sparc64.postrm | 31 debian/linux-image-4.19.0-8-sparc64.preinst | 21 debian/linux-image-4.19.0-8-sparc64.prerm | 17 debian/linux-image-4.19.0-9-4kc-malta-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-4kc-malta.postinst | 25 debian/linux-image-4.19.0-9-4kc-malta.postrm | 31 debian/linux-image-4.19.0-9-4kc-malta.preinst | 21 debian/linux-image-4.19.0-9-4kc-malta.prerm | 17 debian/linux-image-4.19.0-9-5kc-malta-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-5kc-malta.postinst | 25 debian/linux-image-4.19.0-9-5kc-malta.postrm | 31 debian/linux-image-4.19.0-9-5kc-malta.preinst | 21 debian/linux-image-4.19.0-9-5kc-malta.prerm | 17 debian/linux-image-4.19.0-9-686-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-686-pae-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-686-pae-unsigned.postinst | 25 debian/linux-image-4.19.0-9-686-pae-unsigned.postrm | 31 debian/linux-image-4.19.0-9-686-pae-unsigned.preinst | 21 debian/linux-image-4.19.0-9-686-pae-unsigned.prerm | 17 debian/linux-image-4.19.0-9-686-unsigned.postinst | 25 debian/linux-image-4.19.0-9-686-unsigned.postrm | 31 debian/linux-image-4.19.0-9-686-unsigned.preinst | 21 debian/linux-image-4.19.0-9-686-unsigned.prerm | 17 debian/linux-image-4.19.0-9-alpha-generic-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-alpha-generic.postinst | 25 debian/linux-image-4.19.0-9-alpha-generic.postrm | 31 debian/linux-image-4.19.0-9-alpha-generic.preinst | 21 debian/linux-image-4.19.0-9-alpha-generic.prerm | 17 debian/linux-image-4.19.0-9-alpha-smp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-alpha-smp.postinst | 25 debian/linux-image-4.19.0-9-alpha-smp.postrm | 31 debian/linux-image-4.19.0-9-alpha-smp.preinst | 21 debian/linux-image-4.19.0-9-alpha-smp.prerm | 17 debian/linux-image-4.19.0-9-amd64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-amd64-unsigned.postinst | 25 debian/linux-image-4.19.0-9-amd64-unsigned.postrm | 31 debian/linux-image-4.19.0-9-amd64-unsigned.preinst | 21 debian/linux-image-4.19.0-9-amd64-unsigned.prerm | 17 debian/linux-image-4.19.0-9-arm64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-arm64-unsigned.postinst | 25 debian/linux-image-4.19.0-9-arm64-unsigned.postrm | 31 debian/linux-image-4.19.0-9-arm64-unsigned.preinst | 21 debian/linux-image-4.19.0-9-arm64-unsigned.prerm | 17 debian/linux-image-4.19.0-9-armmp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-armmp-lpae-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-armmp-lpae.postinst | 25 debian/linux-image-4.19.0-9-armmp-lpae.postrm | 31 debian/linux-image-4.19.0-9-armmp-lpae.preinst | 21 debian/linux-image-4.19.0-9-armmp-lpae.prerm | 17 debian/linux-image-4.19.0-9-armmp.postinst | 25 debian/linux-image-4.19.0-9-armmp.postrm | 31 debian/linux-image-4.19.0-9-armmp.preinst | 21 debian/linux-image-4.19.0-9-armmp.prerm | 17 debian/linux-image-4.19.0-9-cloud-amd64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postinst | 25 debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postrm | 31 debian/linux-image-4.19.0-9-cloud-amd64-unsigned.preinst | 21 debian/linux-image-4.19.0-9-cloud-amd64-unsigned.prerm | 17 debian/linux-image-4.19.0-9-itanium-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-itanium.postinst | 25 debian/linux-image-4.19.0-9-itanium.postrm | 31 debian/linux-image-4.19.0-9-itanium.preinst | 21 debian/linux-image-4.19.0-9-itanium.prerm | 17 debian/linux-image-4.19.0-9-loongson-3-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-loongson-3.postinst | 25 debian/linux-image-4.19.0-9-loongson-3.postrm | 31 debian/linux-image-4.19.0-9-loongson-3.preinst | 21 debian/linux-image-4.19.0-9-loongson-3.prerm | 17 debian/linux-image-4.19.0-9-m68k-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-m68k.postinst | 25 debian/linux-image-4.19.0-9-m68k.postrm | 31 debian/linux-image-4.19.0-9-m68k.preinst | 21 debian/linux-image-4.19.0-9-m68k.prerm | 17 debian/linux-image-4.19.0-9-marvell-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-marvell.postinst | 25 debian/linux-image-4.19.0-9-marvell.postrm | 31 debian/linux-image-4.19.0-9-marvell.preinst | 21 debian/linux-image-4.19.0-9-marvell.prerm | 17 debian/linux-image-4.19.0-9-mckinley-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-mckinley.postinst | 25 debian/linux-image-4.19.0-9-mckinley.postrm | 31 debian/linux-image-4.19.0-9-mckinley.preinst | 21 debian/linux-image-4.19.0-9-mckinley.prerm | 17 debian/linux-image-4.19.0-9-mips32r6-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-mips32r6.postinst | 25 debian/linux-image-4.19.0-9-mips32r6.postrm | 31 debian/linux-image-4.19.0-9-mips32r6.preinst | 21 debian/linux-image-4.19.0-9-mips32r6.prerm | 17 debian/linux-image-4.19.0-9-mips32r6el-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-mips32r6el.postinst | 25 debian/linux-image-4.19.0-9-mips32r6el.postrm | 31 debian/linux-image-4.19.0-9-mips32r6el.preinst | 21 debian/linux-image-4.19.0-9-mips32r6el.prerm | 17 debian/linux-image-4.19.0-9-mips64r6-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-mips64r6.postinst | 25 debian/linux-image-4.19.0-9-mips64r6.postrm | 31 debian/linux-image-4.19.0-9-mips64r6.preinst | 21 debian/linux-image-4.19.0-9-mips64r6.prerm | 17 debian/linux-image-4.19.0-9-mips64r6el-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-mips64r6el.postinst | 25 debian/linux-image-4.19.0-9-mips64r6el.postrm | 31 debian/linux-image-4.19.0-9-mips64r6el.preinst | 21 debian/linux-image-4.19.0-9-mips64r6el.prerm | 17 debian/linux-image-4.19.0-9-octeon-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-octeon.postinst | 25 debian/linux-image-4.19.0-9-octeon.postrm | 31 debian/linux-image-4.19.0-9-octeon.preinst | 21 debian/linux-image-4.19.0-9-octeon.prerm | 17 debian/linux-image-4.19.0-9-parisc-smp.postinst | 25 debian/linux-image-4.19.0-9-parisc-smp.postrm | 31 debian/linux-image-4.19.0-9-parisc-smp.preinst | 21 debian/linux-image-4.19.0-9-parisc-smp.prerm | 17 debian/linux-image-4.19.0-9-parisc.postinst | 25 debian/linux-image-4.19.0-9-parisc.postrm | 31 debian/linux-image-4.19.0-9-parisc.preinst | 21 debian/linux-image-4.19.0-9-parisc.prerm | 17 debian/linux-image-4.19.0-9-parisc64-smp.postinst | 25 debian/linux-image-4.19.0-9-parisc64-smp.postrm | 31 debian/linux-image-4.19.0-9-parisc64-smp.preinst | 21 debian/linux-image-4.19.0-9-parisc64-smp.prerm | 17 debian/linux-image-4.19.0-9-powerpc-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-powerpc-smp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-powerpc-smp.postinst | 25 debian/linux-image-4.19.0-9-powerpc-smp.postrm | 31 debian/linux-image-4.19.0-9-powerpc-smp.preinst | 21 debian/linux-image-4.19.0-9-powerpc-smp.prerm | 17 debian/linux-image-4.19.0-9-powerpc.postinst | 25 debian/linux-image-4.19.0-9-powerpc.postrm | 31 debian/linux-image-4.19.0-9-powerpc.preinst | 21 debian/linux-image-4.19.0-9-powerpc.prerm | 17 debian/linux-image-4.19.0-9-powerpc64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-powerpc64.postinst | 25 debian/linux-image-4.19.0-9-powerpc64.postrm | 31 debian/linux-image-4.19.0-9-powerpc64.preinst | 21 debian/linux-image-4.19.0-9-powerpc64.prerm | 17 debian/linux-image-4.19.0-9-powerpc64le-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-powerpc64le.postinst | 25 debian/linux-image-4.19.0-9-powerpc64le.postrm | 31 debian/linux-image-4.19.0-9-powerpc64le.preinst | 21 debian/linux-image-4.19.0-9-powerpc64le.prerm | 17 debian/linux-image-4.19.0-9-powerpcspe-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-powerpcspe.postinst | 25 debian/linux-image-4.19.0-9-powerpcspe.postrm | 31 debian/linux-image-4.19.0-9-powerpcspe.preinst | 21 debian/linux-image-4.19.0-9-powerpcspe.prerm | 17 debian/linux-image-4.19.0-9-riscv64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-riscv64.postinst | 25 debian/linux-image-4.19.0-9-riscv64.postrm | 31 debian/linux-image-4.19.0-9-riscv64.preinst | 21 debian/linux-image-4.19.0-9-riscv64.prerm | 17 debian/linux-image-4.19.0-9-rpi-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-rpi.postinst | 25 debian/linux-image-4.19.0-9-rpi.postrm | 31 debian/linux-image-4.19.0-9-rpi.preinst | 21 debian/linux-image-4.19.0-9-rpi.prerm | 17 debian/linux-image-4.19.0-9-rt-686-pae-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postinst | 25 debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postrm | 31 debian/linux-image-4.19.0-9-rt-686-pae-unsigned.preinst | 21 debian/linux-image-4.19.0-9-rt-686-pae-unsigned.prerm | 17 debian/linux-image-4.19.0-9-rt-amd64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-rt-amd64-unsigned.postinst | 25 debian/linux-image-4.19.0-9-rt-amd64-unsigned.postrm | 31 debian/linux-image-4.19.0-9-rt-amd64-unsigned.preinst | 21 debian/linux-image-4.19.0-9-rt-amd64-unsigned.prerm | 17 debian/linux-image-4.19.0-9-rt-arm64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-rt-arm64-unsigned.postinst | 25 debian/linux-image-4.19.0-9-rt-arm64-unsigned.postrm | 31 debian/linux-image-4.19.0-9-rt-arm64-unsigned.preinst | 21 debian/linux-image-4.19.0-9-rt-arm64-unsigned.prerm | 17 debian/linux-image-4.19.0-9-rt-armmp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-rt-armmp.postinst | 25 debian/linux-image-4.19.0-9-rt-armmp.postrm | 31 debian/linux-image-4.19.0-9-rt-armmp.preinst | 21 debian/linux-image-4.19.0-9-rt-armmp.prerm | 17 debian/linux-image-4.19.0-9-s390x-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-s390x.postinst | 25 debian/linux-image-4.19.0-9-s390x.postrm | 31 debian/linux-image-4.19.0-9-s390x.preinst | 21 debian/linux-image-4.19.0-9-s390x.prerm | 17 debian/linux-image-4.19.0-9-sh7751r-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-sh7751r.postinst | 25 debian/linux-image-4.19.0-9-sh7751r.postrm | 31 debian/linux-image-4.19.0-9-sh7751r.preinst | 21 debian/linux-image-4.19.0-9-sh7751r.prerm | 17 debian/linux-image-4.19.0-9-sh7785lcr-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-sh7785lcr.postinst | 25 debian/linux-image-4.19.0-9-sh7785lcr.postrm | 31 debian/linux-image-4.19.0-9-sh7785lcr.preinst | 21 debian/linux-image-4.19.0-9-sh7785lcr.prerm | 17 debian/linux-image-4.19.0-9-sparc64-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-sparc64-smp-dbg.lintian-overrides | 15 debian/linux-image-4.19.0-9-sparc64-smp.postinst | 25 debian/linux-image-4.19.0-9-sparc64-smp.postrm | 31 debian/linux-image-4.19.0-9-sparc64-smp.preinst | 21 debian/linux-image-4.19.0-9-sparc64-smp.prerm | 17 debian/linux-image-4.19.0-9-sparc64.postinst | 25 debian/linux-image-4.19.0-9-sparc64.postrm | 31 debian/linux-image-4.19.0-9-sparc64.preinst | 21 debian/linux-image-4.19.0-9-sparc64.prerm | 17 debian/patches-rt/0001-ARM-at91-add-TCB-registers-definitions.patch | 8 debian/patches-rt/0002-clocksource-drivers-Add-a-new-driver-for-the-Atmel-A.patch | 8 debian/patches-rt/0003-clocksource-drivers-timer-atmel-tcb-add-clockevent-d.patch | 8 debian/patches-rt/0004-clocksource-drivers-atmel-pit-make-option-silent.patch | 8 debian/patches-rt/0005-ARM-at91-Implement-clocksource-selection.patch | 8 debian/patches-rt/0006-ARM-configs-at91-use-new-TCB-timer-driver.patch | 8 debian/patches-rt/0007-ARM-configs-at91-unselect-PIT.patch | 8 debian/patches-rt/0008-irqchip-gic-v3-its-Move-pending-table-allocation-to-.patch | 12 debian/patches-rt/0009-kthread-convert-worker-lock-to-raw-spinlock.patch | 8 debian/patches-rt/0010-crypto-caam-qi-simplify-CGR-allocation-freeing.patch | 8 debian/patches-rt/0011-sched-fair-Robustify-CFS-bandwidth-timer-locking.patch | 26 debian/patches-rt/0012-arm-Convert-arm-boot_lock-to-raw.patch | 8 debian/patches-rt/0013-x86-ioapic-Don-t-let-setaffinity-unmask-threaded-EOI.patch | 8 debian/patches-rt/0014-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch | 8 debian/patches-rt/0015-fscache-initialize-cookie-hash-table-raw-spinlocks.patch | 8 debian/patches-rt/0016-Drivers-hv-vmbus-include-header-for-get_irq_regs.patch | 8 debian/patches-rt/0017-percpu-include-irqflags.h-for-raw_local_irq_save.patch | 8 debian/patches-rt/0018-efi-Allow-efi-runtime.patch | 8 debian/patches-rt/0019-x86-efi-drop-task_lock-from-efi_switch_mm.patch | 12 debian/patches-rt/0020-arm64-KVM-compute_layout-before-altenates-are-applie.patch | 14 debian/patches-rt/0021-of-allocate-free-phandle-cache-outside-of-the-devtre.patch | 8 debian/patches-rt/0022-mm-kasan-make-quarantine_lock-a-raw_spinlock_t.patch | 8 debian/patches-rt/0023-EXP-rcu-Revert-expedited-GP-parallelization-cleverne.patch | 8 debian/patches-rt/0024-kmemleak-Turn-kmemleak_lock-to-raw-spinlock-on-RT.patch | 8 debian/patches-rt/0025-NFSv4-replace-seqcount_t-with-a-seqlock_t.patch | 12 debian/patches-rt/0026-kernel-sched-Provide-a-pointer-to-the-valid-CPU-mask.patch | 54 debian/patches-rt/0027-kernel-sched-core-add-migrate_disable.patch | 10 debian/patches-rt/0028-sched-migrate_disable-Add-export_symbol_gpl-for-__mi.patch | 8 debian/patches-rt/0029-arm-at91-do-not-disable-enable-clocks-in-a-row.patch | 8 debian/patches-rt/0030-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch | 8 debian/patches-rt/0031-timekeeping-Split-jiffies-seqlock.patch | 18 debian/patches-rt/0032-signal-Revert-ptrace-preempt-magic.patch | 12 debian/patches-rt/0033-net-sched-Use-msleep-instead-of-yield.patch | 8 debian/patches-rt/0034-dm-rq-remove-BUG_ON-irqs_disabled-check.patch | 8 debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch | 8 debian/patches-rt/0036-rt-Provide-PREEMPT_RT_BASE-config-switch.patch | 8 debian/patches-rt/0037-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch | 8 debian/patches-rt/0038-jump-label-disable-if-stop_machine-is-used.patch | 10 debian/patches-rt/0039-kconfig-Disable-config-options-which-are-not-RT-comp.patch | 8 debian/patches-rt/0040-lockdep-disable-self-test.patch | 8 debian/patches-rt/0041-mm-Allow-only-slub-on-RT.patch | 8 debian/patches-rt/0042-locking-Disable-spin-on-owner-for-RT.patch | 8 debian/patches-rt/0043-rcu-Disable-RCU_FAST_NO_HZ-on-RT.patch | 8 debian/patches-rt/0044-rcu-make-RCU_BOOST-default-on-RT.patch | 8 debian/patches-rt/0045-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch | 8 debian/patches-rt/0046-net-core-disable-NET_RX_BUSY_POLL.patch | 8 debian/patches-rt/0047-arm-disable-NEON-in-kernel-mode.patch | 10 debian/patches-rt/0048-powerpc-Use-generic-rwsem-on-RT.patch | 10 debian/patches-rt/0049-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch | 8 debian/patches-rt/0050-powerpc-Disable-highmem-on-RT.patch | 12 debian/patches-rt/0051-mips-Disable-highmem-on-RT.patch | 8 debian/patches-rt/0052-x86-Use-generic-rwsem_spinlocks-on-rt.patch | 8 debian/patches-rt/0053-leds-trigger-disable-CPU-trigger-on-RT.patch | 8 debian/patches-rt/0054-cpufreq-drop-K8-s-driver-from-beeing-selected.patch | 8 debian/patches-rt/0055-md-disable-bcache.patch | 8 debian/patches-rt/0056-efi-Disable-runtime-services-on-RT.patch | 8 debian/patches-rt/0057-printk-Add-a-printk-kill-switch.patch | 10 debian/patches-rt/0058-printk-Add-force_early_printk-boot-param-to-help-wit.patch | 10 debian/patches-rt/0059-preempt-Provide-preempt_-_-no-rt-variants.patch | 8 debian/patches-rt/0060-futex-workaround-migrate_disable-enable-in-different.patch | 16 debian/patches-rt/0061-rt-Add-local-irq-locks.patch | 8 debian/patches-rt/0062-locallock-provide-get-put-_locked_ptr-variants.patch | 8 debian/patches-rt/0063-mm-scatterlist-Do-not-disable-irqs-on-RT.patch | 10 debian/patches-rt/0064-signal-x86-Delay-calling-signals-in-atomic.patch | 16 debian/patches-rt/0065-x86-signal-delay-calling-signals-on-32bit.patch | 8 debian/patches-rt/0066-buffer_head-Replace-bh_uptodate_lock-for-rt.patch | 10 debian/patches-rt/0067-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch | 8 debian/patches-rt/0068-list_bl-Make-list-head-locking-RT-safe.patch | 8 debian/patches-rt/0069-list_bl-fixup-bogus-lockdep-warning.patch | 8 debian/patches-rt/0070-genirq-Disable-irqpoll-on-rt.patch | 8 debian/patches-rt/0071-genirq-Force-interrupt-thread-on-RT.patch | 10 debian/patches-rt/0072-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch | 10 debian/patches-rt/0073-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch | 10 debian/patches-rt/0074-mm-SLxB-change-list_lock-to-raw_spinlock_t.patch | 46 debian/patches-rt/0075-mm-SLUB-delay-giving-back-empty-slubs-to-IRQ-enabled.patch | 36 debian/patches-rt/0076-mm-page_alloc-rt-friendly-per-cpu-pages.patch | 14 debian/patches-rt/0077-mm-swap-Convert-to-percpu-locked.patch | 12 debian/patches-rt/0078-mm-perform-lru_add_drain_all-remotely.patch | 8 debian/patches-rt/0079-mm-vmstat-Protect-per-cpu-variables-with-preempt-dis.patch | 8 debian/patches-rt/0080-ARM-Initialize-split-page-table-locks-for-vector-pag.patch | 8 debian/patches-rt/0081-mm-Enable-SLUB-for-RT.patch | 14 debian/patches-rt/0082-slub-Enable-irqs-for-__GFP_WAIT.patch | 10 debian/patches-rt/0083-slub-Disable-SLUB_CPU_PARTIAL.patch | 8 debian/patches-rt/0084-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch | 14 debian/patches-rt/0085-mm-memcontrol-Replace-local_irq_disable-with-local-l.patch | 24 debian/patches-rt/0086-mm-zsmalloc-copy-with-get_cpu_var-and-locking.patch | 8 debian/patches-rt/0087-x86-mm-pat-disable-preemption-__split_large_page-aft.patch | 10 debian/patches-rt/0088-radix-tree-use-local-locks.patch | 8 debian/patches-rt/0089-timers-Prepare-for-full-preemption.patch | 8 debian/patches-rt/0090-x86-kvm-Require-const-tsc-for-RT.patch | 12 debian/patches-rt/0091-pci-switchtec-Don-t-use-completion-s-wait-queue.patch | 27 debian/patches-rt/0092-wait.h-include-atomic.h.patch | 8 debian/patches-rt/0093-work-simple-Simple-work-queue-implemenation.patch | 8 debian/patches-rt/0094-work-simple-drop-a-shit-statement-in-SWORK_EVENT_PEN.patch | 8 debian/patches-rt/0095-completion-Use-simple-wait-queues.patch | 14 debian/patches-rt/0096-fs-aio-simple-simple-work.patch | 10 debian/patches-rt/0097-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch | 142 debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch | 60 debian/patches-rt/0098-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch | 290 debian/patches-rt/0098-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch | 60 debian/patches-rt/0099-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch | 290 debian/patches-rt/0099-hrtimers-Prepare-full-preemption.patch | 290 debian/patches-rt/0100-hrtimer-by-timers-by-default-into-the-softirq-contex.patch | 237 debian/patches-rt/0100-hrtimers-Prepare-full-preemption.patch | 290 debian/patches-rt/0101-hrtimer-by-timers-by-default-into-the-softirq-contex.patch | 237 debian/patches-rt/0101-sched-fair-Make-the-hrtimers-non-hard-again.patch | 34 debian/patches-rt/0102-hrtimer-Move-schedule_work-call-to-helper-thread.patch | 98 debian/patches-rt/0102-sched-fair-Make-the-hrtimers-non-hard-again.patch | 34 debian/patches-rt/0103-hrtimer-Move-schedule_work-call-to-helper-thread.patch | 98 debian/patches-rt/0103-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch | 51 debian/patches-rt/0104-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch | 51 debian/patches-rt/0104-posix-timers-Thread-posix-cpu-timers-on-rt.patch | 269 debian/patches-rt/0105-posix-timers-Thread-posix-cpu-timers-on-rt.patch | 269 debian/patches-rt/0105-sched-Move-task_struct-cleanup-to-RCU.patch | 96 debian/patches-rt/0106-sched-Limit-the-number-of-task-migrations-per-batch.patch | 33 debian/patches-rt/0106-sched-Move-task_struct-cleanup-to-RCU.patch | 96 debian/patches-rt/0107-sched-Limit-the-number-of-task-migrations-per-batch.patch | 33 debian/patches-rt/0107-sched-Move-mmdrop-to-RCU-on-RT.patch | 140 debian/patches-rt/0108-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch | 70 debian/patches-rt/0108-sched-Move-mmdrop-to-RCU-on-RT.patch | 140 debian/patches-rt/0109-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch | 70 debian/patches-rt/0109-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch | 108 debian/patches-rt/0110-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch | 108 debian/patches-rt/0110-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch | 57 debian/patches-rt/0111-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch | 57 debian/patches-rt/0111-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch | 33 debian/patches-rt/0112-sched-Disable-TTWU_QUEUE-on-RT.patch | 38 debian/patches-rt/0112-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch | 33 debian/patches-rt/0113-sched-Disable-TTWU_QUEUE-on-RT.patch | 38 debian/patches-rt/0113-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch | 45 debian/patches-rt/0114-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch | 162 debian/patches-rt/0114-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch | 45 debian/patches-rt/0115-hotplug-Lightweight-get-online-cpus.patch | 101 debian/patches-rt/0115-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch | 162 debian/patches-rt/0116-hotplug-Lightweight-get-online-cpus.patch | 101 debian/patches-rt/0116-trace-Add-migrate-disabled-counter-to-tracing-output.patch | 86 debian/patches-rt/0117-lockdep-Make-it-RT-aware.patch | 78 debian/patches-rt/0117-trace-Add-migrate-disabled-counter-to-tracing-output.patch | 86 debian/patches-rt/0118-lockdep-Make-it-RT-aware.patch | 78 debian/patches-rt/0118-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch | 303 debian/patches-rt/0119-softirq-Check-preemption-after-reenabling-interrupts.patch | 180 debian/patches-rt/0119-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch | 303 debian/patches-rt/0120-softirq-Check-preemption-after-reenabling-interrupts.patch | 180 debian/patches-rt/0120-softirq-Disable-softirq-stacks-for-RT.patch | 177 debian/patches-rt/0121-softirq-Disable-softirq-stacks-for-RT.patch | 177 debian/patches-rt/0121-softirq-Split-softirq-locks.patch | 832 + debian/patches-rt/0122-net-core-use-local_bh_disable-in-netif_rx_ni.patch | 41 debian/patches-rt/0122-softirq-Split-softirq-locks.patch | 832 - debian/patches-rt/0123-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch | 161 debian/patches-rt/0123-net-core-use-local_bh_disable-in-netif_rx_ni.patch | 41 debian/patches-rt/0124-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch | 161 debian/patches-rt/0124-softirq-split-timer-softirqs-out-of-ksoftirqd.patch | 215 debian/patches-rt/0125-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch | 112 debian/patches-rt/0125-softirq-split-timer-softirqs-out-of-ksoftirqd.patch | 215 debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch | 112 debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-task.patch | 41 debian/patches-rt/0127-rtmutex-trylock-is-okay-on-RT.patch | 34 debian/patches-rt/0127-softirq-Avoid-local_softirq_pending-messages-if-task.patch | 41 debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch | 151 debian/patches-rt/0128-rtmutex-trylock-is-okay-on-RT.patch | 34 debian/patches-rt/0129-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch | 151 debian/patches-rt/0129-rtmutex-Handle-the-various-new-futex-race-conditions.patch | 255 debian/patches-rt/0130-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch | 121 debian/patches-rt/0130-rtmutex-Handle-the-various-new-futex-race-conditions.patch | 255 debian/patches-rt/0131-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch | 50 debian/patches-rt/0131-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch | 121 debian/patches-rt/0132-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch | 50 debian/patches-rt/0132-pid.h-include-atomic.h.patch | 43 debian/patches-rt/0133-arm-include-definition-for-cpumask_t.patch | 31 debian/patches-rt/0133-pid.h-include-atomic.h.patch | 43 debian/patches-rt/0134-arm-include-definition-for-cpumask_t.patch | 31 debian/patches-rt/0134-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch | 34 debian/patches-rt/0135-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch | 34 debian/patches-rt/0135-rtmutex-Add-rtmutex_lock_killable.patch | 60 debian/patches-rt/0136-rtmutex-Add-rtmutex_lock_killable.patch | 60 debian/patches-rt/0136-rtmutex-Make-lock_killable-work.patch | 51 debian/patches-rt/0137-rtmutex-Make-lock_killable-work.patch | 51 debian/patches-rt/0137-spinlock-Split-the-lock-types-header.patch | 221 debian/patches-rt/0138-rtmutex-Avoid-include-hell.patch | 30 debian/patches-rt/0138-spinlock-Split-the-lock-types-header.patch | 221 debian/patches-rt/0139-rbtree-don-t-include-the-rcu-header.patch | 175 debian/patches-rt/0139-rtmutex-Avoid-include-hell.patch | 30 debian/patches-rt/0140-rbtree-don-t-include-the-rcu-header.patch | 175 debian/patches-rt/0140-rtmutex-Provide-rt_mutex_slowlock_locked.patch | 145 debian/patches-rt/0141-rtmutex-Provide-rt_mutex_slowlock_locked.patch | 145 debian/patches-rt/0141-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch | 153 debian/patches-rt/0142-rtmutex-add-sleeping-lock-implementation.patch | 1208 + debian/patches-rt/0142-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch | 153 debian/patches-rt/0143-rtmutex-add-mutex-implementation-based-on-rtmutex.patch | 383 debian/patches-rt/0143-rtmutex-add-sleeping-lock-implementation.patch | 1208 - debian/patches-rt/0144-rtmutex-add-mutex-implementation-based-on-rtmutex.patch | 383 debian/patches-rt/0144-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch | 427 debian/patches-rt/0145-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch | 582 debian/patches-rt/0145-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch | 427 debian/patches-rt/0146-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch | 582 debian/patches-rt/0146-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch | 33 debian/patches-rt/0147-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch | 33 debian/patches-rt/0147-rtmutex-wire-up-RT-s-locking.patch | 271 debian/patches-rt/0148-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch | 445 debian/patches-rt/0148-rtmutex-wire-up-RT-s-locking.patch | 271 debian/patches-rt/0149-kconfig-Add-PREEMPT_RT_FULL.patch | 69 debian/patches-rt/0149-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch | 445 debian/patches-rt/0150-kconfig-Add-PREEMPT_RT_FULL.patch | 69 debian/patches-rt/0150-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch | 81 debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch | 46 debian/patches-rt/0151-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch | 81 debian/patches-rt/0152-locking-rt-mutex-Flush-block-plug-on-__down_read.patch | 46 debian/patches-rt/0152-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch | 39 debian/patches-rt/0153-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch | 39 debian/patches-rt/0153-ptrace-fix-ptrace-vs-tasklist_lock-race.patch | 166 debian/patches-rt/0154-ptrace-fix-ptrace-vs-tasklist_lock-race.patch | 166 debian/patches-rt/0154-rtmutex-annotate-sleeping-lock-context.patch | 308 debian/patches-rt/0155-rtmutex-annotate-sleeping-lock-context.patch | 308 debian/patches-rt/0155-sched-migrate_disable-fallback-to-preempt_disable-in.patch | 204 debian/patches-rt/0156-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch | 182 debian/patches-rt/0156-sched-migrate_disable-fallback-to-preempt_disable-in.patch | 204 debian/patches-rt/0157-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch | 182 debian/patches-rt/0157-rcu-Frob-softirq-test.patch | 173 debian/patches-rt/0158-rcu-Frob-softirq-test.patch | 173 debian/patches-rt/0158-rcu-Merge-RCU-bh-into-RCU-preempt.patch | 351 debian/patches-rt/0159-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch | 117 debian/patches-rt/0159-rcu-Merge-RCU-bh-into-RCU-preempt.patch | 351 debian/patches-rt/0160-rcu-Eliminate-softirq-processing-from-rcutree.patch | 423 debian/patches-rt/0160-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch | 117 debian/patches-rt/0161-rcu-Eliminate-softirq-processing-from-rcutree.patch | 423 debian/patches-rt/0161-srcu-use-cpu_online-instead-custom-check.patch | 96 debian/patches-rt/0162-srcu-replace-local_irqsave-with-a-locallock.patch | 77 debian/patches-rt/0162-srcu-use-cpu_online-instead-custom-check.patch | 96 debian/patches-rt/0163-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch | 37 debian/patches-rt/0163-srcu-replace-local_irqsave-with-a-locallock.patch | 77 debian/patches-rt/0164-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch | 37 debian/patches-rt/0164-tty-serial-omap-Make-the-locking-RT-aware.patch | 49 debian/patches-rt/0165-tty-serial-omap-Make-the-locking-RT-aware.patch | 49 debian/patches-rt/0165-tty-serial-pl011-Make-the-locking-work-on-RT.patch | 54 debian/patches-rt/0166-tty-serial-pl011-Make-the-locking-work-on-RT.patch | 54 debian/patches-rt/0166-tty-serial-pl011-explicitly-initialize-the-flags-var.patch | 45 debian/patches-rt/0167-rt-Improve-the-serial-console-PASS_LIMIT.patch | 47 debian/patches-rt/0167-tty-serial-pl011-explicitly-initialize-the-flags-var.patch | 45 debian/patches-rt/0168-rt-Improve-the-serial-console-PASS_LIMIT.patch | 47 debian/patches-rt/0168-tty-serial-8250-don-t-take-the-trylock-during-oops.patch | 35 debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch | 226 debian/patches-rt/0169-tty-serial-8250-don-t-take-the-trylock-during-oops.patch | 35 debian/patches-rt/0170-locking-percpu-rwsem-Remove-preempt_disable-variants.patch | 226 debian/patches-rt/0170-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch | 81 debian/patches-rt/0171-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch | 61 debian/patches-rt/0171-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch | 81 debian/patches-rt/0172-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch | 61 debian/patches-rt/0172-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch | 99 debian/patches-rt/0173-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch | 99 debian/patches-rt/0173-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch | 72 debian/patches-rt/0174-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch | 72 debian/patches-rt/0174-thermal-Defer-thermal-wakups-to-threads.patch | 137 debian/patches-rt/0175-thermal-Defer-thermal-wakups-to-threads.patch | 137 debian/patches-rt/0175-x86-fpu-Disable-preemption-around-local_bh_disable.patch | 38 debian/patches-rt/0176-fs-epoll-Do-not-disable-preemption-on-RT.patch | 37 debian/patches-rt/0176-x86-fpu-Disable-preemption-around-local_bh_disable.patch | 38 debian/patches-rt/0177-fs-epoll-Do-not-disable-preemption-on-RT.patch | 37 debian/patches-rt/0177-mm-vmalloc-Another-preempt-disable-region-which-suck.patch | 73 debian/patches-rt/0178-block-mq-use-cpu_light.patch | 36 debian/patches-rt/0178-mm-vmalloc-Another-preempt-disable-region-which-suck.patch | 73 debian/patches-rt/0179-block-mq-do-not-invoke-preempt_disable.patch | 58 debian/patches-rt/0179-block-mq-use-cpu_light.patch | 36 debian/patches-rt/0180-block-mq-do-not-invoke-preempt_disable.patch | 58 debian/patches-rt/0180-block-mq-don-t-complete-requests-via-IPI.patch | 119 debian/patches-rt/0181-block-mq-don-t-complete-requests-via-IPI.patch | 119 debian/patches-rt/0181-md-raid5-Make-raid5_percpu-handling-RT-aware.patch | 77 debian/patches-rt/0182-md-raid5-Make-raid5_percpu-handling-RT-aware.patch | 77 debian/patches-rt/0182-rt-Introduce-cpu_chill.patch | 113 debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch | 48 debian/patches-rt/0183-rt-Introduce-cpu_chill.patch | 113 debian/patches-rt/0184-hrtimer-Don-t-lose-state-in-cpu_chill.patch | 48 debian/patches-rt/0184-hrtimer-cpu_chill-save-task-state-in-saved_state.patch | 63 debian/patches-rt/0185-block-blk-mq-move-blk_queue_usage_counter_release-in.patch | 120 debian/patches-rt/0185-hrtimer-cpu_chill-save-task-state-in-saved_state.patch | 63 debian/patches-rt/0186-block-Use-cpu_chill-for-retry-loops.patch | 51 debian/patches-rt/0186-block-blk-mq-move-blk_queue_usage_counter_release-in.patch | 120 debian/patches-rt/0187-block-Use-cpu_chill-for-retry-loops.patch | 51 debian/patches-rt/0187-fs-dcache-Use-cpu_chill-in-trylock-loops.patch | 66 debian/patches-rt/0188-fs-dcache-Use-cpu_chill-in-trylock-loops.patch | 66 debian/patches-rt/0188-net-Use-cpu_chill-instead-of-cpu_relax.patch | 70 debian/patches-rt/0189-fs-dcache-use-swait_queue-instead-of-waitqueue.patch | 241 debian/patches-rt/0189-net-Use-cpu_chill-instead-of-cpu_relax.patch | 70 debian/patches-rt/0190-fs-dcache-use-swait_queue-instead-of-waitqueue.patch | 241 debian/patches-rt/0190-workqueue-Use-normal-rcu.patch | 360 debian/patches-rt/0191-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch | 186 debian/patches-rt/0191-workqueue-Use-normal-rcu.patch | 360 debian/patches-rt/0192-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch | 139 debian/patches-rt/0192-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch | 186 debian/patches-rt/0193-sched-Distangle-worker-accounting-from-rqlock.patch | 291 debian/patches-rt/0193-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch | 139 debian/patches-rt/0194-debugobjects-Make-RT-aware.patch | 32 debian/patches-rt/0194-sched-Distangle-worker-accounting-from-rqlock.patch | 291 debian/patches-rt/0195-debugobjects-Make-RT-aware.patch | 32 debian/patches-rt/0195-seqlock-Prevent-rt-starvation.patch | 195 debian/patches-rt/0196-seqlock-Prevent-rt-starvation.patch | 195 debian/patches-rt/0196-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch | 61 debian/patches-rt/0197-net-Use-skbufhead-with-raw-lock.patch | 173 debian/patches-rt/0197-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch | 61 debian/patches-rt/0198-net-Use-skbufhead-with-raw-lock.patch | 173 debian/patches-rt/0198-net-move-xmit_recursion-to-per-task-variable-on-RT.patch | 278 debian/patches-rt/0199-net-move-xmit_recursion-to-per-task-variable-on-RT.patch | 267 debian/patches-rt/0199-net-provide-a-way-to-delegate-processing-a-softirq-t.patch | 89 debian/patches-rt/0200-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch | 42 debian/patches-rt/0200-net-provide-a-way-to-delegate-processing-a-softirq-t.patch | 89 debian/patches-rt/0201-net-Qdisc-use-a-seqlock-instead-seqcount.patch | 293 debian/patches-rt/0201-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch | 42 debian/patches-rt/0202-net-Qdisc-use-a-seqlock-instead-seqcount.patch | 293 debian/patches-rt/0202-net-add-back-the-missing-serialization-in-ip_send_un.patch | 99 debian/patches-rt/0203-net-add-a-lock-around-icmp_sk.patch | 65 debian/patches-rt/0203-net-add-back-the-missing-serialization-in-ip_send_un.patch | 99 debian/patches-rt/0204-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch | 77 debian/patches-rt/0204-net-add-a-lock-around-icmp_sk.patch | 65 debian/patches-rt/0205-irqwork-push-most-work-into-softirq-context.patch | 264 debian/patches-rt/0205-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch | 77 debian/patches-rt/0206-irqwork-push-most-work-into-softirq-context.patch | 264 debian/patches-rt/0206-printk-Make-rt-aware.patch | 114 debian/patches-rt/0207-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch | 48 debian/patches-rt/0207-printk-Make-rt-aware.patch | 114 debian/patches-rt/0208-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch | 48 debian/patches-rt/0208-printk-Drop-the-logbuf_lock-more-often.patch | 83 debian/patches-rt/0209-ARM-enable-irq-in-translation-section-permission-fau.patch | 96 debian/patches-rt/0209-printk-Drop-the-logbuf_lock-more-often.patch | 83 debian/patches-rt/0210-ARM-enable-irq-in-translation-section-permission-fau.patch | 96 debian/patches-rt/0210-genirq-update-irq_set_irqchip_state-documentation.patch | 32 debian/patches-rt/0211-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch | 59 debian/patches-rt/0211-genirq-update-irq_set_irqchip_state-documentation.patch | 32 debian/patches-rt/0212-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch | 59 debian/patches-rt/0212-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch | 171 debian/patches-rt/0213-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch | 171 debian/patches-rt/0213-kgdb-serial-Short-term-workaround.patch | 86 debian/patches-rt/0214-kgdb-serial-Short-term-workaround.patch | 86 debian/patches-rt/0214-sysfs-Add-sys-kernel-realtime-entry.patch | 54 debian/patches-rt/0215-mm-rt-kmap_atomic-scheduling.patch | 325 debian/patches-rt/0215-sysfs-Add-sys-kernel-realtime-entry.patch | 54 debian/patches-rt/0216-mm-rt-kmap_atomic-scheduling.patch | 325 debian/patches-rt/0216-x86-highmem-Add-a-already-used-pte-check.patch | 29 debian/patches-rt/0217-arm-highmem-Flush-tlb-on-unmap.patch | 34 debian/patches-rt/0217-x86-highmem-Add-a-already-used-pte-check.patch | 29 debian/patches-rt/0218-arm-Enable-highmem-for-rt.patch | 184 debian/patches-rt/0218-arm-highmem-Flush-tlb-on-unmap.patch | 34 debian/patches-rt/0219-arm-Enable-highmem-for-rt.patch | 184 debian/patches-rt/0219-scsi-fcoe-Make-RT-aware.patch | 116 debian/patches-rt/0220-scsi-fcoe-Make-RT-aware.patch | 116 debian/patches-rt/0220-x86-crypto-Reduce-preempt-disabled-regions.patch | 118 debian/patches-rt/0221-crypto-Reduce-preempt-disabled-regions-more-algos.patch | 263 debian/patches-rt/0221-x86-crypto-Reduce-preempt-disabled-regions.patch | 118 debian/patches-rt/0222-crypto-Reduce-preempt-disabled-regions-more-algos.patch | 263 debian/patches-rt/0222-crypto-limit-more-FPU-enabled-sections.patch | 108 debian/patches-rt/0223-crypto-limit-more-FPU-enabled-sections.patch | 108 debian/patches-rt/0223-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch | 83 debian/patches-rt/0224-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch | 85 debian/patches-rt/0224-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch | 83 debian/patches-rt/0225-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch | 85 debian/patches-rt/0225-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch | 34 debian/patches-rt/0226-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch | 34 debian/patches-rt/0226-x86-stackprotector-Avoid-random-pool-on-rt.patch | 51 debian/patches-rt/0227-random-Make-it-work-on-rt.patch | 167 debian/patches-rt/0227-x86-stackprotector-Avoid-random-pool-on-rt.patch | 51 debian/patches-rt/0228-cpu-hotplug-Implement-CPU-pinning.patch | 117 debian/patches-rt/0228-random-Make-it-work-on-rt.patch | 167 debian/patches-rt/0229-cpu-hotplug-Implement-CPU-pinning.patch | 117 debian/patches-rt/0229-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch | 39 debian/patches-rt/0230-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch | 102 debian/patches-rt/0230-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch | 39 debian/patches-rt/0231-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch | 102 debian/patches-rt/0231-net-Remove-preemption-disabling-in-netif_rx.patch | 71 debian/patches-rt/0232-net-Another-local_irq_disable-kmalloc-headache.patch | 65 debian/patches-rt/0232-net-Remove-preemption-disabling-in-netif_rx.patch | 71 debian/patches-rt/0233-net-Another-local_irq_disable-kmalloc-headache.patch | 65 debian/patches-rt/0233-net-core-protect-users-of-napi_alloc_cache-against-r.patch | 119 debian/patches-rt/0234-net-core-protect-users-of-napi_alloc_cache-against-r.patch | 119 debian/patches-rt/0234-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch | 84 debian/patches-rt/0235-net-Add-a-mutex-around-devnet_rename_seq.patch | 113 debian/patches-rt/0235-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch | 84 debian/patches-rt/0236-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch | 62 debian/patches-rt/0236-net-Add-a-mutex-around-devnet_rename_seq.patch | 113 debian/patches-rt/0237-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch | 62 debian/patches-rt/0237-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch | 149 debian/patches-rt/0238-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch | 149 debian/patches-rt/0238-sched-Add-support-for-lazy-preemption.patch | 671 debian/patches-rt/0239-ftrace-Fix-trace-header-alignment.patch | 52 debian/patches-rt/0239-sched-Add-support-for-lazy-preemption.patch | 671 debian/patches-rt/0240-ftrace-Fix-trace-header-alignment.patch | 52 debian/patches-rt/0240-x86-Support-for-lazy-preemption.patch | 240 debian/patches-rt/0241-x86-Support-for-lazy-preemption.patch | 240 debian/patches-rt/0241-x86-lazy-preempt-properly-check-against-preempt-mask.patch | 33 debian/patches-rt/0242-x86-lazy-preempt-properly-check-against-preempt-mask.patch | 33 debian/patches-rt/0242-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch | 45 debian/patches-rt/0243-arm-Add-support-for-lazy-preemption.patch | 168 debian/patches-rt/0243-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch | 45 debian/patches-rt/0244-arm-Add-support-for-lazy-preemption.patch | 168 debian/patches-rt/0244-powerpc-Add-support-for-lazy-preemption.patch | 196 debian/patches-rt/0245-arch-arm64-Add-lazy-preempt-support.patch | 133 debian/patches-rt/0245-powerpc-Add-support-for-lazy-preemption.patch | 196 debian/patches-rt/0246-arch-arm64-Add-lazy-preempt-support.patch | 133 debian/patches-rt/0246-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch | 74 debian/patches-rt/0247-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch | 74 debian/patches-rt/0247-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch | 104 debian/patches-rt/0248-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch | 104 debian/patches-rt/0248-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch | 107 debian/patches-rt/0249-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch | 107 debian/patches-rt/0249-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch | 44 debian/patches-rt/0250-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch | 44 debian/patches-rt/0250-tpm_tis-fix-stall-after-iowrite-s.patch | 84 debian/patches-rt/0251-tpm_tis-fix-stall-after-iowrite-s.patch | 84 debian/patches-rt/0251-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch | 81 debian/patches-rt/0252-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch | 61 debian/patches-rt/0252-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch | 81 debian/patches-rt/0253-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch | 128 debian/patches-rt/0253-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch | 61 debian/patches-rt/0254-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch | 128 debian/patches-rt/0254-drm-i915-disable-tracing-on-RT.patch | 47 debian/patches-rt/0255-drm-i915-disable-tracing-on-RT.patch | 47 debian/patches-rt/0255-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch | 33 debian/patches-rt/0256-cgroups-use-simple-wait-in-css_release.patch | 95 debian/patches-rt/0256-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch | 33 debian/patches-rt/0257-cgroups-use-simple-wait-in-css_release.patch | 95 debian/patches-rt/0257-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch | 293 debian/patches-rt/0258-apparmor-use-a-locallock-instead-preempt_disable.patch | 85 debian/patches-rt/0258-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch | 293 debian/patches-rt/0259-apparmor-use-a-locallock-instead-preempt_disable.patch | 85 debian/patches-rt/0259-workqueue-Prevent-deadlock-stall-on-RT.patch | 207 debian/patches-rt/0260-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch | 213 debian/patches-rt/0260-workqueue-Prevent-deadlock-stall-on-RT.patch | 207 debian/patches-rt/0261-Add-localversion-for-RT-release.patch | 22 debian/patches-rt/0261-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch | 213 debian/patches-rt/0262-Add-localversion-for-RT-release.patch | 22 debian/patches-rt/0262-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch | 97 debian/patches-rt/0263-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch | 97 debian/patches-rt/0263-powerpc-reshuffle-TIF-bits.patch | 152 debian/patches-rt/0264-powerpc-reshuffle-TIF-bits.patch | 152 debian/patches-rt/0264-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch | 63 debian/patches-rt/0265-drm-i915-Don-t-disable-interrupts-independently-of-t.patch | 51 debian/patches-rt/0265-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch | 63 debian/patches-rt/0266-drm-i915-Don-t-disable-interrupts-independently-of-t.patch | 51 debian/patches-rt/0266-sched-completion-Fix-a-lockup-in-wait_for_completion.patch | 69 debian/patches-rt/0267-kthread-add-a-global-worker-thread.patch | 180 debian/patches-rt/0267-sched-completion-Fix-a-lockup-in-wait_for_completion.patch | 69 debian/patches-rt/0268-arm-imx6-cpuidle-Use-raw_spinlock_t.patch | 52 debian/patches-rt/0268-kthread-add-a-global-worker-thread.patch | 180 debian/patches-rt/0269-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch | 101 debian/patches-rt/0269-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch | 36 debian/patches-rt/0270-genirq-Handle-missing-work_struct-in-irq_set_affinit.patch | 42 debian/patches-rt/0270-pci-switchtec-fix-stream_open.cocci-warnings.patch | 40 debian/patches-rt/0271-arm-imx6-cpuidle-Use-raw_spinlock_t.patch | 52 debian/patches-rt/0271-sched-core-Drop-a-preempt_disable_rt-statement.patch | 50 debian/patches-rt/0272-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch | 36 debian/patches-rt/0272-timers-Redo-the-notification-of-canceling-timers-on-.patch | 650 debian/patches-rt/0273-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch | 35 debian/patches-rt/0273-pci-switchtec-fix-stream_open.cocci-warnings.patch | 40 debian/patches-rt/0274-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch | 83 debian/patches-rt/0274-sched-core-Drop-a-preempt_disable_rt-statement.patch | 50 debian/patches-rt/0275-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch | 258 debian/patches-rt/0275-timers-Redo-the-notification-of-canceling-timers-on-.patch | 650 debian/patches-rt/0276-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch | 35 debian/patches-rt/0276-Revert-futex-workaround-migrate_disable-enable-in-di.patch | 70 debian/patches-rt/0277-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch | 83 debian/patches-rt/0277-futex-Make-the-futex_hash_bucket-lock-raw.patch | 349 debian/patches-rt/0278-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch | 258 debian/patches-rt/0278-futex-Delay-deallocation-of-pi_state.patch | 183 debian/patches-rt/0279-Revert-futex-workaround-migrate_disable-enable-in-di.patch | 70 debian/patches-rt/0279-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch | 127 debian/patches-rt/0280-futex-Make-the-futex_hash_bucket-lock-raw.patch | 349 debian/patches-rt/0280-revert-aio.patch | 71 debian/patches-rt/0281-fs-aio-simple-simple-work.patch | 76 debian/patches-rt/0281-futex-Delay-deallocation-of-pi_state.patch | 183 debian/patches-rt/0282-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch | 127 debian/patches-rt/0282-revert-thermal.patch | 120 debian/patches-rt/0283-revert-aio.patch | 71 debian/patches-rt/0283-thermal-Defer-thermal-wakups-to-threads.patch | 98 debian/patches-rt/0284-fs-aio-simple-simple-work.patch | 76 debian/patches-rt/0284-revert-block.patch | 83 debian/patches-rt/0285-block-blk-mq-move-blk_queue_usage_counter_release-in.patch | 114 debian/patches-rt/0285-revert-thermal.patch | 120 debian/patches-rt/0286-thermal-Defer-thermal-wakups-to-threads.patch | 98 debian/patches-rt/0286-workqueue-rework.patch | 1464 ++ debian/patches-rt/0287-i2c-exynos5-Remove-IRQF_ONESHOT.patch | 48 debian/patches-rt/0287-revert-block.patch | 83 debian/patches-rt/0288-block-blk-mq-move-blk_queue_usage_counter_release-in.patch | 114 debian/patches-rt/0288-i2c-hix5hd2-Remove-IRQF_ONESHOT.patch | 42 debian/patches-rt/0289-sched-deadline-Ensure-inactive_timer-runs-in-hardirq.patch | 50 debian/patches-rt/0289-workqueue-rework.patch | 1569 -- debian/patches-rt/0290-Linux-4.19.94-rt38-REBASE.patch | 20 debian/patches-rt/0290-thermal-x86_pkg_temp-make-pkg_temp_lock-a-raw-spinlo.patch | 120 debian/patches-rt/0291-dma-buf-Use-seqlock_t-instread-disabling-preemption.patch | 296 debian/patches-rt/0292-KVM-arm-arm64-Let-the-timer-expire-in-hardirq-contex.patch | 54 debian/patches-rt/0293-x86-preempt-Check-preemption-level-before-looking-at.patch | 34 debian/patches-rt/0294-hrtimer-Use-READ_ONCE-to-access-timer-base-in-hrimer.patch | 42 debian/patches-rt/0295-hrtimer-Don-t-grab-the-expiry-lock-for-non-soft-hrti.patch | 41 debian/patches-rt/0296-hrtimer-Prevent-using-hrtimer_grab_expiry_lock-on-mi.patch | 43 debian/patches-rt/0297-hrtimer-Add-a-missing-bracket-and-hide-migration_bas.patch | 75 debian/patches-rt/0298-posix-timers-Unlock-expiry-lock-in-the-early-return.patch | 41 debian/patches-rt/0299-sched-migrate_dis-enable-Use-sleeping_lock-to-annota.patch | 58 debian/patches-rt/0300-sched-__set_cpus_allowed_ptr-Check-cpus_mask-not-cpu.patch | 39 debian/patches-rt/0301-sched-Remove-dead-__migrate_disabled-check.patch | 39 debian/patches-rt/0302-sched-migrate-disable-Protect-cpus_ptr-with-lock.patch | 47 debian/patches-rt/0303-lib-smp_processor_id-Don-t-use-cpumask_equal.patch | 45 debian/patches-rt/0304-futex-Make-the-futex_hash_bucket-spinlock_t-again-an.patch | 738 + debian/patches-rt/0305-locking-rtmutex-Clean-pi_blocked_on-in-the-error-cas.patch | 102 debian/patches-rt/0306-lib-ubsan-Don-t-seralize-UBSAN-report.patch | 308 debian/patches-rt/0307-kmemleak-Change-the-lock-of-kmemleak_object-to-raw_s.patch | 293 debian/patches-rt/0308-sched-migrate_enable-Use-select_fallback_rq.patch | 66 debian/patches-rt/0309-sched-Lazy-migrate_disable-processing.patch | 616 debian/patches-rt/0310-sched-migrate_enable-Use-stop_one_cpu_nowait.patch | 121 debian/patches-rt/0311-Revert-ARM-Initialize-split-page-table-locks-for-vec.patch | 87 debian/patches-rt/0312-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch | 129 debian/patches-rt/0313-sched-core-migrate_enable-must-access-takedown_cpu_t.patch | 55 debian/patches-rt/0314-lib-smp_processor_id-Adjust-check_preemption_disable.patch | 41 debian/patches-rt/0315-sched-migrate_enable-Busy-loop-until-the-migration-r.patch | 57 debian/patches-rt/0316-userfaultfd-Use-a-seqlock-instead-of-seqcount.patch | 80 debian/patches-rt/0317-sched-migrate_enable-Use-per-cpu-cpu_stop_work.patch | 83 debian/patches-rt/0318-sched-migrate_enable-Remove-__schedule-call.patch | 41 debian/patches-rt/0319-mm-memcontrol-Move-misplaced-local_unlock_irqrestore.patch | 42 debian/patches-rt/0320-locallock-Include-header-for-the-current-macro.patch | 32 debian/patches-rt/0321-drm-vmwgfx-Drop-preempt_disable-in-vmw_fifo_ping_hos.patch | 45 debian/patches-rt/0322-tracing-make-preempt_lazy-and-migrate_disable-counte.patch | 56 debian/patches-rt/0323-lib-ubsan-Remove-flags-parameter-from-calls-to-ubsan.patch | 57 debian/patches-rt/0324-irq_work-Fix-checking-of-IRQ_WORK_LAZY-flag-set-on-n.patch | 72 debian/patches-rt/0325-Linux-4.19.115-rt48-REBASE.patch | 20 debian/patches-rt/series | 423 debian/patches/bugfix/all/blktrace-fix-dereference-after-null-check.patch | 66 debian/patches/bugfix/all/blktrace-protect-q-blk_trace-with-rcu.patch | 431 debian/patches/bugfix/all/f2fs-fix-to-avoid-memory-leakage-in-f2fs_listxattr.patch | 65 debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch | 17 debian/patches/bugfix/all/libertas-fix-two-buffer-overflows-at-parsing-bss-descriptor.patch | 64 debian/patches/bugfix/all/net-ipv6-add-net-argument-to-ip6_dst_lookup_flow.patch | 243 debian/patches/bugfix/all/net-ipv6_stub-use-ip6_dst_lookup_flow-instead-of-ip6.patch | 267 debian/patches/bugfix/all/random-try-to-actively-add-entropy-rather-than-passi.patch | 143 debian/patches/bugfix/all/tools-lib-api-fs-fs.c-fix-misuse-of-strncpy.patch | 41 debian/patches/bugfix/all/wimax-i2400-fix-memory-leak-in-i2400m_op_rfkill_sw_toggle.patch | 37 debian/patches/bugfix/all/wimax-i2400-fix-memory-leak.patch | 27 debian/patches/bugfix/powerpc/powerpc-vdso-make-vdso32-installation-conditional-in.patch | 31 debian/patches/debian/revert-objtool-fix-config_stack_validation-y-warning.patch | 12 debian/patches/features/all/ena/net-ena-add-MAX_QUEUES_EXT-get-feature-admin-command.patch | 60 debian/patches/features/all/ena/net-ena-fix-Free-napi-resources-when-ena_up-fails.patch | 34 debian/patches/features/all/ena/net-ena-fix-ena_com_fill_hash_function-implementatio.patch | 31 debian/patches/features/all/ena/net-ena-fix-incorrect-test-of-supported-hash-functio.patch | 36 debian/patches/features/all/ena/net-ena-fix-swapped-parameters-when-calling-ena_com_.patch | 32 debian/patches/features/all/lockdown/0002-Add-a-SysRq-option-to-lift-kernel-lockdown.patch | 285 debian/patches/features/all/lockdown/0029-efi-Lock-down-the-kernel-if-booted-in-secure-boot-mo.patch | 35 debian/patches/features/arm/ARM-dts-bcm283x-Correct-vchiq-compatible-string.patch | 10 debian/patches/series | 18 debian/rules.gen | 610 debian/tests/control | 2 drivers/acpi/acpi_lpss.c | 111 drivers/acpi/acpi_memhotplug.c | 2 drivers/acpi/acpi_watchdog.c | 15 drivers/acpi/acpica/dsfield.c | 2 drivers/acpi/acpica/dswload.c | 21 drivers/acpi/apei/ghes.c | 2 drivers/acpi/battery.c | 75 drivers/acpi/button.c | 16 drivers/acpi/device_pm.c | 94 drivers/acpi/processor_throttling.c | 7 drivers/acpi/video_detect.c | 13 drivers/ata/ahci.c | 8 drivers/ata/libahci.c | 1 drivers/ata/libata-core.c | 21 drivers/ata/libata-pmp.c | 1 drivers/ata/libata-scsi.c | 9 drivers/atm/eni.c | 4 drivers/atm/firestream.c | 3 drivers/atm/fore200e.c | 25 drivers/base/component.c | 8 drivers/base/core.c | 327 drivers/base/dd.c | 7 drivers/base/firmware_loader/fallback.c | 2 drivers/base/memory.c | 203 drivers/base/node.c | 52 drivers/base/platform.c | 12 drivers/base/power/main.c | 42 drivers/base/power/runtime.c | 44 drivers/base/power/wakeup.c | 2 drivers/bcma/driver_pci.c | 4 drivers/block/brd.c | 22 drivers/block/drbd/drbd_main.c | 2 drivers/block/floppy.c | 7 drivers/block/nbd.c | 10 drivers/block/null_blk_main.c | 10 drivers/block/rbd.c | 28 drivers/block/virtio_blk.c | 8 drivers/block/xen-blkfront.c | 17 drivers/bus/sunxi-rsb.c | 2 drivers/bus/ti-sysc.c | 18 drivers/char/hw_random/bcm2835-rng.c | 16 drivers/char/hw_random/imx-rngc.c | 4 drivers/char/hw_random/omap3-rom-rng.c | 17 drivers/char/ipmi/ipmi_msghandler.c | 9 drivers/char/ipmi/ipmi_ssif.c | 10 drivers/char/ipmi/kcs_bmc.c | 5 drivers/char/random.c | 82 drivers/char/tpm/eventlog/common.c | 12 drivers/char/tpm/eventlog/tpm1.c | 2 drivers/char/tpm/eventlog/tpm2.c | 2 drivers/char/tpm/tpm-chip.c | 4 drivers/char/tpm/tpm.h | 2 drivers/char/ttyprintk.c | 15 drivers/clk/actions/owl-factor.c | 7 drivers/clk/at91/clk-usb.c | 3 drivers/clk/clk-highbank.c | 1 drivers/clk/clk-qoriq.c | 1 drivers/clk/imx/clk-imx6q.c | 1 drivers/clk/imx/clk-imx6sx.c | 1 drivers/clk/imx/clk-imx7d.c | 1 drivers/clk/imx/clk-vf610.c | 1 drivers/clk/ingenic/jz4740-cgu.c | 2 drivers/clk/ingenic/jz4770-cgu.c | 4 drivers/clk/meson/axg.c | 10 drivers/clk/meson/gxbb.c | 5 drivers/clk/mmp/clk-of-mmp2.c | 2 drivers/clk/mvebu/armada-370.c | 4 drivers/clk/mvebu/armada-xp.c | 4 drivers/clk/mvebu/dove.c | 8 drivers/clk/mvebu/kirkwood.c | 2 drivers/clk/mvebu/mv98dx3236.c | 4 drivers/clk/qcom/clk-rcg2.c | 5 drivers/clk/qcom/gcc-msm8996.c | 36 drivers/clk/qcom/gcc-msm8998.c | 2 drivers/clk/samsung/clk-exynos4.c | 1 drivers/clk/socfpga/clk-pll-a10.c | 1 drivers/clk/socfpga/clk-pll.c | 1 drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 28 drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c | 6 drivers/clk/sunxi-ng/ccu-sun8i-a23.c | 2 drivers/clk/sunxi-ng/ccu-sun8i-v3s.c | 19 drivers/clk/sunxi-ng/ccu-sun8i-v3s.h | 6 drivers/clk/tegra/clk-tegra-periph.c | 6 drivers/clk/tegra/clk-tegra-pmc.c | 12 drivers/clk/ti/clk.c | 8 drivers/clk/uniphier/clk-uniphier-peri.c | 13 drivers/clocksource/bcm2835_timer.c | 5 drivers/clocksource/exynos_mct.c | 14 drivers/clocksource/timer-sun5i.c | 10 drivers/clocksource/timer-ti-dm.c | 1 drivers/cpufreq/brcmstb-avs-cpufreq.c | 12 drivers/cpufreq/imx6q-cpufreq.c | 3 drivers/cpufreq/powernv-cpufreq.c | 6 drivers/crypto/amcc/crypto4xx_trng.h | 4 drivers/crypto/atmel-aes.c | 37 drivers/crypto/atmel-sha.c | 7 drivers/crypto/axis/artpec6_crypto.c | 2 drivers/crypto/bcm/cipher.c | 6 drivers/crypto/caam/caamalg_desc.c | 16 drivers/crypto/caam/caamrng.c | 5 drivers/crypto/caam/error.c | 2 drivers/crypto/ccp/ccp-crypto-aes.c | 8 drivers/crypto/ccp/ccp-dev-v3.c | 1 drivers/crypto/ccp/ccp-ops.c | 67 drivers/crypto/ccree/cc_aead.c | 56 drivers/crypto/ccree/cc_aead.h | 1 drivers/crypto/ccree/cc_buffer_mgr.c | 108 drivers/crypto/ccree/cc_cipher.c | 2 drivers/crypto/ccree/cc_driver.h | 1 drivers/crypto/ccree/cc_pm.c | 30 drivers/crypto/ccree/cc_request_mgr.c | 51 drivers/crypto/ccree/cc_request_mgr.h | 8 drivers/crypto/chelsio/chcr_algo.c | 16 drivers/crypto/chelsio/chtls/chtls_cm.c | 27 drivers/crypto/chelsio/chtls/chtls_cm.h | 21 drivers/crypto/chelsio/chtls/chtls_hw.c | 3 drivers/crypto/geode-aes.c | 443 drivers/crypto/geode-aes.h | 15 drivers/crypto/hisilicon/sec/sec_algs.c | 44 drivers/crypto/inside-secure/safexcel_hash.c | 10 drivers/crypto/mxs-dcp.c | 54 drivers/crypto/picoxcell_crypto.c | 15 drivers/crypto/sunxi-ss/sun4i-ss-hash.c | 21 drivers/crypto/talitos.c | 160 drivers/crypto/talitos.h | 2 drivers/devfreq/Kconfig | 3 drivers/devfreq/devfreq.c | 13 drivers/devfreq/event/Kconfig | 2 drivers/dma/coh901318.c | 4 drivers/dma/dma-axi-dmac.c | 2 drivers/dma/dmaengine.c | 4 drivers/dma/dw/platform.c | 14 drivers/dma/hsu/hsu.c | 4 drivers/dma/imx-sdma.c | 64 drivers/dma/mv_xor.c | 2 drivers/dma/tegra20-apb-dma.c | 6 drivers/dma/tegra210-adma.c | 72 drivers/dma/ti/edma.c | 6 drivers/edac/amd64_edac.c | 1 drivers/edac/edac_mc.c | 12 drivers/extcon/extcon-axp288.c | 32 drivers/firmware/arm_scmi/clock.c | 2 drivers/firmware/arm_scmi/driver.c | 4 drivers/firmware/arm_scmi/sensors.c | 4 drivers/firmware/arm_sdei.c | 32 drivers/firmware/dmi_scan.c | 2 drivers/firmware/efi/efi.c | 2 drivers/firmware/efi/efivars.c | 32 drivers/firmware/efi/runtime-wrappers.c | 53 drivers/firmware/google/coreboot_table-of.c | 28 drivers/fsi/fsi-core.c | 32 drivers/fsi/fsi-sbefifo.c | 4 drivers/gpio/Kconfig | 1 drivers/gpio/gpio-aspeed.c | 2 drivers/gpio/gpio-grgpio.c | 10 drivers/gpio/gpio-zynq.c | 23 drivers/gpio/gpiolib-acpi.c | 140 drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 20 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 6 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 1 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 37 drivers/gpu/drm/amd/amdgpu/soc15.c | 7 drivers/gpu/drm/amd/amdgpu/soc15_common.h | 1 drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 2 drivers/gpu/drm/amd/amdkfd/kfd_device.c | 4 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 13 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 1 drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_math.h | 40 drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c | 34 drivers/gpu/drm/amd/display/dc/core/dc_link.c | 3 drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 11 drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c | 4 drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c | 2 drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h | 2 drivers/gpu/drm/amd/display/dc/inc/dcn_calc_math.h | 40 drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h | 2 drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c | 23 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 5 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 8 drivers/gpu/drm/bochs/bochs_hw.c | 6 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 46 drivers/gpu/drm/drm_context.c | 15 drivers/gpu/drm/drm_debugfs_crc.c | 4 drivers/gpu/drm/drm_dp_mst_topology.c | 8 drivers/gpu/drm/drm_fb_helper.c | 102 drivers/gpu/drm/drm_lease.c | 3 drivers/gpu/drm/drm_pci.c | 25 drivers/gpu/drm/drm_rect.c | 7 drivers/gpu/drm/etnaviv/etnaviv_buffer.c | 10 drivers/gpu/drm/etnaviv/etnaviv_dump.c | 2 drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 2 drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 1 drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 6 drivers/gpu/drm/etnaviv/etnaviv_mmu.h | 2 drivers/gpu/drm/etnaviv/etnaviv_perfmon.c | 109 drivers/gpu/drm/exynos/exynos_drm_dsi.c | 12 drivers/gpu/drm/gma500/framebuffer.c | 8 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c | 1 drivers/gpu/drm/i915/gvt/dmabuf.c | 2 drivers/gpu/drm/i915/gvt/vgpu.c | 14 drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 26 drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 24 drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 2 drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c | 2 drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c | 2 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 4 drivers/gpu/drm/msm/dsi/dsi_host.c | 6 drivers/gpu/drm/msm/dsi/dsi_manager.c | 7 drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c | 6 drivers/gpu/drm/msm/msm_drv.c | 8 drivers/gpu/drm/msm/msm_gem.c | 47 drivers/gpu/drm/nouveau/dispnv50/wndw.c | 2 drivers/gpu/drm/nouveau/nouveau_abi16.c | 1 drivers/gpu/drm/nouveau/nouveau_fence.c | 2 drivers/gpu/drm/nouveau/nouveau_ttm.c | 4 drivers/gpu/drm/nouveau/nvkm/core/memory.c | 2 drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c | 2 drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c | 21 drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c | 1 drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c | 2 drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c | 4 drivers/gpu/drm/nouveau/nvkm/subdev/secboot/gm20b.c | 5 drivers/gpu/drm/panel/panel-lvds.c | 21 drivers/gpu/drm/radeon/cik.c | 4 drivers/gpu/drm/radeon/r600.c | 4 drivers/gpu/drm/radeon/radeon_display.c | 2 drivers/gpu/drm/radeon/si.c | 4 drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 2 drivers/gpu/drm/rcar-du/rcar_du_kms.c | 2 drivers/gpu/drm/rcar-du/rcar_lvds.c | 8 drivers/gpu/drm/shmobile/shmob_drm_drv.c | 4 drivers/gpu/drm/sti/sti_hda.c | 1 drivers/gpu/drm/sti/sti_hdmi.c | 1 drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c | 2 drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 3 drivers/gpu/drm/sun4i/sun8i_mixer.c | 68 drivers/gpu/drm/sun4i/sun8i_vi_layer.c | 24 drivers/gpu/drm/vc4/vc4_hdmi.c | 20 drivers/gpu/drm/virtio/virtgpu_vq.c | 5 drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c | 6 drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c | 4 drivers/gpu/drm/xen/xen_drm_front_gem.c | 13 drivers/hid/hid-alps.c | 2 drivers/hid/hid-apple.c | 3 drivers/hid/hid-core.c | 4 drivers/hid/hid-google-hammer.c | 2 drivers/hid/hid-ids.h | 4 drivers/hid/hid-ite.c | 4 drivers/hid/hid-multitouch.c | 5 drivers/hid/hid-quirks.c | 1 drivers/hid/hid-steam.c | 4 drivers/hid/i2c-hid/i2c-hid-core.c | 16 drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c | 8 drivers/hid/usbhid/hiddev.c | 2 drivers/hv/channel_mgmt.c | 3 drivers/hv/hv_balloon.c | 13 drivers/hv/vmbus_drv.c | 60 drivers/hwmon/adt7462.c | 2 drivers/hwmon/adt7475.c | 5 drivers/hwmon/hwmon.c | 68 drivers/hwmon/lm75.c | 2 drivers/hwmon/nct7802.c | 4 drivers/hwmon/pmbus/ltc2978.c | 4 drivers/hwmon/pmbus/tps53679.c | 9 drivers/hwmon/shtc1.c | 2 drivers/hwmon/w83627hf.c | 42 drivers/hwtracing/coresight/coresight-catu.h | 5 drivers/hwtracing/coresight/coresight-etb10.c | 4 drivers/hwtracing/coresight/coresight-etm-perf.c | 7 drivers/hwtracing/coresight/coresight-tmc-etf.c | 4 drivers/hwtracing/coresight/coresight-tmc-etr.c | 5 drivers/hwtracing/intel_th/msu.c | 6 drivers/hwtracing/intel_th/pci.c | 5 drivers/i2c/busses/i2c-altera.c | 2 drivers/i2c/busses/i2c-gpio.c | 2 drivers/i2c/busses/i2c-hix5hd2.c | 1 drivers/i2c/busses/i2c-jz4780.c | 36 drivers/i2c/busses/i2c-st.c | 1 drivers/i2c/busses/i2c-stm32.c | 16 drivers/i2c/busses/i2c-stm32f7.c | 13 drivers/i2c/i2c-core-acpi.c | 10 drivers/ide/cmd64x.c | 3 drivers/ide/serverworks.c | 6 drivers/iio/accel/st_accel_i2c.c | 2 drivers/iio/adc/at91-sama5d2_adc.c | 15 drivers/iio/dac/ad5380.c | 2 drivers/iio/gyro/st_gyro_core.c | 75 drivers/iio/light/si1133.c | 37 drivers/iio/light/tsl2772.c | 16 drivers/iio/light/vcnl4000.c | 7 drivers/iio/magnetometer/ak8974.c | 2 drivers/iio/trigger/stm32-timer-trigger.c | 11 drivers/infiniband/core/addr.c | 2 drivers/infiniband/core/cm.c | 1 drivers/infiniband/core/cma.c | 16 drivers/infiniband/core/iwcm.c | 4 drivers/infiniband/core/sa_query.c | 4 drivers/infiniband/core/security.c | 31 drivers/infiniband/core/ucma.c | 49 drivers/infiniband/core/umem_odp.c | 2 drivers/infiniband/core/uverbs_cmd.c | 15 drivers/infiniband/core/uverbs_main.c | 32 drivers/infiniband/core/uverbs_uapi.c | 2 drivers/infiniband/hw/bnxt_re/ib_verbs.c | 1 drivers/infiniband/hw/bnxt_re/qplib_fp.c | 1 drivers/infiniband/hw/cxgb4/cm.c | 24 drivers/infiniband/hw/hfi1/affinity.c | 2 drivers/infiniband/hw/hfi1/chip.c | 36 drivers/infiniband/hw/hfi1/chip.h | 1 drivers/infiniband/hw/hfi1/driver.c | 71 drivers/infiniband/hw/hfi1/file_ops.c | 52 drivers/infiniband/hw/hfi1/hfi.h | 42 drivers/infiniband/hw/hfi1/pio.c | 5 drivers/infiniband/hw/hfi1/rc.c | 32 drivers/infiniband/hw/hfi1/sysfs.c | 26 drivers/infiniband/hw/hfi1/uc.c | 2 drivers/infiniband/hw/hfi1/ud.c | 33 drivers/infiniband/hw/hfi1/user_exp_rcv.c | 5 drivers/infiniband/hw/hfi1/user_sdma.c | 17 drivers/infiniband/hw/hfi1/verbs.c | 8 drivers/infiniband/hw/hns/hns_roce_hem.c | 19 drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 6 drivers/infiniband/hw/hns/hns_roce_qp.c | 1 drivers/infiniband/hw/mlx4/main.c | 20 drivers/infiniband/hw/mlx5/gsi.c | 3 drivers/infiniband/hw/mlx5/ib_rep.c | 4 drivers/infiniband/hw/mlx5/main.c | 59 drivers/infiniband/hw/mlx5/qp.c | 25 drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 2 drivers/infiniband/hw/qedr/verbs.c | 27 drivers/infiniband/hw/qib/qib_verbs.c | 2 drivers/infiniband/hw/usnic/usnic_ib_verbs.c | 2 drivers/infiniband/sw/rdmavt/qp.c | 84 drivers/infiniband/sw/rxe/rxe_comp.c | 8 drivers/infiniband/sw/rxe/rxe_cq.c | 4 drivers/infiniband/sw/rxe/rxe_net.c | 3 drivers/infiniband/sw/rxe/rxe_pool.c | 26 drivers/infiniband/sw/rxe/rxe_qp.c | 5 drivers/infiniband/sw/rxe/rxe_verbs.h | 2 drivers/infiniband/ulp/iser/iscsi_iser.h | 2 drivers/infiniband/ulp/iser/iser_memory.c | 10 drivers/input/keyboard/nomadik-ske-keypad.c | 2 drivers/input/misc/keyspan_remote.c | 9 drivers/input/misc/pm8xxx-vibrator.c | 2 drivers/input/mouse/synaptics.c | 5 drivers/input/rmi4/rmi_smbus.c | 2 drivers/input/serio/i8042-x86ia64io.h | 11 drivers/input/tablet/aiptek.c | 6 drivers/input/tablet/gtco.c | 10 drivers/input/tablet/pegasus_notetaker.c | 2 drivers/input/touchscreen/edt-ft5x06.c | 7 drivers/input/touchscreen/raydium_i2c_ts.c | 8 drivers/input/touchscreen/sun4i-ts.c | 6 drivers/input/touchscreen/sur40.c | 2 drivers/iommu/amd_iommu.c | 39 drivers/iommu/amd_iommu_init.c | 3 drivers/iommu/amd_iommu_types.h | 2 drivers/iommu/arm-smmu-v3.c | 4 drivers/iommu/dma-iommu.c | 16 drivers/iommu/dmar.c | 22 drivers/iommu/intel-iommu.c | 52 drivers/iommu/intel-svm.c | 11 drivers/iommu/iommu-debugfs.c | 23 drivers/iommu/iommu.c | 8 drivers/iommu/mtk_iommu.c | 26 drivers/iommu/qcom_iommu.c | 28 drivers/irqchip/irq-gic-v3-its.c | 10 drivers/irqchip/irq-gic-v3.c | 9 drivers/irqchip/irq-mbigen.c | 9 drivers/irqchip/irq-versatile-fpga.c | 18 drivers/leds/led-triggers.c | 4 drivers/leds/leds-pca963x.c | 8 drivers/lightnvm/pblk-rb.c | 2 drivers/macintosh/therm_windtunnel.c | 52 drivers/macintosh/windfarm_ad7417_sensor.c | 7 drivers/macintosh/windfarm_fcu_controls.c | 7 drivers/macintosh/windfarm_lm75_sensor.c | 16 drivers/macintosh/windfarm_lm87_sensor.c | 7 drivers/macintosh/windfarm_max6690_sensor.c | 7 drivers/macintosh/windfarm_smu_sat.c | 7 drivers/mailbox/mtk-cmdq-mailbox.c | 3 drivers/mailbox/qcom-apcs-ipc-mailbox.c | 2 drivers/mailbox/ti-msgmgr.c | 2 drivers/md/bcache/bcache.h | 3 drivers/md/bcache/bset.h | 3 drivers/md/bcache/debug.c | 5 drivers/md/bcache/request.c | 17 drivers/md/bcache/super.c | 3 drivers/md/bcache/sysfs.c | 22 drivers/md/dm-bio-record.h | 15 drivers/md/dm-cache-target.c | 4 drivers/md/dm-crypt.c | 10 drivers/md/dm-integrity.c | 59 drivers/md/dm-verity-fec.c | 1 drivers/md/dm-writecache.c | 61 drivers/md/dm-zoned-metadata.c | 24 drivers/md/dm.c | 10 drivers/md/md.c | 2 drivers/md/persistent-data/dm-space-map-common.c | 27 drivers/md/persistent-data/dm-space-map-common.h | 2 drivers/md/persistent-data/dm-space-map-disk.c | 6 drivers/md/persistent-data/dm-space-map-metadata.c | 5 drivers/media/i2c/adv748x/adv748x.h | 8 drivers/media/i2c/mt9v032.c | 10 drivers/media/i2c/ov2659.c | 2 drivers/media/i2c/ov5695.c | 49 drivers/media/i2c/tw9910.c | 2 drivers/media/i2c/video-i2c.c | 2 drivers/media/pci/cx18/cx18-fileops.c | 2 drivers/media/pci/cx23885/cx23885-cards.c | 24 drivers/media/pci/cx23885/cx23885-dvb.c | 5 drivers/media/pci/cx23885/cx23885-video.c | 3 drivers/media/pci/cx23885/cx23885.h | 1 drivers/media/pci/ivtv/ivtv-fileops.c | 2 drivers/media/pci/pt1/pt1.c | 54 drivers/media/pci/tw5864/tw5864-video.c | 4 drivers/media/platform/atmel/atmel-isi.c | 2 drivers/media/platform/davinci/isif.c | 9 drivers/media/platform/davinci/vpbe.c | 2 drivers/media/platform/omap/omap_vout.c | 15 drivers/media/platform/qcom/venus/hfi_parser.c | 1 drivers/media/platform/rcar-vin/rcar-core.c | 2 drivers/media/platform/s5p-jpeg/jpeg-core.c | 2 drivers/media/platform/sti/bdisp/bdisp-hw.c | 6 drivers/media/platform/ti-vpe/cal.c | 16 drivers/media/platform/vivid/vivid-osd.c | 2 drivers/media/radio/si470x/radio-si470x-i2c.c | 2 drivers/media/radio/wl128x/fmdrv_common.c | 5 drivers/media/rc/iguanair.c | 2 drivers/media/rc/lirc_dev.c | 2 drivers/media/rc/rc-main.c | 27 drivers/media/usb/b2c2/flexcop-usb.c | 6 drivers/media/usb/dvb-usb/af9005.c | 2 drivers/media/usb/dvb-usb/dib0700_core.c | 4 drivers/media/usb/dvb-usb/digitv.c | 10 drivers/media/usb/dvb-usb/dvb-usb-urb.c | 2 drivers/media/usb/dvb-usb/vp7045.c | 21 drivers/media/usb/em28xx/em28xx-core.c | 2 drivers/media/usb/gspca/gspca.c | 2 drivers/media/usb/gspca/ov519.c | 10 drivers/media/usb/gspca/stv06xx/stv06xx.c | 19 drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c | 4 drivers/media/usb/gspca/xirlink_cit.c | 18 drivers/media/usb/usbtv/usbtv-core.c | 2 drivers/media/usb/usbtv/usbtv-video.c | 5 drivers/media/usb/uvc/uvc_driver.c | 12 drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 148 drivers/media/v4l2-core/v4l2-ioctl.c | 24 drivers/media/v4l2-core/v4l2-mem2mem.c | 4 drivers/media/v4l2-core/videobuf-dma-sg.c | 5 drivers/memory/tegra/mc.c | 11 drivers/mfd/axp20x.c | 2 drivers/mfd/da9062-core.c | 2 drivers/mfd/dln2.c | 18 drivers/mfd/intel-lpss-pci.c | 28 drivers/mfd/intel-lpss.c | 1 drivers/mfd/rn5t618.c | 1 drivers/misc/altera-stapl/altera.c | 12 drivers/misc/aspeed-lpc-snoop.c | 4 drivers/misc/cardreader/rts5227.c | 3 drivers/misc/cardreader/rts5249.c | 2 drivers/misc/cardreader/rts5260.c | 2 drivers/misc/echo/echo.c | 2 drivers/misc/mei/hw-me-regs.h | 6 drivers/misc/mei/main.c | 4 drivers/misc/mei/pci-me.c | 4 drivers/misc/mic/card/mic_x100.c | 28 drivers/misc/pci_endpoint_test.c | 14 drivers/misc/sgi-xp/xpc_partition.c | 2 drivers/mmc/core/core.c | 5 drivers/mmc/core/host.c | 2 drivers/mmc/core/mmc.c | 7 drivers/mmc/core/mmc_ops.c | 8 drivers/mmc/core/quirks.h | 7 drivers/mmc/host/Kconfig | 2 drivers/mmc/host/mmc_spi.c | 11 drivers/mmc/host/rtsx_pci_sdmmc.c | 13 drivers/mmc/host/sdhci-brcmstb.c | 4 drivers/mmc/host/sdhci-of-at91.c | 17 drivers/mmc/host/sdhci-omap.c | 151 drivers/mmc/host/sdhci-tegra.c | 5 drivers/mmc/host/sdhci.c | 10 drivers/mtd/devices/phram.c | 15 drivers/mtd/lpddr/lpddr_cmds.c | 1 drivers/mtd/nand/onenand/onenand_base.c | 82 drivers/mtd/nand/spi/core.c | 18 drivers/mtd/parsers/sharpslpart.c | 4 drivers/mtd/ubi/fastmap.c | 23 drivers/net/bonding/bond_alb.c | 64 drivers/net/can/dev.c | 1 drivers/net/can/slcan.c | 19 drivers/net/dsa/b53/b53_common.c | 93 drivers/net/dsa/b53/b53_priv.h | 3 drivers/net/dsa/bcm_sf2.c | 10 drivers/net/dsa/bcm_sf2_cfp.c | 9 drivers/net/dsa/mt7530.c | 20 drivers/net/dsa/mt7530.h | 7 drivers/net/dsa/qca8k.c | 12 drivers/net/dsa/qca8k.h | 1 drivers/net/ethernet/amazon/ena/ena_com.c | 51 drivers/net/ethernet/amazon/ena/ena_com.h | 9 drivers/net/ethernet/amazon/ena/ena_ethtool.c | 50 drivers/net/ethernet/amazon/ena/ena_netdev.c | 7 drivers/net/ethernet/amazon/ena/ena_netdev.h | 2 drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 2 drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 2 drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 8 drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 7 drivers/net/ethernet/aquantia/atlantic/aq_vec.c | 15 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c | 4 drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 4 drivers/net/ethernet/broadcom/b44.c | 9 drivers/net/ethernet/broadcom/bcmsysport.c | 7 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 32 drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 17 drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 20 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 4 drivers/net/ethernet/cadence/macb_main.c | 14 drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 62 drivers/net/ethernet/cavium/thunder/thunder_bgx.h | 9 drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 2 drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c | 3 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 2 drivers/net/ethernet/chelsio/cxgb4/cxgb4_ptp.c | 3 drivers/net/ethernet/chelsio/cxgb4/l2t.c | 3 drivers/net/ethernet/chelsio/cxgb4/smt.c | 4 drivers/net/ethernet/cisco/enic/enic_main.c | 2 drivers/net/ethernet/dec/tulip/dmfe.c | 7 drivers/net/ethernet/dec/tulip/uli526x.c | 4 drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 51 drivers/net/ethernet/freescale/fec_main.c | 6 drivers/net/ethernet/freescale/fman/Kconfig | 28 drivers/net/ethernet/freescale/fman/fman.c | 18 drivers/net/ethernet/freescale/fman/fman.h | 5 drivers/net/ethernet/freescale/fman/fman_memac.c | 4 drivers/net/ethernet/freescale/gianfar.c | 10 drivers/net/ethernet/freescale/xgmac_mdio.c | 7 drivers/net/ethernet/hisilicon/hix5hd2_gmac.c | 2 drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 17 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 21 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 2 drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 4 drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 5 drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c | 3 drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c | 52 drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h | 2 drivers/net/ethernet/huawei/hinic/hinic_hw_if.h | 1 drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c | 5 drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h | 1 drivers/net/ethernet/huawei/hinic/hinic_rx.c | 5 drivers/net/ethernet/ibm/ehea/ehea_main.c | 2 drivers/net/ethernet/intel/i40e/i40e_common.c | 91 drivers/net/ethernet/intel/ice/ice_ethtool.c | 7 drivers/net/ethernet/intel/igb/e1000_82575.c | 8 drivers/net/ethernet/intel/igb/igb_ethtool.c | 2 drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 4 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 53 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 5 drivers/net/ethernet/marvell/mvneta.c | 30 drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 11 drivers/net/ethernet/mellanox/mlx5/core/en_stats.c | 3 drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c | 2 drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c | 3 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 6 drivers/net/ethernet/mellanox/mlx5/core/qp.c | 5 drivers/net/ethernet/mellanox/mlxsw/reg.h | 22 drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 25 drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c | 3 drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c | 8 drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c | 8 drivers/net/ethernet/micrel/ks8851_mll.c | 93 drivers/net/ethernet/mscc/ocelot_board.c | 8 drivers/net/ethernet/natsemi/sonic.c | 386 drivers/net/ethernet/natsemi/sonic.h | 44 drivers/net/ethernet/neterion/vxge/vxge-config.h | 2 drivers/net/ethernet/neterion/vxge/vxge-main.h | 14 drivers/net/ethernet/netronome/nfp/bpf/jit.c | 13 drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h | 2 drivers/net/ethernet/ni/nixge.c | 2 drivers/net/ethernet/pasemi/pasemi_mac.c | 2 drivers/net/ethernet/qlogic/qed/qed_iwarp.c | 17 drivers/net/ethernet/qlogic/qed/qed_l2.c | 34 drivers/net/ethernet/qlogic/qede/qede.h | 2 drivers/net/ethernet/qlogic/qede/qede_rdma.c | 29 drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | 3 drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | 2 drivers/net/ethernet/qualcomm/qca_spi.c | 9 drivers/net/ethernet/qualcomm/qca_spi.h | 1 drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 211 drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h | 3 drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c | 7 drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 8 drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h | 1 drivers/net/ethernet/realtek/r8169.c | 2 drivers/net/ethernet/renesas/sh_eth.c | 6 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c | 2 drivers/net/ethernet/sfc/efx.c | 1 drivers/net/ethernet/sfc/ptp.c | 38 drivers/net/ethernet/smsc/smc911x.c | 2 drivers/net/ethernet/socionext/netsec.c | 20 drivers/net/ethernet/socionext/sni_ave.c | 2 drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c | 2 drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 2 drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 2 drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | 2 drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c | 5 drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 2 drivers/net/ethernet/stmicro/stmmac/dwmac5.c | 1 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 2 drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 2 drivers/net/geneve.c | 8 drivers/net/gtp.c | 14 drivers/net/hyperv/hyperv_net.h | 3 drivers/net/hyperv/netvsc.c | 40 drivers/net/hyperv/netvsc_drv.c | 16 drivers/net/ipvlan/ipvlan_core.c | 19 drivers/net/ipvlan/ipvlan_main.c | 5 drivers/net/macsec.c | 15 drivers/net/macvlan.c | 2 drivers/net/phy/fixed_phy.c | 6 drivers/net/phy/mdio-bcm-iproc.c | 20 drivers/net/phy/mdio-mux-bcm-iproc.c | 7 drivers/net/phy/mdio_bus.c | 11 drivers/net/phy/micrel.c | 8 drivers/net/phy/phy_device.c | 13 drivers/net/ppp/ppp_async.c | 18 drivers/net/slip/slhc.c | 14 drivers/net/slip/slip.c | 15 drivers/net/team/team.c | 2 drivers/net/tun.c | 4 drivers/net/usb/lan78xx.c | 15 drivers/net/usb/qmi_wwan.c | 46 drivers/net/usb/r8152.c | 17 drivers/net/vrf.c | 19 drivers/net/vxlan.c | 18 drivers/net/wan/fsl_ucc_hdlc.c | 5 drivers/net/wan/ixp4xx_hss.c | 4 drivers/net/wan/sdla.c | 2 drivers/net/wimax/i2400m/op-rfkill.c | 1 drivers/net/wireless/ath/ath10k/mac.c | 4 drivers/net/wireless/ath/ath10k/pci.c | 19 drivers/net/wireless/ath/ath10k/sdio.c | 29 drivers/net/wireless/ath/ath10k/wmi-tlv.c | 2 drivers/net/wireless/ath/ath10k/wmi.c | 6 drivers/net/wireless/ath/ath9k/dynack.c | 8 drivers/net/wireless/ath/ath9k/hif_usb.c | 2 drivers/net/wireless/ath/ath9k/main.c | 3 drivers/net/wireless/ath/wcn36xx/smd.c | 192 drivers/net/wireless/ath/wil6210/debugfs.c | 29 drivers/net/wireless/ath/wil6210/interrupt.c | 12 drivers/net/wireless/ath/wil6210/main.c | 5 drivers/net/wireless/ath/wil6210/txrx.c | 4 drivers/net/wireless/ath/wil6210/txrx_edma.c | 14 drivers/net/wireless/ath/wil6210/wil6210.h | 3 drivers/net/wireless/ath/wil6210/wmi.c | 2 drivers/net/wireless/broadcom/b43legacy/main.c | 5 drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 8 drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 10 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 1 drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 13 drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 5 drivers/net/wireless/cisco/airo.c | 20 drivers/net/wireless/intel/ipw2x00/ipw2100.c | 7 drivers/net/wireless/intel/ipw2x00/ipw2200.c | 5 drivers/net/wireless/intel/iwlegacy/3945-mac.c | 5 drivers/net/wireless/intel/iwlegacy/4965-mac.c | 5 drivers/net/wireless/intel/iwlegacy/common.c | 2 drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h | 14 drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c | 58 drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h | 6 drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 12 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 5 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 2 drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 29 drivers/net/wireless/intel/iwlwifi/mvm/tt.c | 4 drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 15 drivers/net/wireless/intersil/hostap/hostap_ap.c | 2 drivers/net/wireless/intersil/orinoco/orinoco_usb.c | 7 drivers/net/wireless/mac80211_hwsim.c | 12 drivers/net/wireless/marvell/libertas/cfg.c | 18 drivers/net/wireless/marvell/libertas_tf/cmd.c | 2 drivers/net/wireless/marvell/mwifiex/main.h | 13 drivers/net/wireless/marvell/mwifiex/scan.c | 7 drivers/net/wireless/marvell/mwifiex/sta_ioctl.c | 1 drivers/net/wireless/marvell/mwifiex/tdls.c | 75 drivers/net/wireless/marvell/mwifiex/wmm.c | 4 drivers/net/wireless/mediatek/mt76/dma.c | 9 drivers/net/wireless/mediatek/mt76/usb.c | 14 drivers/net/wireless/mediatek/mt7601u/phy.c | 2 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 drivers/net/wireless/realtek/rtlwifi/debug.c | 2 drivers/net/wireless/realtek/rtlwifi/pci.c | 10 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 71 drivers/net/wireless/rsi/rsi_91x_hal.c | 12 drivers/net/wireless/rsi/rsi_91x_sdio.c | 18 drivers/net/wireless/rsi/rsi_91x_usb.c | 44 drivers/net/wireless/zydas/zd1211rw/zd_usb.c | 2 drivers/nfc/fdp/fdp.c | 5 drivers/nfc/pn544/i2c.c | 1 drivers/nfc/pn544/pn544.c | 2 drivers/nfc/port100.c | 2 drivers/ntb/hw/idt/ntb_hw_idt.c | 8 drivers/ntb/hw/mscc/ntb_hw_switchtec.c | 4 drivers/nvdimm/bus.c | 6 drivers/nvme/host/core.c | 15 drivers/nvme/host/fc.c | 14 drivers/nvme/host/multipath.c | 1 drivers/nvme/host/pci.c | 2 drivers/nvme/host/rdma.c | 8 drivers/nvme/target/fcloop.c | 1 drivers/nvmem/imx-ocotp.c | 39 drivers/of/Kconfig | 4 drivers/of/address.c | 6 drivers/of/of_mdio.c | 3 drivers/of/overlay.c | 2 drivers/of/unittest.c | 16 drivers/opp/core.c | 12 drivers/opp/of.c | 20 drivers/opp/opp.h | 6 drivers/pci/controller/dwc/pci-keystone-dw.c | 2 drivers/pci/controller/dwc/pcie-designware-ep.c | 10 drivers/pci/controller/pci-tegra.c | 2 drivers/pci/controller/pcie-iproc.c | 34 drivers/pci/controller/pcie-mobiveil.c | 8 drivers/pci/controller/pcie-rockchip-ep.c | 2 drivers/pci/endpoint/functions/pci-epf-test.c | 4 drivers/pci/endpoint/pci-epc-mem.c | 10 drivers/pci/hotplug/pciehp_hpc.c | 14 drivers/pci/iov.c | 9 drivers/pci/pci-driver.c | 16 drivers/pci/pci.c | 54 drivers/pci/pcie/aspm.c | 4 drivers/pci/quirks.c | 194 drivers/pci/setup-bus.c | 20 drivers/pci/switch/switchtec.c | 8 drivers/perf/arm_pmu_acpi.c | 7 drivers/phy/broadcom/phy-brcm-usb.c | 8 drivers/phy/motorola/phy-cpcap-usb.c | 18 drivers/phy/motorola/phy-mapphone-mdm6600.c | 27 drivers/phy/qualcomm/phy-qcom-apq8064-sata.c | 2 drivers/phy/qualcomm/phy-qcom-qmp.c | 2 drivers/phy/qualcomm/phy-qcom-qusb2.c | 2 drivers/pinctrl/bcm/pinctrl-iproc-gpio.c | 94 drivers/pinctrl/core.c | 1 drivers/pinctrl/intel/pinctrl-baytrail.c | 8 drivers/pinctrl/meson/pinctrl-meson-gxl.c | 16 drivers/pinctrl/sh-pfc/pfc-emev2.c | 20 drivers/pinctrl/sh-pfc/pfc-r8a7740.c | 3 drivers/pinctrl/sh-pfc/pfc-r8a7778.c | 4 drivers/pinctrl/sh-pfc/pfc-r8a7791.c | 8 drivers/pinctrl/sh-pfc/pfc-r8a7792.c | 1 drivers/pinctrl/sh-pfc/pfc-r8a7794.c | 2 drivers/pinctrl/sh-pfc/pfc-r8a77970.c | 2 drivers/pinctrl/sh-pfc/pfc-r8a77980.c | 2 drivers/pinctrl/sh-pfc/pfc-r8a77995.c | 8 drivers/pinctrl/sh-pfc/pfc-sh7264.c | 9 drivers/pinctrl/sh-pfc/pfc-sh7269.c | 41 drivers/pinctrl/sh-pfc/pfc-sh73a0.c | 4 drivers/pinctrl/sh-pfc/pfc-sh7734.c | 4 drivers/platform/mips/cpu_hwmon.c | 2 drivers/platform/x86/alienware-wmi.c | 19 drivers/platform/x86/dell-laptop.c | 26 drivers/platform/x86/gpd-pocket-fan.c | 2 drivers/platform/x86/intel_mid_powerbtn.c | 5 drivers/platform/x86/intel_scu_ipc.c | 21 drivers/platform/x86/pmc_atom.c | 8 drivers/platform/x86/wmi.c | 3 drivers/power/supply/axp288_charger.c | 57 drivers/power/supply/axp288_fuel_gauge.c | 4 drivers/power/supply/bq27xxx_battery.c | 5 drivers/power/supply/ltc2941-battery-gauge.c | 2 drivers/power/supply/power_supply_core.c | 10 drivers/pwm/pwm-lpss.c | 6 drivers/pwm/pwm-meson.c | 9 drivers/pwm/pwm-omap-dmtimer.c | 54 drivers/pwm/pwm-pca9685.c | 89 drivers/rapidio/rio_cm.c | 4 drivers/regulator/lp87565-regulator.c | 2 drivers/regulator/pv88060-regulator.c | 2 drivers/regulator/pv88080-regulator.c | 2 drivers/regulator/pv88090-regulator.c | 2 drivers/regulator/rk808-regulator.c | 2 drivers/regulator/tps65086-regulator.c | 4 drivers/regulator/wm831x-dcdc.c | 4 drivers/remoteproc/qcom_q6v5_pil.c | 12 drivers/remoteproc/remoteproc_core.c | 2 drivers/reset/reset-uniphier.c | 13 drivers/rpmsg/qcom_glink_native.c | 3 drivers/rtc/Kconfig | 1 drivers/rtc/rtc-88pm80x.c | 21 drivers/rtc/rtc-88pm860x.c | 35 drivers/rtc/rtc-cmos.c | 2 drivers/rtc/rtc-ds1307.c | 7 drivers/rtc/rtc-ds1672.c | 3 drivers/rtc/rtc-hym8563.c | 2 drivers/rtc/rtc-mc146818-lib.c | 2 drivers/rtc/rtc-mt6397.c | 9 drivers/rtc/rtc-omap.c | 4 drivers/rtc/rtc-pcf2127.c | 32 drivers/rtc/rtc-pcf8563.c | 13 drivers/rtc/rtc-pm8xxx.c | 6 drivers/rtc/rtc-rv3029c2.c | 16 drivers/s390/cio/blacklist.c | 5 drivers/s390/cio/qdio_setup.c | 3 drivers/s390/crypto/ap_bus.h | 4 drivers/s390/crypto/ap_card.c | 8 drivers/s390/crypto/ap_queue.c | 6 drivers/s390/crypto/zcrypt_api.c | 16 drivers/s390/net/qeth_core_main.c | 36 drivers/s390/net/qeth_l2_main.c | 52 drivers/s390/scsi/zfcp_erp.c | 2 drivers/scsi/aic7xxx/aic7xxx_core.c | 2 drivers/scsi/csiostor/csio_scsi.c | 2 drivers/scsi/fnic/fnic_isr.c | 4 drivers/scsi/fnic/fnic_scsi.c | 3 drivers/scsi/ipr.c | 3 drivers/scsi/ipr.h | 1 drivers/scsi/iscsi_tcp.c | 4 drivers/scsi/libfc/fc_disc.c | 2 drivers/scsi/libfc/fc_exch.c | 2 drivers/scsi/lpfc/lpfc_nvme.c | 2 drivers/scsi/megaraid/megaraid_sas_base.c | 7 drivers/scsi/megaraid/megaraid_sas_fusion.c | 8 drivers/scsi/megaraid/megaraid_sas_fusion.h | 1 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 8 drivers/scsi/pm8001/pm8001_sas.c | 6 drivers/scsi/pm8001/pm80xx_hwi.c | 2 drivers/scsi/pm8001/pm80xx_hwi.h | 2 drivers/scsi/qla2xxx/qla_dbg.c | 6 drivers/scsi/qla2xxx/qla_dbg.h | 6 drivers/scsi/qla2xxx/qla_isr.c | 12 drivers/scsi/qla2xxx/qla_mbx.c | 3 drivers/scsi/qla2xxx/qla_nvme.c | 1 drivers/scsi/qla2xxx/qla_nx.c | 7 drivers/scsi/qla2xxx/qla_os.c | 34 drivers/scsi/qla2xxx/qla_target.c | 21 drivers/scsi/qla4xxx/ql4_os.c | 2 drivers/scsi/scsi_transport_iscsi.c | 33 drivers/scsi/sd.c | 12 drivers/scsi/sg.c | 4 drivers/scsi/ufs/ufshcd.c | 35 drivers/scsi/ufs/ufshcd.h | 2 drivers/soc/amlogic/meson-gx-pwrc-vpu.c | 8 drivers/soc/amlogic/meson-gx-socinfo.c | 32 drivers/soc/fsl/qe/gpio.c | 4 drivers/soc/imx/gpc.c | 24 drivers/soc/qcom/cmd-db.c | 4 drivers/soc/tegra/fuse/fuse-tegra30.c | 3 drivers/soc/tegra/fuse/tegra-apbmisc.c | 2 drivers/soc/ti/wkup_m3_ipc.c | 4 drivers/spi/spi-bcm-qspi.c | 4 drivers/spi/spi-bcm2835aux.c | 13 drivers/spi/spi-bcm63xx-hsspi.c | 1 drivers/spi/spi-cadence.c | 11 drivers/spi/spi-dw.c | 15 drivers/spi/spi-dw.h | 1 drivers/spi/spi-fsl-spi.c | 2 drivers/spi/spi-mem.c | 54 drivers/spi/spi-pxa2xx.c | 23 drivers/spi/spi-qup.c | 11 drivers/spi/spi-tegra114.c | 145 drivers/spi/spi-topcliff-pch.c | 6 drivers/spi/spi-zynqmp-gqspi.c | 3 drivers/staging/android/ashmem.c | 28 drivers/staging/android/vsoc.c | 3 drivers/staging/comedi/drivers/ni_mio_common.c | 24 drivers/staging/erofs/utils.c | 2 drivers/staging/greybus/audio_manager.c | 2 drivers/staging/greybus/light.c | 12 drivers/staging/greybus/tools/loopback_test.c | 21 drivers/staging/most/cdev/cdev.c | 5 drivers/staging/most/net/net.c | 10 drivers/staging/rtl8188eu/os_dep/ioctl_linux.c | 13 drivers/staging/rtl8188eu/os_dep/usb_intf.c | 2 drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c | 5 drivers/staging/rtl8723bs/os_dep/ioctl_linux.c | 4 drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c | 5 drivers/staging/speakup/main.c | 2 drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c | 10 drivers/staging/vt6656/device.h | 2 drivers/staging/vt6656/dpc.c | 2 drivers/staging/vt6656/int.c | 6 drivers/staging/vt6656/main_usb.c | 1 drivers/staging/vt6656/rxtx.c | 26 drivers/staging/wlan-ng/hfa384x_usb.c | 2 drivers/staging/wlan-ng/prism2mgmt.c | 2 drivers/staging/wlan-ng/prism2usb.c | 1 drivers/target/iscsi/iscsi_target.c | 89 drivers/target/iscsi/iscsi_target.h | 1 drivers/target/iscsi/iscsi_target_configfs.c | 5 drivers/target/iscsi/iscsi_target_login.c | 5 drivers/target/target_core_device.c | 4 drivers/tee/optee/Kconfig | 1 drivers/thermal/broadcom/brcmstb_thermal.c | 31 drivers/thermal/cpu_cooling.c | 2 drivers/thermal/mtk_thermal.c | 6 drivers/thermal/rcar_gen3_thermal.c | 38 drivers/thunderbolt/switch.c | 7 drivers/tty/ehv_bytechan.c | 21 drivers/tty/ipwireless/hardware.c | 2 drivers/tty/serdev/serdev-ttyport.c | 6 drivers/tty/serial/8250/8250_aspeed_vuart.c | 1 drivers/tty/serial/8250/8250_bcm2835aux.c | 2 drivers/tty/serial/8250/8250_core.c | 5 drivers/tty/serial/8250/8250_exar.c | 33 drivers/tty/serial/8250/8250_of.c | 1 drivers/tty/serial/8250/8250_port.c | 4 drivers/tty/serial/ar933x_uart.c | 8 drivers/tty/serial/atmel_serial.c | 3 drivers/tty/serial/fsl_lpuart.c | 28 drivers/tty/serial/imx.c | 2 drivers/tty/serial/mvebu-uart.c | 2 drivers/tty/serial/qcom_geni_serial.c | 292 drivers/tty/serial/stm32-usart.c | 194 drivers/tty/serial/stm32-usart.h | 14 drivers/tty/serial/xilinx_uartps.c | 17 drivers/tty/synclink_gt.c | 18 drivers/tty/synclinkmp.c | 24 drivers/tty/sysrq.c | 8 drivers/tty/tty_port.c | 5 drivers/tty/vt/selection.c | 40 drivers/tty/vt/vt.c | 47 drivers/tty/vt/vt_ioctl.c | 97 drivers/uio/uio.c | 10 drivers/uio/uio_dmem_genirq.c | 6 drivers/usb/class/cdc-acm.c | 20 drivers/usb/class/cdc-wdm.c | 2 drivers/usb/core/config.c | 11 drivers/usb/core/hub.c | 26 drivers/usb/core/hub.h | 1 drivers/usb/core/port.c | 10 drivers/usb/core/quirks.c | 49 drivers/usb/core/usb.h | 3 drivers/usb/dwc2/gadget.c | 44 drivers/usb/dwc3/Kconfig | 4 drivers/usb/dwc3/core.c | 8 drivers/usb/dwc3/core.h | 4 drivers/usb/dwc3/dwc3-pci.c | 4 drivers/usb/dwc3/gadget.c | 33 drivers/usb/gadget/composite.c | 39 drivers/usb/gadget/function/f_ecm.c | 16 drivers/usb/gadget/function/f_fs.c | 6 drivers/usb/gadget/function/f_ncm.c | 17 drivers/usb/gadget/function/u_serial.c | 4 drivers/usb/gadget/legacy/cdc2.c | 2 drivers/usb/gadget/legacy/g_ffs.c | 2 drivers/usb/gadget/legacy/multi.c | 2 drivers/usb/gadget/legacy/ncm.c | 2 drivers/usb/gadget/udc/fsl_udc_core.c | 30 drivers/usb/gadget/udc/gr_udc.c | 16 drivers/usb/host/xhci-hub.c | 27 drivers/usb/host/xhci-mem.c | 73 drivers/usb/host/xhci-pci.c | 13 drivers/usb/host/xhci-plat.c | 1 drivers/usb/host/xhci-ring.c | 60 drivers/usb/host/xhci-trace.h | 23 drivers/usb/host/xhci.c | 4 drivers/usb/host/xhci.h | 16 drivers/usb/misc/iowarrior.c | 31 drivers/usb/musb/musb_host.c | 17 drivers/usb/musb/omap2430.c | 2 drivers/usb/phy/Kconfig | 2 drivers/usb/phy/phy-twl6030-usb.c | 2 drivers/usb/serial/io_edgeport.c | 2 drivers/usb/serial/ir-usb.c | 136 drivers/usb/serial/option.c | 8 drivers/usb/serial/pl2303.c | 1 drivers/usb/serial/pl2303.h | 1 drivers/usb/storage/uas.c | 23 drivers/usb/storage/unusual_devs.h | 6 drivers/usb/storage/unusual_uas.h | 7 drivers/usb/typec/Kconfig | 1 drivers/usb/typec/fusb302/fusb302.c | 10 drivers/usb/typec/tcpci.c | 16 drivers/usb/typec/tcpm.c | 32 drivers/usb/typec/typec_wcove.c | 10 drivers/vfio/mdev/mdev_core.c | 11 drivers/vfio/mdev/mdev_sysfs.c | 2 drivers/vfio/pci/vfio_pci.c | 19 drivers/vhost/net.c | 10 drivers/vhost/test.c | 2 drivers/video/backlight/lm3630a_bl.c | 4 drivers/video/backlight/pwm_bl.c | 24 drivers/video/console/vgacon.c | 3 drivers/video/fbdev/chipsfb.c | 3 drivers/video/fbdev/core/fbcon.c | 3 drivers/video/fbdev/core/fbmem.c | 2 drivers/video/fbdev/pxa168fb.c | 6 drivers/video/fbdev/sis/init301.c | 4 drivers/virtio/virtio_balloon.c | 2 drivers/visorbus/visorchipset.c | 11 drivers/vme/bridges/vme_fake.c | 30 drivers/watchdog/Kconfig | 1 drivers/watchdog/da9062_wdt.c | 7 drivers/watchdog/rn5t618_wdt.c | 1 drivers/watchdog/rtd119x_wdt.c | 2 drivers/watchdog/sp805_wdt.c | 4 drivers/watchdog/sprd_wdt.c | 6 drivers/watchdog/watchdog_core.c | 35 drivers/watchdog/watchdog_dev.c | 36 drivers/watchdog/wdat_wdt.c | 2 drivers/xen/cpu_hotplug.c | 2 drivers/xen/preempt.c | 4 drivers/xen/pvcalls-back.c | 2 drivers/xen/xen-balloon.c | 2 drivers/xen/xenbus/xenbus_comms.c | 4 drivers/xen/xenbus/xenbus_xs.c | 9 fs/affs/super.c | 6 fs/afs/callback.c | 8 fs/afs/cell.c | 11 fs/afs/dir_edit.c | 12 fs/afs/file.c | 7 fs/afs/flock.c | 414 fs/afs/inode.c | 8 fs/afs/rxrpc.c | 5 fs/afs/security.c | 4 fs/afs/super.c | 1 fs/afs/xattr.c | 4 fs/aio.c | 20 fs/btrfs/async-thread.c | 8 fs/btrfs/async-thread.h | 1 fs/btrfs/check-integrity.c | 3 fs/btrfs/ctree.c | 8 fs/btrfs/ctree.h | 6 fs/btrfs/delayed-inode.c | 13 fs/btrfs/delayed-ref.c | 8 fs/btrfs/disk-io.c | 52 fs/btrfs/extent_io.c | 8 fs/btrfs/extent_map.c | 11 fs/btrfs/file-item.c | 3 fs/btrfs/file.c | 14 fs/btrfs/inode-map.c | 28 fs/btrfs/inode.c | 20 fs/btrfs/ordered-data.c | 7 fs/btrfs/qgroup.c | 11 fs/btrfs/ref-verify.c | 5 fs/btrfs/relocation.c | 39 fs/btrfs/super.c | 12 fs/btrfs/tests/btrfs-tests.c | 1 fs/btrfs/transaction.c | 8 fs/btrfs/tree-log.c | 388 fs/btrfs/volumes.c | 2 fs/buffer.c | 11 fs/ceph/file.c | 14 fs/ceph/mds_client.c | 3 fs/ceph/super.c | 61 fs/ceph/super.h | 2 fs/ceph/xattr.c | 2 fs/cifs/cifsacl.c | 4 fs/cifs/connect.c | 11 fs/cifs/dir.c | 1 fs/cifs/file.c | 2 fs/cifs/inode.c | 8 fs/cifs/smb2misc.c | 2 fs/cifs/smb2pdu.c | 17 fs/cifs/transport.c | 28 fs/dax.c | 3 fs/ecryptfs/crypto.c | 6 fs/ecryptfs/keystore.c | 2 fs/ecryptfs/messaging.c | 1 fs/eventfd.c | 15 fs/exec.c | 2 fs/exportfs/expfs.c | 1 fs/ext2/super.c | 6 fs/ext2/xattr.c | 8 fs/ext4/balloc.c | 14 fs/ext4/block_validity.c | 1 fs/ext4/dir.c | 14 fs/ext4/ext4.h | 44 fs/ext4/extents.c | 8 fs/ext4/file.c | 10 fs/ext4/ialloc.c | 23 fs/ext4/inline.c | 2 fs/ext4/inode.c | 32 fs/ext4/mballoc.c | 61 fs/ext4/migrate.c | 27 fs/ext4/mmp.c | 12 fs/ext4/namei.c | 8 fs/ext4/page-io.c | 19 fs/ext4/resize.c | 62 fs/ext4/super.c | 281 fs/f2fs/dir.c | 5 fs/f2fs/f2fs.h | 3 fs/f2fs/inline.c | 6 fs/f2fs/namei.c | 27 fs/f2fs/node.c | 7 fs/f2fs/super.c | 19 fs/f2fs/sysfs.c | 12 fs/fat/inode.c | 19 fs/filesystems.c | 4 fs/gfs2/file.c | 74 fs/gfs2/glock.c | 3 fs/gfs2/inode.c | 2 fs/hfsplus/attributes.c | 4 fs/inode.c | 1 fs/jbd2/checkpoint.c | 2 fs/jbd2/commit.c | 51 fs/jbd2/journal.c | 25 fs/jbd2/transaction.c | 26 fs/jfs/jfs_txnmgr.c | 3 fs/libfs.c | 8 fs/namei.c | 19 fs/nfs/Kconfig | 2 fs/nfs/callback_proc.c | 2 fs/nfs/client.c | 1 fs/nfs/delegation.c | 20 fs/nfs/delegation.h | 1 fs/nfs/dir.c | 47 fs/nfs/direct.c | 6 fs/nfs/flexfilelayout/flexfilelayout.h | 32 fs/nfs/fscache.c | 2 fs/nfs/nfs3xdr.c | 5 fs/nfs/nfs42proc.c | 4 fs/nfs/nfs42xdr.c | 10 fs/nfs/nfs4client.c | 1 fs/nfs/nfs4proc.c | 7 fs/nfs/nfs4xdr.c | 5 fs/nfs/pagelist.c | 17 fs/nfs/pnfs.c | 33 fs/nfs/pnfs.h | 1 fs/nfs/pnfs_nfs.c | 7 fs/nfs/super.c | 2 fs/nfs/write.c | 15 fs/nfsd/nfs4layouts.c | 2 fs/nfsd/nfs4state.c | 2 fs/nfsd/state.h | 2 fs/nfsd/vfs.c | 1 fs/ocfs2/alloc.c | 4 fs/ocfs2/file.c | 14 fs/ocfs2/journal.h | 8 fs/open.c | 3 fs/orangefs/orangefs-debugfs.c | 1 fs/overlayfs/file.c | 2 fs/overlayfs/inode.c | 4 fs/overlayfs/readdir.c | 8 fs/pstore/inode.c | 5 fs/pstore/platform.c | 4 fs/reiserfs/stree.c | 3 fs/reiserfs/super.c | 4 fs/ubifs/dir.c | 2 fs/ubifs/file.c | 4 fs/ubifs/ioctl.c | 11 fs/udf/super.c | 23 fs/xfs/xfs_quotaops.c | 3 include/acpi/actypes.h | 3 include/acpi/processor.h | 8 include/drm/drm_panel.h | 1 include/keys/big_key-type.h | 2 include/keys/user-type.h | 3 include/linux/acpi.h | 12 include/linux/bitops.h | 14 include/linux/buffer_head.h | 8 include/linux/ceph/osdmap.h | 4 include/linux/ceph/rados.h | 6 include/linux/cgroup.h | 1 include/linux/compiler.h | 2 include/linux/devfreq_cooling.h | 2 include/linux/device.h | 13 include/linux/dmaengine.h | 2 include/linux/efi.h | 36 include/linux/eventfd.h | 14 include/linux/fs.h | 1 include/linux/futex.h | 17 include/linux/hid.h | 2 include/linux/inet_diag.h | 18 include/linux/intel-svm.h | 2 include/linux/iocontext.h | 1 include/linux/irq.h | 18 include/linux/irqchip/arm-gic-v3.h | 12 include/linux/irqdomain.h | 9 include/linux/key-type.h | 2 include/linux/kvm_host.h | 8 include/linux/libata.h | 1 include/linux/list_nulls.h | 8 include/linux/memblock.h | 15 include/linux/memory.h | 8 include/linux/memory_hotplug.h | 22 include/linux/mlx5/mlx5_ifc.h | 11 include/linux/mmc/host.h | 1 include/linux/mmc/sdio_ids.h | 2 include/linux/mmzone.h | 3 include/linux/netdevice.h | 2 include/linux/netfilter/ipset/ip_set.h | 7 include/linux/node.h | 7 include/linux/notifier.h | 3 include/linux/nvme-fc-driver.h | 4 include/linux/of.h | 5 include/linux/page-flags.h | 2 include/linux/pci-epc.h | 3 include/linux/percpu-defs.h | 3 include/linux/percpu_counter.h | 4 include/linux/perf_event.h | 7 include/linux/phy.h | 2 include/linux/platform_data/dma-imx-sdma.h | 3 include/linux/power/smartreflex.h | 3 include/linux/rculist_nulls.h | 8 include/linux/rtc.h | 2 include/linux/sched.h | 8 include/linux/selection.h | 4 include/linux/signal.h | 15 include/linux/swab.h | 1 include/linux/swapops.h | 3 include/linux/switchtec.h | 4 include/linux/tty.h | 2 include/linux/usb/irda.h | 13 include/linux/usb/quirks.h | 3 include/linux/usb/tcpm.h | 13 include/linux/vmalloc.h | 5 include/linux/vt_kern.h | 2 include/media/davinci/vpbe.h | 2 include/media/v4l2-device.h | 12 include/media/v4l2-rect.h | 8 include/net/cfg80211.h | 5 include/net/fib_rules.h | 1 include/net/flow_dissector.h | 9 include/net/ip6_route.h | 1 include/net/ipx.h | 5 include/net/pkt_cls.h | 33 include/net/request_sock.h | 4 include/net/sch_generic.h | 3 include/net/sctp/sctp.h | 5 include/net/tcp.h | 2 include/net/xfrm.h | 1 include/rdma/ib_verbs.h | 3 include/scsi/iscsi_proto.h | 1 include/sound/rawmidi.h | 6 include/sound/soc.h | 2 include/target/iscsi/iscsi_target_core.h | 2 include/trace/events/afs.h | 2 include/trace/events/rxrpc.h | 6 include/trace/events/xen.h | 6 include/uapi/linux/btf.h | 4 include/uapi/linux/coresight-stm.h | 6 include/uapi/linux/netfilter/nf_tables.h | 2 include/uapi/linux/serio.h | 10 include/uapi/linux/swab.h | 10 include/uapi/linux/usb/charger.h | 16 ipc/msg.c | 19 ipc/sem.c | 6 kernel/audit.c | 40 kernel/auditfilter.c | 71 kernel/bpf/btf.c | 5 kernel/bpf/inode.c | 3 kernel/bpf/offload.c | 6 kernel/bpf/syscall.c | 9 kernel/bpf/verifier.c | 47 kernel/cgroup/cgroup-v1.c | 3 kernel/cgroup/cgroup.c | 48 kernel/cpu.c | 18 kernel/debug/kdb/kdb_main.c | 2 kernel/events/core.c | 136 kernel/fork.c | 16 kernel/futex.c | 93 kernel/irq/debugfs.c | 1 kernel/irq/internals.h | 2 kernel/irq/irqdomain.c | 14 kernel/irq/manage.c | 29 kernel/irq/msi.c | 5 kernel/irq/proc.c | 22 kernel/kmod.c | 4 kernel/kprobes.c | 71 kernel/locking/lockdep.c | 4 kernel/locking/locktorture.c | 8 kernel/memremap.c | 12 kernel/module.c | 11 kernel/notifier.c | 2 kernel/padata.c | 49 kernel/printk/printk.c | 4 kernel/rcu/tree_plugin.h | 11 kernel/sched/fair.c | 220 kernel/sched/sched.h | 8 kernel/signal.c | 30 kernel/time/alarmtimer.c | 8 kernel/time/clocksource.c | 11 kernel/trace/ftrace.c | 20 kernel/trace/trace.c | 2 kernel/trace/trace.h | 29 kernel/trace/trace_events_hist.c | 177 kernel/trace/trace_events_trigger.c | 35 kernel/trace/trace_kprobe.c | 2 kernel/trace/trace_sched_switch.c | 4 kernel/trace/trace_stat.c | 31 kernel/watchdog.c | 10 kernel/workqueue.c | 14 lib/devres.c | 3 lib/find_bit.c | 16 lib/kfifo.c | 3 lib/raid6/neon.uc | 5 lib/raid6/recov_neon_inner.c | 7 lib/scatterlist.c | 2 lib/stackdepot.c | 8 lib/test_kasan.c | 1 mm/hmm.c | 8 mm/huge_memory.c | 29 mm/memcontrol.c | 28 mm/memory_hotplug.c | 173 mm/mempolicy.c | 12 mm/migrate.c | 27 mm/mprotect.c | 38 mm/nommu.c | 10 mm/page_alloc.c | 72 mm/slub.c | 43 mm/sparse.c | 27 mm/vmalloc.c | 19 mm/vmscan.c | 9 net/6lowpan/nhc.c | 2 net/batman-adv/bat_iv_ogm.c | 4 net/batman-adv/bat_v_ogm.c | 42 net/batman-adv/types.h | 4 net/bluetooth/hci_sock.c | 3 net/bluetooth/rfcomm/tty.c | 4 net/bpfilter/bpfilter_kern.c | 2 net/bridge/br_arp_nd_proxy.c | 2 net/bridge/netfilter/ebtables.c | 4 net/ceph/osdmap.c | 9 net/core/dev.c | 115 net/core/devlink.c | 33 net/core/fib_rules.c | 2 net/core/filter.c | 4 net/core/neighbour.c | 4 net/core/net-sysfs.c | 39 net/core/netclassid_cgroup.c | 47 net/core/rtnetlink.c | 13 net/core/sock.c | 9 net/core/utils.c | 20 net/dns_resolver/dns_key.c | 2 net/dsa/port.c | 7 net/dsa/slave.c | 8 net/dsa/tag_brcm.c | 2 net/dsa/tag_qca.c | 2 net/hsr/hsr_framereg.c | 10 net/hsr/hsr_netlink.c | 84 net/hsr/hsr_slave.c | 10 net/ieee802154/6lowpan/reassembly.c | 2 net/ieee802154/nl_policy.c | 6 net/ipv4/Kconfig | 1 net/ipv4/af_inet.c | 2 net/ipv4/cipso_ipv4.c | 7 net/ipv4/devinet.c | 13 net/ipv4/fib_trie.c | 3 net/ipv4/gre_demux.c | 12 net/ipv4/inet_connection_sock.c | 22 net/ipv4/inet_diag.c | 44 net/ipv4/ip_gre.c | 105 net/ipv4/ip_output.c | 3 net/ipv4/ip_tunnel.c | 15 net/ipv4/ip_vti.c | 35 net/ipv4/raw_diag.c | 5 net/ipv4/tcp.c | 15 net/ipv4/tcp_bbr.c | 3 net/ipv4/tcp_input.c | 1 net/ipv4/tcp_output.c | 1 net/ipv4/udp.c | 3 net/ipv4/udp_diag.c | 5 net/ipv4/udp_offload.c | 5 net/ipv6/addrconf.c | 53 net/ipv6/ip6_fib.c | 10 net/ipv6/ip6_gre.c | 4 net/ipv6/ip6_output.c | 3 net/ipv6/ip6_tunnel.c | 4 net/ipv6/ip6_vti.c | 33 net/ipv6/ipv6_sockglue.c | 10 net/ipv6/raw.c | 2 net/ipv6/reassembly.c | 2 net/ipv6/route.c | 1 net/ipv6/seg6_local.c | 4 net/ipv6/tcp_ipv6.c | 3 net/iucv/af_iucv.c | 40 net/l2tp/l2tp_core.c | 10 net/llc/af_llc.c | 34 net/llc/llc_conn.c | 35 net/llc/llc_if.c | 12 net/mac80211/cfg.c | 23 net/mac80211/ieee80211_i.h | 3 net/mac80211/mesh_hwmp.c | 6 net/mac80211/rc80211_minstrel_ht.c | 2 net/mac80211/rx.c | 13 net/mac80211/sta_info.c | 7 net/mac80211/tdls.c | 2 net/mac80211/tkip.c | 18 net/mac80211/tx.c | 44 net/mac80211/util.c | 18 net/mpls/mpls_iptunnel.c | 2 net/netfilter/ipset/ip_set_bitmap_gen.h | 2 net/netfilter/ipset/ip_set_bitmap_ip.c | 6 net/netfilter/ipset/ip_set_bitmap_ipmac.c | 6 net/netfilter/ipset/ip_set_bitmap_port.c | 6 net/netfilter/nf_conntrack_netlink.c | 7 net/netfilter/nf_conntrack_standalone.c | 2 net/netfilter/nf_flow_table_core.c | 9 net/netfilter/nf_flow_table_ip.c | 2 net/netfilter/nf_synproxy_core.c | 2 net/netfilter/nf_tables_api.c | 33 net/netfilter/nfnetlink_cthelper.c | 2 net/netfilter/nft_flow_offload.c | 3 net/netfilter/nft_fwd_netdev.c | 9 net/netfilter/nft_osf.c | 13 net/netfilter/nft_payload.c | 1 net/netfilter/nft_set_hash.c | 25 net/netfilter/nft_tunnel.c | 12 net/netfilter/x_tables.c | 6 net/netfilter/xt_hashlimit.c | 10 net/netfilter/xt_recent.c | 2 net/netlink/af_netlink.c | 7 net/nfc/hci/core.c | 19 net/nfc/netlink.c | 4 net/packet/af_packet.c | 59 net/packet/internal.h | 5 net/qrtr/qrtr.c | 9 net/rds/ib_stats.c | 2 net/rds/stats.c | 2 net/rxrpc/af_rxrpc.c | 5 net/rxrpc/ar-internal.h | 13 net/rxrpc/call_accept.c | 2 net/rxrpc/call_object.c | 26 net/rxrpc/conn_client.c | 53 net/rxrpc/conn_event.c | 31 net/rxrpc/conn_object.c | 18 net/rxrpc/conn_service.c | 2 net/rxrpc/input.c | 24 net/rxrpc/key.c | 27 net/rxrpc/local_object.c | 28 net/rxrpc/output.c | 30 net/rxrpc/peer_event.c | 40 net/rxrpc/sendmsg.c | 4 net/sched/act_csum.c | 31 net/sched/act_mirred.c | 6 net/sched/cls_basic.c | 11 net/sched/cls_bpf.c | 11 net/sched/cls_flower.c | 13 net/sched/cls_fw.c | 11 net/sched/cls_matchall.c | 12 net/sched/cls_route.c | 15 net/sched/cls_rsvp.h | 17 net/sched/cls_tcindex.c | 55 net/sched/cls_u32.c | 11 net/sched/ematch.c | 5 net/sched/sch_api.c | 6 net/sched/sch_cbs.c | 120 net/sched/sch_fq.c | 1 net/sched/sch_netem.c | 18 net/sctp/diag.c | 8 net/sctp/input.c | 12 net/sctp/ipv6.c | 20 net/sctp/protocol.c | 28 net/sctp/sm_statefuns.c | 29 net/sctp/socket.c | 31 net/smc/smc_clc.c | 4 net/smc/smc_diag.c | 8 net/smc/smc_ib.c | 3 net/smc/smc_rx.c | 29 net/sunrpc/auth_gss/svcauth_gss.c | 88 net/sunrpc/xprtrdma/verbs.c | 3 net/tipc/link.c | 29 net/tipc/monitor.c | 15 net/tipc/monitor.h | 1 net/tipc/name_distr.c | 18 net/tipc/name_table.c | 1 net/tipc/name_table.h | 1 net/tipc/net.c | 2 net/tipc/netlink.c | 3 net/tipc/node.c | 7 net/tipc/socket.c | 2 net/tipc/sysctl.c | 8 net/tls/tls_device.c | 21 net/tls/tls_device_fallback.c | 4 net/vmw_vsock/hyperv_transport.c | 68 net/wireless/ethtool.c | 8 net/wireless/nl80211.c | 8 net/wireless/rdev-ops.h | 10 net/wireless/reg.c | 47 net/wireless/trace.h | 5 net/wireless/wext-core.c | 3 net/x25/af_x25.c | 6 net/xdp/xdp_umem.c | 11 net/xdp/xsk.c | 21 net/xfrm/xfrm_device.c | 1 net/xfrm/xfrm_interface.c | 44 net/xfrm/xfrm_policy.c | 2 net/xfrm/xfrm_user.c | 6 samples/bpf/Makefile | 2 samples/bpf/xdp_rxq_info_user.c | 6 scripts/Kconfig.include | 2 scripts/Makefile.extrawarn | 1 scripts/dtc/dtc-lexer.l | 1 scripts/dtc/include-prefixes/arc/axs10x_mb.dtsi | 1 scripts/dtc/include-prefixes/arm/am335x-boneblack-common.dtsi | 5 scripts/dtc/include-prefixes/arm/am437x-idk-evm.dts | 4 scripts/dtc/include-prefixes/arm/am43x-epos-evm.dts | 2 scripts/dtc/include-prefixes/arm/am43xx-clocks.dtsi | 54 scripts/dtc/include-prefixes/arm/am571x-idk.dts | 4 scripts/dtc/include-prefixes/arm/am572x-idk-common.dtsi | 4 scripts/dtc/include-prefixes/arm/am57xx-beagle-x15-common.dtsi | 25 scripts/dtc/include-prefixes/arm/aspeed-g5.dtsi | 2 scripts/dtc/include-prefixes/arm/at91-nattis-2-natte-2.dts | 7 scripts/dtc/include-prefixes/arm/at91sam9260.dtsi | 12 scripts/dtc/include-prefixes/arm/at91sam9261.dtsi | 6 scripts/dtc/include-prefixes/arm/at91sam9263.dtsi | 6 scripts/dtc/include-prefixes/arm/at91sam9g45.dtsi | 8 scripts/dtc/include-prefixes/arm/at91sam9rl.dtsi | 8 scripts/dtc/include-prefixes/arm/bcm2835-rpi-zero-w.dts | 1 scripts/dtc/include-prefixes/arm/bcm2835-rpi.dtsi | 2 scripts/dtc/include-prefixes/arm/dra7.dtsi | 3 scripts/dtc/include-prefixes/arm/dra76x.dtsi | 5 scripts/dtc/include-prefixes/arm/imx6qdl-phytec-phycore-som.dtsi | 5 scripts/dtc/include-prefixes/arm/imx6qdl-zii-rdu2.dtsi | 7 scripts/dtc/include-prefixes/arm/imx6qdl.dtsi | 5 scripts/dtc/include-prefixes/arm/imx6qp.dtsi | 1 scripts/dtc/include-prefixes/arm/imx7-colibri.dtsi | 1 scripts/dtc/include-prefixes/arm/iwg20d-q7-common.dtsi | 2 scripts/dtc/include-prefixes/arm/logicpd-som-lv-baseboard.dtsi | 2 scripts/dtc/include-prefixes/arm/logicpd-som-lv.dtsi | 26 scripts/dtc/include-prefixes/arm/lpc3250-phy3250.dts | 4 scripts/dtc/include-prefixes/arm/lpc32xx.dtsi | 10 scripts/dtc/include-prefixes/arm/ls1021a-twr.dts | 9 scripts/dtc/include-prefixes/arm/ls1021a.dtsi | 9 scripts/dtc/include-prefixes/arm/omap3-n900.dts | 50 scripts/dtc/include-prefixes/arm/omap5.dtsi | 1 scripts/dtc/include-prefixes/arm/ox810se.dtsi | 4 scripts/dtc/include-prefixes/arm/ox820.dtsi | 4 scripts/dtc/include-prefixes/arm/r8a7743.dtsi | 4 scripts/dtc/include-prefixes/arm/r8a7779.dtsi | 8 scripts/dtc/include-prefixes/arm/sama5d3.dtsi | 28 scripts/dtc/include-prefixes/arm/sama5d3_can.dtsi | 4 scripts/dtc/include-prefixes/arm/sama5d3_tcb1.dtsi | 1 scripts/dtc/include-prefixes/arm/sama5d3_uart.dtsi | 4 scripts/dtc/include-prefixes/arm/stihxxx-b2120.dtsi | 2 scripts/dtc/include-prefixes/arm/stm32f469-disco.dts | 8 scripts/dtc/include-prefixes/arm/stm32h743i-eval.dts | 1 scripts/dtc/include-prefixes/arm/sun8i-a23-a33.dtsi | 30 scripts/dtc/include-prefixes/arm/sun8i-a83t-cubietruck-plus.dts | 2 scripts/dtc/include-prefixes/arm/sun8i-a83t-tbs-a711.dts | 4 scripts/dtc/include-prefixes/arm/sun8i-h3-beelink-x2.dts | 4 scripts/dtc/include-prefixes/arm/sun8i-h3.dtsi | 15 scripts/dtc/include-prefixes/arm/sun9i-a80-optimus.dts | 4 scripts/dtc/include-prefixes/arm64/allwinner/sun50i-a64.dtsi | 3 scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6-pine-h64.dts | 2 scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6.dtsi | 31 scripts/dtc/include-prefixes/arm64/amlogic/meson-gx-p23x-q20x.dtsi | 1 scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-khadas-vim.dts | 1 scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-libretech-cc.dts | 2 scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-p212.dts | 1 scripts/dtc/include-prefixes/arm64/amlogic/meson-gxm-khadas-vim2.dts | 17 scripts/dtc/include-prefixes/arm64/arm/juno-clocks.dtsi | 4 scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043-post.dtsi | 2 scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043a-rdb.dts | 4 scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1046a-rdb.dts | 4 scripts/dtc/include-prefixes/arm64/qcom/apq8016-sbc.dtsi | 2 scripts/dtc/include-prefixes/arm64/qcom/msm8916.dtsi | 8 scripts/dtc/include-prefixes/arm64/qcom/msm8996.dtsi | 4 scripts/dtc/include-prefixes/arm64/renesas/r8a7795-es1.dtsi | 2 scripts/dtc/include-prefixes/arm64/renesas/r8a77990-ebisu.dts | 1 scripts/dtc/include-prefixes/arm64/renesas/r8a77995.dtsi | 2 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-0.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-1.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-2.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-3.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-4.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-5.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-0.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-1.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-0.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-1.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-2.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-3.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-4.dtsi | 1 scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-5.dtsi | 1 scripts/find-unused-docs.sh | 2 scripts/kconfig/confdata.c | 2 scripts/recordmcount.c | 17 security/apparmor/include/cred.h | 2 security/apparmor/lsm.c | 4 security/apparmor/net.c | 15 security/keys/big_key.c | 11 security/keys/encrypted-keys/encrypted.c | 7 security/keys/key.c | 3 security/keys/keyctl.c | 77 security/keys/keyring.c | 6 security/keys/proc.c | 2 security/keys/request_key_auth.c | 7 security/keys/trusted.c | 14 security/keys/user_defined.c | 5 security/selinux/avc.c | 77 security/selinux/hooks.c | 11 security/selinux/include/avc.h | 8 security/tomoyo/common.c | 11 sound/aoa/codecs/onyx.c | 4 sound/core/control.c | 5 sound/core/oss/pcm_plugin.c | 36 sound/core/seq/oss/seq_oss_midi.c | 1 sound/core/seq/seq_clientmgr.c | 4 sound/core/seq/seq_queue.c | 29 sound/core/seq/seq_timer.c | 13 sound/core/seq/seq_timer.h | 3 sound/core/seq/seq_virmidi.c | 1 sound/drivers/dummy.c | 2 sound/hda/ext/hdac_ext_controller.c | 9 sound/hda/hdmi_chmap.c | 2 sound/pci/hda/hda_beep.c | 6 sound/pci/hda/hda_codec.c | 2 sound/pci/hda/hda_controller.h | 9 sound/pci/hda/hda_eld.c | 2 sound/pci/hda/hda_intel.c | 37 sound/pci/hda/hda_sysfs.c | 4 sound/pci/hda/patch_ca0132.c | 1 sound/pci/hda/patch_conexant.c | 1 sound/pci/hda/patch_hdmi.c | 7 sound/pci/hda/patch_realtek.c | 60 sound/pci/ice1712/prodigy_hifi.c | 4 sound/sh/aica.c | 18 sound/sh/sh_dac_audio.c | 3 sound/soc/atmel/Kconfig | 2 sound/soc/codecs/cs4349.c | 1 sound/soc/codecs/es8328.c | 2 sound/soc/codecs/pcm512x.c | 8 sound/soc/codecs/rt5640.c | 7 sound/soc/codecs/wm8737.c | 2 sound/soc/codecs/wm9705.c | 10 sound/soc/codecs/wm9712.c | 13 sound/soc/codecs/wm9713.c | 10 sound/soc/davinci/davinci-mcasp.c | 13 sound/soc/fsl/imx-sgtl5000.c | 3 sound/soc/intel/atom/sst-atom-controls.c | 2 sound/soc/intel/atom/sst/sst_pci.c | 2 sound/soc/intel/skylake/skl-debug.c | 32 sound/soc/jz4740/jz4740-i2s.c | 2 sound/soc/meson/axg-tdmin.c | 1 sound/soc/meson/axg-tdmout.c | 1 sound/soc/qcom/apq8016_sbc.c | 21 sound/soc/soc-dapm.c | 10 sound/soc/soc-ops.c | 4 sound/soc/soc-pcm.c | 121 sound/soc/soc-topology.c | 19 sound/soc/sti/uniperif_player.c | 7 sound/soc/sunxi/sun4i-i2s.c | 4 sound/soc/sunxi/sun8i-codec.c | 9 sound/usb/clock.c | 99 sound/usb/clock.h | 4 sound/usb/format.c | 3 sound/usb/line6/driver.c | 2 sound/usb/line6/midibuf.c | 2 sound/usb/mixer.c | 47 sound/usb/mixer_maps.c | 30 sound/usb/quirks-table.h | 9 sound/usb/quirks.c | 1 sound/usb/usx2y/usX2Yhwdep.c | 2 sound/usb/validate.c | 6 tools/accounting/getdelays.c | 2 tools/bpf/bpftool/btf_dumper.c | 8 tools/bpf/bpftool/cgroup.c | 6 tools/bpf/bpftool/map_perf_ring.c | 4 tools/gpio/Makefile | 2 tools/include/linux/string.h | 8 tools/kvm/kvm_stat/kvm_stat | 8 tools/lib/api/fs/fs.c | 4 tools/lib/string.c | 7 tools/lib/traceevent/parse-filter.c | 4 tools/objtool/arch/x86/lib/x86-opcode-map.txt | 2 tools/objtool/check.c | 5 tools/perf/Makefile | 2 tools/perf/Makefile.config | 11 tools/perf/bench/futex-wake.c | 4 tools/perf/builtin-c2c.c | 10 tools/perf/builtin-report.c | 6 tools/perf/ui/browsers/hists.c | 1 tools/perf/util/machine.c | 27 tools/perf/util/map.c | 2 tools/perf/util/probe-finder.c | 11 tools/perf/util/stat-shadow.c | 6 tools/power/acpi/Makefile.config | 2 tools/power/cpupower/utils/idle_monitor/amd_fam14h_idle.c | 2 tools/power/cpupower/utils/idle_monitor/cpuidle_sysfs.c | 2 tools/power/cpupower/utils/idle_monitor/cpupower-monitor.c | 2 tools/power/cpupower/utils/idle_monitor/cpupower-monitor.h | 2 tools/power/x86/turbostat/turbostat.c | 27 tools/scripts/Makefile.include | 4 tools/testing/ktest/ktest.pl | 2 tools/testing/selftests/bpf/test_select_reuseport.c | 16 tools/testing/selftests/ipc/msgque.c | 11 tools/testing/selftests/lib.mk | 23 tools/testing/selftests/net/fib_tests.sh | 40 tools/testing/selftests/net/forwarding/mirror_gre.sh | 25 tools/testing/selftests/size/get_size.c | 24 tools/testing/selftests/vm/mlock2-tests.c | 233 tools/testing/selftests/x86/ptrace_syscall.c | 8 tools/usb/usbip/src/usbip_network.c | 42 tools/usb/usbip/src/usbip_network.h | 12 usr/Kconfig | 22 virt/kvm/arm/aarch32.c | 131 virt/kvm/arm/mmio.c | 6 virt/kvm/arm/mmu.c | 3 virt/kvm/arm/pmu.c | 3 virt/kvm/arm/vgic/vgic-its.c | 3 virt/kvm/async_pf.c | 10 virt/kvm/kvm_main.c | 16 3061 files changed, 63693 insertions(+), 49352 deletions(-) diff -Nru linux-4.19.98/Documentation/ABI/testing/sysfs-bus-iio linux-4.19.118/Documentation/ABI/testing/sysfs-bus-iio --- linux-4.19.98/Documentation/ABI/testing/sysfs-bus-iio 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/ABI/testing/sysfs-bus-iio 2020-04-23 08:30:24.000000000 +0000 @@ -199,7 +199,7 @@ What: /sys/bus/iio/devices/iio:deviceX/in_positionrelative_x_raw What: /sys/bus/iio/devices/iio:deviceX/in_positionrelative_y_raw -KernelVersion: 4.18 +KernelVersion: 4.19 Contact: linux-iio@vger.kernel.org Description: Relative position in direction x or y on a pad (may be diff -Nru linux-4.19.98/Documentation/ABI/testing/sysfs-class-devfreq linux-4.19.118/Documentation/ABI/testing/sysfs-class-devfreq --- linux-4.19.98/Documentation/ABI/testing/sysfs-class-devfreq 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/ABI/testing/sysfs-class-devfreq 2020-04-23 08:30:24.000000000 +0000 @@ -7,6 +7,13 @@ The name of devfreq object denoted as ... is same as the name of device using devfreq. +What: /sys/class/devfreq/.../name +Date: November 2019 +Contact: Chanwoo Choi +Description: + The /sys/class/devfreq/.../name shows the name of device + of the corresponding devfreq object. + What: /sys/class/devfreq/.../governor Date: September 2011 Contact: MyungJoo Ham diff -Nru linux-4.19.98/Documentation/admin-guide/kernel-parameters.txt linux-4.19.118/Documentation/admin-guide/kernel-parameters.txt --- linux-4.19.98/Documentation/admin-guide/kernel-parameters.txt 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/admin-guide/kernel-parameters.txt 2020-04-23 08:30:24.000000000 +0000 @@ -136,6 +136,10 @@ dynamic table installation which will install SSDT tables to /sys/firmware/acpi/tables/dynamic. + acpi_no_watchdog [HW,ACPI,WDT] + Ignore the ACPI-based watchdog interface (WDAT) and let + a native driver control the watchdog device instead. + acpi_rsdp= [ACPI,EFI,KEXEC] Pass the RSDP address to the kernel, mostly used on machines running EFI runtime service to boot the @@ -1946,6 +1950,12 @@ Built with CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y, the default is off. + kpti= [ARM64] Control page table isolation of user + and kernel address spaces. + Default: enabled on cores which need mitigation. + 0: force disabled + 1: force enabled + kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs. Default is 0 (don't ignore, but inject #GP) diff -Nru linux-4.19.98/Documentation/devicetree/bindings/bus/ti-sysc.txt linux-4.19.118/Documentation/devicetree/bindings/bus/ti-sysc.txt --- linux-4.19.98/Documentation/devicetree/bindings/bus/ti-sysc.txt 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/devicetree/bindings/bus/ti-sysc.txt 2020-04-23 08:30:24.000000000 +0000 @@ -35,6 +35,7 @@ "ti,sysc-omap3-sham" "ti,sysc-omap-aes" "ti,sysc-mcasp" + "ti,sysc-dra7-mcasp" "ti,sysc-usb-host-fs" "ti,sysc-dra7-mcan" diff -Nru linux-4.19.98/Documentation/devicetree/bindings/net/fsl-fman.txt linux-4.19.118/Documentation/devicetree/bindings/net/fsl-fman.txt --- linux-4.19.98/Documentation/devicetree/bindings/net/fsl-fman.txt 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/devicetree/bindings/net/fsl-fman.txt 2020-04-23 08:30:24.000000000 +0000 @@ -110,6 +110,13 @@ Usage: required Definition: See soc/fsl/qman.txt and soc/fsl/bman.txt +- fsl,erratum-a050385 + Usage: optional + Value type: boolean + Definition: A boolean property. Indicates the presence of the + erratum A050385 which indicates that DMA transactions that are + split can result in a FMan lock. + ============================================================================= FMan MURAM Node diff -Nru linux-4.19.98/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt linux-4.19.118/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt --- linux-4.19.98/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/Documentation/devicetree/bindings/rng/omap3_rom_rng.txt 2020-04-23 08:30:24.000000000 +0000 @@ -0,0 +1,27 @@ +OMAP ROM RNG driver binding + +Secure SoCs may provide RNG via secure ROM calls like Nokia N900 does. The +implementation can depend on the SoC secure ROM used. + +- compatible: + Usage: required + Value type: + Definition: must be "nokia,n900-rom-rng" + +- clocks: + Usage: required + Value type: + Definition: reference to the the RNG interface clock + +- clock-names: + Usage: required + Value type: + Definition: must be "ick" + +Example: + + rom_rng: rng { + compatible = "nokia,n900-rom-rng"; + clocks = <&rng_ick>; + clock-names = "ick"; + }; diff -Nru linux-4.19.98/Documentation/driver-api/device_link.rst linux-4.19.118/Documentation/driver-api/device_link.rst --- linux-4.19.98/Documentation/driver-api/device_link.rst 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/driver-api/device_link.rst 2020-04-23 08:30:24.000000000 +0000 @@ -25,8 +25,8 @@ Device links allow representation of such dependencies in the driver core. -In its standard form, a device link combines *both* dependency types: -It guarantees correct suspend/resume and shutdown ordering between a +In its standard or *managed* form, a device link combines *both* dependency +types: It guarantees correct suspend/resume and shutdown ordering between a "supplier" device and its "consumer" devices, and it guarantees driver presence on the supplier. The consumer devices are not probed before the supplier is bound to a driver, and they're unbound before the supplier @@ -59,18 +59,24 @@ Another example for an inconsistent state would be a device link that represents a driver presence dependency, yet is added from the consumer's -``->probe`` callback while the supplier hasn't probed yet: Had the driver -core known about the device link earlier, it wouldn't have probed the +``->probe`` callback while the supplier hasn't started to probe yet: Had the +driver core known about the device link earlier, it wouldn't have probed the consumer in the first place. The onus is thus on the consumer to check presence of the supplier after adding the link, and defer probing on -non-presence. - -If a device link is added in the ``->probe`` callback of the supplier or -consumer driver, it is typically deleted in its ``->remove`` callback for -symmetry. That way, if the driver is compiled as a module, the device -link is added on module load and orderly deleted on unload. The same -restrictions that apply to device link addition (e.g. exclusion of a -parallel suspend/resume transition) apply equally to deletion. +non-presence. [Note that it is valid to create a link from the consumer's +``->probe`` callback while the supplier is still probing, but the consumer must +know that the supplier is functional already at the link creation time (that is +the case, for instance, if the consumer has just acquired some resources that +would not have been available had the supplier not been functional then).] + +If a device link with ``DL_FLAG_STATELESS`` set (i.e. a stateless device link) +is added in the ``->probe`` callback of the supplier or consumer driver, it is +typically deleted in its ``->remove`` callback for symmetry. That way, if the +driver is compiled as a module, the device link is added on module load and +orderly deleted on unload. The same restrictions that apply to device link +addition (e.g. exclusion of a parallel suspend/resume transition) apply equally +to deletion. Device links managed by the driver core are deleted automatically +by it. Several flags may be specified on device link addition, two of which have already been mentioned above: ``DL_FLAG_STATELESS`` to express that no @@ -83,22 +89,37 @@ can be specified to runtime resume the supplier upon addition of the device link. ``DL_FLAG_AUTOREMOVE_CONSUMER`` causes the device link to be automatically purged when the consumer fails to probe or later unbinds. -This obviates the need to explicitly delete the link in the ``->remove`` -callback or in the error path of the ``->probe`` callback. Similarly, when the device link is added from supplier's ``->probe`` callback, ``DL_FLAG_AUTOREMOVE_SUPPLIER`` causes the device link to be automatically purged when the supplier fails to probe or later unbinds. +If neither ``DL_FLAG_AUTOREMOVE_CONSUMER`` nor ``DL_FLAG_AUTOREMOVE_SUPPLIER`` +is set, ``DL_FLAG_AUTOPROBE_CONSUMER`` can be used to request the driver core +to probe for a driver for the consumer driver on the link automatically after +a driver has been bound to the supplier device. + +Note, however, that any combinations of ``DL_FLAG_AUTOREMOVE_CONSUMER``, +``DL_FLAG_AUTOREMOVE_SUPPLIER`` or ``DL_FLAG_AUTOPROBE_CONSUMER`` with +``DL_FLAG_STATELESS`` are invalid and cannot be used. + Limitations =========== -Driver authors should be aware that a driver presence dependency (i.e. when -``DL_FLAG_STATELESS`` is not specified on link addition) may cause probing of -the consumer to be deferred indefinitely. This can become a problem if the -consumer is required to probe before a certain initcall level is reached. -Worse, if the supplier driver is blacklisted or missing, the consumer will -never be probed. +Driver authors should be aware that a driver presence dependency for managed +device links (i.e. when ``DL_FLAG_STATELESS`` is not specified on link addition) +may cause probing of the consumer to be deferred indefinitely. This can become +a problem if the consumer is required to probe before a certain initcall level +is reached. Worse, if the supplier driver is blacklisted or missing, the +consumer will never be probed. + +Moreover, managed device links cannot be deleted directly. They are deleted +by the driver core when they are not necessary any more in accordance with the +``DL_FLAG_AUTOREMOVE_CONSUMER`` and ``DL_FLAG_AUTOREMOVE_SUPPLIER`` flags. +However, stateless device links (i.e. device links with ``DL_FLAG_STATELESS`` +set) are expected to be removed by whoever called :c:func:`device_link_add()` +to add them with the help of either :c:func:`device_link_del()` or +:c:func:`device_link_remove()`. Sometimes drivers depend on optional resources. They are able to operate in a degraded mode (reduced feature set or performance) when those resources @@ -282,4 +303,4 @@ === .. kernel-doc:: drivers/base/core.c - :functions: device_link_add device_link_del + :functions: device_link_add device_link_del device_link_remove diff -Nru linux-4.19.98/Documentation/filesystems/porting linux-4.19.118/Documentation/filesystems/porting --- linux-4.19.98/Documentation/filesystems/porting 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/filesystems/porting 2020-04-23 08:30:24.000000000 +0000 @@ -627,3 +627,10 @@ DCACHE_RCUACCESS is gone; having an RCU delay on dentry freeing is the default. DCACHE_NORCU opts out, and only d_alloc_pseudo() has any business doing so. +-- +[mandatory] + + [should've been added in 2016] stale comment in finish_open() + nonwithstanding, failure exits in ->atomic_open() instances should + *NOT* fput() the file, no matter what. Everything is handled by the + caller. diff -Nru linux-4.19.98/Documentation/networking/nf_flowtable.txt linux-4.19.118/Documentation/networking/nf_flowtable.txt --- linux-4.19.98/Documentation/networking/nf_flowtable.txt 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/networking/nf_flowtable.txt 2020-04-23 08:30:24.000000000 +0000 @@ -76,7 +76,7 @@ table inet x { flowtable f { - hook ingress priority 0 devices = { eth0, eth1 }; + hook ingress priority 0; devices = { eth0, eth1 }; } chain y { type filter hook forward priority 0; policy accept; diff -Nru linux-4.19.98/Documentation/sound/hd-audio/index.rst linux-4.19.118/Documentation/sound/hd-audio/index.rst --- linux-4.19.98/Documentation/sound/hd-audio/index.rst 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/sound/hd-audio/index.rst 2020-04-23 08:30:24.000000000 +0000 @@ -8,3 +8,4 @@ models controls dp-mst + realtek-pc-beep diff -Nru linux-4.19.98/Documentation/sound/hd-audio/models.rst linux-4.19.118/Documentation/sound/hd-audio/models.rst --- linux-4.19.98/Documentation/sound/hd-audio/models.rst 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Documentation/sound/hd-audio/models.rst 2020-04-23 08:30:24.000000000 +0000 @@ -216,8 +216,6 @@ ALC298 fixups on Dell AIO machines alc275-dell-xps ALC275 fixups on Dell XPS models -alc256-dell-xps13 - ALC256 fixups on Dell XPS13 lenovo-spk-noise Workaround for speaker noise on Lenovo machines lenovo-hotkey diff -Nru linux-4.19.98/Documentation/sound/hd-audio/realtek-pc-beep.rst linux-4.19.118/Documentation/sound/hd-audio/realtek-pc-beep.rst --- linux-4.19.98/Documentation/sound/hd-audio/realtek-pc-beep.rst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/Documentation/sound/hd-audio/realtek-pc-beep.rst 2020-04-23 08:30:24.000000000 +0000 @@ -0,0 +1,129 @@ +=============================== +Realtek PC Beep Hidden Register +=============================== + +This file documents the "PC Beep Hidden Register", which is present in certain +Realtek HDA codecs and controls a muxer and pair of passthrough mixers that can +route audio between pins but aren't themselves exposed as HDA widgets. As far +as I can tell, these hidden routes are designed to allow flexible PC Beep output +for codecs that don't have mixer widgets in their output paths. Why it's easier +to hide a mixer behind an undocumented vendor register than to just expose it +as a widget, I have no idea. + +Register Description +==================== + +The register is accessed via processing coefficient 0x36 on NID 20h. Bits not +identified below have no discernible effect on my machine, a Dell XPS 13 9350:: + + MSB LSB + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | |h|S|L| | B |R| | Known bits + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + |0|0|1|1| 0x7 |0|0x0|1| 0x7 | Reset value + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +1Ah input select (B): 2 bits + When zero, expose the PC Beep line (from the internal beep generator, when + enabled with the Set Beep Generation verb on NID 01h, or else from the + external PCBEEP pin) on the 1Ah pin node. When nonzero, expose the headphone + jack (or possibly Line In on some machines) input instead. If PC Beep is + selected, the 1Ah boost control has no effect. + +Amplify 1Ah loopback, left (L): 1 bit + Amplify the left channel of 1Ah before mixing it into outputs as specified + by h and S bits. Does not affect the level of 1Ah exposed to other widgets. + +Amplify 1Ah loopback, right (R): 1 bit + Amplify the right channel of 1Ah before mixing it into outputs as specified + by h and S bits. Does not affect the level of 1Ah exposed to other widgets. + +Loopback 1Ah to 21h [active low] (h): 1 bit + When zero, mix 1Ah (possibly with amplification, depending on L and R bits) + into 21h (headphone jack on my machine). Mixed signal respects the mute + setting on 21h. + +Loopback 1Ah to 14h (S): 1 bit + When one, mix 1Ah (possibly with amplification, depending on L and R bits) + into 14h (internal speaker on my machine). Mixed signal **ignores** the mute + setting on 14h and is present whenever 14h is configured as an output. + +Path diagrams +============= + +1Ah input selection (DIV is the PC Beep divider set on NID 01h):: + + + | | | + +--DIV--+--!DIV--+ {1Ah boost control} + | | + +--(b == 0)--+--(b != 0)--+ + | + >1Ah (Beep/Headphone Mic/Line In)< + +Loopback of 1Ah to 21h/14h:: + + <1Ah (Beep/Headphone Mic/Line In)> + | + {amplify if L/R} + | + +-----!h-----+-----S-----+ + | | + {21h mute control} | + | | + >21h (Headphone)< >14h (Internal Speaker)< + +Background +========== + +All Realtek HDA codecs have a vendor-defined widget with node ID 20h which +provides access to a bank of registers that control various codec functions. +Registers are read and written via the standard HDA processing coefficient +verbs (Set/Get Coefficient Index, Set/Get Processing Coefficient). The node is +named "Realtek Vendor Registers" in public datasheets' verb listings and, +apart from that, is entirely undocumented. + +This particular register, exposed at coefficient 0x36 and named in commits from +Realtek, is of note: unlike most registers, which seem to control detailed +amplifier parameters not in scope of the HDA specification, it controls audio +routing which could just as easily have been defined using standard HDA mixer +and selector widgets. + +Specifically, it selects between two sources for the input pin widget with Node +ID (NID) 1Ah: the widget's signal can come either from an audio jack (on my +laptop, a Dell XPS 13 9350, it's the headphone jack, but comments in Realtek +commits indicate that it might be a Line In on some machines) or from the PC +Beep line (which is itself multiplexed between the codec's internal beep +generator and external PCBEEP pin, depending on if the beep generator is +enabled via verbs on NID 01h). Additionally, it can mix (with optional +amplification) that signal onto the 21h and/or 14h output pins. + +The register's reset value is 0x3717, corresponding to PC Beep on 1Ah that is +then amplified and mixed into both the headphones and the speakers. Not only +does this violate the HDA specification, which says that "[a vendor defined +beep input pin] connection may be maintained *only* while the Link reset +(**RST#**) is asserted", it means that we cannot ignore the register if we care +about the input that 1Ah would otherwise expose or if the PCBEEP trace is +poorly shielded and picks up chassis noise (both of which are the case on my +machine). + +Unfortunately, there are lots of ways to get this register configuration wrong. +Linux, it seems, has gone through most of them. For one, the register resets +after S3 suspend: judging by existing code, this isn't the case for all vendor +registers, and it's led to some fixes that improve behavior on cold boot but +don't last after suspend. Other fixes have successfully switched the 1Ah input +away from PC Beep but have failed to disable both loopback paths. On my +machine, this means that the headphone input is amplified and looped back to +the headphone output, which uses the exact same pins! As you might expect, this +causes terrible headphone noise, the character of which is controlled by the +1Ah boost control. (If you've seen instructions online to fix XPS 13 headphone +noise by changing "Headphone Mic Boost" in ALSA, now you know why.) + +The information here has been obtained through black-box reverse engineering of +the ALC256 codec's behavior and is not guaranteed to be correct. It likely +also applies for the ALC255, ALC257, ALC235, and ALC236, since those codecs +seem to be close relatives of the ALC256. (They all share one initialization +function.) Additionally, other codecs like the ALC225 and ALC285 also have this +register, judging by existing fixups in ``patch_realtek.c``, but specific +data (e.g. node IDs, bit positions, pin mappings) for those codecs may differ +from what I've described here. diff -Nru linux-4.19.98/MAINTAINERS linux-4.19.118/MAINTAINERS --- linux-4.19.98/MAINTAINERS 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/MAINTAINERS 2020-04-23 08:30:24.000000000 +0000 @@ -7340,7 +7340,7 @@ M: Rodrigo Vivi L: intel-gfx@lists.freedesktop.org W: https://01.org/linuxgraphics/ -B: https://01.org/linuxgraphics/documentation/how-report-bugs +B: https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs C: irc://chat.freenode.net/intel-gfx Q: http://patchwork.freedesktop.org/project/intel-gfx/ T: git git://anongit.freedesktop.org/drm-intel diff -Nru linux-4.19.98/Makefile linux-4.19.118/Makefile --- linux-4.19.98/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 98 +SUBLEVEL = 118 EXTRAVERSION = NAME = "People's Front" @@ -964,6 +964,7 @@ endif endif +PHONY += prepare0 ifeq ($(KBUILD_EXTMOD),) core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ @@ -1072,8 +1073,7 @@ # archprepare is used in arch Makefiles and when processed asm symlink, # version.h and scripts_basic is processed / created. -# Listed in dependency order -PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3 +PHONY += prepare archprepare prepare1 prepare2 prepare3 # prepare3 is used to check if we are building in a separate output directory, # and if so do: diff -Nru linux-4.19.98/arch/arc/boot/dts/axs10x_mb.dtsi linux-4.19.118/arch/arc/boot/dts/axs10x_mb.dtsi --- linux-4.19.98/arch/arc/boot/dts/axs10x_mb.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arc/boot/dts/axs10x_mb.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -80,6 +80,7 @@ interrupt-names = "macirq"; phy-mode = "rgmii"; snps,pbl = < 32 >; + snps,multicast-filter-bins = <256>; clocks = <&apbclk>; clock-names = "stmmaceth"; max-speed = <100>; diff -Nru linux-4.19.98/arch/arc/include/asm/linkage.h linux-4.19.118/arch/arc/include/asm/linkage.h --- linux-4.19.98/arch/arc/include/asm/linkage.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arc/include/asm/linkage.h 2020-04-23 08:30:24.000000000 +0000 @@ -14,6 +14,8 @@ #ifdef __ASSEMBLY__ #define ASM_NL ` /* use '`' to mark new line in macro */ +#define __ALIGN .align 4 +#define __ALIGN_STR __stringify(__ALIGN) /* annotation for data we want in DCCM - if enabled in .config */ .macro ARCFP_DATA nm diff -Nru linux-4.19.98/arch/arc/plat-eznps/Kconfig linux-4.19.118/arch/arc/plat-eznps/Kconfig --- linux-4.19.98/arch/arc/plat-eznps/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arc/plat-eznps/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -7,7 +7,7 @@ menuconfig ARC_PLAT_EZNPS bool "\"EZchip\" ARC dev platform" select CPU_BIG_ENDIAN - select CLKSRC_NPS + select CLKSRC_NPS if !PHYS_ADDR_T_64BIT select EZNPS_GIC select EZCHIP_NPS_MANAGEMENT_ENET if ETHERNET help diff -Nru linux-4.19.98/arch/arm/Kconfig linux-4.19.118/arch/arm/Kconfig --- linux-4.19.98/arch/arm/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -61,7 +61,7 @@ select HAVE_EBPF_JIT if !CPU_ENDIAN_BE32 select HAVE_CONTEXT_TRACKING select HAVE_C_RECORDMCOUNT - select HAVE_DEBUG_KMEMLEAK + select HAVE_DEBUG_KMEMLEAK if !XIP_KERNEL select HAVE_DMA_CONTIGUOUS if MMU select HAVE_DYNAMIC_FTRACE if (!XIP_KERNEL) && !CPU_ENDIAN_BE32 && MMU select HAVE_DYNAMIC_FTRACE_WITH_REGS if HAVE_DYNAMIC_FTRACE @@ -2008,7 +2008,7 @@ config KEXEC bool "Kexec system call (EXPERIMENTAL)" depends on (!SMP || PM_SLEEP_SMP) - depends on !CPU_V7M + depends on MMU select KEXEC_CORE help kexec is a system call that implements the ability to shutdown your diff -Nru linux-4.19.98/arch/arm/boot/dts/am335x-boneblack-common.dtsi linux-4.19.118/arch/arm/boot/dts/am335x-boneblack-common.dtsi --- linux-4.19.98/arch/arm/boot/dts/am335x-boneblack-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/am335x-boneblack-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -131,6 +131,11 @@ }; / { + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x20000000>; /* 512 MB */ + }; + clk_mcasp0_fixed: clk_mcasp0_fixed { #clock-cells = <0>; compatible = "fixed-clock"; diff -Nru linux-4.19.98/arch/arm/boot/dts/am437x-idk-evm.dts linux-4.19.118/arch/arm/boot/dts/am437x-idk-evm.dts --- linux-4.19.98/arch/arm/boot/dts/am437x-idk-evm.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/am437x-idk-evm.dts 2020-04-23 08:30:24.000000000 +0000 @@ -525,11 +525,11 @@ * Supply voltage supervisor on board will not allow opp50 so * disable it and set opp100 as suspend OPP. */ - opp50@300000000 { + opp50-300000000 { status = "disabled"; }; - opp100@600000000 { + opp100-600000000 { opp-suspend; }; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/am43x-epos-evm.dts linux-4.19.118/arch/arm/boot/dts/am43x-epos-evm.dts --- linux-4.19.98/arch/arm/boot/dts/am43x-epos-evm.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/am43x-epos-evm.dts 2020-04-23 08:30:24.000000000 +0000 @@ -839,6 +839,7 @@ pinctrl-names = "default", "sleep"; pinctrl-0 = <&spi0_pins_default>; pinctrl-1 = <&spi0_pins_sleep>; + ti,pindir-d0-out-d1-in = <1>; }; &spi1 { @@ -846,6 +847,7 @@ pinctrl-names = "default", "sleep"; pinctrl-0 = <&spi1_pins_default>; pinctrl-1 = <&spi1_pins_sleep>; + ti,pindir-d0-out-d1-in = <1>; }; &usb2_phy1 { diff -Nru linux-4.19.98/arch/arm/boot/dts/am43xx-clocks.dtsi linux-4.19.118/arch/arm/boot/dts/am43xx-clocks.dtsi --- linux-4.19.98/arch/arm/boot/dts/am43xx-clocks.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/am43xx-clocks.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -707,6 +707,60 @@ ti,bit-shift = <8>; reg = <0x2a48>; }; + + clkout1_osc_div_ck: clkout1-osc-div-ck { + #clock-cells = <0>; + compatible = "ti,divider-clock"; + clocks = <&sys_clkin_ck>; + ti,bit-shift = <20>; + ti,max-div = <4>; + reg = <0x4100>; + }; + + clkout1_src2_mux_ck: clkout1-src2-mux-ck { + #clock-cells = <0>; + compatible = "ti,mux-clock"; + clocks = <&clk_rc32k_ck>, <&sysclk_div>, <&dpll_ddr_m2_ck>, + <&dpll_per_m2_ck>, <&dpll_disp_m2_ck>, + <&dpll_mpu_m2_ck>; + reg = <0x4100>; + }; + + clkout1_src2_pre_div_ck: clkout1-src2-pre-div-ck { + #clock-cells = <0>; + compatible = "ti,divider-clock"; + clocks = <&clkout1_src2_mux_ck>; + ti,bit-shift = <4>; + ti,max-div = <8>; + reg = <0x4100>; + }; + + clkout1_src2_post_div_ck: clkout1-src2-post-div-ck { + #clock-cells = <0>; + compatible = "ti,divider-clock"; + clocks = <&clkout1_src2_pre_div_ck>; + ti,bit-shift = <8>; + ti,max-div = <32>; + ti,index-power-of-two; + reg = <0x4100>; + }; + + clkout1_mux_ck: clkout1-mux-ck { + #clock-cells = <0>; + compatible = "ti,mux-clock"; + clocks = <&clkout1_osc_div_ck>, <&clk_rc32k_ck>, + <&clkout1_src2_post_div_ck>, <&dpll_extdev_m2_ck>; + ti,bit-shift = <16>; + reg = <0x4100>; + }; + + clkout1_ck: clkout1-ck { + #clock-cells = <0>; + compatible = "ti,gate-clock"; + clocks = <&clkout1_mux_ck>; + ti,bit-shift = <23>; + reg = <0x4100>; + }; }; &prcm { diff -Nru linux-4.19.98/arch/arm/boot/dts/am571x-idk.dts linux-4.19.118/arch/arm/boot/dts/am571x-idk.dts --- linux-4.19.98/arch/arm/boot/dts/am571x-idk.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/am571x-idk.dts 2020-04-23 08:30:24.000000000 +0000 @@ -93,10 +93,6 @@ gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>; }; -&pcie1_ep { - gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; -}; - &mmc1 { pinctrl-names = "default", "hs"; pinctrl-0 = <&mmc1_pins_default_no_clk_pu>; diff -Nru linux-4.19.98/arch/arm/boot/dts/am572x-idk-common.dtsi linux-4.19.118/arch/arm/boot/dts/am572x-idk-common.dtsi --- linux-4.19.98/arch/arm/boot/dts/am572x-idk-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/am572x-idk-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -71,10 +71,6 @@ gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; }; -&pcie1_ep { - gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; -}; - &mailbox5 { status = "okay"; mbox_ipu1_ipc3x: mbox_ipu1_ipc3x { diff -Nru linux-4.19.98/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi linux-4.19.118/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi --- linux-4.19.98/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -32,6 +32,27 @@ reg = <0x0 0x80000000 0x0 0x80000000>; }; + main_12v0: fixedregulator-main_12v0 { + /* main supply */ + compatible = "regulator-fixed"; + regulator-name = "main_12v0"; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + regulator-always-on; + regulator-boot-on; + }; + + evm_5v0: fixedregulator-evm_5v0 { + /* Output of TPS54531D */ + compatible = "regulator-fixed"; + regulator-name = "evm_5v0"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&main_12v0>; + regulator-always-on; + regulator-boot-on; + }; + vdd_3v3: fixedregulator-vdd_3v3 { compatible = "regulator-fixed"; regulator-name = "vdd_3v3"; @@ -550,10 +571,6 @@ gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; }; -&pcie1_ep { - gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; -}; - &mcasp3 { #sound-dai-cells = <0>; assigned-clocks = <&l4per_clkctrl DRA7_MCASP3_CLKCTRL 24>; diff -Nru linux-4.19.98/arch/arm/boot/dts/aspeed-g5.dtsi linux-4.19.118/arch/arm/boot/dts/aspeed-g5.dtsi --- linux-4.19.98/arch/arm/boot/dts/aspeed-g5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/aspeed-g5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -247,7 +247,7 @@ compatible = "aspeed,ast2500-gpio"; reg = <0x1e780000 0x1000>; interrupts = <20>; - gpio-ranges = <&pinctrl 0 0 220>; + gpio-ranges = <&pinctrl 0 0 232>; clocks = <&syscon ASPEED_CLK_APB>; interrupt-controller; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/at91-nattis-2-natte-2.dts linux-4.19.118/arch/arm/boot/dts/at91-nattis-2-natte-2.dts --- linux-4.19.98/arch/arm/boot/dts/at91-nattis-2-natte-2.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/at91-nattis-2-natte-2.dts 2020-04-23 08:30:24.000000000 +0000 @@ -38,14 +38,16 @@ atmel,pins = ; + (AT91_PINCTRL_OUTPUT | + AT91_PINCTRL_OUTPUT_VAL(0))>; }; pinctrl_lcd_hipow0: lcd_hipow0 { atmel,pins = ; + (AT91_PINCTRL_OUTPUT | + AT91_PINCTRL_OUTPUT_VAL(0))>; }; }; }; @@ -219,6 +221,7 @@ reg = <0>; bus-width = <4>; cd-gpios = <&pioD 5 GPIO_ACTIVE_HIGH>; + cd-inverted; }; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/at91sam9260.dtsi linux-4.19.118/arch/arm/boot/dts/at91sam9260.dtsi --- linux-4.19.98/arch/arm/boot/dts/at91sam9260.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/at91sam9260.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -434,7 +434,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - ; }; @@ -468,7 +468,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - ; }; @@ -486,7 +486,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - ; }; @@ -504,7 +504,7 @@ usart3 { pinctrl_usart3: usart3-0 { atmel,pins = - ; }; @@ -522,7 +522,7 @@ uart0 { pinctrl_uart0: uart0-0 { atmel,pins = - ; }; }; @@ -530,7 +530,7 @@ uart1 { pinctrl_uart1: uart1-0 { atmel,pins = - ; }; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/at91sam9261.dtsi linux-4.19.118/arch/arm/boot/dts/at91sam9261.dtsi --- linux-4.19.98/arch/arm/boot/dts/at91sam9261.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/at91sam9261.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -328,7 +328,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - , + , ; }; @@ -346,7 +346,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - , + , ; }; @@ -364,7 +364,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - , + , ; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/at91sam9263.dtsi linux-4.19.118/arch/arm/boot/dts/at91sam9263.dtsi --- linux-4.19.98/arch/arm/boot/dts/at91sam9263.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/at91sam9263.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -437,7 +437,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - ; }; @@ -455,7 +455,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - ; }; @@ -473,7 +473,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - ; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/at91sam9g45.dtsi linux-4.19.118/arch/arm/boot/dts/at91sam9g45.dtsi --- linux-4.19.98/arch/arm/boot/dts/at91sam9g45.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/at91sam9g45.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -555,7 +555,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - ; }; @@ -573,7 +573,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - ; }; @@ -591,7 +591,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - ; }; @@ -609,7 +609,7 @@ usart3 { pinctrl_usart3: usart3-0 { atmel,pins = - ; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/at91sam9rl.dtsi linux-4.19.118/arch/arm/boot/dts/at91sam9rl.dtsi --- linux-4.19.98/arch/arm/boot/dts/at91sam9rl.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/at91sam9rl.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -681,7 +681,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - , + , ; }; @@ -720,7 +720,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - , + , ; }; @@ -743,7 +743,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - , + , ; }; @@ -766,7 +766,7 @@ usart3 { pinctrl_usart3: usart3-0 { atmel,pins = - , + , ; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts linux-4.19.118/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts --- linux-4.19.98/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts 2020-04-23 08:30:24.000000000 +0000 @@ -118,6 +118,7 @@ &sdhci { #address-cells = <1>; #size-cells = <0>; + pinctrl-names = "default"; pinctrl-0 = <&emmc_gpio34 &gpclk2_gpio43>; mmc-pwrseq = <&wifi_pwrseq>; non-removable; diff -Nru linux-4.19.98/arch/arm/boot/dts/bcm2835-rpi.dtsi linux-4.19.118/arch/arm/boot/dts/bcm2835-rpi.dtsi --- linux-4.19.98/arch/arm/boot/dts/bcm2835-rpi.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/bcm2835-rpi.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -32,7 +32,7 @@ mailbox@7e00b840 { compatible = "brcm,bcm2835-vchiq"; - reg = <0x7e00b840 0xf>; + reg = <0x7e00b840 0x3c>; interrupts = <0 2>; }; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/dra7.dtsi linux-4.19.118/arch/arm/boot/dts/dra7.dtsi --- linux-4.19.98/arch/arm/boot/dts/dra7.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/dra7.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -150,6 +150,7 @@ #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0x0 0x0 0xc0000000>; + dma-ranges = <0x80000000 0x0 0x80000000 0x80000000>; ti,hwmods = "l3_main_1", "l3_main_2"; reg = <0x0 0x44000000 0x0 0x1000000>, <0x0 0x45000000 0x0 0x1000>; @@ -324,6 +325,7 @@ device_type = "pci"; ranges = <0x81000000 0 0 0x03000 0 0x00010000 0x82000000 0 0x20013000 0x13000 0 0xffed000>; + dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>; bus-range = <0x00 0xff>; #interrupt-cells = <1>; num-lanes = <1>; @@ -376,6 +378,7 @@ device_type = "pci"; ranges = <0x81000000 0 0 0x03000 0 0x00010000 0x82000000 0 0x30013000 0x13000 0 0xffed000>; + dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>; bus-range = <0x00 0xff>; #interrupt-cells = <1>; num-lanes = <1>; diff -Nru linux-4.19.98/arch/arm/boot/dts/dra76x.dtsi linux-4.19.118/arch/arm/boot/dts/dra76x.dtsi --- linux-4.19.98/arch/arm/boot/dts/dra76x.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/dra76x.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -81,3 +81,8 @@ reg = <0x3fc>; }; }; + +&mmc3 { + /* dra76x is not affected by i887 */ + max-frequency = <96000000>; +}; diff -Nru linux-4.19.98/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi linux-4.19.118/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi --- linux-4.19.98/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/imx6qdl-phytec-phycore-som.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -107,14 +107,14 @@ regulators { vdd_arm: buck1 { regulator-name = "vdd_arm"; - regulator-min-microvolt = <730000>; + regulator-min-microvolt = <925000>; regulator-max-microvolt = <1380000>; regulator-always-on; }; vdd_soc: buck2 { regulator-name = "vdd_soc"; - regulator-min-microvolt = <730000>; + regulator-min-microvolt = <1150000>; regulator-max-microvolt = <1380000>; regulator-always-on; }; @@ -183,7 +183,6 @@ pinctrl-0 = <&pinctrl_usdhc4>; bus-width = <8>; non-removable; - vmmc-supply = <&vdd_emmc_1p8>; status = "disabled"; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi linux-4.19.118/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi --- linux-4.19.98/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/imx6qdl-zii-rdu2.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -657,7 +657,7 @@ pinctrl-0 = <&pinctrl_usdhc2>; bus-width = <4>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; - wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>; + disable-wp; vmmc-supply = <®_3p3v_sd>; vqmmc-supply = <®_3p3v>; no-1-8-v; @@ -670,7 +670,7 @@ pinctrl-0 = <&pinctrl_usdhc3>; bus-width = <4>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>; - wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; + disable-wp; vmmc-supply = <®_3p3v_sd>; vqmmc-supply = <®_3p3v>; no-1-8-v; @@ -804,6 +804,7 @@ &usbh1 { vbus-supply = <®_5p0v_main>; disable-over-current; + maximum-speed = "full-speed"; status = "okay"; }; @@ -1081,7 +1082,6 @@ MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059 MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059 MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x17059 - MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x40010040 MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x40010040 >; }; @@ -1094,7 +1094,6 @@ MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059 MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059 MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059 - MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x40010040 MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x40010040 >; diff -Nru linux-4.19.98/arch/arm/boot/dts/imx6qdl.dtsi linux-4.19.118/arch/arm/boot/dts/imx6qdl.dtsi --- linux-4.19.98/arch/arm/boot/dts/imx6qdl.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/imx6qdl.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -1013,9 +1013,8 @@ compatible = "fsl,imx6q-fec"; reg = <0x02188000 0x4000>; interrupt-names = "int0", "pps"; - interrupts-extended = - <&intc 0 118 IRQ_TYPE_LEVEL_HIGH>, - <&intc 0 119 IRQ_TYPE_LEVEL_HIGH>; + interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>, + <0 119 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6QDL_CLK_ENET>, <&clks IMX6QDL_CLK_ENET>, <&clks IMX6QDL_CLK_ENET_REF>; diff -Nru linux-4.19.98/arch/arm/boot/dts/imx6qp.dtsi linux-4.19.118/arch/arm/boot/dts/imx6qp.dtsi --- linux-4.19.98/arch/arm/boot/dts/imx6qp.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/imx6qp.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -77,7 +77,6 @@ }; &fec { - /delete-property/interrupts-extended; interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>, <0 119 IRQ_TYPE_LEVEL_HIGH>; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/imx7-colibri.dtsi linux-4.19.118/arch/arm/boot/dts/imx7-colibri.dtsi --- linux-4.19.98/arch/arm/boot/dts/imx7-colibri.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/imx7-colibri.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -319,7 +319,6 @@ assigned-clock-rates = <400000000>; bus-width = <8>; fsl,tuning-step = <2>; - max-frequency = <100000000>; vmmc-supply = <®_module_3v3>; vqmmc-supply = <®_DCDC3>; non-removable; diff -Nru linux-4.19.98/arch/arm/boot/dts/iwg20d-q7-common.dtsi linux-4.19.118/arch/arm/boot/dts/iwg20d-q7-common.dtsi --- linux-4.19.98/arch/arm/boot/dts/iwg20d-q7-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/iwg20d-q7-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -87,7 +87,7 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; - gpios = <&gpio2 30 GPIO_ACTIVE_LOW>; + gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>; gpios-states = <1>; states = <3300000 1 1800000 0>; diff -Nru linux-4.19.98/arch/arm/boot/dts/logicpd-som-lv-baseboard.dtsi linux-4.19.118/arch/arm/boot/dts/logicpd-som-lv-baseboard.dtsi --- linux-4.19.98/arch/arm/boot/dts/logicpd-som-lv-baseboard.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/logicpd-som-lv-baseboard.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -153,7 +153,7 @@ pinctrl-names = "default"; pinctrl-0 = <&mmc1_pins>; wp-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; /* gpio_126 */ - cd-gpios = <&gpio4 14 IRQ_TYPE_LEVEL_LOW>; /* gpio_110 */ + cd-gpios = <&gpio4 14 GPIO_ACTIVE_LOW>; /* gpio_110 */ vmmc-supply = <&vmmc1>; bus-width = <4>; cap-power-off-card; diff -Nru linux-4.19.98/arch/arm/boot/dts/logicpd-som-lv.dtsi linux-4.19.118/arch/arm/boot/dts/logicpd-som-lv.dtsi --- linux-4.19.98/arch/arm/boot/dts/logicpd-som-lv.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/logicpd-som-lv.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -232,6 +232,20 @@ >; }; + i2c2_pins: pinmux_i2c2_pins { + pinctrl-single,pins = < + OMAP3_CORE1_IOPAD(0x21be, PIN_INPUT | MUX_MODE0) /* i2c2_scl */ + OMAP3_CORE1_IOPAD(0x21c0, PIN_INPUT | MUX_MODE0) /* i2c2_sda */ + >; + }; + + i2c3_pins: pinmux_i2c3_pins { + pinctrl-single,pins = < + OMAP3_CORE1_IOPAD(0x21c2, PIN_INPUT | MUX_MODE0) /* i2c3_scl */ + OMAP3_CORE1_IOPAD(0x21c4, PIN_INPUT | MUX_MODE0) /* i2c3_sda */ + >; + }; + tsc2004_pins: pinmux_tsc2004_pins { pinctrl-single,pins = < OMAP3_CORE1_IOPAD(0x2186, PIN_INPUT | MUX_MODE4) /* mcbsp4_dr.gpio_153 */ @@ -253,18 +267,6 @@ OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */ >; }; - i2c2_pins: pinmux_i2c2_pins { - pinctrl-single,pins = < - OMAP3_CORE1_IOPAD(0x21be, PIN_INPUT | MUX_MODE0) /* i2c2_scl */ - OMAP3_CORE1_IOPAD(0x21c0, PIN_INPUT | MUX_MODE0) /* i2c2_sda */ - >; - }; - i2c3_pins: pinmux_i2c3_pins { - pinctrl-single,pins = < - OMAP3_CORE1_IOPAD(0x21c2, PIN_INPUT | MUX_MODE0) /* i2c3_scl */ - OMAP3_CORE1_IOPAD(0x21c4, PIN_INPUT | MUX_MODE0) /* i2c3_sda */ - >; - }; }; &omap3_pmx_core2 { diff -Nru linux-4.19.98/arch/arm/boot/dts/lpc3250-phy3250.dts linux-4.19.118/arch/arm/boot/dts/lpc3250-phy3250.dts --- linux-4.19.98/arch/arm/boot/dts/lpc3250-phy3250.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/lpc3250-phy3250.dts 2020-04-23 08:30:24.000000000 +0000 @@ -49,8 +49,8 @@ sd_reg: regulator@2 { compatible = "regulator-fixed"; regulator-name = "sd_reg"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; gpio = <&gpio 5 5 0>; enable-active-high; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/lpc32xx.dtsi linux-4.19.118/arch/arm/boot/dts/lpc32xx.dtsi --- linux-4.19.98/arch/arm/boot/dts/lpc32xx.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/lpc32xx.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -139,11 +139,11 @@ }; clcd: clcd@31040000 { - compatible = "arm,pl110", "arm,primecell"; + compatible = "arm,pl111", "arm,primecell"; reg = <0x31040000 0x1000>; interrupts = <14 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&clk LPC32XX_CLK_LCD>; - clock-names = "apb_pclk"; + clocks = <&clk LPC32XX_CLK_LCD>, <&clk LPC32XX_CLK_LCD>; + clock-names = "clcdclk", "apb_pclk"; status = "disabled"; }; @@ -462,7 +462,9 @@ key: key@40050000 { compatible = "nxp,lpc3220-key"; reg = <0x40050000 0x1000>; - interrupts = <54 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clk LPC32XX_CLK_KEY>; + interrupt-parent = <&sic1>; + interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/ls1021a-twr.dts linux-4.19.118/arch/arm/boot/dts/ls1021a-twr.dts --- linux-4.19.98/arch/arm/boot/dts/ls1021a-twr.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/ls1021a-twr.dts 2020-04-23 08:30:24.000000000 +0000 @@ -143,7 +143,7 @@ }; &enet0 { - tbi-handle = <&tbi1>; + tbi-handle = <&tbi0>; phy-handle = <&sgmii_phy2>; phy-connection-type = "sgmii"; status = "okay"; @@ -222,6 +222,13 @@ sgmii_phy2: ethernet-phy@2 { reg = <0x2>; }; + tbi0: tbi-phy@1f { + reg = <0x1f>; + device_type = "tbi-phy"; + }; +}; + +&mdio1 { tbi1: tbi-phy@1f { reg = <0x1f>; device_type = "tbi-phy"; diff -Nru linux-4.19.98/arch/arm/boot/dts/ls1021a.dtsi linux-4.19.118/arch/arm/boot/dts/ls1021a.dtsi --- linux-4.19.98/arch/arm/boot/dts/ls1021a.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/ls1021a.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -592,6 +592,15 @@ <0x0 0x2d10030 0x0 0x4>; }; + mdio1: mdio@2d64000 { + compatible = "gianfar"; + device_type = "mdio"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x0 0x2d64000 0x0 0x4000>, + <0x0 0x2d50030 0x0 0x4>; + }; + ptp_clock@2d10e00 { compatible = "fsl,etsec-ptp"; reg = <0x0 0x2d10e00 0x0 0xb0>; diff -Nru linux-4.19.98/arch/arm/boot/dts/omap3-n900.dts linux-4.19.118/arch/arm/boot/dts/omap3-n900.dts --- linux-4.19.98/arch/arm/boot/dts/omap3-n900.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/omap3-n900.dts 2020-04-23 08:30:24.000000000 +0000 @@ -158,6 +158,12 @@ pwms = <&pwm9 0 26316 0>; /* 38000 Hz */ }; + rom_rng: rng { + compatible = "nokia,n900-rom-rng"; + clocks = <&rng_ick>; + clock-names = "ick"; + }; + /* controlled (enabled/disabled) directly by bcm2048 and wl1251 */ vctcxo: vctcxo { compatible = "fixed-clock"; @@ -846,34 +852,46 @@ compatible = "ti,omap2-onenand"; reg = <0 0 0x20000>; /* CS0, offset 0, IO size 128K */ + /* + * These timings are based on CONFIG_OMAP_GPMC_DEBUG=y reported + * bootloader set values when booted with v5.1 + * (OneNAND Manufacturer: Samsung): + * + * cs0 GPMC_CS_CONFIG1: 0xfb001202 + * cs0 GPMC_CS_CONFIG2: 0x00111100 + * cs0 GPMC_CS_CONFIG3: 0x00020200 + * cs0 GPMC_CS_CONFIG4: 0x11001102 + * cs0 GPMC_CS_CONFIG5: 0x03101616 + * cs0 GPMC_CS_CONFIG6: 0x90060000 + */ gpmc,sync-read; gpmc,sync-write; gpmc,burst-length = <16>; gpmc,burst-read; gpmc,burst-wrap; gpmc,burst-write; - gpmc,device-width = <2>; /* GPMC_DEVWIDTH_16BIT */ - gpmc,mux-add-data = <2>; /* GPMC_MUX_AD */ + gpmc,device-width = <2>; + gpmc,mux-add-data = <2>; gpmc,cs-on-ns = <0>; - gpmc,cs-rd-off-ns = <87>; - gpmc,cs-wr-off-ns = <87>; + gpmc,cs-rd-off-ns = <102>; + gpmc,cs-wr-off-ns = <102>; gpmc,adv-on-ns = <0>; - gpmc,adv-rd-off-ns = <10>; - gpmc,adv-wr-off-ns = <10>; - gpmc,oe-on-ns = <15>; - gpmc,oe-off-ns = <87>; + gpmc,adv-rd-off-ns = <12>; + gpmc,adv-wr-off-ns = <12>; + gpmc,oe-on-ns = <12>; + gpmc,oe-off-ns = <102>; gpmc,we-on-ns = <0>; - gpmc,we-off-ns = <87>; - gpmc,rd-cycle-ns = <112>; - gpmc,wr-cycle-ns = <112>; - gpmc,access-ns = <81>; - gpmc,page-burst-access-ns = <15>; + gpmc,we-off-ns = <102>; + gpmc,rd-cycle-ns = <132>; + gpmc,wr-cycle-ns = <132>; + gpmc,access-ns = <96>; + gpmc,page-burst-access-ns = <18>; gpmc,bus-turnaround-ns = <0>; gpmc,cycle2cycle-delay-ns = <0>; gpmc,wait-monitoring-ns = <0>; - gpmc,clk-activation-ns = <5>; - gpmc,wr-data-mux-bus-ns = <30>; - gpmc,wr-access-ns = <81>; + gpmc,clk-activation-ns = <6>; + gpmc,wr-data-mux-bus-ns = <36>; + gpmc,wr-access-ns = <96>; gpmc,sync-clk-ps = <15000>; /* diff -Nru linux-4.19.98/arch/arm/boot/dts/omap5.dtsi linux-4.19.118/arch/arm/boot/dts/omap5.dtsi --- linux-4.19.98/arch/arm/boot/dts/omap5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/omap5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -144,6 +144,7 @@ #address-cells = <1>; #size-cells = <1>; ranges = <0 0 0 0xc0000000>; + dma-ranges = <0x80000000 0x0 0x80000000 0x80000000>; ti,hwmods = "l3_main_1", "l3_main_2", "l3_main_3"; reg = <0 0x44000000 0 0x2000>, <0 0x44800000 0 0x3000>, diff -Nru linux-4.19.98/arch/arm/boot/dts/ox810se.dtsi linux-4.19.118/arch/arm/boot/dts/ox810se.dtsi --- linux-4.19.98/arch/arm/boot/dts/ox810se.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/ox810se.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -322,8 +322,8 @@ interrupt-controller; reg = <0 0x200>; #interrupt-cells = <1>; - valid-mask = <0xFFFFFFFF>; - clear-mask = <0>; + valid-mask = <0xffffffff>; + clear-mask = <0xffffffff>; }; timer0: timer@200 { diff -Nru linux-4.19.98/arch/arm/boot/dts/ox820.dtsi linux-4.19.118/arch/arm/boot/dts/ox820.dtsi --- linux-4.19.98/arch/arm/boot/dts/ox820.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/ox820.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -239,8 +239,8 @@ reg = <0 0x200>; interrupts = ; #interrupt-cells = <1>; - valid-mask = <0xFFFFFFFF>; - clear-mask = <0>; + valid-mask = <0xffffffff>; + clear-mask = <0xffffffff>; }; timer0: timer@200 { diff -Nru linux-4.19.98/arch/arm/boot/dts/r8a7743.dtsi linux-4.19.118/arch/arm/boot/dts/r8a7743.dtsi --- linux-4.19.98/arch/arm/boot/dts/r8a7743.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/r8a7743.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -565,9 +565,7 @@ /* doesn't need pinmux */ #address-cells = <1>; #size-cells = <0>; - compatible = "renesas,iic-r8a7743", - "renesas,rcar-gen2-iic", - "renesas,rmobile-iic"; + compatible = "renesas,iic-r8a7743"; reg = <0 0xe60b0000 0 0x425>; interrupts = ; clocks = <&cpg CPG_MOD 926>; diff -Nru linux-4.19.98/arch/arm/boot/dts/r8a7779.dtsi linux-4.19.118/arch/arm/boot/dts/r8a7779.dtsi --- linux-4.19.98/arch/arm/boot/dts/r8a7779.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/r8a7779.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -68,6 +68,14 @@ <0xf0000100 0x100>; }; + timer@f0000200 { + compatible = "arm,cortex-a9-global-timer"; + reg = <0xf0000200 0x100>; + interrupts = ; + clocks = <&cpg_clocks R8A7779_CLK_ZS>; + }; + timer@f0000600 { compatible = "arm,cortex-a9-twd-timer"; reg = <0xf0000600 0x20>; diff -Nru linux-4.19.98/arch/arm/boot/dts/sama5d3.dtsi linux-4.19.118/arch/arm/boot/dts/sama5d3.dtsi --- linux-4.19.98/arch/arm/boot/dts/sama5d3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sama5d3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -1187,49 +1187,49 @@ usart0_clk: usart0_clk { #clock-cells = <0>; reg = <12>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; usart1_clk: usart1_clk { #clock-cells = <0>; reg = <13>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; usart2_clk: usart2_clk { #clock-cells = <0>; reg = <14>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; usart3_clk: usart3_clk { #clock-cells = <0>; reg = <15>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; uart0_clk: uart0_clk { #clock-cells = <0>; reg = <16>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; twi0_clk: twi0_clk { reg = <18>; #clock-cells = <0>; - atmel,clk-output-range = <0 16625000>; + atmel,clk-output-range = <0 41500000>; }; twi1_clk: twi1_clk { #clock-cells = <0>; reg = <19>; - atmel,clk-output-range = <0 16625000>; + atmel,clk-output-range = <0 41500000>; }; twi2_clk: twi2_clk { #clock-cells = <0>; reg = <20>; - atmel,clk-output-range = <0 16625000>; + atmel,clk-output-range = <0 41500000>; }; mci0_clk: mci0_clk { @@ -1245,19 +1245,19 @@ spi0_clk: spi0_clk { #clock-cells = <0>; reg = <24>; - atmel,clk-output-range = <0 133000000>; + atmel,clk-output-range = <0 166000000>; }; spi1_clk: spi1_clk { #clock-cells = <0>; reg = <25>; - atmel,clk-output-range = <0 133000000>; + atmel,clk-output-range = <0 166000000>; }; tcb0_clk: tcb0_clk { #clock-cells = <0>; reg = <26>; - atmel,clk-output-range = <0 133000000>; + atmel,clk-output-range = <0 166000000>; }; pwm_clk: pwm_clk { @@ -1268,7 +1268,7 @@ adc_clk: adc_clk { #clock-cells = <0>; reg = <29>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; dma0_clk: dma0_clk { @@ -1299,13 +1299,13 @@ ssc0_clk: ssc0_clk { #clock-cells = <0>; reg = <38>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; ssc1_clk: ssc1_clk { #clock-cells = <0>; reg = <39>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; sha_clk: sha_clk { diff -Nru linux-4.19.98/arch/arm/boot/dts/sama5d3_can.dtsi linux-4.19.118/arch/arm/boot/dts/sama5d3_can.dtsi --- linux-4.19.98/arch/arm/boot/dts/sama5d3_can.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sama5d3_can.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -37,13 +37,13 @@ can0_clk: can0_clk { #clock-cells = <0>; reg = <40>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; can1_clk: can1_clk { #clock-cells = <0>; reg = <41>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; }; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/sama5d3_tcb1.dtsi linux-4.19.118/arch/arm/boot/dts/sama5d3_tcb1.dtsi --- linux-4.19.98/arch/arm/boot/dts/sama5d3_tcb1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sama5d3_tcb1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -23,6 +23,7 @@ tcb1_clk: tcb1_clk { #clock-cells = <0>; reg = <27>; + atmel,clk-output-range = <0 166000000>; }; }; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/sama5d3_uart.dtsi linux-4.19.118/arch/arm/boot/dts/sama5d3_uart.dtsi --- linux-4.19.98/arch/arm/boot/dts/sama5d3_uart.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sama5d3_uart.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -42,13 +42,13 @@ uart0_clk: uart0_clk { #clock-cells = <0>; reg = <16>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; uart1_clk: uart1_clk { #clock-cells = <0>; reg = <17>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; }; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/stihxxx-b2120.dtsi linux-4.19.118/arch/arm/boot/dts/stihxxx-b2120.dtsi --- linux-4.19.98/arch/arm/boot/dts/stihxxx-b2120.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/stihxxx-b2120.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -45,7 +45,7 @@ /* DAC */ format = "i2s"; mclk-fs = <256>; - frame-inversion = <1>; + frame-inversion; cpu { sound-dai = <&sti_uni_player2>; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/stm32f469-disco.dts linux-4.19.118/arch/arm/boot/dts/stm32f469-disco.dts --- linux-4.19.98/arch/arm/boot/dts/stm32f469-disco.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/stm32f469-disco.dts 2020-04-23 08:30:24.000000000 +0000 @@ -75,6 +75,13 @@ regulator-max-microvolt = <3300000>; }; + vdd_dsi: vdd-dsi { + compatible = "regulator-fixed"; + regulator-name = "vdd_dsi"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + soc { dma-ranges = <0xc0000000 0x0 0x10000000>; }; @@ -154,6 +161,7 @@ compatible = "orisetech,otm8009a"; reg = <0>; /* dsi virtual channel (0..3) */ reset-gpios = <&gpioh 7 GPIO_ACTIVE_LOW>; + power-supply = <&vdd_dsi>; status = "okay"; port { diff -Nru linux-4.19.98/arch/arm/boot/dts/stm32h743i-eval.dts linux-4.19.118/arch/arm/boot/dts/stm32h743i-eval.dts --- linux-4.19.98/arch/arm/boot/dts/stm32h743i-eval.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/stm32h743i-eval.dts 2020-04-23 08:30:24.000000000 +0000 @@ -79,6 +79,7 @@ }; &adc_12 { + vdda-supply = <&vdda>; vref-supply = <&vdda>; status = "okay"; adc1: adc@0 { diff -Nru linux-4.19.98/arch/arm/boot/dts/sun8i-a23-a33.dtsi linux-4.19.118/arch/arm/boot/dts/sun8i-a23-a33.dtsi --- linux-4.19.98/arch/arm/boot/dts/sun8i-a23-a33.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sun8i-a23-a33.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -155,6 +155,21 @@ #dma-cells = <1>; }; + nfc: nand@1c03000 { + compatible = "allwinner,sun4i-a10-nand"; + reg = <0x01c03000 0x1000>; + interrupts = ; + clocks = <&ccu CLK_BUS_NAND>, <&ccu CLK_NAND>; + clock-names = "ahb", "mod"; + resets = <&ccu RST_BUS_NAND>; + reset-names = "ahb"; + pinctrl-names = "default"; + pinctrl-0 = <&nand_pins &nand_pins_cs0 &nand_pins_rb0>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; + }; + mmc0: mmc@1c0f000 { compatible = "allwinner,sun7i-a20-mmc"; reg = <0x01c0f000 0x1000>; @@ -210,21 +225,6 @@ status = "disabled"; #address-cells = <1>; #size-cells = <0>; - }; - - nfc: nand@1c03000 { - compatible = "allwinner,sun4i-a10-nand"; - reg = <0x01c03000 0x1000>; - interrupts = ; - clocks = <&ccu CLK_BUS_NAND>, <&ccu CLK_NAND>; - clock-names = "ahb", "mod"; - resets = <&ccu RST_BUS_NAND>; - reset-names = "ahb"; - pinctrl-names = "default"; - pinctrl-0 = <&nand_pins &nand_pins_cs0 &nand_pins_rb0>; - status = "disabled"; - #address-cells = <1>; - #size-cells = <0>; }; usb_otg: usb@1c19000 { diff -Nru linux-4.19.98/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts linux-4.19.118/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts --- linux-4.19.98/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts 2020-04-23 08:30:24.000000000 +0000 @@ -90,7 +90,7 @@ initial-mode = <1>; /* initialize in HUB mode */ disabled-ports = <1>; intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ - reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ + reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ refclk-frequency = <19200000>; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts linux-4.19.118/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts --- linux-4.19.98/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts 2020-04-23 08:30:24.000000000 +0000 @@ -318,8 +318,8 @@ }; ®_dldo3 { - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; regulator-name = "vdd-csi"; }; diff -Nru linux-4.19.98/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts linux-4.19.118/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts --- linux-4.19.98/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts 2020-04-23 08:30:24.000000000 +0000 @@ -90,6 +90,8 @@ wifi_pwrseq: wifi_pwrseq { compatible = "mmc-pwrseq-simple"; reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */ + clocks = <&rtc 1>; + clock-names = "ext_clock"; }; sound_spdif { @@ -155,6 +157,8 @@ &mmc1 { vmmc-supply = <®_vcc3v3>; + vqmmc-supply = <®_vcc3v3>; + mmc-pwrseq = <&wifi_pwrseq>; bus-width = <4>; non-removable; status = "okay"; diff -Nru linux-4.19.98/arch/arm/boot/dts/sun8i-h3.dtsi linux-4.19.118/arch/arm/boot/dts/sun8i-h3.dtsi --- linux-4.19.98/arch/arm/boot/dts/sun8i-h3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sun8i-h3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -80,7 +80,7 @@ #cooling-cells = <2>; }; - cpu@1 { + cpu1: cpu@1 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <1>; @@ -90,7 +90,7 @@ #cooling-cells = <2>; }; - cpu@2 { + cpu2: cpu@2 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <2>; @@ -100,7 +100,7 @@ #cooling-cells = <2>; }; - cpu@3 { + cpu3: cpu@3 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <3>; @@ -111,6 +111,15 @@ }; }; + pmu { + compatible = "arm,cortex-a7-pmu"; + interrupts = , + , + , + ; + interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; + }; + timer { compatible = "arm,armv7-timer"; interrupts = , diff -Nru linux-4.19.98/arch/arm/boot/dts/sun9i-a80-optimus.dts linux-4.19.118/arch/arm/boot/dts/sun9i-a80-optimus.dts --- linux-4.19.98/arch/arm/boot/dts/sun9i-a80-optimus.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/boot/dts/sun9i-a80-optimus.dts 2020-04-23 08:30:24.000000000 +0000 @@ -82,7 +82,7 @@ reg_usb1_vbus: usb1-vbus { compatible = "regulator-fixed"; - pinctrl-names = "default"; + regulator-name = "usb1-vbus"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; enable-active-high; @@ -91,7 +91,7 @@ reg_usb3_vbus: usb3-vbus { compatible = "regulator-fixed"; - pinctrl-names = "default"; + regulator-name = "usb3-vbus"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; enable-active-high; diff -Nru linux-4.19.98/arch/arm/common/mcpm_entry.c linux-4.19.118/arch/arm/common/mcpm_entry.c --- linux-4.19.98/arch/arm/common/mcpm_entry.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/common/mcpm_entry.c 2020-04-23 08:30:24.000000000 +0000 @@ -381,7 +381,7 @@ unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); phys_reset_t phys_reset; - mcpm_set_entry_vector(cpu, cluster, cpu_resume); + mcpm_set_entry_vector(cpu, cluster, cpu_resume_no_hyp); setup_mm_for_reboot(); __mcpm_cpu_going_down(cpu, cluster); diff -Nru linux-4.19.98/arch/arm/configs/qcom_defconfig linux-4.19.118/arch/arm/configs/qcom_defconfig --- linux-4.19.98/arch/arm/configs/qcom_defconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/configs/qcom_defconfig 2020-04-23 08:30:24.000000000 +0000 @@ -207,6 +207,7 @@ CONFIG_MSM_IOMMU=y CONFIG_HWSPINLOCK=y CONFIG_HWSPINLOCK_QCOM=y +CONFIG_MAILBOX=y CONFIG_REMOTEPROC=y CONFIG_QCOM_ADSP_PIL=y CONFIG_QCOM_Q6V5_PIL=y diff -Nru linux-4.19.98/arch/arm/include/asm/kvm_emulate.h linux-4.19.118/arch/arm/include/asm/kvm_emulate.h --- linux-4.19.98/arch/arm/include/asm/kvm_emulate.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/include/asm/kvm_emulate.h 2020-04-23 08:30:24.000000000 +0000 @@ -26,13 +26,25 @@ #include /* arm64 compatibility macros */ +#define PSR_AA32_MODE_FIQ FIQ_MODE +#define PSR_AA32_MODE_SVC SVC_MODE #define PSR_AA32_MODE_ABT ABT_MODE #define PSR_AA32_MODE_UND UND_MODE #define PSR_AA32_T_BIT PSR_T_BIT +#define PSR_AA32_F_BIT PSR_F_BIT #define PSR_AA32_I_BIT PSR_I_BIT #define PSR_AA32_A_BIT PSR_A_BIT #define PSR_AA32_E_BIT PSR_E_BIT #define PSR_AA32_IT_MASK PSR_IT_MASK +#define PSR_AA32_GE_MASK 0x000f0000 +#define PSR_AA32_DIT_BIT 0x00200000 +#define PSR_AA32_PAN_BIT 0x00400000 +#define PSR_AA32_SSBS_BIT 0x00800000 +#define PSR_AA32_Q_BIT PSR_Q_BIT +#define PSR_AA32_V_BIT PSR_V_BIT +#define PSR_AA32_C_BIT PSR_C_BIT +#define PSR_AA32_Z_BIT PSR_Z_BIT +#define PSR_AA32_N_BIT PSR_N_BIT unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num); @@ -53,6 +65,11 @@ *__vcpu_spsr(vcpu) = v; } +static inline unsigned long host_spsr_to_spsr32(unsigned long spsr) +{ + return spsr; +} + static inline unsigned long vcpu_get_reg(struct kvm_vcpu *vcpu, u8 reg_num) { @@ -189,6 +206,11 @@ return kvm_vcpu_get_hsr(vcpu) & HSR_SSE; } +static inline bool kvm_vcpu_dabt_issf(const struct kvm_vcpu *vcpu) +{ + return false; +} + static inline int kvm_vcpu_dabt_get_rd(struct kvm_vcpu *vcpu) { return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT; diff -Nru linux-4.19.98/arch/arm/include/asm/kvm_mmio.h linux-4.19.118/arch/arm/include/asm/kvm_mmio.h --- linux-4.19.98/arch/arm/include/asm/kvm_mmio.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/include/asm/kvm_mmio.h 2020-04-23 08:30:24.000000000 +0000 @@ -26,6 +26,8 @@ struct kvm_decode { unsigned long rt; bool sign_extend; + /* Not used on 32-bit arm */ + bool sixty_four; }; void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data); diff -Nru linux-4.19.98/arch/arm/include/asm/suspend.h linux-4.19.118/arch/arm/include/asm/suspend.h --- linux-4.19.98/arch/arm/include/asm/suspend.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/include/asm/suspend.h 2020-04-23 08:30:24.000000000 +0000 @@ -10,6 +10,7 @@ }; extern void cpu_resume(void); +extern void cpu_resume_no_hyp(void); extern void cpu_resume_arm(void); extern int cpu_suspend(unsigned long, int (*)(unsigned long)); diff -Nru linux-4.19.98/arch/arm/kernel/head-nommu.S linux-4.19.118/arch/arm/kernel/head-nommu.S --- linux-4.19.98/arch/arm/kernel/head-nommu.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/kernel/head-nommu.S 2020-04-23 08:30:24.000000000 +0000 @@ -441,8 +441,8 @@ str r5, [r12, #PMSAv8_RBAR_A(0)] str r6, [r12, #PMSAv8_RLAR_A(0)] #else - mcr p15, 0, r5, c6, c10, 1 @ PRBAR4 - mcr p15, 0, r6, c6, c10, 2 @ PRLAR4 + mcr p15, 0, r5, c6, c10, 0 @ PRBAR4 + mcr p15, 0, r6, c6, c10, 1 @ PRLAR4 #endif #endif ret lr diff -Nru linux-4.19.98/arch/arm/kernel/hyp-stub.S linux-4.19.118/arch/arm/kernel/hyp-stub.S --- linux-4.19.98/arch/arm/kernel/hyp-stub.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/kernel/hyp-stub.S 2020-04-23 08:30:24.000000000 +0000 @@ -159,10 +159,9 @@ #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER) @ make CNTP_* and CNTPCT accessible from PL1 mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 - lsr r7, #16 - and r7, #0xf - cmp r7, #1 - bne 1f + ubfx r7, r7, #16, #4 + teq r7, #0 + beq 1f mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL orr r7, r7, #3 @ PL1PCEN | PL1PCTEN mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL @@ -180,8 +179,8 @@ @ Check whether GICv3 system registers are available mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 ubfx r7, r7, #28, #4 - cmp r7, #1 - bne 2f + teq r7, #0 + beq 2f @ Enable system register accesses mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE diff -Nru linux-4.19.98/arch/arm/kernel/sleep.S linux-4.19.118/arch/arm/kernel/sleep.S --- linux-4.19.98/arch/arm/kernel/sleep.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/kernel/sleep.S 2020-04-23 08:30:24.000000000 +0000 @@ -120,6 +120,14 @@ .text .align +#ifdef CONFIG_MCPM + .arm +THUMB( .thumb ) +ENTRY(cpu_resume_no_hyp) +ARM_BE8(setend be) @ ensure we are in BE mode + b no_hyp +#endif + #ifdef CONFIG_MMU .arm ENTRY(cpu_resume_arm) @@ -135,6 +143,7 @@ bl __hyp_stub_install_secondary #endif safe_svcmode_maskall r1 +no_hyp: mov r1, #0 ALT_SMP(mrc p15, 0, r0, c0, c0, 5) ALT_UP_B(1f) @@ -164,6 +173,9 @@ #ifdef CONFIG_MMU ENDPROC(cpu_resume_arm) #endif +#ifdef CONFIG_MCPM +ENDPROC(cpu_resume_no_hyp) +#endif .align 2 _sleep_save_sp: diff -Nru linux-4.19.98/arch/arm/kernel/vdso.c linux-4.19.118/arch/arm/kernel/vdso.c --- linux-4.19.98/arch/arm/kernel/vdso.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/kernel/vdso.c 2020-04-23 08:30:24.000000000 +0000 @@ -104,6 +104,8 @@ */ np = of_find_compatible_node(NULL, NULL, "arm,armv7-timer"); if (!np) + np = of_find_compatible_node(NULL, NULL, "arm,armv8-timer"); + if (!np) goto out_put; if (of_property_read_bool(np, "arm,cpu-registers-not-fw-configured")) @@ -205,7 +207,6 @@ } text_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; - pr_debug("vdso: %i text pages at base %p\n", text_pages, vdso_start); /* Allocate the VDSO text pagelist */ vdso_text_pagelist = kcalloc(text_pages, sizeof(struct page *), diff -Nru linux-4.19.98/arch/arm/lib/copy_from_user.S linux-4.19.118/arch/arm/lib/copy_from_user.S --- linux-4.19.98/arch/arm/lib/copy_from_user.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/lib/copy_from_user.S 2020-04-23 08:30:24.000000000 +0000 @@ -100,7 +100,7 @@ ENDPROC(arm_copy_from_user) - .pushsection .fixup,"ax" + .pushsection .text.fixup,"ax" .align 0 copy_abort_preamble ldmfd sp!, {r1, r2, r3} diff -Nru linux-4.19.98/arch/arm/mach-imx/Makefile linux-4.19.118/arch/arm/mach-imx/Makefile --- linux-4.19.98/arch/arm/mach-imx/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-imx/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -89,6 +89,8 @@ obj-$(CONFIG_SOC_IMX6) += suspend-imx6.o obj-$(CONFIG_SOC_IMX53) += suspend-imx53.o endif +AFLAGS_resume-imx6.o :=-Wa,-march=armv7-a +obj-$(CONFIG_SOC_IMX6) += resume-imx6.o obj-$(CONFIG_SOC_IMX6) += pm-imx6.o obj-$(CONFIG_SOC_IMX1) += mach-imx1.o diff -Nru linux-4.19.98/arch/arm/mach-imx/common.h linux-4.19.118/arch/arm/mach-imx/common.h --- linux-4.19.98/arch/arm/mach-imx/common.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-imx/common.h 2020-04-23 08:30:24.000000000 +0000 @@ -103,17 +103,17 @@ int imx_cpu_kill(unsigned int cpu); #ifdef CONFIG_SUSPEND -void v7_cpu_resume(void); void imx53_suspend(void __iomem *ocram_vbase); extern const u32 imx53_suspend_sz; void imx6_suspend(void __iomem *ocram_vbase); #else -static inline void v7_cpu_resume(void) {} static inline void imx53_suspend(void __iomem *ocram_vbase) {} static const u32 imx53_suspend_sz; static inline void imx6_suspend(void __iomem *ocram_vbase) {} #endif +void v7_cpu_resume(void); + void imx6_pm_ccm_init(const char *ccm_compat); void imx6q_pm_init(void); void imx6dl_pm_init(void); diff -Nru linux-4.19.98/arch/arm/mach-imx/resume-imx6.S linux-4.19.118/arch/arm/mach-imx/resume-imx6.S --- linux-4.19.98/arch/arm/mach-imx/resume-imx6.S 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-imx/resume-imx6.S 2020-04-23 08:30:24.000000000 +0000 @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright 2014 Freescale Semiconductor, Inc. + */ + +#include +#include +#include +#include +#include "hardware.h" + +/* + * The following code must assume it is running from physical address + * where absolute virtual addresses to the data section have to be + * turned into relative ones. + */ + +ENTRY(v7_cpu_resume) + bl v7_invalidate_l1 +#ifdef CONFIG_CACHE_L2X0 + bl l2c310_early_resume +#endif + b cpu_resume +ENDPROC(v7_cpu_resume) diff -Nru linux-4.19.98/arch/arm/mach-imx/suspend-imx6.S linux-4.19.118/arch/arm/mach-imx/suspend-imx6.S --- linux-4.19.98/arch/arm/mach-imx/suspend-imx6.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-imx/suspend-imx6.S 2020-04-23 08:30:24.000000000 +0000 @@ -333,17 +333,3 @@ ret lr ENDPROC(imx6_suspend) - -/* - * The following code must assume it is running from physical address - * where absolute virtual addresses to the data section have to be - * turned into relative ones. - */ - -ENTRY(v7_cpu_resume) - bl v7_invalidate_l1 -#ifdef CONFIG_CACHE_L2X0 - bl l2c310_early_resume -#endif - b cpu_resume -ENDPROC(v7_cpu_resume) diff -Nru linux-4.19.98/arch/arm/mach-npcm/Kconfig linux-4.19.118/arch/arm/mach-npcm/Kconfig --- linux-4.19.98/arch/arm/mach-npcm/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-npcm/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -10,7 +10,7 @@ depends on ARCH_MULTI_V7 select PINCTRL_NPCM7XX select NPCM7XX_TIMER - select ARCH_REQUIRE_GPIOLIB + select GPIOLIB select CACHE_L2X0 select ARM_GIC select HAVE_ARM_TWD if SMP diff -Nru linux-4.19.98/arch/arm/mach-omap2/omap_hwmod.c linux-4.19.118/arch/arm/mach-omap2/omap_hwmod.c --- linux-4.19.98/arch/arm/mach-omap2/omap_hwmod.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-omap2/omap_hwmod.c 2020-04-23 08:30:24.000000000 +0000 @@ -2430,7 +2430,7 @@ */ static int _setup_reset(struct omap_hwmod *oh) { - int r; + int r = 0; if (oh->_state != _HWMOD_STATE_INITIALIZED) return -EINVAL; diff -Nru linux-4.19.98/arch/arm/mach-omap2/pdata-quirks.c linux-4.19.118/arch/arm/mach-omap2/pdata-quirks.c --- linux-4.19.98/arch/arm/mach-omap2/pdata-quirks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-omap2/pdata-quirks.c 2020-04-23 08:30:24.000000000 +0000 @@ -263,14 +263,6 @@ am35xx_emac_reset(); } -static struct platform_device omap3_rom_rng_device = { - .name = "omap3-rom-rng", - .id = -1, - .dev = { - .platform_data = rx51_secure_rng_call, - }, -}; - static void __init nokia_n900_legacy_init(void) { hsmmc2_internal_input_clk(); @@ -286,9 +278,6 @@ pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n"); pr_warn("Thumb binaries may crash randomly without this workaround\n"); } - - pr_info("RX-51: Registering OMAP3 HWRNG device\n"); - platform_device_register(&omap3_rom_rng_device); } } @@ -466,6 +455,7 @@ OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", &am35xx_emac_pdata), + OF_DEV_AUXDATA("nokia,n900-rom-rng", 0, NULL, rx51_secure_rng_call), /* McBSP modules with sidetone core */ #if IS_ENABLED(CONFIG_SND_OMAP_SOC_MCBSP) OF_DEV_AUXDATA("ti,omap3-mcbsp", 0x49022000, "49022000.mcbsp", &mcbsp_pdata), diff -Nru linux-4.19.98/arch/arm/mach-rpc/irq.c linux-4.19.118/arch/arm/mach-rpc/irq.c --- linux-4.19.98/arch/arm/mach-rpc/irq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-rpc/irq.c 2020-04-23 08:30:24.000000000 +0000 @@ -118,7 +118,7 @@ void __init rpc_init_irq(void) { - unsigned int irq, clr, set = 0; + unsigned int irq, clr, set; iomd_writeb(0, IOMD_IRQMASKA); iomd_writeb(0, IOMD_IRQMASKB); @@ -130,6 +130,7 @@ for (irq = 0; irq < NR_IRQS; irq++) { clr = IRQ_NOREQUEST; + set = 0; if (irq <= 6 || (irq >= 9 && irq <= 15)) clr |= IRQ_NOPROBE; diff -Nru linux-4.19.98/arch/arm/mach-stm32/Kconfig linux-4.19.118/arch/arm/mach-stm32/Kconfig --- linux-4.19.98/arch/arm/mach-stm32/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-stm32/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -1,5 +1,6 @@ menuconfig ARCH_STM32 - bool "STMicroelectronics STM32 family" if ARM_SINGLE_ARMV7M || ARCH_MULTI_V7 + bool "STMicroelectronics STM32 family" + depends on ARM_SINGLE_ARMV7M || ARCH_MULTI_V7 select ARMV7M_SYSTICK if ARM_SINGLE_ARMV7M select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7 select ARM_GIC if ARCH_MULTI_V7 diff -Nru linux-4.19.98/arch/arm/mach-tegra/sleep-tegra30.S linux-4.19.118/arch/arm/mach-tegra/sleep-tegra30.S --- linux-4.19.98/arch/arm/mach-tegra/sleep-tegra30.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mach-tegra/sleep-tegra30.S 2020-04-23 08:30:24.000000000 +0000 @@ -382,6 +382,14 @@ pll_locked r1, r0, CLK_RESET_PLLC_BASE pll_locked r1, r0, CLK_RESET_PLLX_BASE + tegra_get_soc_id TEGRA_APB_MISC_BASE, r1 + cmp r1, #TEGRA30 + beq 1f + ldr r1, [r0, #CLK_RESET_PLLP_BASE] + bic r1, r1, #(1<<31) @ disable PllP bypass + str r1, [r0, #CLK_RESET_PLLP_BASE] +1: + mov32 r7, TEGRA_TMRUS_BASE ldr r1, [r7] add r1, r1, #LOCK_DELAY @@ -641,7 +649,10 @@ str r0, [r4, #PMC_PLLP_WB0_OVERRIDE] /* disable PLLP, PLLA, PLLC and PLLX */ + tegra_get_soc_id TEGRA_APB_MISC_BASE, r1 + cmp r1, #TEGRA30 ldr r0, [r5, #CLK_RESET_PLLP_BASE] + orrne r0, r0, #(1 << 31) @ enable PllP bypass on fast cluster bic r0, r0, #(1 << 30) str r0, [r5, #CLK_RESET_PLLP_BASE] ldr r0, [r5, #CLK_RESET_PLLA_BASE] diff -Nru linux-4.19.98/arch/arm/mm/init.c linux-4.19.118/arch/arm/mm/init.c --- linux-4.19.98/arch/arm/mm/init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/mm/init.c 2020-04-23 08:30:24.000000000 +0000 @@ -357,7 +357,7 @@ *p++ = 0xe7fddef0; } -static inline void +static inline void __init free_memmap(unsigned long start_pfn, unsigned long end_pfn) { struct page *start_pg, *end_pg; diff -Nru linux-4.19.98/arch/arm/net/bpf_jit_32.c linux-4.19.118/arch/arm/net/bpf_jit_32.c --- linux-4.19.98/arch/arm/net/bpf_jit_32.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/net/bpf_jit_32.c 2020-04-23 08:30:24.000000000 +0000 @@ -930,7 +930,11 @@ rd = arm_bpf_get_reg64(dst, tmp, ctx); /* Do LSR operation */ - if (val < 32) { + if (val == 0) { + /* An immediate value of 0 encodes a shift amount of 32 + * for LSR. To shift by 0, don't do anything. + */ + } else if (val < 32) { emit(ARM_MOV_SI(tmp2[1], rd[1], SRTYPE_LSR, val), ctx); emit(ARM_ORR_SI(rd[1], tmp2[1], rd[0], SRTYPE_ASL, 32 - val), ctx); emit(ARM_MOV_SI(rd[0], rd[0], SRTYPE_LSR, val), ctx); @@ -956,7 +960,11 @@ rd = arm_bpf_get_reg64(dst, tmp, ctx); /* Do ARSH operation */ - if (val < 32) { + if (val == 0) { + /* An immediate value of 0 encodes a shift amount of 32 + * for ASR. To shift by 0, don't do anything. + */ + } else if (val < 32) { emit(ARM_MOV_SI(tmp2[1], rd[1], SRTYPE_LSR, val), ctx); emit(ARM_ORR_SI(rd[1], tmp2[1], rd[0], SRTYPE_ASL, 32 - val), ctx); emit(ARM_MOV_SI(rd[0], rd[0], SRTYPE_ASR, val), ctx); @@ -993,21 +1001,35 @@ arm_bpf_put_reg32(dst_hi, rd[0], ctx); } +static bool is_ldst_imm(s16 off, const u8 size) +{ + s16 off_max = 0; + + switch (size) { + case BPF_B: + case BPF_W: + off_max = 0xfff; + break; + case BPF_H: + off_max = 0xff; + break; + case BPF_DW: + /* Need to make sure off+4 does not overflow. */ + off_max = 0xfff - 4; + break; + } + return -off_max <= off && off <= off_max; +} + /* *(size *)(dst + off) = src */ static inline void emit_str_r(const s8 dst, const s8 src[], - s32 off, struct jit_ctx *ctx, const u8 sz){ + s16 off, struct jit_ctx *ctx, const u8 sz){ const s8 *tmp = bpf2a32[TMP_REG_1]; - s32 off_max; s8 rd; rd = arm_bpf_get_reg32(dst, tmp[1], ctx); - if (sz == BPF_H) - off_max = 0xff; - else - off_max = 0xfff; - - if (off < 0 || off > off_max) { + if (!is_ldst_imm(off, sz)) { emit_a32_mov_i(tmp[0], off, ctx); emit(ARM_ADD_R(tmp[0], tmp[0], rd), ctx); rd = tmp[0]; @@ -1036,18 +1058,12 @@ /* dst = *(size*)(src + off) */ static inline void emit_ldx_r(const s8 dst[], const s8 src, - s32 off, struct jit_ctx *ctx, const u8 sz){ + s16 off, struct jit_ctx *ctx, const u8 sz){ const s8 *tmp = bpf2a32[TMP_REG_1]; const s8 *rd = is_stacked(dst_lo) ? tmp : dst; s8 rm = src; - s32 off_max; - - if (sz == BPF_H) - off_max = 0xff; - else - off_max = 0xfff; - if (off < 0 || off > off_max) { + if (!is_ldst_imm(off, sz)) { emit_a32_mov_i(tmp[0], off, ctx); emit(ARM_ADD_R(tmp[0], tmp[0], src), ctx); rm = tmp[0]; diff -Nru linux-4.19.98/arch/arm/plat-pxa/ssp.c linux-4.19.118/arch/arm/plat-pxa/ssp.c --- linux-4.19.98/arch/arm/plat-pxa/ssp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm/plat-pxa/ssp.c 2020-04-23 08:30:24.000000000 +0000 @@ -183,18 +183,12 @@ static int pxa_ssp_remove(struct platform_device *pdev) { - struct resource *res; struct ssp_device *ssp; ssp = platform_get_drvdata(pdev); if (ssp == NULL) return -ENODEV; - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - clk_put(ssp->clk); - mutex_lock(&ssp_lock); list_del(&ssp->node); mutex_unlock(&ssp_lock); diff -Nru linux-4.19.98/arch/arm64/boot/Makefile linux-4.19.118/arch/arm64/boot/Makefile --- linux-4.19.98/arch/arm64/boot/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -16,7 +16,7 @@ OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S -targets := Image Image.gz +targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo $(obj)/Image: vmlinux FORCE $(call if_changed,objcopy) diff -Nru linux-4.19.98/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi linux-4.19.118/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi --- linux-4.19.98/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -366,7 +366,8 @@ interrupts = , , ; - clocks = <&ccu 58>; + clocks = <&ccu 58>, <&osc24M>, <&rtc 0>; + clock-names = "apb", "hosc", "losc"; gpio-controller; #gpio-cells = <3>; interrupt-controller; diff -Nru linux-4.19.98/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts linux-4.19.118/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts --- linux-4.19.98/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts 2020-04-23 08:30:24.000000000 +0000 @@ -176,6 +176,8 @@ pcf8563: rtc@51 { compatible = "nxp,pcf8563"; reg = <0x51>; + interrupt-parent = <&r_intc>; + interrupts = <0 IRQ_TYPE_LEVEL_LOW>; #clock-cells = <0>; }; }; diff -Nru linux-4.19.98/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi linux-4.19.118/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi --- linux-4.19.98/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -69,6 +69,15 @@ clock-output-names = "osc32k"; }; + pmu { + compatible = "arm,cortex-a53-pmu"; + interrupts = , + , + , + ; + interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; + }; + psci { compatible = "arm,psci-0.2"; method = "smc"; @@ -101,17 +110,6 @@ #reset-cells = <1>; }; - gic: interrupt-controller@3021000 { - compatible = "arm,gic-400"; - reg = <0x03021000 0x1000>, - <0x03022000 0x2000>, - <0x03024000 0x2000>, - <0x03026000 0x2000>; - interrupts = ; - interrupt-controller; - #interrupt-cells = <3>; - }; - pio: pinctrl@300b000 { compatible = "allwinner,sun50i-h6-pinctrl"; reg = <0x0300b000 0x400>; @@ -149,6 +147,17 @@ }; }; + gic: interrupt-controller@3021000 { + compatible = "arm,gic-400"; + reg = <0x03021000 0x1000>, + <0x03022000 0x2000>, + <0x03024000 0x2000>, + <0x03026000 0x2000>; + interrupts = ; + interrupt-controller; + #interrupt-cells = <3>; + }; + mmc0: mmc@4020000 { compatible = "allwinner,sun50i-h6-mmc", "allwinner,sun50i-a64-mmc"; diff -Nru linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi --- linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gx-p23x-q20x.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -125,6 +125,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { diff -Nru linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts --- linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-khadas-vim.dts 2020-04-23 08:30:24.000000000 +0000 @@ -76,6 +76,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { diff -Nru linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts --- linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-libretech-cc.dts 2020-04-23 08:30:24.000000000 +0000 @@ -155,6 +155,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { @@ -255,7 +256,6 @@ cap-mmc-highspeed; mmc-ddr-3_3v; max-frequency = <50000000>; - non-removable; disable-wp; mmc-pwrseq = <&emmc_pwrseq>; diff -Nru linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts --- linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxl-s905x-p212.dts 2020-04-23 08:30:24.000000000 +0000 @@ -51,6 +51,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { diff -Nru linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts --- linux-4.19.98/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/amlogic/meson-gxm-khadas-vim2.dts 2020-04-23 08:30:24.000000000 +0000 @@ -18,7 +18,6 @@ aliases { serial0 = &uart_AO; - serial1 = &uart_A; serial2 = &uart_AO_B; }; @@ -63,11 +62,9 @@ gpio-keys-polled { compatible = "gpio-keys-polled"; - #address-cells = <1>; - #size-cells = <0>; poll-interval = <100>; - button@0 { + power-button { label = "power"; linux,code = ; gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; @@ -271,6 +268,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { @@ -408,8 +406,17 @@ /* This one is connected to the Bluetooth module */ &uart_A { status = "okay"; - pinctrl-0 = <&uart_a_pins>; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; }; /* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */ diff -Nru linux-4.19.98/arch/arm64/boot/dts/arm/juno-clocks.dtsi linux-4.19.118/arch/arm64/boot/dts/arm/juno-clocks.dtsi --- linux-4.19.98/arch/arm64/boot/dts/arm/juno-clocks.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/arm/juno-clocks.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -8,10 +8,10 @@ */ / { /* SoC fixed clocks */ - soc_uartclk: refclk7273800hz { + soc_uartclk: refclk7372800hz { compatible = "fixed-clock"; #clock-cells = <0>; - clock-frequency = <7273800>; + clock-frequency = <7372800>; clock-output-names = "juno:uartclk"; }; diff -Nru linux-4.19.98/arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi linux-4.19.118/arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi --- linux-4.19.98/arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/freescale/fsl-ls1043-post.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -20,6 +20,8 @@ }; &fman0 { + fsl,erratum-a050385; + /* these aliases provide the FMan ports mapping */ enet0: ethernet@e0000 { }; diff -Nru linux-4.19.98/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts linux-4.19.118/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts --- linux-4.19.98/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/freescale/fsl-ls1043a-rdb.dts 2020-04-23 08:30:24.000000000 +0000 @@ -118,12 +118,12 @@ ethernet@e4000 { phy-handle = <&rgmii_phy1>; - phy-connection-type = "rgmii-txid"; + phy-connection-type = "rgmii-id"; }; ethernet@e6000 { phy-handle = <&rgmii_phy2>; - phy-connection-type = "rgmii-txid"; + phy-connection-type = "rgmii-id"; }; ethernet@e8000 { diff -Nru linux-4.19.98/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts linux-4.19.118/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts --- linux-4.19.98/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts 2020-04-23 08:30:24.000000000 +0000 @@ -125,12 +125,12 @@ &fman0 { ethernet@e4000 { phy-handle = <&rgmii_phy1>; - phy-connection-type = "rgmii"; + phy-connection-type = "rgmii-id"; }; ethernet@e6000 { phy-handle = <&rgmii_phy2>; - phy-connection-type = "rgmii"; + phy-connection-type = "rgmii-id"; }; ethernet@e8000 { diff -Nru linux-4.19.98/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi linux-4.19.118/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi --- linux-4.19.98/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -630,6 +630,8 @@ l11 { regulator-min-microvolt = <1750000>; regulator-max-microvolt = <3337000>; + regulator-allow-set-load; + regulator-system-load = <200000>; }; l12 { diff -Nru linux-4.19.98/arch/arm64/boot/dts/qcom/msm8916.dtsi linux-4.19.118/arch/arm64/boot/dts/qcom/msm8916.dtsi --- linux-4.19.98/arch/arm64/boot/dts/qcom/msm8916.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/qcom/msm8916.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -114,7 +114,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; @@ -126,7 +126,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; @@ -138,7 +138,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; @@ -150,7 +150,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; diff -Nru linux-4.19.98/arch/arm64/boot/dts/qcom/msm8996.dtsi linux-4.19.118/arch/arm64/boot/dts/qcom/msm8996.dtsi --- linux-4.19.98/arch/arm64/boot/dts/qcom/msm8996.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/qcom/msm8996.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -918,6 +918,8 @@ interrupts = <0 138 IRQ_TYPE_LEVEL_HIGH>; phys = <&hsusb_phy2>; phy-names = "usb2-phy"; + snps,dis_u2_susphy_quirk; + snps,dis_enblslpm_quirk; }; }; @@ -947,6 +949,8 @@ interrupts = <0 131 IRQ_TYPE_LEVEL_HIGH>; phys = <&hsusb_phy1>, <&ssusb_phy_0>; phy-names = "usb2-phy", "usb3-phy"; + snps,dis_u2_susphy_quirk; + snps,dis_enblslpm_quirk; }; }; diff -Nru linux-4.19.98/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi linux-4.19.118/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi --- linux-4.19.98/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/renesas/r8a7795-es1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -28,6 +28,7 @@ compatible = "renesas,ipmmu-r8a7795"; reg = <0 0xec680000 0 0x1000>; renesas,ipmmu-main = <&ipmmu_mm 5>; + power-domains = <&sysc R8A7795_PD_ALWAYS_ON>; #iommu-cells = <1>; }; @@ -35,6 +36,7 @@ compatible = "renesas,ipmmu-r8a7795"; reg = <0 0xe7730000 0 0x1000>; renesas,ipmmu-main = <&ipmmu_mm 8>; + power-domains = <&sysc R8A7795_PD_ALWAYS_ON>; #iommu-cells = <1>; }; diff -Nru linux-4.19.98/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts linux-4.19.118/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts --- linux-4.19.98/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/renesas/r8a77990-ebisu.dts 2020-04-23 08:30:24.000000000 +0000 @@ -33,7 +33,6 @@ &avb { pinctrl-0 = <&avb_pins>; pinctrl-names = "default"; - renesas,no-ether-link; phy-handle = <&phy0>; phy-mode = "rgmii-txid"; status = "okay"; diff -Nru linux-4.19.98/arch/arm64/boot/dts/renesas/r8a77995.dtsi linux-4.19.118/arch/arm64/boot/dts/renesas/r8a77995.dtsi --- linux-4.19.98/arch/arm64/boot/dts/renesas/r8a77995.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/boot/dts/renesas/r8a77995.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -938,7 +938,7 @@ du: display@feb00000 { compatible = "renesas,du-r8a77995"; - reg = <0 0xfeb00000 0 0x80000>; + reg = <0 0xfeb00000 0 0x40000>; interrupts = , ; clocks = <&cpg CPG_MOD 724>, diff -Nru linux-4.19.98/arch/arm64/configs/defconfig linux-4.19.118/arch/arm64/configs/defconfig --- linux-4.19.98/arch/arm64/configs/defconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/configs/defconfig 2020-04-23 08:30:24.000000000 +0000 @@ -365,6 +365,7 @@ CONFIG_ROCKCHIP_THERMAL=m CONFIG_RCAR_GEN3_THERMAL=y CONFIG_ARMADA_THERMAL=y +CONFIG_BCM2835_THERMAL=m CONFIG_BRCMSTB_THERMAL=m CONFIG_EXYNOS_THERMAL=y CONFIG_TEGRA_BPMP_THERMAL=m diff -Nru linux-4.19.98/arch/arm64/include/asm/alternative.h linux-4.19.118/arch/arm64/include/asm/alternative.h --- linux-4.19.98/arch/arm64/include/asm/alternative.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/include/asm/alternative.h 2020-04-23 08:30:24.000000000 +0000 @@ -35,13 +35,16 @@ static inline void apply_alternatives_module(void *start, size_t length) { } #endif -#define ALTINSTR_ENTRY(feature,cb) \ +#define ALTINSTR_ENTRY(feature) \ " .word 661b - .\n" /* label */ \ - " .if " __stringify(cb) " == 0\n" \ " .word 663f - .\n" /* new instruction */ \ - " .else\n" \ + " .hword " __stringify(feature) "\n" /* feature bit */ \ + " .byte 662b-661b\n" /* source len */ \ + " .byte 664f-663f\n" /* replacement len */ + +#define ALTINSTR_ENTRY_CB(feature, cb) \ + " .word 661b - .\n" /* label */ \ " .word " __stringify(cb) "- .\n" /* callback */ \ - " .endif\n" \ " .hword " __stringify(feature) "\n" /* feature bit */ \ " .byte 662b-661b\n" /* source len */ \ " .byte 664f-663f\n" /* replacement len */ @@ -62,15 +65,14 @@ * * Alternatives with callbacks do not generate replacement instructions. */ -#define __ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg_enabled, cb) \ +#define __ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg_enabled) \ ".if "__stringify(cfg_enabled)" == 1\n" \ "661:\n\t" \ oldinstr "\n" \ "662:\n" \ ".pushsection .altinstructions,\"a\"\n" \ - ALTINSTR_ENTRY(feature,cb) \ + ALTINSTR_ENTRY(feature) \ ".popsection\n" \ - " .if " __stringify(cb) " == 0\n" \ ".pushsection .altinstr_replacement, \"a\"\n" \ "663:\n\t" \ newinstr "\n" \ @@ -78,17 +80,25 @@ ".popsection\n\t" \ ".org . - (664b-663b) + (662b-661b)\n\t" \ ".org . - (662b-661b) + (664b-663b)\n" \ - ".else\n\t" \ + ".endif\n" + +#define __ALTERNATIVE_CFG_CB(oldinstr, feature, cfg_enabled, cb) \ + ".if "__stringify(cfg_enabled)" == 1\n" \ + "661:\n\t" \ + oldinstr "\n" \ + "662:\n" \ + ".pushsection .altinstructions,\"a\"\n" \ + ALTINSTR_ENTRY_CB(feature, cb) \ + ".popsection\n" \ "663:\n\t" \ "664:\n\t" \ - ".endif\n" \ ".endif\n" #define _ALTERNATIVE_CFG(oldinstr, newinstr, feature, cfg, ...) \ - __ALTERNATIVE_CFG(oldinstr, newinstr, feature, IS_ENABLED(cfg), 0) + __ALTERNATIVE_CFG(oldinstr, newinstr, feature, IS_ENABLED(cfg)) #define ALTERNATIVE_CB(oldinstr, cb) \ - __ALTERNATIVE_CFG(oldinstr, "NOT_AN_INSTRUCTION", ARM64_CB_PATCH, 1, cb) + __ALTERNATIVE_CFG_CB(oldinstr, ARM64_CB_PATCH, 1, cb) #else #include @@ -211,7 +221,7 @@ .macro user_alt, label, oldinstr, newinstr, cond 9999: alternative_insn "\oldinstr", "\newinstr", \cond - _ASM_EXTABLE 9999b, \label + _asm_extable 9999b, \label .endm /* diff -Nru linux-4.19.98/arch/arm64/include/asm/kvm_emulate.h linux-4.19.118/arch/arm64/include/asm/kvm_emulate.h --- linux-4.19.98/arch/arm64/include/asm/kvm_emulate.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/include/asm/kvm_emulate.h 2020-04-23 08:30:24.000000000 +0000 @@ -202,6 +202,38 @@ vcpu_gp_regs(vcpu)->spsr[KVM_SPSR_EL1] = v; } +/* + * The layout of SPSR for an AArch32 state is different when observed from an + * AArch64 SPSR_ELx or an AArch32 SPSR_*. This function generates the AArch32 + * view given an AArch64 view. + * + * In ARM DDI 0487E.a see: + * + * - The AArch64 view (SPSR_EL2) in section C5.2.18, page C5-426 + * - The AArch32 view (SPSR_abt) in section G8.2.126, page G8-6256 + * - The AArch32 view (SPSR_und) in section G8.2.132, page G8-6280 + * + * Which show the following differences: + * + * | Bit | AA64 | AA32 | Notes | + * +-----+------+------+-----------------------------| + * | 24 | DIT | J | J is RES0 in ARMv8 | + * | 21 | SS | DIT | SS doesn't exist in AArch32 | + * + * ... and all other bits are (currently) common. + */ +static inline unsigned long host_spsr_to_spsr32(unsigned long spsr) +{ + const unsigned long overlap = BIT(24) | BIT(21); + unsigned long dit = !!(spsr & PSR_AA32_DIT_BIT); + + spsr &= ~overlap; + + spsr |= dit << 21; + + return spsr; +} + static inline bool vcpu_mode_priv(const struct kvm_vcpu *vcpu) { u32 mode; @@ -261,6 +293,11 @@ return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SSE); } +static inline bool kvm_vcpu_dabt_issf(const struct kvm_vcpu *vcpu) +{ + return !!(kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SF); +} + static inline int kvm_vcpu_dabt_get_rd(const struct kvm_vcpu *vcpu) { return (kvm_vcpu_get_hsr(vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT; diff -Nru linux-4.19.98/arch/arm64/include/asm/kvm_mmio.h linux-4.19.118/arch/arm64/include/asm/kvm_mmio.h --- linux-4.19.98/arch/arm64/include/asm/kvm_mmio.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/include/asm/kvm_mmio.h 2020-04-23 08:30:24.000000000 +0000 @@ -21,13 +21,11 @@ #include #include -/* - * This is annoying. The mmio code requires this, even if we don't - * need any decoding. To be fixed. - */ struct kvm_decode { unsigned long rt; bool sign_extend; + /* Witdth of the register accessed by the faulting instruction is 64-bits */ + bool sixty_four; }; void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data); diff -Nru linux-4.19.98/arch/arm64/include/asm/ptrace.h linux-4.19.118/arch/arm64/include/asm/ptrace.h --- linux-4.19.98/arch/arm64/include/asm/ptrace.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/include/asm/ptrace.h 2020-04-23 08:30:24.000000000 +0000 @@ -50,6 +50,7 @@ #define PSR_AA32_I_BIT 0x00000080 #define PSR_AA32_A_BIT 0x00000100 #define PSR_AA32_E_BIT 0x00000200 +#define PSR_AA32_PAN_BIT 0x00400000 #define PSR_AA32_SSBS_BIT 0x00800000 #define PSR_AA32_DIT_BIT 0x01000000 #define PSR_AA32_Q_BIT 0x08000000 diff -Nru linux-4.19.98/arch/arm64/include/uapi/asm/ptrace.h linux-4.19.118/arch/arm64/include/uapi/asm/ptrace.h --- linux-4.19.98/arch/arm64/include/uapi/asm/ptrace.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/include/uapi/asm/ptrace.h 2020-04-23 08:30:24.000000000 +0000 @@ -49,6 +49,7 @@ #define PSR_SSBS_BIT 0x00001000 #define PSR_PAN_BIT 0x00400000 #define PSR_UAO_BIT 0x00800000 +#define PSR_DIT_BIT 0x01000000 #define PSR_V_BIT 0x10000000 #define PSR_C_BIT 0x20000000 #define PSR_Z_BIT 0x40000000 diff -Nru linux-4.19.98/arch/arm64/kernel/armv8_deprecated.c linux-4.19.118/arch/arm64/kernel/armv8_deprecated.c --- linux-4.19.98/arch/arm64/kernel/armv8_deprecated.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/armv8_deprecated.c 2020-04-23 08:30:24.000000000 +0000 @@ -604,7 +604,7 @@ }, { /* Thumb mode */ - .instr_mask = 0x0000fff7, + .instr_mask = 0xfffffff7, .instr_val = 0x0000b650, .pstate_mask = (PSR_AA32_T_BIT | PSR_AA32_MODE_MASK), .pstate_val = (PSR_AA32_T_BIT | PSR_AA32_MODE_USR), diff -Nru linux-4.19.98/arch/arm64/kernel/cpufeature.c linux-4.19.118/arch/arm64/kernel/cpufeature.c --- linux-4.19.98/arch/arm64/kernel/cpufeature.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/cpufeature.c 2020-04-23 08:30:24.000000000 +0000 @@ -42,9 +42,7 @@ #define COMPAT_ELF_HWCAP_DEFAULT \ (COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\ COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\ - COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\ - COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\ - COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV|\ + COMPAT_HWCAP_TLS|COMPAT_HWCAP_IDIV|\ COMPAT_HWCAP_LPAE) unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT; unsigned int compat_elf_hwcap2 __read_mostly; @@ -1241,7 +1239,7 @@ { /* FP/SIMD is not implemented */ .capability = ARM64_HAS_NO_FPSIMD, - .type = ARM64_CPUCAP_SYSTEM_FEATURE, + .type = ARM64_CPUCAP_BOOT_RESTRICTED_CPU_LOCAL_FEATURE, .min_field_value = 0, .matches = has_no_fpsimd, }, @@ -1341,17 +1339,30 @@ {}, }; -#define HWCAP_CAP(reg, field, s, min_value, cap_type, cap) \ - { \ - .desc = #cap, \ - .type = ARM64_CPUCAP_SYSTEM_FEATURE, \ + +#define HWCAP_CPUID_MATCH(reg, field, s, min_value) \ .matches = has_cpuid_feature, \ .sys_reg = reg, \ .field_pos = field, \ .sign = s, \ .min_field_value = min_value, \ + +#define __HWCAP_CAP(name, cap_type, cap) \ + .desc = name, \ + .type = ARM64_CPUCAP_SYSTEM_FEATURE, \ .hwcap_type = cap_type, \ .hwcap = cap, \ + +#define HWCAP_CAP(reg, field, s, min_value, cap_type, cap) \ + { \ + __HWCAP_CAP(#cap, cap_type, cap) \ + HWCAP_CPUID_MATCH(reg, field, s, min_value) \ + } + +#define HWCAP_CAP_MATCH(match, cap_type, cap) \ + { \ + __HWCAP_CAP(#cap, cap_type, cap) \ + .matches = match, \ } static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = { @@ -1387,8 +1398,35 @@ {}, }; +#ifdef CONFIG_COMPAT +static bool compat_has_neon(const struct arm64_cpu_capabilities *cap, int scope) +{ + /* + * Check that all of MVFR1_EL1.{SIMDSP, SIMDInt, SIMDLS} are available, + * in line with that of arm32 as in vfp_init(). We make sure that the + * check is future proof, by making sure value is non-zero. + */ + u32 mvfr1; + + WARN_ON(scope == SCOPE_LOCAL_CPU && preemptible()); + if (scope == SCOPE_SYSTEM) + mvfr1 = read_sanitised_ftr_reg(SYS_MVFR1_EL1); + else + mvfr1 = read_sysreg_s(SYS_MVFR1_EL1); + + return cpuid_feature_extract_unsigned_field(mvfr1, MVFR1_SIMDSP_SHIFT) && + cpuid_feature_extract_unsigned_field(mvfr1, MVFR1_SIMDINT_SHIFT) && + cpuid_feature_extract_unsigned_field(mvfr1, MVFR1_SIMDLS_SHIFT); +} +#endif + static const struct arm64_cpu_capabilities compat_elf_hwcaps[] = { #ifdef CONFIG_COMPAT + HWCAP_CAP_MATCH(compat_has_neon, CAP_COMPAT_HWCAP, COMPAT_HWCAP_NEON), + HWCAP_CAP(SYS_MVFR1_EL1, MVFR1_SIMDFMAC_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv4), + /* Arm v8 mandates MVFR0.FPDP == {0, 2}. So, piggy back on this for the presence of VFP support */ + HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFP), + HWCAP_CAP(SYS_MVFR0_EL1, MVFR0_FPDP_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv3), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 2, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_PMULL), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_AES_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_AES), HWCAP_CAP(SYS_ID_ISAR5_EL1, ID_ISAR5_SHA1_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP2, COMPAT_HWCAP2_SHA1), diff -Nru linux-4.19.98/arch/arm64/kernel/fpsimd.c linux-4.19.118/arch/arm64/kernel/fpsimd.c --- linux-4.19.98/arch/arm64/kernel/fpsimd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/fpsimd.c 2020-04-23 08:30:24.000000000 +0000 @@ -218,6 +218,7 @@ static void task_fpsimd_load(void) { WARN_ON(!in_softirq() && !irqs_disabled()); + WARN_ON(!system_supports_fpsimd()); if (system_supports_sve() && test_thread_flag(TIF_SVE)) sve_load_state(sve_pffr(¤t->thread), @@ -238,6 +239,7 @@ struct user_fpsimd_state *st = __this_cpu_read(fpsimd_last_state.st); /* set by fpsimd_bind_task_to_cpu() or fpsimd_bind_state_to_cpu() */ + WARN_ON(!system_supports_fpsimd()); WARN_ON(!in_softirq() && !irqs_disabled()); if (!test_thread_flag(TIF_FOREIGN_FPSTATE)) { @@ -977,6 +979,7 @@ struct fpsimd_last_state_struct *last = this_cpu_ptr(&fpsimd_last_state); + WARN_ON(!system_supports_fpsimd()); last->st = ¤t->thread.uw.fpsimd_state; current->thread.fpsimd_cpu = smp_processor_id(); @@ -996,6 +999,7 @@ struct fpsimd_last_state_struct *last = this_cpu_ptr(&fpsimd_last_state); + WARN_ON(!system_supports_fpsimd()); WARN_ON(!in_softirq() && !irqs_disabled()); last->st = st; @@ -1008,8 +1012,19 @@ */ void fpsimd_restore_current_state(void) { - if (!system_supports_fpsimd()) + /* + * For the tasks that were created before we detected the absence of + * FP/SIMD, the TIF_FOREIGN_FPSTATE could be set via fpsimd_thread_switch(), + * e.g, init. This could be then inherited by the children processes. + * If we later detect that the system doesn't support FP/SIMD, + * we must clear the flag for all the tasks to indicate that the + * FPSTATE is clean (as we can't have one) to avoid looping for ever in + * do_notify_resume(). + */ + if (!system_supports_fpsimd()) { + clear_thread_flag(TIF_FOREIGN_FPSTATE); return; + } local_bh_disable(); @@ -1028,7 +1043,7 @@ */ void fpsimd_update_current_state(struct user_fpsimd_state const *state) { - if (!system_supports_fpsimd()) + if (WARN_ON(!system_supports_fpsimd())) return; local_bh_disable(); @@ -1055,6 +1070,7 @@ void fpsimd_flush_cpu_state(void) { + WARN_ON(!system_supports_fpsimd()); __this_cpu_write(fpsimd_last_state.st, NULL); set_thread_flag(TIF_FOREIGN_FPSTATE); } diff -Nru linux-4.19.98/arch/arm64/kernel/head.S linux-4.19.118/arch/arm64/kernel/head.S --- linux-4.19.98/arch/arm64/kernel/head.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/head.S 2020-04-23 08:30:24.000000000 +0000 @@ -667,7 +667,7 @@ * with MMU turned off. */ ENTRY(__early_cpu_boot_status) - .long 0 + .quad 0 .popsection diff -Nru linux-4.19.98/arch/arm64/kernel/hibernate.c linux-4.19.118/arch/arm64/kernel/hibernate.c --- linux-4.19.98/arch/arm64/kernel/hibernate.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/hibernate.c 2020-04-23 08:30:24.000000000 +0000 @@ -202,6 +202,7 @@ gfp_t mask) { int rc = 0; + pgd_t *trans_pgd; pgd_t *pgdp; pud_t *pudp; pmd_t *pmdp; @@ -216,7 +217,13 @@ memcpy((void *)dst, src_start, length); __flush_icache_range(dst, dst + length); - pgdp = pgd_offset_raw(allocator(mask), dst_addr); + trans_pgd = allocator(mask); + if (!trans_pgd) { + rc = -ENOMEM; + goto out; + } + + pgdp = pgd_offset_raw(trans_pgd, dst_addr); if (pgd_none(READ_ONCE(*pgdp))) { pudp = allocator(mask); if (!pudp) { diff -Nru linux-4.19.98/arch/arm64/kernel/process.c linux-4.19.118/arch/arm64/kernel/process.c --- linux-4.19.98/arch/arm64/kernel/process.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/process.c 2020-04-23 08:30:24.000000000 +0000 @@ -414,6 +414,13 @@ if (unlikely(next->flags & PF_KTHREAD)) return; + /* + * If all CPUs implement the SSBS extension, then we just need to + * context-switch the PSTATE field. + */ + if (cpu_have_feature(cpu_feature(SSBS))) + return; + /* If the mitigation is enabled, then we leave SSBS clear. */ if ((arm64_get_ssbd_state() == ARM64_SSBD_FORCE_ENABLE) || test_tsk_thread_flag(next, TIF_SSBD)) diff -Nru linux-4.19.98/arch/arm64/kernel/ptrace.c linux-4.19.118/arch/arm64/kernel/ptrace.c --- linux-4.19.98/arch/arm64/kernel/ptrace.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/ptrace.c 2020-04-23 08:30:24.000000000 +0000 @@ -627,6 +627,13 @@ return 0; } +static int fpr_active(struct task_struct *target, const struct user_regset *regset) +{ + if (!system_supports_fpsimd()) + return -ENODEV; + return regset->n; +} + /* * TODO: update fp accessors for lazy context switching (sync/flush hwstate) */ @@ -649,6 +656,9 @@ unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf) { + if (!system_supports_fpsimd()) + return -EINVAL; + if (target == current) fpsimd_preserve_current_state(); @@ -688,6 +698,9 @@ { int ret; + if (!system_supports_fpsimd()) + return -EINVAL; + ret = __fpr_set(target, regset, pos, count, kbuf, ubuf, 0); if (ret) return ret; @@ -990,6 +1003,7 @@ */ .size = sizeof(u32), .align = sizeof(u32), + .active = fpr_active, .get = fpr_get, .set = fpr_set }, @@ -1176,6 +1190,9 @@ compat_ulong_t fpscr; int ret, vregs_end_pos; + if (!system_supports_fpsimd()) + return -EINVAL; + uregs = &target->thread.uw.fpsimd_state; if (target == current) @@ -1209,6 +1226,9 @@ compat_ulong_t fpscr; int ret, vregs_end_pos; + if (!system_supports_fpsimd()) + return -EINVAL; + uregs = &target->thread.uw.fpsimd_state; vregs_end_pos = VFP_STATE_SIZE - sizeof(compat_ulong_t); @@ -1266,6 +1286,7 @@ .n = VFP_STATE_SIZE / sizeof(compat_ulong_t), .size = sizeof(compat_ulong_t), .align = sizeof(compat_ulong_t), + .active = fpr_active, .get = compat_vfp_get, .set = compat_vfp_set }, diff -Nru linux-4.19.98/arch/arm64/kernel/smp.c linux-4.19.118/arch/arm64/kernel/smp.c --- linux-4.19.98/arch/arm64/kernel/smp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/smp.c 2020-04-23 08:30:24.000000000 +0000 @@ -936,11 +936,22 @@ } #endif +/* + * The number of CPUs online, not counting this CPU (which may not be + * fully online and so not counted in num_online_cpus()). + */ +static inline unsigned int num_other_online_cpus(void) +{ + unsigned int this_cpu_online = cpu_online(smp_processor_id()); + + return num_online_cpus() - this_cpu_online; +} + void smp_send_stop(void) { unsigned long timeout; - if (num_online_cpus() > 1) { + if (num_other_online_cpus()) { cpumask_t mask; cpumask_copy(&mask, cpu_online_mask); @@ -953,10 +964,10 @@ /* Wait up to one second for other CPUs to stop */ timeout = USEC_PER_SEC; - while (num_online_cpus() > 1 && timeout--) + while (num_other_online_cpus() && timeout--) udelay(1); - if (num_online_cpus() > 1) + if (num_other_online_cpus()) pr_warning("SMP: failed to stop secondary CPUs %*pbl\n", cpumask_pr_args(cpu_online_mask)); @@ -979,7 +990,11 @@ cpus_stopped = 1; - if (num_online_cpus() == 1) { + /* + * If this cpu is the only one alive at this point in time, online or + * not, there are no stop messages to be sent around, so just back out. + */ + if (num_other_online_cpus() == 0) { sdei_mask_local_cpu(); return; } @@ -987,7 +1002,7 @@ cpumask_copy(&mask, cpu_online_mask); cpumask_clear_cpu(smp_processor_id(), &mask); - atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); + atomic_set(&waiting_for_crash_ipi, num_other_online_cpus()); pr_crit("SMP: stopping secondary CPUs\n"); smp_cross_call(&mask, IPI_CPU_CRASH_STOP); diff -Nru linux-4.19.98/arch/arm64/kernel/vdso.c linux-4.19.118/arch/arm64/kernel/vdso.c --- linux-4.19.98/arch/arm64/kernel/vdso.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kernel/vdso.c 2020-04-23 08:30:24.000000000 +0000 @@ -146,8 +146,6 @@ } vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; - pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n", - vdso_pages + 1, vdso_pages, vdso_start, 1L, vdso_data); /* Allocate the vDSO pagelist, plus a page for the data. */ vdso_pagelist = kcalloc(vdso_pages + 1, sizeof(struct page *), diff -Nru linux-4.19.98/arch/arm64/kvm/debug.c linux-4.19.118/arch/arm64/kvm/debug.c --- linux-4.19.98/arch/arm64/kvm/debug.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kvm/debug.c 2020-04-23 08:30:24.000000000 +0000 @@ -112,7 +112,7 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) { bool trap_debug = !(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY); - unsigned long mdscr; + unsigned long mdscr, orig_mdcr_el2 = vcpu->arch.mdcr_el2; trace_kvm_arm_setup_debug(vcpu, vcpu->guest_debug); @@ -208,6 +208,10 @@ if (vcpu_read_sys_reg(vcpu, MDSCR_EL1) & (DBG_MDSCR_KDE | DBG_MDSCR_MDE)) vcpu->arch.flags |= KVM_ARM64_DEBUG_DIRTY; + /* Write mdcr_el2 changes since vcpu_load on VHE systems */ + if (has_vhe() && orig_mdcr_el2 != vcpu->arch.mdcr_el2) + write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2); + trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2); trace_kvm_arm_set_dreg32("MDSCR_EL1", vcpu_read_sys_reg(vcpu, MDSCR_EL1)); } diff -Nru linux-4.19.98/arch/arm64/kvm/hyp/switch.c linux-4.19.118/arch/arm64/kvm/hyp/switch.c --- linux-4.19.98/arch/arm64/kvm/hyp/switch.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kvm/hyp/switch.c 2020-04-23 08:30:24.000000000 +0000 @@ -37,7 +37,15 @@ /* Check whether the FP regs were dirtied while in the host-side run loop: */ static bool __hyp_text update_fp_enabled(struct kvm_vcpu *vcpu) { - if (vcpu->arch.host_thread_info->flags & _TIF_FOREIGN_FPSTATE) + /* + * When the system doesn't support FP/SIMD, we cannot rely on + * the _TIF_FOREIGN_FPSTATE flag. However, we always inject an + * abort on the very first access to FP and thus we should never + * see KVM_ARM64_FP_ENABLED. For added safety, make sure we always + * trap the accesses. + */ + if (!system_supports_fpsimd() || + vcpu->arch.host_thread_info->flags & _TIF_FOREIGN_FPSTATE) vcpu->arch.flags &= ~(KVM_ARM64_FP_ENABLED | KVM_ARM64_FP_HOST); diff -Nru linux-4.19.98/arch/arm64/kvm/inject_fault.c linux-4.19.118/arch/arm64/kvm/inject_fault.c --- linux-4.19.98/arch/arm64/kvm/inject_fault.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/arm64/kvm/inject_fault.c 2020-04-23 08:30:24.000000000 +0000 @@ -25,9 +25,6 @@ #include #include -#define PSTATE_FAULT_BITS_64 (PSR_MODE_EL1h | PSR_A_BIT | PSR_F_BIT | \ - PSR_I_BIT | PSR_D_BIT) - #define CURRENT_EL_SP_EL0_VECTOR 0x0 #define CURRENT_EL_SP_ELx_VECTOR 0x200 #define LOWER_EL_AArch64_VECTOR 0x400 @@ -61,6 +58,69 @@ return vcpu_read_sys_reg(vcpu, VBAR_EL1) + exc_offset + type; } +/* + * When an exception is taken, most PSTATE fields are left unchanged in the + * handler. However, some are explicitly overridden (e.g. M[4:0]). Luckily all + * of the inherited bits have the same position in the AArch64/AArch32 SPSR_ELx + * layouts, so we don't need to shuffle these for exceptions from AArch32 EL0. + * + * For the SPSR_ELx layout for AArch64, see ARM DDI 0487E.a page C5-429. + * For the SPSR_ELx layout for AArch32, see ARM DDI 0487E.a page C5-426. + * + * Here we manipulate the fields in order of the AArch64 SPSR_ELx layout, from + * MSB to LSB. + */ +static unsigned long get_except64_pstate(struct kvm_vcpu *vcpu) +{ + unsigned long sctlr = vcpu_read_sys_reg(vcpu, SCTLR_EL1); + unsigned long old, new; + + old = *vcpu_cpsr(vcpu); + new = 0; + + new |= (old & PSR_N_BIT); + new |= (old & PSR_Z_BIT); + new |= (old & PSR_C_BIT); + new |= (old & PSR_V_BIT); + + // TODO: TCO (if/when ARMv8.5-MemTag is exposed to guests) + + new |= (old & PSR_DIT_BIT); + + // PSTATE.UAO is set to zero upon any exception to AArch64 + // See ARM DDI 0487E.a, page D5-2579. + + // PSTATE.PAN is unchanged unless SCTLR_ELx.SPAN == 0b0 + // SCTLR_ELx.SPAN is RES1 when ARMv8.1-PAN is not implemented + // See ARM DDI 0487E.a, page D5-2578. + new |= (old & PSR_PAN_BIT); + if (!(sctlr & SCTLR_EL1_SPAN)) + new |= PSR_PAN_BIT; + + // PSTATE.SS is set to zero upon any exception to AArch64 + // See ARM DDI 0487E.a, page D2-2452. + + // PSTATE.IL is set to zero upon any exception to AArch64 + // See ARM DDI 0487E.a, page D1-2306. + + // PSTATE.SSBS is set to SCTLR_ELx.DSSBS upon any exception to AArch64 + // See ARM DDI 0487E.a, page D13-3258 + if (sctlr & SCTLR_ELx_DSSBS) + new |= PSR_SSBS_BIT; + + // PSTATE.BTYPE is set to zero upon any exception to AArch64 + // See ARM DDI 0487E.a, pages D1-2293 to D1-2294. + + new |= PSR_D_BIT; + new |= PSR_A_BIT; + new |= PSR_I_BIT; + new |= PSR_F_BIT; + + new |= PSR_MODE_EL1h; + + return new; +} + static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr) { unsigned long cpsr = *vcpu_cpsr(vcpu); @@ -70,7 +130,7 @@ vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu)); *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); - *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; + *vcpu_cpsr(vcpu) = get_except64_pstate(vcpu); vcpu_write_spsr(vcpu, cpsr); vcpu_write_sys_reg(vcpu, addr, FAR_EL1); @@ -105,7 +165,7 @@ vcpu_write_elr_el1(vcpu, *vcpu_pc(vcpu)); *vcpu_pc(vcpu) = get_except_vector(vcpu, except_type_sync); - *vcpu_cpsr(vcpu) = PSTATE_FAULT_BITS_64; + *vcpu_cpsr(vcpu) = get_except64_pstate(vcpu); vcpu_write_spsr(vcpu, cpsr); /* diff -Nru linux-4.19.98/arch/ia64/kernel/signal.c linux-4.19.118/arch/ia64/kernel/signal.c --- linux-4.19.98/arch/ia64/kernel/signal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/ia64/kernel/signal.c 2020-04-23 08:30:24.000000000 +0000 @@ -110,7 +110,6 @@ { extern char ia64_strace_leave_kernel, ia64_leave_kernel; struct sigcontext __user *sc; - struct siginfo si; sigset_t set; long retval; @@ -153,14 +152,7 @@ return retval; give_sigsegv: - clear_siginfo(&si); - si.si_signo = SIGSEGV; - si.si_errno = 0; - si.si_code = SI_KERNEL; - si.si_pid = task_pid_vnr(current); - si.si_uid = from_kuid_munged(current_user_ns(), current_uid()); - si.si_addr = sc; - force_sig_info(SIGSEGV, &si, current); + force_sig(SIGSEGV, current); return retval; } @@ -232,37 +224,6 @@ } static long -force_sigsegv_info (int sig, void __user *addr) -{ - unsigned long flags; - struct siginfo si; - - clear_siginfo(&si); - if (sig == SIGSEGV) { - /* - * Acquiring siglock around the sa_handler-update is almost - * certainly overkill, but this isn't a - * performance-critical path and I'd rather play it safe - * here than having to debug a nasty race if and when - * something changes in kernel/signal.c that would make it - * no longer safe to modify sa_handler without holding the - * lock. - */ - spin_lock_irqsave(¤t->sighand->siglock, flags); - current->sighand->action[sig - 1].sa.sa_handler = SIG_DFL; - spin_unlock_irqrestore(¤t->sighand->siglock, flags); - } - si.si_signo = SIGSEGV; - si.si_errno = 0; - si.si_code = SI_KERNEL; - si.si_pid = task_pid_vnr(current); - si.si_uid = from_kuid_munged(current_user_ns(), current_uid()); - si.si_addr = addr; - force_sig_info(SIGSEGV, &si, current); - return 1; -} - -static long setup_frame(struct ksignal *ksig, sigset_t *set, struct sigscratch *scr) { extern char __kernel_sigtramp[]; @@ -295,15 +256,18 @@ * instead so we will die with SIGSEGV. */ check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN; - if (!likely(on_sig_stack(check_sp))) - return force_sigsegv_info(ksig->sig, (void __user *) - check_sp); + if (!likely(on_sig_stack(check_sp))) { + force_sigsegv(ksig->sig, current); + return 1; + } } } frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN); - if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) - return force_sigsegv_info(ksig->sig, frame); + if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) { + force_sigsegv(ksig->sig, current); + return 1; + } err = __put_user(ksig->sig, &frame->arg0); err |= __put_user(&frame->info, &frame->arg1); @@ -317,8 +281,10 @@ err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12); err |= setup_sigcontext(&frame->sc, set, scr); - if (unlikely(err)) - return force_sigsegv_info(ksig->sig, frame); + if (unlikely(err)) { + force_sigsegv(ksig->sig, current); + return 1; + } scr->pt.r12 = (unsigned long) frame - 16; /* new stack pointer */ scr->pt.ar_fpsr = FPSR_DEFAULT; /* reset fpsr for signal handler */ diff -Nru linux-4.19.98/arch/ia64/mm/init.c linux-4.19.118/arch/ia64/mm/init.c --- linux-4.19.98/arch/ia64/mm/init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/ia64/mm/init.c 2020-04-23 08:30:24.000000000 +0000 @@ -661,21 +661,12 @@ return ret; } -#ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct zone *zone; - int ret; - zone = page_zone(pfn_to_page(start_pfn)); - ret = __remove_pages(zone, start_pfn, nr_pages, altmap); - if (ret) - pr_warn("%s: Problem encountered in __remove_pages() as" - " ret=%d\n", __func__, ret); - - return ret; + __remove_pages(start_pfn, nr_pages, altmap); } #endif -#endif diff -Nru linux-4.19.98/arch/m68k/amiga/cia.c linux-4.19.118/arch/m68k/amiga/cia.c --- linux-4.19.98/arch/m68k/amiga/cia.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/amiga/cia.c 2020-04-23 08:30:24.000000000 +0000 @@ -88,10 +88,19 @@ struct ciabase *base = dev_id; int mach_irq; unsigned char ints; + unsigned long flags; + /* Interrupts get disabled while the timer irq flag is cleared and + * the timer interrupt serviced. + */ mach_irq = base->cia_irq; + local_irq_save(flags); ints = cia_set_irq(base, CIA_ICR_ALL); amiga_custom.intreq = base->int_mask; + if (ints & 1) + generic_handle_irq(mach_irq); + local_irq_restore(flags); + mach_irq++, ints >>= 1; for (; ints; mach_irq++, ints >>= 1) { if (ints & 1) generic_handle_irq(mach_irq); diff -Nru linux-4.19.98/arch/m68k/atari/ataints.c linux-4.19.118/arch/m68k/atari/ataints.c --- linux-4.19.98/arch/m68k/atari/ataints.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/atari/ataints.c 2020-04-23 08:30:24.000000000 +0000 @@ -142,7 +142,7 @@ .name = "MFP Timer D" }; -static irqreturn_t mfptimer_handler(int irq, void *dev_id) +static irqreturn_t mfp_timer_d_handler(int irq, void *dev_id) { struct mfptimerbase *base = dev_id; int mach_irq; @@ -344,7 +344,7 @@ st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 0xf0) | 0x6; /* request timer D dispatch handler */ - if (request_irq(IRQ_MFP_TIMD, mfptimer_handler, IRQF_SHARED, + if (request_irq(IRQ_MFP_TIMD, mfp_timer_d_handler, IRQF_SHARED, stmfp_base.name, &stmfp_base)) pr_err("Couldn't register %s interrupt\n", stmfp_base.name); diff -Nru linux-4.19.98/arch/m68k/atari/time.c linux-4.19.118/arch/m68k/atari/time.c --- linux-4.19.98/arch/m68k/atari/time.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/atari/time.c 2020-04-23 08:30:24.000000000 +0000 @@ -24,6 +24,18 @@ DEFINE_SPINLOCK(rtc_lock); EXPORT_SYMBOL_GPL(rtc_lock); +static irqreturn_t mfp_timer_c_handler(int irq, void *dev_id) +{ + irq_handler_t timer_routine = dev_id; + unsigned long flags; + + local_irq_save(flags); + timer_routine(0, NULL); + local_irq_restore(flags); + + return IRQ_HANDLED; +} + void __init atari_sched_init(irq_handler_t timer_routine) { @@ -32,7 +44,8 @@ /* start timer C, div = 1:100 */ st_mfp.tim_ct_cd = (st_mfp.tim_ct_cd & 15) | 0x60; /* install interrupt service routine for MFP Timer C */ - if (request_irq(IRQ_MFP_TIMC, timer_routine, 0, "timer", timer_routine)) + if (request_irq(IRQ_MFP_TIMC, mfp_timer_c_handler, 0, "timer", + timer_routine)) pr_err("Couldn't register timer interrupt\n"); } diff -Nru linux-4.19.98/arch/m68k/bvme6000/config.c linux-4.19.118/arch/m68k/bvme6000/config.c --- linux-4.19.98/arch/m68k/bvme6000/config.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/bvme6000/config.c 2020-04-23 08:30:24.000000000 +0000 @@ -44,11 +44,6 @@ extern void bvme6000_reset (void); void bvme6000_set_vectors (void); -/* Save tick handler routine pointer, will point to xtime_update() in - * kernel/timer/timekeeping.c, called via bvme6000_process_int() */ - -static irq_handler_t tick_handler; - int __init bvme6000_parse_bootinfo(const struct bi_record *bi) { @@ -157,12 +152,18 @@ static irqreturn_t bvme6000_timer_int (int irq, void *dev_id) { + irq_handler_t timer_routine = dev_id; + unsigned long flags; volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; - unsigned char msr = rtc->msr & 0xc0; + unsigned char msr; + local_irq_save(flags); + msr = rtc->msr & 0xc0; rtc->msr = msr | 0x20; /* Ack the interrupt */ + timer_routine(0, NULL); + local_irq_restore(flags); - return tick_handler(irq, dev_id); + return IRQ_HANDLED; } /* @@ -181,9 +182,8 @@ rtc->msr = 0; /* Ensure timer registers accessible */ - tick_handler = timer_routine; - if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, - "timer", bvme6000_timer_int)) + if (request_irq(BVME_IRQ_RTC, bvme6000_timer_int, 0, "timer", + timer_routine)) panic ("Couldn't register timer int"); rtc->t1cr_omr = 0x04; /* Mode 2, ext clk */ diff -Nru linux-4.19.98/arch/m68k/hp300/time.c linux-4.19.118/arch/m68k/hp300/time.c --- linux-4.19.98/arch/m68k/hp300/time.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/hp300/time.c 2020-04-23 08:30:24.000000000 +0000 @@ -38,13 +38,19 @@ static irqreturn_t hp300_tick(int irq, void *dev_id) { + irq_handler_t timer_routine = dev_id; + unsigned long flags; unsigned long tmp; - irq_handler_t vector = dev_id; + + local_irq_save(flags); in_8(CLOCKBASE + CLKSR); asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE)); + timer_routine(0, NULL); + local_irq_restore(flags); + /* Turn off the network and SCSI leds */ blinken_leds(0, 0xe0); - return vector(irq, NULL); + return IRQ_HANDLED; } u32 hp300_gettimeoffset(void) diff -Nru linux-4.19.98/arch/m68k/mac/via.c linux-4.19.118/arch/m68k/mac/via.c --- linux-4.19.98/arch/m68k/mac/via.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/mac/via.c 2020-04-23 08:30:24.000000000 +0000 @@ -55,16 +55,6 @@ static int gIER,gIFR,gBufA,gBufB; /* - * Timer defs. - */ - -#define TICK_SIZE 10000 -#define MAC_CLOCK_TICK (783300/HZ) /* ticks per HZ */ -#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF) -#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8) - - -/* * On Macs with a genuine VIA chip there is no way to mask an individual slot * interrupt. This limitation also seems to apply to VIA clone logic cores in * Quadra-like ASICs. (RBV and OSS machines don't have this limitation.) @@ -268,22 +258,6 @@ } /* - * Start the 100 Hz clock - */ - -void __init via_init_clock(irq_handler_t func) -{ - via1[vACR] |= 0x40; - via1[vT1LL] = MAC_CLOCK_LOW; - via1[vT1LH] = MAC_CLOCK_HIGH; - via1[vT1CL] = MAC_CLOCK_LOW; - via1[vT1CH] = MAC_CLOCK_HIGH; - - if (request_irq(IRQ_MAC_TIMER_1, func, 0, "timer", func)) - pr_err("Couldn't register %s interrupt\n", "timer"); -} - -/* * Debugging dump, used in various places to see what's going on. */ @@ -311,29 +285,6 @@ } /* - * This is always executed with interrupts disabled. - * - * TBI: get time offset between scheduling timer ticks - */ - -u32 mac_gettimeoffset(void) -{ - unsigned long ticks, offset = 0; - - /* read VIA1 timer 2 current value */ - ticks = via1[vT1CL] | (via1[vT1CH] << 8); - /* The probability of underflow is less than 2% */ - if (ticks > MAC_CLOCK_TICK - MAC_CLOCK_TICK / 50) - /* Check for pending timer interrupt in VIA1 IFR */ - if (via1[vIFR] & 0x40) offset = TICK_SIZE; - - ticks = MAC_CLOCK_TICK - ticks; - ticks = ticks * 10000L / MAC_CLOCK_TICK; - - return (ticks + offset) * 1000; -} - -/* * Flush the L2 cache on Macs that have it by flipping * the system into 24-bit mode for an instant. */ @@ -436,6 +387,8 @@ * via6522.c :-), disable/pending masks added. */ +#define VIA_TIMER_1_INT BIT(6) + void via1_irq(struct irq_desc *desc) { int irq_num; @@ -445,6 +398,21 @@ if (!events) return; + irq_num = IRQ_MAC_TIMER_1; + irq_bit = VIA_TIMER_1_INT; + if (events & irq_bit) { + unsigned long flags; + + local_irq_save(flags); + via1[vIFR] = irq_bit; + generic_handle_irq(irq_num); + local_irq_restore(flags); + + events &= ~irq_bit; + if (!events) + return; + } + irq_num = VIA1_SOURCE_BASE; irq_bit = 1; do { @@ -601,3 +569,56 @@ return via2[gIFR] & (1 << IRQ_IDX(IRQ_MAC_SCSIDRQ)); } EXPORT_SYMBOL(via2_scsi_drq_pending); + +/* timer and clock source */ + +#define VIA_CLOCK_FREQ 783360 /* VIA "phase 2" clock in Hz */ +#define VIA_TIMER_INTERVAL (1000000 / HZ) /* microseconds per jiffy */ +#define VIA_TIMER_CYCLES (VIA_CLOCK_FREQ / HZ) /* clock cycles per jiffy */ + +#define VIA_TC (VIA_TIMER_CYCLES - 2) /* including 0 and -1 */ +#define VIA_TC_LOW (VIA_TC & 0xFF) +#define VIA_TC_HIGH (VIA_TC >> 8) + +void __init via_init_clock(irq_handler_t timer_routine) +{ + if (request_irq(IRQ_MAC_TIMER_1, timer_routine, 0, "timer", NULL)) { + pr_err("Couldn't register %s interrupt\n", "timer"); + return; + } + + via1[vT1LL] = VIA_TC_LOW; + via1[vT1LH] = VIA_TC_HIGH; + via1[vT1CL] = VIA_TC_LOW; + via1[vT1CH] = VIA_TC_HIGH; + via1[vACR] |= 0x40; +} + +u32 mac_gettimeoffset(void) +{ + unsigned long flags; + u8 count_high; + u16 count, offset = 0; + + /* + * Timer counter wrap-around is detected with the timer interrupt flag + * but reading the counter low byte (vT1CL) would reset the flag. + * Also, accessing both counter registers is essentially a data race. + * These problems are avoided by ignoring the low byte. Clock accuracy + * is 256 times worse (error can reach 0.327 ms) but CPU overhead is + * reduced by avoiding slow VIA register accesses. + */ + + local_irq_save(flags); + count_high = via1[vT1CH]; + if (count_high == 0xFF) + count_high = 0; + if (count_high > 0 && (via1[vIFR] & VIA_TIMER_1_INT)) + offset = VIA_TIMER_CYCLES; + local_irq_restore(flags); + + count = count_high << 8; + count = VIA_TIMER_CYCLES - count + offset; + + return ((count * VIA_TIMER_INTERVAL) / VIA_TIMER_CYCLES) * 1000; +} diff -Nru linux-4.19.98/arch/m68k/mvme147/config.c linux-4.19.118/arch/m68k/mvme147/config.c --- linux-4.19.98/arch/m68k/mvme147/config.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/mvme147/config.c 2020-04-23 08:30:24.000000000 +0000 @@ -45,11 +45,6 @@ static int bcd2int (unsigned char b); -/* Save tick handler routine pointer, will point to xtime_update() in - * kernel/time/timekeeping.c, called via mvme147_process_int() */ - -irq_handler_t tick_handler; - int __init mvme147_parse_bootinfo(const struct bi_record *bi) { @@ -104,16 +99,23 @@ static irqreturn_t mvme147_timer_int (int irq, void *dev_id) { + irq_handler_t timer_routine = dev_id; + unsigned long flags; + + local_irq_save(flags); m147_pcc->t1_int_cntrl = PCC_TIMER_INT_CLR; m147_pcc->t1_int_cntrl = PCC_INT_ENAB|PCC_LEVEL_TIMER1; - return tick_handler(irq, dev_id); + timer_routine(0, NULL); + local_irq_restore(flags); + + return IRQ_HANDLED; } void mvme147_sched_init (irq_handler_t timer_routine) { - tick_handler = timer_routine; - if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", NULL)) + if (request_irq(PCC_IRQ_TIMER1, mvme147_timer_int, 0, "timer 1", + timer_routine)) pr_err("Couldn't register timer interrupt\n"); /* Init the clock with a value */ diff -Nru linux-4.19.98/arch/m68k/mvme16x/config.c linux-4.19.118/arch/m68k/mvme16x/config.c --- linux-4.19.98/arch/m68k/mvme16x/config.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/mvme16x/config.c 2020-04-23 08:30:24.000000000 +0000 @@ -50,11 +50,6 @@ int bcd2int (unsigned char b); -/* Save tick handler routine pointer, will point to xtime_update() in - * kernel/time/timekeeping.c, called via mvme16x_process_int() */ - -static irq_handler_t tick_handler; - unsigned short mvme16x_config; EXPORT_SYMBOL(mvme16x_config); @@ -352,8 +347,15 @@ static irqreturn_t mvme16x_timer_int (int irq, void *dev_id) { - *(volatile unsigned char *)0xfff4201b |= 8; - return tick_handler(irq, dev_id); + irq_handler_t timer_routine = dev_id; + unsigned long flags; + + local_irq_save(flags); + *(volatile unsigned char *)0xfff4201b |= 8; + timer_routine(0, NULL); + local_irq_restore(flags); + + return IRQ_HANDLED; } void mvme16x_sched_init (irq_handler_t timer_routine) @@ -361,14 +363,13 @@ uint16_t brdno = be16_to_cpu(mvme_bdid.brdno); int irq; - tick_handler = timer_routine; /* Using PCCchip2 or MC2 chip tick timer 1 */ *(volatile unsigned long *)0xfff42008 = 0; *(volatile unsigned long *)0xfff42004 = 10000; /* 10ms */ *(volatile unsigned char *)0xfff42017 |= 3; *(volatile unsigned char *)0xfff4201b = 0x16; - if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, - "timer", mvme16x_timer_int)) + if (request_irq(MVME16x_IRQ_TIMER, mvme16x_timer_int, 0, "timer", + timer_routine)) panic ("Couldn't register timer int"); if (brdno == 0x0162 || brdno == 0x172) diff -Nru linux-4.19.98/arch/m68k/q40/q40ints.c linux-4.19.118/arch/m68k/q40/q40ints.c --- linux-4.19.98/arch/m68k/q40/q40ints.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/q40/q40ints.c 2020-04-23 08:30:24.000000000 +0000 @@ -127,10 +127,10 @@ sound_ticks = ticks << 1; } -static irq_handler_t q40_timer_routine; - -static irqreturn_t q40_timer_int (int irq, void * dev) +static irqreturn_t q40_timer_int(int irq, void *dev_id) { + irq_handler_t timer_routine = dev_id; + ql_ticks = ql_ticks ? 0 : 1; if (sound_ticks) { unsigned char sval=(sound_ticks & 1) ? 128-SVOL : 128+SVOL; @@ -139,8 +139,13 @@ *DAC_RIGHT=sval; } - if (!ql_ticks) - q40_timer_routine(irq, dev); + if (!ql_ticks) { + unsigned long flags; + + local_irq_save(flags); + timer_routine(0, NULL); + local_irq_restore(flags); + } return IRQ_HANDLED; } @@ -148,11 +153,9 @@ { int timer_irq; - q40_timer_routine = timer_routine; timer_irq = Q40_IRQ_FRAME; - if (request_irq(timer_irq, q40_timer_int, 0, - "timer", q40_timer_int)) + if (request_irq(timer_irq, q40_timer_int, 0, "timer", timer_routine)) panic("Couldn't register timer int"); master_outb(-1, FRAME_CLEAR_REG); diff -Nru linux-4.19.98/arch/m68k/sun3/sun3ints.c linux-4.19.118/arch/m68k/sun3/sun3ints.c --- linux-4.19.98/arch/m68k/sun3/sun3ints.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/sun3/sun3ints.c 2020-04-23 08:30:24.000000000 +0000 @@ -61,8 +61,10 @@ static irqreturn_t sun3_int5(int irq, void *dev_id) { + unsigned long flags; unsigned int cnt; + local_irq_save(flags); #ifdef CONFIG_SUN3 intersil_clear(); #endif @@ -76,6 +78,7 @@ cnt = kstat_irqs_cpu(irq, 0); if (!(cnt % 20)) sun3_leds(led_pattern[cnt % 160 / 20]); + local_irq_restore(flags); return IRQ_HANDLED; } diff -Nru linux-4.19.98/arch/m68k/sun3x/time.c linux-4.19.118/arch/m68k/sun3x/time.c --- linux-4.19.98/arch/m68k/sun3x/time.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/m68k/sun3x/time.c 2020-04-23 08:30:24.000000000 +0000 @@ -80,15 +80,19 @@ } #if 0 -static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sun3x_timer_tick(int irq, void *dev_id) { - void (*vector)(int, void *, struct pt_regs *) = dev_id; + irq_handler_t timer_routine = dev_id; + unsigned long flags; - /* Clear the pending interrupt - pulse the enable line low */ - disable_irq(5); - enable_irq(5); + local_irq_save(flags); + /* Clear the pending interrupt - pulse the enable line low */ + disable_irq(5); + enable_irq(5); + timer_routine(0, NULL); + local_irq_restore(flags); - vector(irq, NULL, regs); + return IRQ_HANDLED; } #endif diff -Nru linux-4.19.98/arch/microblaze/kernel/cpu/cache.c linux-4.19.118/arch/microblaze/kernel/cpu/cache.c --- linux-4.19.98/arch/microblaze/kernel/cpu/cache.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/microblaze/kernel/cpu/cache.c 2020-04-23 08:30:24.000000000 +0000 @@ -92,7 +92,8 @@ #define CACHE_LOOP_LIMITS(start, end, cache_line_length, cache_size) \ do { \ int align = ~(cache_line_length - 1); \ - end = min(start + cache_size, end); \ + if (start < UINT_MAX - cache_size) \ + end = min(start + cache_size, end); \ start &= align; \ } while (0) diff -Nru linux-4.19.98/arch/mips/Makefile.postlink linux-4.19.118/arch/mips/Makefile.postlink --- linux-4.19.98/arch/mips/Makefile.postlink 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/Makefile.postlink 2020-04-23 08:30:24.000000000 +0000 @@ -12,7 +12,7 @@ include scripts/Kbuild.include CMD_RELOCS = arch/mips/boot/tools/relocs -quiet_cmd_relocs = RELOCS $@ +quiet_cmd_relocs = RELOCS $@ cmd_relocs = $(CMD_RELOCS) $@ # `@true` prevents complaint when there is nothing to be done diff -Nru linux-4.19.98/arch/mips/bcm63xx/Makefile linux-4.19.118/arch/mips/bcm63xx/Makefile --- linux-4.19.98/arch/mips/bcm63xx/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/bcm63xx/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -1,8 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 obj-y += clk.o cpu.o cs.o gpio.o irq.o nvram.o prom.o reset.o \ - setup.o timer.o dev-dsp.o dev-enet.o dev-flash.o \ - dev-pcmcia.o dev-rng.o dev-spi.o dev-hsspi.o dev-uart.o \ - dev-wdt.o dev-usb-usbd.o + setup.o timer.o dev-enet.o dev-flash.o dev-pcmcia.o \ + dev-rng.o dev-spi.o dev-hsspi.o dev-uart.o dev-wdt.o \ + dev-usb-usbd.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-y += boards/ diff -Nru linux-4.19.98/arch/mips/bcm63xx/boards/board_bcm963xx.c linux-4.19.118/arch/mips/bcm63xx/boards/board_bcm963xx.c --- linux-4.19.98/arch/mips/bcm63xx/boards/board_bcm963xx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/bcm63xx/boards/board_bcm963xx.c 2020-04-23 08:30:24.000000000 +0000 @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -289,14 +288,6 @@ .has_pccard = 1, .has_ehci0 = 1, - .has_dsp = 1, - .dsp = { - .gpio_rst = 6, - .gpio_int = 34, - .cs = 2, - .ext_irq = 2, - }, - .leds = { { .name = "adsl-fail", @@ -401,14 +392,6 @@ .has_ohci0 = 1, - .has_dsp = 1, - .dsp = { - .gpio_rst = 6, - .gpio_int = 34, - .ext_irq = 2, - .cs = 2, - }, - .leds = { { .name = "adsl-fail", @@ -898,9 +881,6 @@ if (board.has_usbd) bcm63xx_usbd_register(&board.usbd); - if (board.has_dsp) - bcm63xx_dsp_register(&board.dsp); - /* Generate MAC address for WLAN and register our SPROM, * do this after registering enet devices */ diff -Nru linux-4.19.98/arch/mips/bcm63xx/dev-dsp.c linux-4.19.118/arch/mips/bcm63xx/dev-dsp.c --- linux-4.19.98/arch/mips/bcm63xx/dev-dsp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/bcm63xx/dev-dsp.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -/* - * Broadcom BCM63xx VoIP DSP registration - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 2009 Florian Fainelli - */ - -#include -#include -#include - -#include -#include -#include -#include - -static struct resource voip_dsp_resources[] = { - { - .start = -1, /* filled at runtime */ - .end = -1, /* filled at runtime */ - .flags = IORESOURCE_MEM, - }, - { - .start = -1, /* filled at runtime */ - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device bcm63xx_voip_dsp_device = { - .name = "bcm63xx-voip-dsp", - .id = -1, - .num_resources = ARRAY_SIZE(voip_dsp_resources), - .resource = voip_dsp_resources, -}; - -int __init bcm63xx_dsp_register(const struct bcm63xx_dsp_platform_data *pd) -{ - struct bcm63xx_dsp_platform_data *dpd; - u32 val; - - /* Get the memory window */ - val = bcm_mpi_readl(MPI_CSBASE_REG(pd->cs - 1)); - val &= MPI_CSBASE_BASE_MASK; - voip_dsp_resources[0].start = val; - voip_dsp_resources[0].end = val + 0xFFFFFFF; - voip_dsp_resources[1].start = pd->ext_irq; - - /* copy given platform data */ - dpd = bcm63xx_voip_dsp_device.dev.platform_data; - memcpy(dpd, pd, sizeof (*pd)); - - return platform_device_register(&bcm63xx_voip_dsp_device); -} diff -Nru linux-4.19.98/arch/mips/boot/Makefile linux-4.19.118/arch/mips/boot/Makefile --- linux-4.19.98/arch/mips/boot/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/boot/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -123,7 +123,7 @@ targets += vmlinux.its targets += vmlinux.gz.its targets += vmlinux.bz2.its -targets += vmlinux.lzmo.its +targets += vmlinux.lzma.its targets += vmlinux.lzo.its quiet_cmd_cpp_its_S = ITS $@ diff -Nru linux-4.19.98/arch/mips/cavium-octeon/octeon-irq.c linux-4.19.118/arch/mips/cavium-octeon/octeon-irq.c --- linux-4.19.98/arch/mips/cavium-octeon/octeon-irq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/cavium-octeon/octeon-irq.c 2020-04-23 08:30:24.000000000 +0000 @@ -2199,6 +2199,9 @@ } cd = kzalloc(sizeof(*cd), GFP_KERNEL); + if (!cd) + return -ENOMEM; + cd->host_data = host_data; cd->bit = hw; diff -Nru linux-4.19.98/arch/mips/include/asm/io.h linux-4.19.118/arch/mips/include/asm/io.h --- linux-4.19.98/arch/mips/include/asm/io.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/include/asm/io.h 2020-04-23 08:30:24.000000000 +0000 @@ -62,21 +62,11 @@ * instruction, so the lower 16 bits must be zero. Should be true on * on any sane architecture; generic code does not use this assumption. */ -extern const unsigned long mips_io_port_base; +extern unsigned long mips_io_port_base; -/* - * Gcc will generate code to load the value of mips_io_port_base after each - * function call which may be fairly wasteful in some cases. So we don't - * play quite by the book. We tell gcc mips_io_port_base is a long variable - * which solves the code generation issue. Now we need to violate the - * aliasing rules a little to make initialization possible and finally we - * will need the barrier() to fight side effects of the aliasing chat. - * This trickery will eventually collapse under gcc's optimizer. Oh well. - */ static inline void set_io_port_base(unsigned long base) { - * (unsigned long *) &mips_io_port_base = base; - barrier(); + mips_io_port_base = base; } /* diff -Nru linux-4.19.98/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h linux-4.19.118/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h --- linux-4.19.98/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_dsp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __BCM63XX_DSP_H -#define __BCM63XX_DSP_H - -struct bcm63xx_dsp_platform_data { - unsigned gpio_rst; - unsigned gpio_int; - unsigned cs; - unsigned ext_irq; -}; - -int __init bcm63xx_dsp_register(const struct bcm63xx_dsp_platform_data *pd); - -#endif /* __BCM63XX_DSP_H */ diff -Nru linux-4.19.98/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h linux-4.19.118/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h --- linux-4.19.98/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h 2020-04-23 08:30:24.000000000 +0000 @@ -7,7 +7,6 @@ #include #include #include -#include /* * flash mapping @@ -31,7 +30,6 @@ unsigned int has_ohci0:1; unsigned int has_ehci0:1; unsigned int has_usbd:1; - unsigned int has_dsp:1; unsigned int has_uart0:1; unsigned int has_uart1:1; @@ -43,9 +41,6 @@ /* USB config */ struct bcm63xx_usbd_platform_data usbd; - /* DSP config */ - struct bcm63xx_dsp_platform_data dsp; - /* GPIO LEDs */ struct gpio_led leds[5]; diff -Nru linux-4.19.98/arch/mips/kernel/setup.c linux-4.19.118/arch/mips/kernel/setup.c --- linux-4.19.98/arch/mips/kernel/setup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/kernel/setup.c 2020-04-23 08:30:24.000000000 +0000 @@ -76,7 +76,7 @@ * mips_io_port_base is the begin of the address space to which x86 style * I/O ports are mapped. */ -const unsigned long mips_io_port_base = -1; +unsigned long mips_io_port_base = -1; EXPORT_SYMBOL(mips_io_port_base); static struct resource code_resource = { .name = "Kernel code", }; diff -Nru linux-4.19.98/arch/mips/kernel/vpe.c linux-4.19.118/arch/mips/kernel/vpe.c --- linux-4.19.98/arch/mips/kernel/vpe.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/kernel/vpe.c 2020-04-23 08:30:24.000000000 +0000 @@ -134,7 +134,7 @@ { list_del(&v->list); if (v->load_addr) - release_progmem(v); + release_progmem(v->load_addr); kfree(v); } diff -Nru linux-4.19.98/arch/mips/loongson64/loongson-3/platform.c linux-4.19.118/arch/mips/loongson64/loongson-3/platform.c --- linux-4.19.98/arch/mips/loongson64/loongson-3/platform.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/loongson64/loongson-3/platform.c 2020-04-23 08:30:24.000000000 +0000 @@ -31,6 +31,9 @@ continue; pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL); + if (!pdev) + return -ENOMEM; + pdev->name = loongson_sysconf.sensors[i].name; pdev->id = loongson_sysconf.sensors[i].id; pdev->dev.platform_data = &loongson_sysconf.sensors[i]; diff -Nru linux-4.19.98/arch/mips/mm/tlbex.c linux-4.19.118/arch/mips/mm/tlbex.c --- linux-4.19.98/arch/mips/mm/tlbex.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/mips/mm/tlbex.c 2020-04-23 08:30:24.000000000 +0000 @@ -1479,6 +1479,7 @@ static void setup_pw(void) { + unsigned int pwctl; unsigned long pgd_i, pgd_w; #ifndef __PAGETABLE_PMD_FOLDED unsigned long pmd_i, pmd_w; @@ -1505,6 +1506,7 @@ pte_i = ilog2(_PAGE_GLOBAL); pte_w = 0; + pwctl = 1 << 30; /* Set PWDirExt */ #ifndef __PAGETABLE_PMD_FOLDED write_c0_pwfield(pgd_i << 24 | pmd_i << 12 | pt_i << 6 | pte_i); @@ -1515,8 +1517,9 @@ #endif #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT - write_c0_pwctl(1 << 6 | psn); + pwctl |= (1 << 6 | psn); #endif + write_c0_pwctl(pwctl); write_c0_kpgd((long)swapper_pg_dir); kscratch_used_mask |= (1 << 7); /* KScratch6 is used for KPGD */ } diff -Nru linux-4.19.98/arch/nios2/kernel/nios2_ksyms.c linux-4.19.118/arch/nios2/kernel/nios2_ksyms.c --- linux-4.19.98/arch/nios2/kernel/nios2_ksyms.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/nios2/kernel/nios2_ksyms.c 2020-04-23 08:30:24.000000000 +0000 @@ -9,12 +9,20 @@ #include #include +#include +#include + /* string functions */ EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memset); EXPORT_SYMBOL(memmove); +/* memory management */ + +EXPORT_SYMBOL(empty_zero_page); +EXPORT_SYMBOL(flush_icache_range); + /* * libgcc functions - functions that are used internally by the * compiler... (prototypes are not correct though, but that @@ -31,3 +39,7 @@ DECLARE_EXPORT(__umoddi3); DECLARE_EXPORT(__umodsi3); DECLARE_EXPORT(__muldi3); +DECLARE_EXPORT(__ucmpdi2); +DECLARE_EXPORT(__lshrdi3); +DECLARE_EXPORT(__ashldi3); +DECLARE_EXPORT(__ashrdi3); diff -Nru linux-4.19.98/arch/parisc/kernel/drivers.c linux-4.19.118/arch/parisc/kernel/drivers.c --- linux-4.19.98/arch/parisc/kernel/drivers.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/parisc/kernel/drivers.c 2020-04-23 08:30:24.000000000 +0000 @@ -868,8 +868,8 @@ static int count; print_pa_hwpath(dev, hw_path); - pr_info("%d. %s at 0x%px [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", - ++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type, + pr_info("%d. %s at %pap [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", + ++count, dev->name, &(dev->hpa.start), hw_path, dev->id.hw_type, dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); if (dev->num_addrs) { diff -Nru linux-4.19.98/arch/powerpc/Kconfig linux-4.19.118/arch/powerpc/Kconfig --- linux-4.19.98/arch/powerpc/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -230,6 +230,7 @@ select NEED_SG_DMA_LENGTH select NO_BOOTMEM select OF + select OF_DMA_DEFAULT_COHERENT if !NOT_COHERENT_CACHE select OF_EARLY_FLATTREE select OF_RESERVED_MEM select OLD_SIGACTION if PPC32 diff -Nru linux-4.19.98/arch/powerpc/Makefile linux-4.19.118/arch/powerpc/Makefile --- linux-4.19.98/arch/powerpc/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -412,7 +412,9 @@ ifdef CONFIG_PPC64 $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@ endif +ifdef CONFIG_VDSO32 $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@ +endif archclean: $(Q)$(MAKE) $(clean)=$(boot) diff -Nru linux-4.19.98/arch/powerpc/boot/4xx.c linux-4.19.118/arch/powerpc/boot/4xx.c --- linux-4.19.98/arch/powerpc/boot/4xx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/4xx.c 2020-04-23 08:30:24.000000000 +0000 @@ -232,7 +232,7 @@ dpath = 8; /* 64 bits */ /* get address pins (rows) */ - val = SDRAM0_READ(DDR0_42); + val = SDRAM0_READ(DDR0_42); row = DDR_GET_VAL(val, DDR_APIN, DDR_APIN_SHIFT); if (row > max_row) diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -63,6 +63,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy0: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy6: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -63,6 +63,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy1: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy7: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy0: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy1: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe5000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy2: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe7000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy3: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe9000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy4: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xeb000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy5: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy14: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy15: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy8: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy9: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe5000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy10: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe7000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy11: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe9000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy12: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi --- linux-4.19.98/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xeb000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy13: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/arch/powerpc/include/asm/archrandom.h linux-4.19.118/arch/powerpc/include/asm/archrandom.h --- linux-4.19.98/arch/powerpc/include/asm/archrandom.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/archrandom.h 2020-04-23 08:30:24.000000000 +0000 @@ -28,7 +28,7 @@ unsigned long val; int rc; - rc = arch_get_random_long(&val); + rc = arch_get_random_seed_long(&val); if (rc) *v = val; diff -Nru linux-4.19.98/arch/powerpc/include/asm/book3s/64/hash-4k.h linux-4.19.118/arch/powerpc/include/asm/book3s/64/hash-4k.h --- linux-4.19.98/arch/powerpc/include/asm/book3s/64/hash-4k.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/book3s/64/hash-4k.h 2020-04-23 08:30:24.000000000 +0000 @@ -145,6 +145,12 @@ extern int hash__has_transparent_hugepage(void); #endif +static inline pmd_t hash__pmd_mkdevmap(pmd_t pmd) +{ + BUG(); + return pmd; +} + #endif /* !__ASSEMBLY__ */ #endif /* _ASM_POWERPC_BOOK3S_64_HASH_4K_H */ diff -Nru linux-4.19.98/arch/powerpc/include/asm/book3s/64/hash-64k.h linux-4.19.118/arch/powerpc/include/asm/book3s/64/hash-64k.h --- linux-4.19.98/arch/powerpc/include/asm/book3s/64/hash-64k.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/book3s/64/hash-64k.h 2020-04-23 08:30:24.000000000 +0000 @@ -233,7 +233,7 @@ */ static inline int hash__pmd_trans_huge(pmd_t pmd) { - return !!((pmd_val(pmd) & (_PAGE_PTE | H_PAGE_THP_HUGE)) == + return !!((pmd_val(pmd) & (_PAGE_PTE | H_PAGE_THP_HUGE | _PAGE_DEVMAP)) == (_PAGE_PTE | H_PAGE_THP_HUGE)); } @@ -259,6 +259,12 @@ unsigned long addr, pmd_t *pmdp); extern int hash__has_transparent_hugepage(void); #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ + +static inline pmd_t hash__pmd_mkdevmap(pmd_t pmd) +{ + return __pmd(pmd_val(pmd) | (_PAGE_PTE | H_PAGE_THP_HUGE | _PAGE_DEVMAP)); +} + #endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_BOOK3S_64_HASH_64K_H */ diff -Nru linux-4.19.98/arch/powerpc/include/asm/book3s/64/pgtable.h linux-4.19.118/arch/powerpc/include/asm/book3s/64/pgtable.h --- linux-4.19.98/arch/powerpc/include/asm/book3s/64/pgtable.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/book3s/64/pgtable.h 2020-04-23 08:30:24.000000000 +0000 @@ -1253,7 +1253,9 @@ static inline pmd_t pmd_mkdevmap(pmd_t pmd) { - return __pmd(pmd_val(pmd) | (_PAGE_PTE | _PAGE_DEVMAP)); + if (radix_enabled()) + return radix__pmd_mkdevmap(pmd); + return hash__pmd_mkdevmap(pmd); } static inline int pmd_devmap(pmd_t pmd) diff -Nru linux-4.19.98/arch/powerpc/include/asm/book3s/64/radix.h linux-4.19.118/arch/powerpc/include/asm/book3s/64/radix.h --- linux-4.19.98/arch/powerpc/include/asm/book3s/64/radix.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/book3s/64/radix.h 2020-04-23 08:30:24.000000000 +0000 @@ -255,6 +255,11 @@ extern int radix__has_transparent_hugepage(void); #endif +static inline pmd_t radix__pmd_mkdevmap(pmd_t pmd) +{ + return __pmd(pmd_val(pmd) | (_PAGE_PTE | _PAGE_DEVMAP)); +} + extern int __meminit radix__vmemmap_create_mapping(unsigned long start, unsigned long page_size, unsigned long phys); diff -Nru linux-4.19.98/arch/powerpc/include/asm/drmem.h linux-4.19.118/arch/powerpc/include/asm/drmem.h --- linux-4.19.98/arch/powerpc/include/asm/drmem.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/drmem.h 2020-04-23 08:30:24.000000000 +0000 @@ -28,12 +28,12 @@ extern struct drmem_lmb_info *drmem_info; #define for_each_drmem_lmb_in_range(lmb, start, end) \ - for ((lmb) = (start); (lmb) <= (end); (lmb)++) + for ((lmb) = (start); (lmb) < (end); (lmb)++) #define for_each_drmem_lmb(lmb) \ for_each_drmem_lmb_in_range((lmb), \ &drmem_info->lmbs[0], \ - &drmem_info->lmbs[drmem_info->n_lmbs - 1]) + &drmem_info->lmbs[drmem_info->n_lmbs]) /* * The of_drconf_cell_v1 struct defines the layout of the LMB data diff -Nru linux-4.19.98/arch/powerpc/include/asm/kgdb.h linux-4.19.118/arch/powerpc/include/asm/kgdb.h --- linux-4.19.98/arch/powerpc/include/asm/kgdb.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/kgdb.h 2020-04-23 08:30:24.000000000 +0000 @@ -26,9 +26,12 @@ #define BREAK_INSTR_SIZE 4 #define BUFMAX ((NUMREGBYTES * 2) + 512) #define OUTBUFMAX ((NUMREGBYTES * 2) + 512) + +#define BREAK_INSTR 0x7d821008 /* twge r2, r2 */ + static inline void arch_kgdb_breakpoint(void) { - asm(".long 0x7d821008"); /* twge r2, r2 */ + asm(stringify_in_c(.long BREAK_INSTR)); } #define CACHE_FLUSH_IS_SAFE 1 #define DBG_MAX_REG_NUM 70 diff -Nru linux-4.19.98/arch/powerpc/include/asm/setjmp.h linux-4.19.118/arch/powerpc/include/asm/setjmp.h --- linux-4.19.98/arch/powerpc/include/asm/setjmp.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/include/asm/setjmp.h 2020-04-23 08:30:24.000000000 +0000 @@ -12,7 +12,9 @@ #define JMP_BUF_LEN 23 -extern long setjmp(long *); -extern void longjmp(long *, long); +typedef long jmp_buf[JMP_BUF_LEN]; + +extern int setjmp(jmp_buf env) __attribute__((returns_twice)); +extern void longjmp(jmp_buf env, int val) __attribute__((noreturn)); #endif /* _ASM_POWERPC_SETJMP_H */ diff -Nru linux-4.19.98/arch/powerpc/kernel/Makefile linux-4.19.118/arch/powerpc/kernel/Makefile --- linux-4.19.98/arch/powerpc/kernel/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -5,9 +5,6 @@ CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' -# Avoid clang warnings around longjmp/setjmp declarations -CFLAGS_crash.o += -ffreestanding - subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror ifdef CONFIG_PPC64 diff -Nru linux-4.19.98/arch/powerpc/kernel/cacheinfo.c linux-4.19.118/arch/powerpc/kernel/cacheinfo.c --- linux-4.19.98/arch/powerpc/kernel/cacheinfo.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/cacheinfo.c 2020-04-23 08:30:24.000000000 +0000 @@ -865,4 +865,25 @@ if (cache) cache_cpu_clear(cache, cpu_id); } + +void cacheinfo_teardown(void) +{ + unsigned int cpu; + + lockdep_assert_cpus_held(); + + for_each_online_cpu(cpu) + cacheinfo_cpu_offline(cpu); +} + +void cacheinfo_rebuild(void) +{ + unsigned int cpu; + + lockdep_assert_cpus_held(); + + for_each_online_cpu(cpu) + cacheinfo_cpu_online(cpu); +} + #endif /* (CONFIG_PPC_PSERIES && CONFIG_SUSPEND) || CONFIG_HOTPLUG_CPU */ diff -Nru linux-4.19.98/arch/powerpc/kernel/cacheinfo.h linux-4.19.118/arch/powerpc/kernel/cacheinfo.h --- linux-4.19.98/arch/powerpc/kernel/cacheinfo.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/cacheinfo.h 2020-04-23 08:30:24.000000000 +0000 @@ -6,4 +6,8 @@ extern void cacheinfo_cpu_online(unsigned int cpu_id); extern void cacheinfo_cpu_offline(unsigned int cpu_id); +/* Allow migration/suspend to tear down and rebuild the hierarchy. */ +extern void cacheinfo_teardown(void); +extern void cacheinfo_rebuild(void); + #endif /* _PPC_CACHEINFO_H */ diff -Nru linux-4.19.98/arch/powerpc/kernel/cputable.c linux-4.19.118/arch/powerpc/kernel/cputable.c --- linux-4.19.98/arch/powerpc/kernel/cputable.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/cputable.c 2020-04-23 08:30:24.000000000 +0000 @@ -2188,11 +2188,13 @@ * oprofile_cpu_type already has a value, then we are * possibly overriding a real PVR with a logical one, * and, in that case, keep the current value for - * oprofile_cpu_type. + * oprofile_cpu_type. Futhermore, let's ensure that the + * fix for the PMAO bug is enabled on compatibility mode. */ if (old.oprofile_cpu_type != NULL) { t->oprofile_cpu_type = old.oprofile_cpu_type; t->oprofile_type = old.oprofile_type; + t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG; } } diff -Nru linux-4.19.98/arch/powerpc/kernel/dt_cpu_ftrs.c linux-4.19.118/arch/powerpc/kernel/dt_cpu_ftrs.c --- linux-4.19.98/arch/powerpc/kernel/dt_cpu_ftrs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/dt_cpu_ftrs.c 2020-04-23 08:30:24.000000000 +0000 @@ -666,8 +666,10 @@ m = &dt_cpu_feature_match_table[i]; if (!strcmp(f->name, m->name)) { known = true; - if (m->enable(f)) + if (m->enable(f)) { + cur_cpu_spec->cpu_features |= m->cpu_ftr_bit_mask; break; + } pr_info("not enabling: %s (disabled or unsupported by kernel)\n", f->name); @@ -675,17 +677,12 @@ } } - if (!known && enable_unknown) { - if (!feat_try_enable_unknown(f)) { - pr_info("not enabling: %s (unknown and unsupported by kernel)\n", - f->name); - return false; - } + if (!known && (!enable_unknown || !feat_try_enable_unknown(f))) { + pr_info("not enabling: %s (unknown and unsupported by kernel)\n", + f->name); + return false; } - if (m->cpu_ftr_bit_mask) - cur_cpu_spec->cpu_features |= m->cpu_ftr_bit_mask; - if (known) pr_debug("enabling: %s\n", f->name); else diff -Nru linux-4.19.98/arch/powerpc/kernel/eeh_driver.c linux-4.19.118/arch/powerpc/kernel/eeh_driver.c --- linux-4.19.98/arch/powerpc/kernel/eeh_driver.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/eeh_driver.c 2020-04-23 08:30:24.000000000 +0000 @@ -554,12 +554,6 @@ pci_iov_remove_virtfn(edev->physfn, pdn->vf_index); edev->pdev = NULL; - - /* - * We have to set the VF PE number to invalid one, which is - * required to plug the VF successfully. - */ - pdn->pe_number = IODA_INVALID_PE; #endif if (rmv_data) list_add(&edev->rmv_list, &rmv_data->edev_list); diff -Nru linux-4.19.98/arch/powerpc/kernel/idle_book3s.S linux-4.19.118/arch/powerpc/kernel/idle_book3s.S --- linux-4.19.98/arch/powerpc/kernel/idle_book3s.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/idle_book3s.S 2020-04-23 08:30:24.000000000 +0000 @@ -170,8 +170,11 @@ bne- core_idle_lock_held blr -/* Reuse an unused pt_regs slot for IAMR */ +/* Reuse some unused pt_regs slots for AMR/IAMR/UAMOR/UAMOR */ +#define PNV_POWERSAVE_AMR _TRAP #define PNV_POWERSAVE_IAMR _DAR +#define PNV_POWERSAVE_UAMOR _DSISR +#define PNV_POWERSAVE_AMOR RESULT /* * Pass requested state in r3: @@ -205,8 +208,16 @@ SAVE_NVGPRS(r1) BEGIN_FTR_SECTION + mfspr r4, SPRN_AMR mfspr r5, SPRN_IAMR + mfspr r6, SPRN_UAMOR + std r4, PNV_POWERSAVE_AMR(r1) std r5, PNV_POWERSAVE_IAMR(r1) + std r6, PNV_POWERSAVE_UAMOR(r1) +BEGIN_FTR_SECTION_NESTED(42) + mfspr r7, SPRN_AMOR + std r7, PNV_POWERSAVE_AMOR(r1) +END_FTR_SECTION_NESTED_IFSET(CPU_FTR_HVMODE, 42) END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) mfcr r5 @@ -935,12 +946,20 @@ REST_GPR(2, r1) BEGIN_FTR_SECTION - /* IAMR was saved in pnv_powersave_common() */ + /* These regs were saved in pnv_powersave_common() */ + ld r4, PNV_POWERSAVE_AMR(r1) ld r5, PNV_POWERSAVE_IAMR(r1) + ld r6, PNV_POWERSAVE_UAMOR(r1) + mtspr SPRN_AMR, r4 mtspr SPRN_IAMR, r5 + mtspr SPRN_UAMOR, r6 +BEGIN_FTR_SECTION_NESTED(42) + ld r7, PNV_POWERSAVE_AMOR(r1) + mtspr SPRN_AMOR, r7 +END_FTR_SECTION_NESTED_IFSET(CPU_FTR_HVMODE, 42) /* - * We don't need an isync here because the upcoming mtmsrd is - * execution synchronizing. + * We don't need an isync here after restoring IAMR because the upcoming + * mtmsrd is execution synchronizing. */ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) diff -Nru linux-4.19.98/arch/powerpc/kernel/kgdb.c linux-4.19.118/arch/powerpc/kernel/kgdb.c --- linux-4.19.98/arch/powerpc/kernel/kgdb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/kgdb.c 2020-04-23 08:30:24.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include #include /* @@ -144,7 +145,7 @@ if (kgdb_handle_exception(1, SIGTRAP, 0, regs) != 0) return 0; - if (*(u32 *) (regs->nip) == *(u32 *) (&arch_kgdb_ops.gdb_bpt_instr)) + if (*(u32 *)regs->nip == BREAK_INSTR) regs->nip += BREAK_INSTR_SIZE; return 1; @@ -441,16 +442,42 @@ return -1; } +int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) +{ + int err; + unsigned int instr; + unsigned int *addr = (unsigned int *)bpt->bpt_addr; + + err = probe_kernel_address(addr, instr); + if (err) + return err; + + err = patch_instruction(addr, BREAK_INSTR); + if (err) + return -EFAULT; + + *(unsigned int *)bpt->saved_instr = instr; + + return 0; +} + +int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) +{ + int err; + unsigned int instr = *(unsigned int *)bpt->saved_instr; + unsigned int *addr = (unsigned int *)bpt->bpt_addr; + + err = patch_instruction(addr, instr); + if (err) + return -EFAULT; + + return 0; +} + /* * Global data */ -struct kgdb_arch arch_kgdb_ops = { -#ifdef __LITTLE_ENDIAN__ - .gdb_bpt_instr = {0x08, 0x10, 0x82, 0x7d}, -#else - .gdb_bpt_instr = {0x7d, 0x82, 0x10, 0x08}, -#endif -}; +struct kgdb_arch arch_kgdb_ops; static int kgdb_not_implemented(struct pt_regs *regs) { diff -Nru linux-4.19.98/arch/powerpc/kernel/kprobes.c linux-4.19.118/arch/powerpc/kernel/kprobes.c --- linux-4.19.98/arch/powerpc/kernel/kprobes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/kprobes.c 2020-04-23 08:30:24.000000000 +0000 @@ -277,6 +277,9 @@ if (user_mode(regs)) return 0; + if (!(regs->msr & MSR_IR) || !(regs->msr & MSR_DR)) + return 0; + /* * We don't want to be preempted for the entire * duration of kprobe processing diff -Nru linux-4.19.98/arch/powerpc/kernel/mce_power.c linux-4.19.118/arch/powerpc/kernel/mce_power.c --- linux-4.19.98/arch/powerpc/kernel/mce_power.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/mce_power.c 2020-04-23 08:30:24.000000000 +0000 @@ -40,7 +40,7 @@ { pte_t *ptep; unsigned int shift; - unsigned long flags; + unsigned long pfn, flags; struct mm_struct *mm; if (user_mode(regs)) @@ -50,18 +50,22 @@ local_irq_save(flags); ptep = __find_linux_pte(mm->pgd, addr, NULL, &shift); - local_irq_restore(flags); - if (!ptep || pte_special(*ptep)) - return ULONG_MAX; + if (!ptep || pte_special(*ptep)) { + pfn = ULONG_MAX; + goto out; + } - if (shift > PAGE_SHIFT) { + if (shift <= PAGE_SHIFT) + pfn = pte_pfn(*ptep); + else { unsigned long rpnmask = (1ul << shift) - PAGE_SIZE; - - return pte_pfn(__pte(pte_val(*ptep) | (addr & rpnmask))); + pfn = pte_pfn(__pte(pte_val(*ptep) | (addr & rpnmask))); } - return pte_pfn(*ptep); +out: + local_irq_restore(flags); + return pfn; } /* flush SLBs and reload */ diff -Nru linux-4.19.98/arch/powerpc/kernel/pci_dn.c linux-4.19.118/arch/powerpc/kernel/pci_dn.c --- linux-4.19.98/arch/powerpc/kernel/pci_dn.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/pci_dn.c 2020-04-23 08:30:24.000000000 +0000 @@ -257,9 +257,22 @@ continue; #ifdef CONFIG_EEH - /* Release EEH device for the VF */ + /* + * Release EEH state for this VF. The PCI core + * has already torn down the pci_dev for this VF, but + * we're responsible to removing the eeh_dev since it + * has the same lifetime as the pci_dn that spawned it. + */ edev = pdn_to_eeh_dev(pdn); if (edev) { + /* + * We allocate pci_dn's for the totalvfs count, + * but only only the vfs that were activated + * have a configured PE. + */ + if (edev->pe) + eeh_rmv_from_parent_pe(edev); + pdn->edev = NULL; kfree(edev); } diff -Nru linux-4.19.98/arch/powerpc/kernel/prom_init.c linux-4.19.118/arch/powerpc/kernel/prom_init.c --- linux-4.19.98/arch/powerpc/kernel/prom_init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/prom_init.c 2020-04-23 08:30:24.000000000 +0000 @@ -904,7 +904,7 @@ .reserved2 = 0, .reserved3 = 0, .subprocessors = 1, - .byte22 = OV5_FEAT(OV5_DRMEM_V2), + .byte22 = OV5_FEAT(OV5_DRMEM_V2) | OV5_FEAT(OV5_DRC_INFO), .intarch = 0, .mmu = 0, .hash_ext = 0, diff -Nru linux-4.19.98/arch/powerpc/kernel/signal.c linux-4.19.118/arch/powerpc/kernel/signal.c --- linux-4.19.98/arch/powerpc/kernel/signal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/signal.c 2020-04-23 08:30:24.000000000 +0000 @@ -200,14 +200,27 @@ * normal/non-checkpointed stack pointer. */ + unsigned long ret = tsk->thread.regs->gpr[1]; + #ifdef CONFIG_PPC_TRANSACTIONAL_MEM BUG_ON(tsk != current); if (MSR_TM_ACTIVE(tsk->thread.regs->msr)) { + preempt_disable(); tm_reclaim_current(TM_CAUSE_SIGNAL); if (MSR_TM_TRANSACTIONAL(tsk->thread.regs->msr)) - return tsk->thread.ckpt_regs.gpr[1]; + ret = tsk->thread.ckpt_regs.gpr[1]; + + /* + * If we treclaim, we must clear the current thread's TM bits + * before re-enabling preemption. Otherwise we might be + * preempted and have the live MSR[TS] changed behind our back + * (tm_recheckpoint_new_task() would recheckpoint). Besides, we + * enter the signal handler in non-transactional state. + */ + tsk->thread.regs->msr &= ~MSR_TS_MASK; + preempt_enable(); } #endif - return tsk->thread.regs->gpr[1]; + return ret; } diff -Nru linux-4.19.98/arch/powerpc/kernel/signal_32.c linux-4.19.118/arch/powerpc/kernel/signal_32.c --- linux-4.19.98/arch/powerpc/kernel/signal_32.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/signal_32.c 2020-04-23 08:30:24.000000000 +0000 @@ -493,19 +493,11 @@ */ static int save_tm_user_regs(struct pt_regs *regs, struct mcontext __user *frame, - struct mcontext __user *tm_frame, int sigret) + struct mcontext __user *tm_frame, int sigret, + unsigned long msr) { - unsigned long msr = regs->msr; - WARN_ON(tm_suspend_disabled); - /* Remove TM bits from thread's MSR. The MSR in the sigcontext - * just indicates to userland that we were doing a transaction, but we - * don't want to return in transactional state. This also ensures - * that flush_fp_to_thread won't set TIF_RESTORE_TM again. - */ - regs->msr &= ~MSR_TS_MASK; - /* Save both sets of general registers */ if (save_general_regs(¤t->thread.ckpt_regs, frame) || save_general_regs(regs, tm_frame)) @@ -916,6 +908,10 @@ int sigret; unsigned long tramp; struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM + /* Save the thread's msr before get_tm_stackpointer() changes it */ + unsigned long msr = regs->msr; +#endif BUG_ON(tsk != current); @@ -948,13 +944,13 @@ #ifdef CONFIG_PPC_TRANSACTIONAL_MEM tm_frame = &rt_sf->uc_transact.uc_mcontext; - if (MSR_TM_ACTIVE(regs->msr)) { + if (MSR_TM_ACTIVE(msr)) { if (__put_user((unsigned long)&rt_sf->uc_transact, &rt_sf->uc.uc_link) || __put_user((unsigned long)tm_frame, &rt_sf->uc_transact.uc_regs)) goto badframe; - if (save_tm_user_regs(regs, frame, tm_frame, sigret)) + if (save_tm_user_regs(regs, frame, tm_frame, sigret, msr)) goto badframe; } else @@ -1365,6 +1361,10 @@ int sigret; unsigned long tramp; struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM + /* Save the thread's msr before get_tm_stackpointer() changes it */ + unsigned long msr = regs->msr; +#endif BUG_ON(tsk != current); @@ -1398,9 +1398,9 @@ #ifdef CONFIG_PPC_TRANSACTIONAL_MEM tm_mctx = &frame->mctx_transact; - if (MSR_TM_ACTIVE(regs->msr)) { + if (MSR_TM_ACTIVE(msr)) { if (save_tm_user_regs(regs, &frame->mctx, &frame->mctx_transact, - sigret)) + sigret, msr)) goto badframe; } else diff -Nru linux-4.19.98/arch/powerpc/kernel/signal_64.c linux-4.19.118/arch/powerpc/kernel/signal_64.c --- linux-4.19.98/arch/powerpc/kernel/signal_64.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/signal_64.c 2020-04-23 08:30:24.000000000 +0000 @@ -196,7 +196,8 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc, struct sigcontext __user *tm_sc, struct task_struct *tsk, - int signr, sigset_t *set, unsigned long handler) + int signr, sigset_t *set, unsigned long handler, + unsigned long msr) { /* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the * process never used altivec yet (MSR_VEC is zero in pt_regs of @@ -211,12 +212,11 @@ elf_vrreg_t __user *tm_v_regs = sigcontext_vmx_regs(tm_sc); #endif struct pt_regs *regs = tsk->thread.regs; - unsigned long msr = tsk->thread.regs->msr; long err = 0; BUG_ON(tsk != current); - BUG_ON(!MSR_TM_ACTIVE(regs->msr)); + BUG_ON(!MSR_TM_ACTIVE(msr)); WARN_ON(tm_suspend_disabled); @@ -226,13 +226,6 @@ */ msr |= tsk->thread.ckpt_regs.msr & (MSR_FP | MSR_VEC | MSR_VSX); - /* Remove TM bits from thread's MSR. The MSR in the sigcontext - * just indicates to userland that we were doing a transaction, but we - * don't want to return in transactional state. This also ensures - * that flush_fp_to_thread won't set TIF_RESTORE_TM again. - */ - regs->msr &= ~MSR_TS_MASK; - #ifdef CONFIG_ALTIVEC err |= __put_user(v_regs, &sc->v_regs); err |= __put_user(tm_v_regs, &tm_sc->v_regs); @@ -484,8 +477,10 @@ err |= __get_user(tsk->thread.ckpt_regs.ccr, &sc->gp_regs[PT_CCR]); + /* Don't allow userspace to set the trap value */ + regs->trap = 0; + /* These regs are not checkpointed; they can go in 'regs'. */ - err |= __get_user(regs->trap, &sc->gp_regs[PT_TRAP]); err |= __get_user(regs->dar, &sc->gp_regs[PT_DAR]); err |= __get_user(regs->dsisr, &sc->gp_regs[PT_DSISR]); err |= __get_user(regs->result, &sc->gp_regs[PT_RESULT]); @@ -803,6 +798,10 @@ unsigned long newsp = 0; long err = 0; struct pt_regs *regs = tsk->thread.regs; +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM + /* Save the thread's msr before get_tm_stackpointer() changes it */ + unsigned long msr = regs->msr; +#endif BUG_ON(tsk != current); @@ -820,7 +819,7 @@ err |= __put_user(0, &frame->uc.uc_flags); err |= __save_altstack(&frame->uc.uc_stack, regs->gpr[1]); #ifdef CONFIG_PPC_TRANSACTIONAL_MEM - if (MSR_TM_ACTIVE(regs->msr)) { + if (MSR_TM_ACTIVE(msr)) { /* The ucontext_t passed to userland points to the second * ucontext_t (for transactional state) with its uc_link ptr. */ @@ -828,7 +827,8 @@ err |= setup_tm_sigcontexts(&frame->uc.uc_mcontext, &frame->uc_transact.uc_mcontext, tsk, ksig->sig, NULL, - (unsigned long)ksig->ka.sa.sa_handler); + (unsigned long)ksig->ka.sa.sa_handler, + msr); } else #endif { diff -Nru linux-4.19.98/arch/powerpc/kernel/vmlinux.lds.S linux-4.19.118/arch/powerpc/kernel/vmlinux.lds.S --- linux-4.19.98/arch/powerpc/kernel/vmlinux.lds.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kernel/vmlinux.lds.S 2020-04-23 08:30:24.000000000 +0000 @@ -322,6 +322,12 @@ *(.branch_lt) } +#ifdef CONFIG_DEBUG_INFO_BTF + .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) { + *(.BTF) + } +#endif + .opd : AT(ADDR(.opd) - LOAD_OFFSET) { __start_opd = .; KEEP(*(.opd)) diff -Nru linux-4.19.98/arch/powerpc/kvm/book3s_64_vio.c linux-4.19.118/arch/powerpc/kvm/book3s_64_vio.c --- linux-4.19.98/arch/powerpc/kvm/book3s_64_vio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kvm/book3s_64_vio.c 2020-04-23 08:30:24.000000000 +0000 @@ -133,7 +133,6 @@ continue; kref_put(&stit->kref, kvm_spapr_tce_liobn_put); - return; } } } diff -Nru linux-4.19.98/arch/powerpc/kvm/book3s_hv.c linux-4.19.118/arch/powerpc/kvm/book3s_hv.c --- linux-4.19.98/arch/powerpc/kvm/book3s_hv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kvm/book3s_hv.c 2020-04-23 08:30:24.000000000 +0000 @@ -2065,7 +2065,7 @@ mutex_unlock(&kvm->lock); if (!vcore) - goto free_vcpu; + goto uninit_vcpu; spin_lock(&vcore->lock); ++vcore->num_threads; @@ -2082,6 +2082,8 @@ return vcpu; +uninit_vcpu: + kvm_vcpu_uninit(vcpu); free_vcpu: kmem_cache_free(kvm_vcpu_cache, vcpu); out: @@ -2993,25 +2995,26 @@ } } - /* - * Interrupts will be enabled once we get into the guest, - * so tell lockdep that we're about to enable interrupts. - */ - trace_hardirqs_on(); - guest_enter_irqoff(); srcu_idx = srcu_read_lock(&vc->kvm->srcu); this_cpu_disable_ftrace(); + /* + * Interrupts will be enabled once we get into the guest, + * so tell lockdep that we're about to enable interrupts. + */ + trace_hardirqs_on(); + trap = __kvmppc_vcore_entry(); + trace_hardirqs_off(); + this_cpu_enable_ftrace(); srcu_read_unlock(&vc->kvm->srcu, srcu_idx); - trace_hardirqs_off(); set_irq_happened(trap); spin_lock(&vc->lock); diff -Nru linux-4.19.98/arch/powerpc/kvm/book3s_pr.c linux-4.19.118/arch/powerpc/kvm/book3s_pr.c --- linux-4.19.98/arch/powerpc/kvm/book3s_pr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/kvm/book3s_pr.c 2020-04-23 08:30:24.000000000 +0000 @@ -1772,10 +1772,12 @@ err = kvmppc_mmu_init(vcpu); if (err < 0) - goto uninit_vcpu; + goto free_shared_page; return vcpu; +free_shared_page: + free_page((unsigned long)vcpu->arch.shared); uninit_vcpu: kvm_vcpu_uninit(vcpu); free_shadow_vcpu: diff -Nru linux-4.19.98/arch/powerpc/mm/dump_hashpagetable.c linux-4.19.118/arch/powerpc/mm/dump_hashpagetable.c --- linux-4.19.98/arch/powerpc/mm/dump_hashpagetable.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/mm/dump_hashpagetable.c 2020-04-23 08:30:24.000000000 +0000 @@ -342,7 +342,7 @@ /* Look in secondary table */ if (slot == -1) - slot = base_hpte_find(ea, psize, true, &v, &r); + slot = base_hpte_find(ea, psize, false, &v, &r); /* No entry found */ if (slot == -1) diff -Nru linux-4.19.98/arch/powerpc/mm/mem.c linux-4.19.118/arch/powerpc/mm/mem.c --- linux-4.19.98/arch/powerpc/mm/mem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/mm/mem.c 2020-04-23 08:30:24.000000000 +0000 @@ -118,8 +118,8 @@ return -ENODEV; } -int __meminit arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap, - bool want_memblock) +int __ref arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap, + bool want_memblock) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; @@ -139,30 +139,20 @@ return __add_pages(nid, start_pfn, nr_pages, altmap, want_memblock); } -#ifdef CONFIG_MEMORY_HOTREMOVE -int __meminit arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void __ref arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct page *page; int ret; - /* - * If we have an altmap then we need to skip over any reserved PFNs - * when querying the zone. - */ - page = pfn_to_page(start_pfn); - if (altmap) - page += vmem_altmap_offset(altmap); - - ret = __remove_pages(page_zone(page), start_pfn, nr_pages, altmap); - if (ret) - return ret; + __remove_pages(start_pfn, nr_pages, altmap); /* Remove htab bolted mappings for this section of memory */ start = (unsigned long)__va(start); flush_inval_dcache_range(start, start + size); ret = remove_section_mapping(start, start + size); + WARN_ON_ONCE(ret); /* Ensure all vmalloc mappings are flushed in case they also * hit that section of memory @@ -170,11 +160,8 @@ vm_unmap_aliases(); resize_hpt_for_hotplug(memblock_phys_mem_size()); - - return ret; } #endif -#endif /* CONFIG_MEMORY_HOTPLUG */ /* * walk_memory_resource() needs to make sure there is no holes in a given diff -Nru linux-4.19.98/arch/powerpc/mm/pgtable-radix.c linux-4.19.118/arch/powerpc/mm/pgtable-radix.c --- linux-4.19.98/arch/powerpc/mm/pgtable-radix.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/mm/pgtable-radix.c 2020-04-23 08:30:24.000000000 +0000 @@ -717,8 +717,8 @@ spin_unlock(&init_mm.page_table_lock); pte_clear(&init_mm, params->aligned_start, params->pte); - create_physical_mapping(params->aligned_start, params->start, -1); - create_physical_mapping(params->end, params->aligned_end, -1); + create_physical_mapping(__pa(params->aligned_start), __pa(params->start), -1); + create_physical_mapping(__pa(params->end), __pa(params->aligned_end), -1); spin_lock(&init_mm.page_table_lock); return 0; } diff -Nru linux-4.19.98/arch/powerpc/mm/tlb_nohash_low.S linux-4.19.118/arch/powerpc/mm/tlb_nohash_low.S --- linux-4.19.98/arch/powerpc/mm/tlb_nohash_low.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/mm/tlb_nohash_low.S 2020-04-23 08:30:24.000000000 +0000 @@ -402,7 +402,7 @@ * extern void loadcam_entry(unsigned int index) * * Load TLBCAM[index] entry in to the L2 CAM MMU - * Must preserve r7, r8, r9, and r10 + * Must preserve r7, r8, r9, r10 and r11 */ _GLOBAL(loadcam_entry) mflr r5 @@ -438,6 +438,10 @@ */ _GLOBAL(loadcam_multi) mflr r8 + /* Don't switch to AS=1 if already there */ + mfmsr r11 + andi. r11,r11,MSR_IS + bne 10f /* * Set up temporary TLB entry that is the same as what we're @@ -463,6 +467,7 @@ mtmsr r6 isync +10: mr r9,r3 add r10,r3,r4 2: bl loadcam_entry @@ -471,6 +476,10 @@ mr r3,r9 blt 2b + /* Don't return to AS=0 if we were in AS=1 at function start */ + andi. r11,r11,MSR_IS + bne 3f + /* Return to AS=0 and clear the temporary entry */ mfmsr r6 rlwinm. r6,r6,0,~(MSR_IS|MSR_DS) @@ -486,6 +495,7 @@ tlbwe isync +3: mtlr r8 blr #endif diff -Nru linux-4.19.98/arch/powerpc/platforms/maple/setup.c linux-4.19.118/arch/powerpc/platforms/maple/setup.c --- linux-4.19.98/arch/powerpc/platforms/maple/setup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/maple/setup.c 2020-04-23 08:30:24.000000000 +0000 @@ -299,23 +299,6 @@ return 1; } -define_machine(maple) { - .name = "Maple", - .probe = maple_probe, - .setup_arch = maple_setup_arch, - .init_IRQ = maple_init_IRQ, - .pci_irq_fixup = maple_pci_irq_fixup, - .pci_get_legacy_ide_irq = maple_pci_get_legacy_ide_irq, - .restart = maple_restart, - .halt = maple_halt, - .get_boot_time = maple_get_boot_time, - .set_rtc_time = maple_set_rtc_time, - .get_rtc_time = maple_get_rtc_time, - .calibrate_decr = generic_calibrate_decr, - .progress = maple_progress, - .power_save = power4_idle, -}; - #ifdef CONFIG_EDAC /* * Register a platform device for CPC925 memory controller on @@ -372,3 +355,20 @@ } machine_device_initcall(maple, maple_cpc925_edac_setup); #endif + +define_machine(maple) { + .name = "Maple", + .probe = maple_probe, + .setup_arch = maple_setup_arch, + .init_IRQ = maple_init_IRQ, + .pci_irq_fixup = maple_pci_irq_fixup, + .pci_get_legacy_ide_irq = maple_pci_get_legacy_ide_irq, + .restart = maple_restart, + .halt = maple_halt, + .get_boot_time = maple_get_boot_time, + .set_rtc_time = maple_set_rtc_time, + .get_rtc_time = maple_get_rtc_time, + .calibrate_decr = generic_calibrate_decr, + .progress = maple_progress, + .power_save = power4_idle, +}; diff -Nru linux-4.19.98/arch/powerpc/platforms/powernv/memtrace.c linux-4.19.118/arch/powerpc/platforms/powernv/memtrace.c --- linux-4.19.98/arch/powerpc/platforms/powernv/memtrace.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/powernv/memtrace.c 2020-04-23 08:30:24.000000000 +0000 @@ -122,7 +122,7 @@ */ end_pfn = base_pfn + nr_pages; for (pfn = base_pfn; pfn < end_pfn; pfn += bytes>> PAGE_SHIFT) { - remove_memory(nid, pfn << PAGE_SHIFT, bytes); + __remove_memory(nid, pfn << PAGE_SHIFT, bytes); } unlock_device_hotplug(); return base_pfn << PAGE_SHIFT; diff -Nru linux-4.19.98/arch/powerpc/platforms/powernv/pci-ioda.c linux-4.19.118/arch/powerpc/platforms/powernv/pci-ioda.c --- linux-4.19.98/arch/powerpc/platforms/powernv/pci-ioda.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/powernv/pci-ioda.c 2020-04-23 08:30:24.000000000 +0000 @@ -1552,6 +1552,10 @@ /* Reserve PE for each VF */ for (vf_index = 0; vf_index < num_vfs; vf_index++) { + int vf_devfn = pci_iov_virtfn_devfn(pdev, vf_index); + int vf_bus = pci_iov_virtfn_bus(pdev, vf_index); + struct pci_dn *vf_pdn; + if (pdn->m64_single_mode) pe_num = pdn->pe_num_map[vf_index]; else @@ -1564,13 +1568,11 @@ pe->pbus = NULL; pe->parent_dev = pdev; pe->mve_number = -1; - pe->rid = (pci_iov_virtfn_bus(pdev, vf_index) << 8) | - pci_iov_virtfn_devfn(pdev, vf_index); + pe->rid = (vf_bus << 8) | vf_devfn; pe_info(pe, "VF %04d:%02d:%02d.%d associated with PE#%x\n", hose->global_number, pdev->bus->number, - PCI_SLOT(pci_iov_virtfn_devfn(pdev, vf_index)), - PCI_FUNC(pci_iov_virtfn_devfn(pdev, vf_index)), pe_num); + PCI_SLOT(vf_devfn), PCI_FUNC(vf_devfn), pe_num); if (pnv_ioda_configure_pe(phb, pe)) { /* XXX What do we do here ? */ @@ -1584,6 +1586,15 @@ list_add_tail(&pe->list, &phb->ioda.pe_list); mutex_unlock(&phb->ioda.pe_list_mutex); + /* associate this pe to it's pdn */ + list_for_each_entry(vf_pdn, &pdn->parent->child_list, list) { + if (vf_pdn->busno == vf_bus && + vf_pdn->devfn == vf_devfn) { + vf_pdn->pe_number = pe_num; + break; + } + } + pnv_pci_ioda2_setup_dma_pe(phb, pe); } } @@ -3004,9 +3015,6 @@ struct pci_dn *pdn; int mul, total_vfs; - if (!pdev->is_physfn || pci_dev_is_added(pdev)) - return; - pdn = pci_get_pdn(pdev); pdn->vfs_expanded = 0; pdn->m64_single_mode = false; @@ -3081,6 +3089,30 @@ res->end = res->start - 1; } } + +static void pnv_pci_ioda_fixup_iov(struct pci_dev *pdev) +{ + if (WARN_ON(pci_dev_is_added(pdev))) + return; + + if (pdev->is_virtfn) { + struct pnv_ioda_pe *pe = pnv_ioda_get_pe(pdev); + + /* + * VF PEs are single-device PEs so their pdev pointer needs to + * be set. The pdev doesn't exist when the PE is allocated (in + * (pcibios_sriov_enable()) so we fix it up here. + */ + pe->pdev = pdev; + WARN_ON(!(pe->flags & PNV_IODA_PE_VF)); + } else if (pdev->is_physfn) { + /* + * For PFs adjust their allocated IOV resources to match what + * the PHB can support using it's M64 BAR table. + */ + pnv_pci_ioda_fixup_iov_resources(pdev); + } +} #endif /* CONFIG_PCI_IOV */ static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe, @@ -3974,7 +4006,7 @@ ppc_md.pcibios_default_alignment = pnv_pci_default_alignment; #ifdef CONFIG_PCI_IOV - ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov_resources; + ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov; ppc_md.pcibios_iov_resource_alignment = pnv_pci_iov_resource_alignment; ppc_md.pcibios_sriov_enable = pnv_pcibios_sriov_enable; ppc_md.pcibios_sriov_disable = pnv_pcibios_sriov_disable; diff -Nru linux-4.19.98/arch/powerpc/platforms/powernv/pci.c linux-4.19.118/arch/powerpc/platforms/powernv/pci.c --- linux-4.19.98/arch/powerpc/platforms/powernv/pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/powernv/pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -820,24 +820,6 @@ { struct pci_controller *hose = pci_bus_to_host(pdev->bus); struct pnv_phb *phb = hose->private_data; -#ifdef CONFIG_PCI_IOV - struct pnv_ioda_pe *pe; - struct pci_dn *pdn; - - /* Fix the VF pdn PE number */ - if (pdev->is_virtfn) { - pdn = pci_get_pdn(pdev); - WARN_ON(pdn->pe_number != IODA_INVALID_PE); - list_for_each_entry(pe, &phb->ioda.pe_list, list) { - if (pe->rid == ((pdev->bus->number << 8) | - (pdev->devfn & 0xff))) { - pdn->pe_number = pe->pe_number; - pe->pdev = pdev; - break; - } - } - } -#endif /* CONFIG_PCI_IOV */ if (phb && phb->dma_dev_setup) phb->dma_dev_setup(phb, pdev); diff -Nru linux-4.19.98/arch/powerpc/platforms/pseries/hotplug-memory.c linux-4.19.118/arch/powerpc/platforms/pseries/hotplug-memory.c --- linux-4.19.98/arch/powerpc/platforms/pseries/hotplug-memory.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/pseries/hotplug-memory.c 2020-04-23 08:30:24.000000000 +0000 @@ -101,11 +101,12 @@ return new_prop; } -static u32 find_aa_index(struct device_node *dr_node, - struct property *ala_prop, const u32 *lmb_assoc) +static bool find_aa_index(struct device_node *dr_node, + struct property *ala_prop, + const u32 *lmb_assoc, u32 *aa_index) { - u32 *assoc_arrays; - u32 aa_index; + u32 *assoc_arrays, new_prop_size; + struct property *new_prop; int aa_arrays, aa_array_entries, aa_array_sz; int i, index; @@ -121,46 +122,39 @@ aa_array_entries = be32_to_cpu(assoc_arrays[1]); aa_array_sz = aa_array_entries * sizeof(u32); - aa_index = -1; for (i = 0; i < aa_arrays; i++) { index = (i * aa_array_entries) + 2; if (memcmp(&assoc_arrays[index], &lmb_assoc[1], aa_array_sz)) continue; - aa_index = i; - break; + *aa_index = i; + return true; } - if (aa_index == -1) { - struct property *new_prop; - u32 new_prop_size; - - new_prop_size = ala_prop->length + aa_array_sz; - new_prop = dlpar_clone_property(ala_prop, new_prop_size); - if (!new_prop) - return -1; + new_prop_size = ala_prop->length + aa_array_sz; + new_prop = dlpar_clone_property(ala_prop, new_prop_size); + if (!new_prop) + return false; - assoc_arrays = new_prop->value; + assoc_arrays = new_prop->value; - /* increment the number of entries in the lookup array */ - assoc_arrays[0] = cpu_to_be32(aa_arrays + 1); + /* increment the number of entries in the lookup array */ + assoc_arrays[0] = cpu_to_be32(aa_arrays + 1); - /* copy the new associativity into the lookup array */ - index = aa_arrays * aa_array_entries + 2; - memcpy(&assoc_arrays[index], &lmb_assoc[1], aa_array_sz); + /* copy the new associativity into the lookup array */ + index = aa_arrays * aa_array_entries + 2; + memcpy(&assoc_arrays[index], &lmb_assoc[1], aa_array_sz); - of_update_property(dr_node, new_prop); + of_update_property(dr_node, new_prop); - /* - * The associativity lookup array index for this lmb is - * number of entries - 1 since we added its associativity - * to the end of the lookup array. - */ - aa_index = be32_to_cpu(assoc_arrays[0]) - 1; - } - - return aa_index; + /* + * The associativity lookup array index for this lmb is + * number of entries - 1 since we added its associativity + * to the end of the lookup array. + */ + *aa_index = be32_to_cpu(assoc_arrays[0]) - 1; + return true; } static int update_lmb_associativity_index(struct drmem_lmb *lmb) @@ -169,6 +163,7 @@ struct property *ala_prop; const u32 *lmb_assoc; u32 aa_index; + bool found; parent = of_find_node_by_path("/"); if (!parent) @@ -200,12 +195,12 @@ return -ENODEV; } - aa_index = find_aa_index(dr_node, ala_prop, lmb_assoc); + found = find_aa_index(dr_node, ala_prop, lmb_assoc, &aa_index); of_node_put(dr_node); dlpar_free_cc_nodes(lmb_node); - if (aa_index < 0) { + if (!found) { pr_err("Could not find LMB associativity\n"); return -1; } @@ -232,7 +227,7 @@ struct drmem_lmb **end_lmb) { struct drmem_lmb *lmb, *start, *end; - struct drmem_lmb *last_lmb; + struct drmem_lmb *limit; start = NULL; for_each_drmem_lmb(lmb) { @@ -245,10 +240,10 @@ if (!start) return -EINVAL; - end = &start[n_lmbs - 1]; + end = &start[n_lmbs]; - last_lmb = &drmem_info->lmbs[drmem_info->n_lmbs - 1]; - if (end > last_lmb) + limit = &drmem_info->lmbs[drmem_info->n_lmbs]; + if (end > limit) return -EINVAL; *start_lmb = start; @@ -306,7 +301,7 @@ nid = memory_add_physaddr_to_nid(base); for (i = 0; i < sections_per_block; i++) { - remove_memory(nid, base, MIN_MEMORY_BLOCK_SIZE); + __remove_memory(nid, base, MIN_MEMORY_BLOCK_SIZE); base += MIN_MEMORY_BLOCK_SIZE; } @@ -371,8 +366,10 @@ for (i = 0; i < scns_per_block; i++) { pfn = PFN_DOWN(phys_addr); - if (!pfn_present(pfn)) + if (!pfn_present(pfn)) { + phys_addr += MIN_MEMORY_BLOCK_SIZE; continue; + } rc &= is_mem_section_removable(pfn, PAGES_PER_SECTION); phys_addr += MIN_MEMORY_BLOCK_SIZE; @@ -398,7 +395,7 @@ block_sz = pseries_memory_block_size(); nid = memory_add_physaddr_to_nid(lmb->base_addr); - remove_memory(nid, lmb->base_addr, block_sz); + __remove_memory(nid, lmb->base_addr, block_sz); /* Update memory regions for memory remove */ memblock_remove(lmb->base_addr, block_sz); @@ -685,7 +682,7 @@ rc = dlpar_online_lmb(lmb); if (rc) { - remove_memory(nid, lmb->base_addr, block_sz); + __remove_memory(nid, lmb->base_addr, block_sz); invalidate_lmb_associativity_index(lmb); } else { lmb->flags |= DRCONF_MEM_ASSIGNED; diff -Nru linux-4.19.98/arch/powerpc/platforms/pseries/iommu.c linux-4.19.118/arch/powerpc/platforms/pseries/iommu.c --- linux-4.19.98/arch/powerpc/platforms/pseries/iommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/pseries/iommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -167,10 +167,10 @@ return be64_to_cpu(*tcep); } -static void tce_free_pSeriesLP(struct iommu_table*, long, long); +static void tce_free_pSeriesLP(unsigned long liobn, long, long); static void tce_freemulti_pSeriesLP(struct iommu_table*, long, long); -static int tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, +static int tce_build_pSeriesLP(unsigned long liobn, long tcenum, long tceshift, long npages, unsigned long uaddr, enum dma_data_direction direction, unsigned long attrs) @@ -181,25 +181,25 @@ int ret = 0; long tcenum_start = tcenum, npages_start = npages; - rpn = __pa(uaddr) >> TCE_SHIFT; + rpn = __pa(uaddr) >> tceshift; proto_tce = TCE_PCI_READ; if (direction != DMA_TO_DEVICE) proto_tce |= TCE_PCI_WRITE; while (npages--) { - tce = proto_tce | (rpn & TCE_RPN_MASK) << TCE_RPN_SHIFT; - rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, tce); + tce = proto_tce | (rpn & TCE_RPN_MASK) << tceshift; + rc = plpar_tce_put((u64)liobn, (u64)tcenum << tceshift, tce); if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) { ret = (int)rc; - tce_free_pSeriesLP(tbl, tcenum_start, + tce_free_pSeriesLP(liobn, tcenum_start, (npages_start - (npages + 1))); break; } if (rc && printk_ratelimit()) { printk("tce_build_pSeriesLP: plpar_tce_put failed. rc=%lld\n", rc); - printk("\tindex = 0x%llx\n", (u64)tbl->it_index); + printk("\tindex = 0x%llx\n", (u64)liobn); printk("\ttcenum = 0x%llx\n", (u64)tcenum); printk("\ttce val = 0x%llx\n", tce ); dump_stack(); @@ -228,7 +228,8 @@ unsigned long flags; if ((npages == 1) || !firmware_has_feature(FW_FEATURE_MULTITCE)) { - return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, + return tce_build_pSeriesLP(tbl->it_index, tcenum, + tbl->it_page_shift, npages, uaddr, direction, attrs); } @@ -244,8 +245,9 @@ /* If allocation fails, fall back to the loop implementation */ if (!tcep) { local_irq_restore(flags); - return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, - direction, attrs); + return tce_build_pSeriesLP(tbl->it_index, tcenum, + tbl->it_page_shift, + npages, uaddr, direction, attrs); } __this_cpu_write(tce_page, tcep); } @@ -296,16 +298,16 @@ return ret; } -static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages) +static void tce_free_pSeriesLP(unsigned long liobn, long tcenum, long npages) { u64 rc; while (npages--) { - rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, 0); + rc = plpar_tce_put((u64)liobn, (u64)tcenum << 12, 0); if (rc && printk_ratelimit()) { printk("tce_free_pSeriesLP: plpar_tce_put failed. rc=%lld\n", rc); - printk("\tindex = 0x%llx\n", (u64)tbl->it_index); + printk("\tindex = 0x%llx\n", (u64)liobn); printk("\ttcenum = 0x%llx\n", (u64)tcenum); dump_stack(); } @@ -320,7 +322,7 @@ u64 rc; if (!firmware_has_feature(FW_FEATURE_MULTITCE)) - return tce_free_pSeriesLP(tbl, tcenum, npages); + return tce_free_pSeriesLP(tbl->it_index, tcenum, npages); rc = plpar_tce_stuff((u64)tbl->it_index, (u64)tcenum << 12, 0, npages); @@ -435,6 +437,19 @@ u64 rc = 0; long l, limit; + if (!firmware_has_feature(FW_FEATURE_MULTITCE)) { + unsigned long tceshift = be32_to_cpu(maprange->tce_shift); + unsigned long dmastart = (start_pfn << PAGE_SHIFT) + + be64_to_cpu(maprange->dma_base); + unsigned long tcenum = dmastart >> tceshift; + unsigned long npages = num_pfn << PAGE_SHIFT >> tceshift; + void *uaddr = __va(start_pfn << PAGE_SHIFT); + + return tce_build_pSeriesLP(be32_to_cpu(maprange->liobn), + tcenum, tceshift, npages, (unsigned long) uaddr, + DMA_BIDIRECTIONAL, 0); + } + local_irq_disable(); /* to protect tcep and the page behind it */ tcep = __this_cpu_read(tce_page); diff -Nru linux-4.19.98/arch/powerpc/platforms/pseries/lpar.c linux-4.19.118/arch/powerpc/platforms/pseries/lpar.c --- linux-4.19.98/arch/powerpc/platforms/pseries/lpar.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/pseries/lpar.c 2020-04-23 08:30:24.000000000 +0000 @@ -1056,7 +1056,7 @@ { char name[16]; long i; - static struct dentry *vpa_dir; + struct dentry *vpa_dir; if (!firmware_has_feature(FW_FEATURE_SPLPAR)) return 0; diff -Nru linux-4.19.98/arch/powerpc/platforms/pseries/mobility.c linux-4.19.118/arch/powerpc/platforms/pseries/mobility.c --- linux-4.19.98/arch/powerpc/platforms/pseries/mobility.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/pseries/mobility.c 2020-04-23 08:30:24.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include "pseries.h" +#include "../../kernel/cacheinfo.h" static struct kobject *mobility_kobj; @@ -360,11 +361,20 @@ */ cpus_read_lock(); + /* + * It's common for the destination firmware to replace cache + * nodes. Release all of the cacheinfo hierarchy's references + * before updating the device tree. + */ + cacheinfo_teardown(); + rc = pseries_devicetree_update(MIGRATION_SCOPE); if (rc) printk(KERN_ERR "Post-mobility device tree update " "failed: %d\n", rc); + cacheinfo_rebuild(); + cpus_read_unlock(); /* Possibly switch to a new RFI flush type */ diff -Nru linux-4.19.98/arch/powerpc/platforms/pseries/vio.c linux-4.19.118/arch/powerpc/platforms/pseries/vio.c --- linux-4.19.98/arch/powerpc/platforms/pseries/vio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/platforms/pseries/vio.c 2020-04-23 08:30:24.000000000 +0000 @@ -1195,6 +1195,8 @@ if (tbl == NULL) return NULL; + kref_init(&tbl->it_kref); + of_parse_dma_window(dev->dev.of_node, dma_window, &tbl->it_index, &offset, &size); diff -Nru linux-4.19.98/arch/powerpc/sysdev/xive/common.c linux-4.19.118/arch/powerpc/sysdev/xive/common.c --- linux-4.19.98/arch/powerpc/sysdev/xive/common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/sysdev/xive/common.c 2020-04-23 08:30:24.000000000 +0000 @@ -72,13 +72,6 @@ /* Xive state for each CPU */ static DEFINE_PER_CPU(struct xive_cpu *, xive_cpu); -/* - * A "disabled" interrupt should never fire, to catch problems - * we set its logical number to this - */ -#define XIVE_BAD_IRQ 0x7fffffff -#define XIVE_MAX_IRQ (XIVE_BAD_IRQ - 1) - /* An invalid CPU target */ #define XIVE_INVALID_TARGET (-1) @@ -1074,7 +1067,7 @@ xc = per_cpu(xive_cpu, cpu); /* Check if we are already setup */ - if (xc->hw_ipi != 0) + if (xc->hw_ipi != XIVE_BAD_IRQ) return 0; /* Grab an IPI from the backend, this will populate xc->hw_ipi */ @@ -1111,7 +1104,7 @@ /* Disable the IPI and free the IRQ data */ /* Already cleaned up ? */ - if (xc->hw_ipi == 0) + if (xc->hw_ipi == XIVE_BAD_IRQ) return; /* Mask the IPI */ @@ -1267,6 +1260,7 @@ if (np) xc->chip_id = of_get_ibm_chip_id(np); of_node_put(np); + xc->hw_ipi = XIVE_BAD_IRQ; per_cpu(xive_cpu, cpu) = xc; } diff -Nru linux-4.19.98/arch/powerpc/sysdev/xive/native.c linux-4.19.118/arch/powerpc/sysdev/xive/native.c --- linux-4.19.98/arch/powerpc/sysdev/xive/native.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/sysdev/xive/native.c 2020-04-23 08:30:24.000000000 +0000 @@ -311,7 +311,7 @@ s64 rc; /* Free the IPI */ - if (!xc->hw_ipi) + if (xc->hw_ipi == XIVE_BAD_IRQ) return; for (;;) { rc = opal_xive_free_irq(xc->hw_ipi); @@ -319,7 +319,7 @@ msleep(OPAL_BUSY_DELAY_MS); continue; } - xc->hw_ipi = 0; + xc->hw_ipi = XIVE_BAD_IRQ; break; } } diff -Nru linux-4.19.98/arch/powerpc/sysdev/xive/spapr.c linux-4.19.118/arch/powerpc/sysdev/xive/spapr.c --- linux-4.19.98/arch/powerpc/sysdev/xive/spapr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/sysdev/xive/spapr.c 2020-04-23 08:30:24.000000000 +0000 @@ -509,11 +509,11 @@ static void xive_spapr_put_ipi(unsigned int cpu, struct xive_cpu *xc) { - if (!xc->hw_ipi) + if (xc->hw_ipi == XIVE_BAD_IRQ) return; xive_irq_bitmap_free(xc->hw_ipi); - xc->hw_ipi = 0; + xc->hw_ipi = XIVE_BAD_IRQ; } #endif /* CONFIG_SMP */ diff -Nru linux-4.19.98/arch/powerpc/sysdev/xive/xive-internal.h linux-4.19.118/arch/powerpc/sysdev/xive/xive-internal.h --- linux-4.19.98/arch/powerpc/sysdev/xive/xive-internal.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/sysdev/xive/xive-internal.h 2020-04-23 08:30:24.000000000 +0000 @@ -9,6 +9,13 @@ #ifndef __XIVE_INTERNAL_H #define __XIVE_INTERNAL_H +/* + * A "disabled" interrupt should never fire, to catch problems + * we set its logical number to this + */ +#define XIVE_BAD_IRQ 0x7fffffff +#define XIVE_MAX_IRQ (XIVE_BAD_IRQ - 1) + /* Each CPU carry one of these with various per-CPU state */ struct xive_cpu { #ifdef CONFIG_SMP diff -Nru linux-4.19.98/arch/powerpc/xmon/Makefile linux-4.19.118/arch/powerpc/xmon/Makefile --- linux-4.19.98/arch/powerpc/xmon/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/xmon/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -1,9 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 # Makefile for xmon -# Avoid clang warnings around longjmp/setjmp declarations -subdir-ccflags-y := -ffreestanding - subdir-ccflags-$(CONFIG_PPC_WERROR) += -Werror GCOV_PROFILE := n diff -Nru linux-4.19.98/arch/powerpc/xmon/xmon.c linux-4.19.118/arch/powerpc/xmon/xmon.c --- linux-4.19.98/arch/powerpc/xmon/xmon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/powerpc/xmon/xmon.c 2020-04-23 08:30:24.000000000 +0000 @@ -1878,15 +1878,14 @@ printf("pidr = %.16lx tidr = %.16lx\n", mfspr(SPRN_PID), mfspr(SPRN_TIDR)); - printf("asdr = %.16lx psscr = %.16lx\n", - mfspr(SPRN_ASDR), hv ? mfspr(SPRN_PSSCR) - : mfspr(SPRN_PSSCR_PR)); + printf("psscr = %.16lx\n", + hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR)); if (!hv) return; - printf("ptcr = %.16lx\n", - mfspr(SPRN_PTCR)); + printf("ptcr = %.16lx asdr = %.16lx\n", + mfspr(SPRN_PTCR), mfspr(SPRN_ASDR)); #endif } diff -Nru linux-4.19.98/arch/riscv/kernel/module.c linux-4.19.118/arch/riscv/kernel/module.c --- linux-4.19.98/arch/riscv/kernel/module.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/riscv/kernel/module.c 2020-04-23 08:30:24.000000000 +0000 @@ -16,6 +16,10 @@ #include #include #include +#include +#include +#include +#include static int apply_r_riscv_32_rela(struct module *me, u32 *location, Elf_Addr v) { @@ -394,3 +398,15 @@ return 0; } + +#if defined(CONFIG_MMU) && defined(CONFIG_64BIT) +#define VMALLOC_MODULE_START \ + max(PFN_ALIGN((unsigned long)&_end - SZ_2G), VMALLOC_START) +void *module_alloc(unsigned long size) +{ + return __vmalloc_node_range(size, 1, VMALLOC_MODULE_START, + VMALLOC_END, GFP_KERNEL, + PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE, + __builtin_return_address(0)); +} +#endif diff -Nru linux-4.19.98/arch/riscv/kernel/vdso/Makefile linux-4.19.118/arch/riscv/kernel/vdso/Makefile --- linux-4.19.98/arch/riscv/kernel/vdso/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/riscv/kernel/vdso/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -55,7 +55,8 @@ cmd_vdsold = $(CC) $(KBUILD_CFLAGS) $(call cc-option, -no-pie) -nostdlib -nostartfiles $(SYSCFLAGS_$(@F)) \ -Wl,-T,$(filter-out FORCE,$^) -o $@.tmp && \ $(CROSS_COMPILE)objcopy \ - $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ + $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ && \ + rm $@.tmp # install commands for the unstripped file quiet_cmd_vdso_install = INSTALL $@ diff -Nru linux-4.19.98/arch/s390/Makefile linux-4.19.118/arch/s390/Makefile --- linux-4.19.98/arch/s390/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -63,7 +63,7 @@ # cflags-$(CONFIG_FRAME_POINTER) += -fno-optimize-sibling-calls -ifeq ($(call cc-option-yn,-mpacked-stack),y) +ifeq ($(call cc-option-yn,-mpacked-stack -mbackchain -msoft-float),y) cflags-$(CONFIG_PACK_STACK) += -mpacked-stack -D__PACK_STACK aflags-$(CONFIG_PACK_STACK) += -D__PACK_STACK endif @@ -140,7 +140,7 @@ #KBUILD_IMAGE is necessary for packaging targets like rpm-pkg, deb-pkg... KBUILD_IMAGE := $(boot)/bzImage -install: vmlinux +install: $(Q)$(MAKE) $(build)=$(boot) $@ bzImage: vmlinux diff -Nru linux-4.19.98/arch/s390/boot/Makefile linux-4.19.118/arch/s390/boot/Makefile --- linux-4.19.98/arch/s390/boot/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/boot/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -46,7 +46,7 @@ $(obj)/startup.a: $(OBJECTS) FORCE $(call if_changed,ar) -install: $(CONFIGURE) $(obj)/bzImage +install: sh -x $(srctree)/$(obj)/install.sh $(KERNELRELEASE) $(obj)/bzImage \ System.map "$(INSTALL_PATH)" diff -Nru linux-4.19.98/arch/s390/include/asm/page.h linux-4.19.118/arch/s390/include/asm/page.h --- linux-4.19.98/arch/s390/include/asm/page.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/include/asm/page.h 2020-04-23 08:30:24.000000000 +0000 @@ -33,6 +33,8 @@ #define ARCH_HAS_PREPARE_HUGEPAGE #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH +#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA + #include #ifndef __ASSEMBLY__ @@ -40,7 +42,7 @@ static inline void storage_key_init_range(unsigned long start, unsigned long end) { - if (PAGE_DEFAULT_KEY) + if (PAGE_DEFAULT_KEY != 0) __storage_key_init_range(start, end); } diff -Nru linux-4.19.98/arch/s390/include/asm/qdio.h linux-4.19.118/arch/s390/include/asm/qdio.h --- linux-4.19.98/arch/s390/include/asm/qdio.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/include/asm/qdio.h 2020-04-23 08:30:24.000000000 +0000 @@ -228,7 +228,7 @@ * @sbal: absolute SBAL address */ struct sl_element { - unsigned long sbal; + u64 sbal; } __attribute__ ((packed)); /** diff -Nru linux-4.19.98/arch/s390/include/asm/timex.h linux-4.19.118/arch/s390/include/asm/timex.h --- linux-4.19.98/arch/s390/include/asm/timex.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/include/asm/timex.h 2020-04-23 08:30:24.000000000 +0000 @@ -155,7 +155,7 @@ static inline unsigned long long get_tod_clock(void) { - unsigned char clk[STORE_CLOCK_EXT_SIZE]; + char clk[STORE_CLOCK_EXT_SIZE]; get_tod_clock_ext(clk); return *((unsigned long long *)&clk[1]); diff -Nru linux-4.19.98/arch/s390/kernel/diag.c linux-4.19.118/arch/s390/kernel/diag.c --- linux-4.19.98/arch/s390/kernel/diag.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kernel/diag.c 2020-04-23 08:30:24.000000000 +0000 @@ -79,7 +79,7 @@ static void *show_diag_stat_start(struct seq_file *m, loff_t *pos) { - return *pos <= nr_cpu_ids ? (void *)((unsigned long) *pos + 1) : NULL; + return *pos <= NR_DIAG_STAT ? (void *)((unsigned long) *pos + 1) : NULL; } static void *show_diag_stat_next(struct seq_file *m, void *v, loff_t *pos) diff -Nru linux-4.19.98/arch/s390/kernel/kexec_elf.c linux-4.19.118/arch/s390/kernel/kexec_elf.c --- linux-4.19.98/arch/s390/kernel/kexec_elf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kernel/kexec_elf.c 2020-04-23 08:30:24.000000000 +0000 @@ -58,7 +58,7 @@ if (ret) return ret; - data->memsz += buf.memsz; + data->memsz = ALIGN(data->memsz, phdr->p_align) + buf.memsz; } return 0; diff -Nru linux-4.19.98/arch/s390/kernel/mcount.S linux-4.19.118/arch/s390/kernel/mcount.S --- linux-4.19.98/arch/s390/kernel/mcount.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kernel/mcount.S 2020-04-23 08:30:24.000000000 +0000 @@ -25,6 +25,12 @@ #define STACK_PTREGS (STACK_FRAME_OVERHEAD) #define STACK_PTREGS_GPRS (STACK_PTREGS + __PT_GPRS) #define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW) +#ifdef __PACK_STACK +/* allocate just enough for r14, r15 and backchain */ +#define TRACED_FUNC_FRAME_SIZE 24 +#else +#define TRACED_FUNC_FRAME_SIZE STACK_FRAME_OVERHEAD +#endif ENTRY(_mcount) BR_EX %r14 @@ -38,9 +44,16 @@ #if !(defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT)) aghi %r0,MCOUNT_RETURN_FIXUP #endif - aghi %r15,-STACK_FRAME_SIZE + # allocate stack frame for ftrace_caller to contain traced function + aghi %r15,-TRACED_FUNC_FRAME_SIZE stg %r1,__SF_BACKCHAIN(%r15) + stg %r0,(__SF_GPRS+8*8)(%r15) + stg %r15,(__SF_GPRS+9*8)(%r15) + # allocate pt_regs and stack frame for ftrace_trace_function + aghi %r15,-STACK_FRAME_SIZE stg %r1,(STACK_PTREGS_GPRS+15*8)(%r15) + aghi %r1,-TRACED_FUNC_FRAME_SIZE + stg %r1,__SF_BACKCHAIN(%r15) stg %r0,(STACK_PTREGS_PSW+8)(%r15) stmg %r2,%r14,(STACK_PTREGS_GPRS+2*8)(%r15) #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES diff -Nru linux-4.19.98/arch/s390/kernel/perf_cpum_sf.c linux-4.19.118/arch/s390/kernel/perf_cpum_sf.c --- linux-4.19.98/arch/s390/kernel/perf_cpum_sf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kernel/perf_cpum_sf.c 2020-04-23 08:30:24.000000000 +0000 @@ -1537,6 +1537,7 @@ perf_aux_output_end(handle, size); num_sdb = aux->sfb.num_sdb; + num_sdb = aux->sfb.num_sdb; while (!done) { /* Get an output handle */ aux = perf_aux_output_begin(handle, cpuhw->event); diff -Nru linux-4.19.98/arch/s390/kernel/processor.c linux-4.19.118/arch/s390/kernel/processor.c --- linux-4.19.98/arch/s390/kernel/processor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kernel/processor.c 2020-04-23 08:30:24.000000000 +0000 @@ -157,8 +157,9 @@ static int show_cpuinfo(struct seq_file *m, void *v) { unsigned long n = (unsigned long) v - 1; + unsigned long first = cpumask_first(cpu_online_mask); - if (!n) + if (n == first) show_cpu_summary(m, v); if (!machine_has_cpu_mhz) return 0; @@ -171,6 +172,8 @@ { if (*pos) *pos = cpumask_next(*pos - 1, cpu_online_mask); + else + *pos = cpumask_first(cpu_online_mask); return *pos < nr_cpu_ids ? (void *)*pos + 1 : NULL; } diff -Nru linux-4.19.98/arch/s390/kvm/interrupt.c linux-4.19.118/arch/s390/kvm/interrupt.c --- linux-4.19.98/arch/s390/kvm/interrupt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kvm/interrupt.c 2020-04-23 08:30:24.000000000 +0000 @@ -2109,7 +2109,7 @@ return -EINVAL; if (!test_kvm_facility(kvm, 72)) - return -ENOTSUPP; + return -EOPNOTSUPP; mutex_lock(&fi->ais_lock); ais.simm = fi->simm; @@ -2412,7 +2412,7 @@ int ret = 0; if (!test_kvm_facility(kvm, 72)) - return -ENOTSUPP; + return -EOPNOTSUPP; if (copy_from_user(&req, (void __user *)attr->addr, sizeof(req))) return -EFAULT; @@ -2492,7 +2492,7 @@ struct kvm_s390_ais_all ais; if (!test_kvm_facility(kvm, 72)) - return -ENOTSUPP; + return -EOPNOTSUPP; if (copy_from_user(&ais, (void __user *)attr->addr, sizeof(ais))) return -EFAULT; diff -Nru linux-4.19.98/arch/s390/kvm/kvm-s390.c linux-4.19.118/arch/s390/kvm/kvm-s390.c --- linux-4.19.98/arch/s390/kvm/kvm-s390.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kvm/kvm-s390.c 2020-04-23 08:30:24.000000000 +0000 @@ -2564,9 +2564,7 @@ vcpu->arch.sie_block->gcr[14] = CR14_UNUSED_32 | CR14_UNUSED_33 | CR14_EXTERNAL_DAMAGE_SUBMASK; - /* make sure the new fpc will be lazily loaded */ - save_fpu_regs(); - current->thread.fpu.fpc = 0; + vcpu->run->s.regs.fpc = 0; vcpu->arch.sie_block->gbea = 1; vcpu->arch.sie_block->pp = 0; vcpu->arch.sie_block->fpf &= ~FPF_BPBC; @@ -3994,7 +3992,7 @@ switch (ioctl) { case KVM_S390_STORE_STATUS: idx = srcu_read_lock(&vcpu->kvm->srcu); - r = kvm_s390_vcpu_store_status(vcpu, arg); + r = kvm_s390_store_status_unloaded(vcpu, arg); srcu_read_unlock(&vcpu->kvm->srcu, idx); break; case KVM_S390_SET_INITIAL_PSW: { diff -Nru linux-4.19.98/arch/s390/kvm/vsie.c linux-4.19.118/arch/s390/kvm/vsie.c --- linux-4.19.98/arch/s390/kvm/vsie.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/kvm/vsie.c 2020-04-23 08:30:24.000000000 +0000 @@ -1024,6 +1024,7 @@ scb_s->iprcc = PGM_ADDRESSING; scb_s->pgmilc = 4; scb_s->gpsw.addr = __rewind_psw(scb_s->gpsw, 4); + rc = 1; } return rc; } diff -Nru linux-4.19.98/arch/s390/mm/gmap.c linux-4.19.118/arch/s390/mm/gmap.c --- linux-4.19.98/arch/s390/mm/gmap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/mm/gmap.c 2020-04-23 08:30:24.000000000 +0000 @@ -787,14 +787,18 @@ static inline unsigned long *gmap_table_walk(struct gmap *gmap, unsigned long gaddr, int level) { + const int asce_type = gmap->asce & _ASCE_TYPE_MASK; unsigned long *table; if ((gmap->asce & _ASCE_TYPE_MASK) + 4 < (level * 4)) return NULL; if (gmap_is_shadow(gmap) && gmap->removed) return NULL; - if (gaddr & (-1UL << (31 + ((gmap->asce & _ASCE_TYPE_MASK) >> 2)*11))) + + if (asce_type != _ASCE_TYPE_REGION1 && + gaddr & (-1UL << (31 + (asce_type >> 2) * 11))) return NULL; + table = gmap->table; switch (gmap->asce & _ASCE_TYPE_MASK) { case _ASCE_TYPE_REGION1: @@ -1834,6 +1838,7 @@ goto out_free; } else if (*table & _REGION_ENTRY_ORIGIN) { rc = -EAGAIN; /* Race with shadow */ + goto out_free; } crst_table_init(s_r3t, _REGION3_ENTRY_EMPTY); /* mark as invalid as long as the parent table is not protected */ diff -Nru linux-4.19.98/arch/s390/mm/hugetlbpage.c linux-4.19.118/arch/s390/mm/hugetlbpage.c --- linux-4.19.98/arch/s390/mm/hugetlbpage.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/mm/hugetlbpage.c 2020-04-23 08:30:24.000000000 +0000 @@ -2,7 +2,7 @@ /* * IBM System z Huge TLB Page Support for Kernel. * - * Copyright IBM Corp. 2007,2016 + * Copyright IBM Corp. 2007,2020 * Author(s): Gerald Schaefer */ @@ -11,6 +11,9 @@ #include #include +#include +#include +#include /* * If the bit selected by single-bit bitmask "a" is set within "x", move @@ -267,3 +270,98 @@ return 1; } __setup("hugepagesz=", setup_hugepagesz); + +static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file, + unsigned long addr, unsigned long len, + unsigned long pgoff, unsigned long flags) +{ + struct hstate *h = hstate_file(file); + struct vm_unmapped_area_info info; + + info.flags = 0; + info.length = len; + info.low_limit = current->mm->mmap_base; + info.high_limit = TASK_SIZE; + info.align_mask = PAGE_MASK & ~huge_page_mask(h); + info.align_offset = 0; + return vm_unmapped_area(&info); +} + +static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file, + unsigned long addr0, unsigned long len, + unsigned long pgoff, unsigned long flags) +{ + struct hstate *h = hstate_file(file); + struct vm_unmapped_area_info info; + unsigned long addr; + + info.flags = VM_UNMAPPED_AREA_TOPDOWN; + info.length = len; + info.low_limit = max(PAGE_SIZE, mmap_min_addr); + info.high_limit = current->mm->mmap_base; + info.align_mask = PAGE_MASK & ~huge_page_mask(h); + info.align_offset = 0; + addr = vm_unmapped_area(&info); + + /* + * A failed mmap() very likely causes application failure, + * so fall back to the bottom-up function here. This scenario + * can happen with large stack limits and large mmap() + * allocations. + */ + if (addr & ~PAGE_MASK) { + VM_BUG_ON(addr != -ENOMEM); + info.flags = 0; + info.low_limit = TASK_UNMAPPED_BASE; + info.high_limit = TASK_SIZE; + addr = vm_unmapped_area(&info); + } + + return addr; +} + +unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, + unsigned long len, unsigned long pgoff, unsigned long flags) +{ + struct hstate *h = hstate_file(file); + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + int rc; + + if (len & ~huge_page_mask(h)) + return -EINVAL; + if (len > TASK_SIZE - mmap_min_addr) + return -ENOMEM; + + if (flags & MAP_FIXED) { + if (prepare_hugepage_range(file, addr, len)) + return -EINVAL; + goto check_asce_limit; + } + + if (addr) { + addr = ALIGN(addr, huge_page_size(h)); + vma = find_vma(mm, addr); + if (TASK_SIZE - len >= addr && addr >= mmap_min_addr && + (!vma || addr + len <= vm_start_gap(vma))) + goto check_asce_limit; + } + + if (mm->get_unmapped_area == arch_get_unmapped_area) + addr = hugetlb_get_unmapped_area_bottomup(file, addr, len, + pgoff, flags); + else + addr = hugetlb_get_unmapped_area_topdown(file, addr, len, + pgoff, flags); + if (addr & ~PAGE_MASK) + return addr; + +check_asce_limit: + if (addr + len > current->mm->context.asce_limit && + addr + len <= TASK_SIZE) { + rc = crst_table_upgrade(mm, addr + len); + if (rc) + return (unsigned long) rc; + } + return addr; +} diff -Nru linux-4.19.98/arch/s390/mm/init.c linux-4.19.118/arch/s390/mm/init.c --- linux-4.19.98/arch/s390/mm/init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/mm/init.c 2020-04-23 08:30:24.000000000 +0000 @@ -239,15 +239,13 @@ return rc; } -#ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { - /* - * There is no hardware or firmware interface which could trigger a - * hot memory remove on s390. So there is nothing that needs to be - * implemented. - */ - return -EBUSY; + unsigned long start_pfn = start >> PAGE_SHIFT; + unsigned long nr_pages = size >> PAGE_SHIFT; + + __remove_pages(start_pfn, nr_pages, altmap); + vmem_remove_mapping(start, size); } -#endif #endif /* CONFIG_MEMORY_HOTPLUG */ diff -Nru linux-4.19.98/arch/s390/pci/pci_sysfs.c linux-4.19.118/arch/s390/pci/pci_sysfs.c --- linux-4.19.98/arch/s390/pci/pci_sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/s390/pci/pci_sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -13,6 +13,8 @@ #include #include +#include "../../../drivers/pci/pci.h" + #include #define zpci_attr(name, fmt, member) \ @@ -40,31 +42,50 @@ static ssize_t recover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { + struct kernfs_node *kn; struct pci_dev *pdev = to_pci_dev(dev); struct zpci_dev *zdev = to_zpci(pdev); - int ret; - - if (!device_remove_file_self(dev, attr)) - return count; + int ret = 0; + /* Can't use device_remove_self() here as that would lead us to lock + * the pci_rescan_remove_lock while holding the device' kernfs lock. + * This would create a possible deadlock with disable_slot() which is + * not directly protected by the device' kernfs lock but takes it + * during the device removal which happens under + * pci_rescan_remove_lock. + * + * This is analogous to sdev_store_delete() in + * drivers/scsi/scsi_sysfs.c + */ + kn = sysfs_break_active_protection(&dev->kobj, &attr->attr); + WARN_ON_ONCE(!kn); + /* device_remove_file() serializes concurrent calls ignoring all but + * the first + */ + device_remove_file(dev, attr); + + /* A concurrent call to recover_store() may slip between + * sysfs_break_active_protection() and the sysfs file removal. + * Once it unblocks from pci_lock_rescan_remove() the original pdev + * will already be removed. + */ pci_lock_rescan_remove(); - pci_stop_and_remove_bus_device(pdev); - ret = zpci_disable_device(zdev); - if (ret) - goto error; - - ret = zpci_enable_device(zdev); - if (ret) - goto error; - - pci_rescan_bus(zdev->bus); - pci_unlock_rescan_remove(); - - return count; - -error: + if (pci_dev_is_added(pdev)) { + pci_stop_and_remove_bus_device(pdev); + ret = zpci_disable_device(zdev); + if (ret) + goto out; + + ret = zpci_enable_device(zdev); + if (ret) + goto out; + pci_rescan_bus(zdev->bus); + } +out: pci_unlock_rescan_remove(); - return ret; + if (kn) + sysfs_unbreak_active_protection(kn); + return ret ? ret : count; } static DEVICE_ATTR_WO(recover); diff -Nru linux-4.19.98/arch/sh/boards/mach-migor/setup.c linux-4.19.118/arch/sh/boards/mach-migor/setup.c --- linux-4.19.98/arch/sh/boards/mach-migor/setup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/sh/boards/mach-migor/setup.c 2020-04-23 08:30:24.000000000 +0000 @@ -5,6 +5,7 @@ * Copyright (C) 2008 Magnus Damm */ #include +#include #include #include #include diff -Nru linux-4.19.98/arch/sh/include/cpu-sh2a/cpu/sh7269.h linux-4.19.118/arch/sh/include/cpu-sh2a/cpu/sh7269.h --- linux-4.19.98/arch/sh/include/cpu-sh2a/cpu/sh7269.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/sh/include/cpu-sh2a/cpu/sh7269.h 2020-04-23 08:30:24.000000000 +0000 @@ -78,8 +78,15 @@ GPIO_FN_WDTOVF, /* CAN */ - GPIO_FN_CTX1, GPIO_FN_CRX1, GPIO_FN_CTX0, GPIO_FN_CTX0_CTX1, - GPIO_FN_CRX0, GPIO_FN_CRX0_CRX1, GPIO_FN_CRX0_CRX1_CRX2, + GPIO_FN_CTX2, GPIO_FN_CRX2, + GPIO_FN_CTX1, GPIO_FN_CRX1, + GPIO_FN_CTX0, GPIO_FN_CRX0, + GPIO_FN_CTX0_CTX1, GPIO_FN_CRX0_CRX1, + GPIO_FN_CTX0_CTX1_CTX2, GPIO_FN_CRX0_CRX1_CRX2, + GPIO_FN_CTX2_PJ21, GPIO_FN_CRX2_PJ20, + GPIO_FN_CTX1_PJ23, GPIO_FN_CRX1_PJ22, + GPIO_FN_CTX0_CTX1_PJ23, GPIO_FN_CRX0_CRX1_PJ22, + GPIO_FN_CTX0_CTX1_CTX2_PJ21, GPIO_FN_CRX0_CRX1_CRX2_PJ20, /* DMAC */ GPIO_FN_TEND0, GPIO_FN_DACK0, GPIO_FN_DREQ0, diff -Nru linux-4.19.98/arch/sh/mm/init.c linux-4.19.118/arch/sh/mm/init.c --- linux-4.19.98/arch/sh/mm/init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/sh/mm/init.c 2020-04-23 08:30:24.000000000 +0000 @@ -443,21 +443,12 @@ EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); #endif -#ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { unsigned long start_pfn = PFN_DOWN(start); unsigned long nr_pages = size >> PAGE_SHIFT; - struct zone *zone; - int ret; - zone = page_zone(pfn_to_page(start_pfn)); - ret = __remove_pages(zone, start_pfn, nr_pages, altmap); - if (unlikely(ret)) - pr_warn("%s: Failed, __remove_pages() == %d\n", __func__, - ret); - - return ret; + __remove_pages(start_pfn, nr_pages, altmap); } -#endif #endif /* CONFIG_MEMORY_HOTPLUG */ diff -Nru linux-4.19.98/arch/sparc/include/uapi/asm/ipcbuf.h linux-4.19.118/arch/sparc/include/uapi/asm/ipcbuf.h --- linux-4.19.98/arch/sparc/include/uapi/asm/ipcbuf.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/sparc/include/uapi/asm/ipcbuf.h 2020-04-23 08:30:24.000000000 +0000 @@ -15,19 +15,19 @@ struct ipc64_perm { - __kernel_key_t key; - __kernel_uid_t uid; - __kernel_gid_t gid; - __kernel_uid_t cuid; - __kernel_gid_t cgid; + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; #ifndef __arch64__ - unsigned short __pad0; + unsigned short __pad0; #endif - __kernel_mode_t mode; - unsigned short __pad1; - unsigned short seq; - unsigned long long __unused1; - unsigned long long __unused2; + __kernel_mode_t mode; + unsigned short __pad1; + unsigned short seq; + unsigned long long __unused1; + unsigned long long __unused2; }; #endif /* __SPARC_IPCBUF_H */ diff -Nru linux-4.19.98/arch/sparc/kernel/vmlinux.lds.S linux-4.19.118/arch/sparc/kernel/vmlinux.lds.S --- linux-4.19.98/arch/sparc/kernel/vmlinux.lds.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/sparc/kernel/vmlinux.lds.S 2020-04-23 08:30:24.000000000 +0000 @@ -172,12 +172,14 @@ } PERCPU_SECTION(SMP_CACHE_BYTES) -#ifdef CONFIG_JUMP_LABEL . = ALIGN(PAGE_SIZE); .exit.text : { EXIT_TEXT } -#endif + + .exit.data : { + EXIT_DATA + } . = ALIGN(PAGE_SIZE); __init_end = .; diff -Nru linux-4.19.98/arch/um/drivers/chan_kern.c linux-4.19.118/arch/um/drivers/chan_kern.c --- linux-4.19.98/arch/um/drivers/chan_kern.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/um/drivers/chan_kern.c 2020-04-23 08:30:24.000000000 +0000 @@ -171,19 +171,55 @@ return err; } +/* Items are added in IRQ context, when free_irq can't be called, and + * removed in process context, when it can. + * This handles interrupt sources which disappear, and which need to + * be permanently disabled. This is discovered in IRQ context, but + * the freeing of the IRQ must be done later. + */ +static DEFINE_SPINLOCK(irqs_to_free_lock); +static LIST_HEAD(irqs_to_free); + +void free_irqs(void) +{ + struct chan *chan; + LIST_HEAD(list); + struct list_head *ele; + unsigned long flags; + + spin_lock_irqsave(&irqs_to_free_lock, flags); + list_splice_init(&irqs_to_free, &list); + spin_unlock_irqrestore(&irqs_to_free_lock, flags); + + list_for_each(ele, &list) { + chan = list_entry(ele, struct chan, free_list); + + if (chan->input && chan->enabled) + um_free_irq(chan->line->driver->read_irq, chan); + if (chan->output && chan->enabled) + um_free_irq(chan->line->driver->write_irq, chan); + chan->enabled = 0; + } +} + static void close_one_chan(struct chan *chan, int delay_free_irq) { + unsigned long flags; + if (!chan->opened) return; - /* we can safely call free now - it will be marked - * as free and freed once the IRQ stopped processing - */ - if (chan->input && chan->enabled) - um_free_irq(chan->line->driver->read_irq, chan); - if (chan->output && chan->enabled) - um_free_irq(chan->line->driver->write_irq, chan); - chan->enabled = 0; + if (delay_free_irq) { + spin_lock_irqsave(&irqs_to_free_lock, flags); + list_add(&chan->free_list, &irqs_to_free); + spin_unlock_irqrestore(&irqs_to_free_lock, flags); + } else { + if (chan->input && chan->enabled) + um_free_irq(chan->line->driver->read_irq, chan); + if (chan->output && chan->enabled) + um_free_irq(chan->line->driver->write_irq, chan); + chan->enabled = 0; + } if (chan->ops->close != NULL) (*chan->ops->close)(chan->fd, chan->data); diff -Nru linux-4.19.98/arch/um/drivers/ubd_kern.c linux-4.19.118/arch/um/drivers/ubd_kern.c --- linux-4.19.98/arch/um/drivers/ubd_kern.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/um/drivers/ubd_kern.c 2020-04-23 08:30:24.000000000 +0000 @@ -1574,7 +1574,9 @@ written = 0; do { - res = os_write_file(kernel_fd, ((char *) io_req_buffer) + written, n); + res = os_write_file(kernel_fd, + ((char *) io_req_buffer) + written, + n - written); if (res >= 0) { written += res; } else { diff -Nru linux-4.19.98/arch/um/include/asm/irq.h linux-4.19.118/arch/um/include/asm/irq.h --- linux-4.19.98/arch/um/include/asm/irq.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/um/include/asm/irq.h 2020-04-23 08:30:24.000000000 +0000 @@ -23,7 +23,7 @@ #define VECTOR_BASE_IRQ 15 #define VECTOR_IRQ_SPACE 8 -#define LAST_IRQ (VECTOR_IRQ_SPACE + VECTOR_BASE_IRQ) +#define LAST_IRQ (VECTOR_IRQ_SPACE + VECTOR_BASE_IRQ - 1) #else diff -Nru linux-4.19.98/arch/um/kernel/irq.c linux-4.19.118/arch/um/kernel/irq.c --- linux-4.19.98/arch/um/kernel/irq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/um/kernel/irq.c 2020-04-23 08:30:24.000000000 +0000 @@ -21,6 +21,8 @@ #include +extern void free_irqs(void); + /* When epoll triggers we do not know why it did so * we can also have different IRQs for read and write. * This is why we keep a small irq_fd array for each fd - @@ -100,6 +102,8 @@ } } } + + free_irqs(); } static int assign_epoll_events_to_irq(struct irq_entry *irq_entry) diff -Nru linux-4.19.98/arch/x86/Kconfig.debug linux-4.19.118/arch/x86/Kconfig.debug --- linux-4.19.98/arch/x86/Kconfig.debug 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/Kconfig.debug 2020-04-23 08:30:24.000000000 +0000 @@ -181,7 +181,7 @@ config X86_DECODER_SELFTEST bool "x86 instruction decoder selftest" - depends on DEBUG_KERNEL && KPROBES + depends on DEBUG_KERNEL && INSTRUCTION_DECODER depends on !COMPILE_TEST ---help--- Perform x86 instruction decoder selftests at build time. diff -Nru linux-4.19.98/arch/x86/boot/compressed/head_32.S linux-4.19.118/arch/x86/boot/compressed/head_32.S --- linux-4.19.98/arch/x86/boot/compressed/head_32.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/boot/compressed/head_32.S 2020-04-23 08:30:24.000000000 +0000 @@ -106,7 +106,7 @@ notl %eax andl %eax, %ebx cmpl $LOAD_PHYSICAL_ADDR, %ebx - jge 1f + jae 1f #endif movl $LOAD_PHYSICAL_ADDR, %ebx 1: diff -Nru linux-4.19.98/arch/x86/boot/compressed/head_64.S linux-4.19.118/arch/x86/boot/compressed/head_64.S --- linux-4.19.98/arch/x86/boot/compressed/head_64.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/boot/compressed/head_64.S 2020-04-23 08:30:24.000000000 +0000 @@ -106,7 +106,7 @@ notl %eax andl %eax, %ebx cmpl $LOAD_PHYSICAL_ADDR, %ebx - jge 1f + jae 1f #endif movl $LOAD_PHYSICAL_ADDR, %ebx 1: @@ -297,7 +297,7 @@ notq %rax andq %rax, %rbp cmpq $LOAD_PHYSICAL_ADDR, %rbp - jge 1f + jae 1f #endif movq $LOAD_PHYSICAL_ADDR, %rbp 1: diff -Nru linux-4.19.98/arch/x86/boot/compressed/kaslr_64.c linux-4.19.118/arch/x86/boot/compressed/kaslr_64.c --- linux-4.19.98/arch/x86/boot/compressed/kaslr_64.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/boot/compressed/kaslr_64.c 2020-04-23 08:30:24.000000000 +0000 @@ -29,9 +29,6 @@ #define __PAGE_OFFSET __PAGE_OFFSET_BASE #include "../../mm/ident_map.c" -/* Used by pgtable.h asm code to force instruction serialization. */ -unsigned long __force_order; - /* Used to track our page table allocation area. */ struct alloc_pgt_data { unsigned char *pgt_buf; diff -Nru linux-4.19.98/arch/x86/entry/calling.h linux-4.19.118/arch/x86/entry/calling.h --- linux-4.19.98/arch/x86/entry/calling.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/entry/calling.h 2020-04-23 08:30:24.000000000 +0000 @@ -172,21 +172,6 @@ .endif .endm -/* - * This is a sneaky trick to help the unwinder find pt_regs on the stack. The - * frame pointer is replaced with an encoded pointer to pt_regs. The encoding - * is just setting the LSB, which makes it an invalid stack address and is also - * a signal to the unwinder that it's a pt_regs pointer in disguise. - * - * NOTE: This macro must be used *after* PUSH_AND_CLEAR_REGS because it corrupts - * the original rbp. - */ -.macro ENCODE_FRAME_POINTER ptregs_offset=0 -#ifdef CONFIG_FRAME_POINTER - leaq 1+\ptregs_offset(%rsp), %rbp -#endif -.endm - #ifdef CONFIG_PAGE_TABLE_ISOLATION /* diff -Nru linux-4.19.98/arch/x86/entry/entry_32.S linux-4.19.118/arch/x86/entry/entry_32.S --- linux-4.19.98/arch/x86/entry/entry_32.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/entry/entry_32.S 2020-04-23 08:30:24.000000000 +0000 @@ -245,22 +245,6 @@ .Lend_\@: .endm -/* - * This is a sneaky trick to help the unwinder find pt_regs on the stack. The - * frame pointer is replaced with an encoded pointer to pt_regs. The encoding - * is just clearing the MSB, which makes it an invalid stack address and is also - * a signal to the unwinder that it's a pt_regs pointer in disguise. - * - * NOTE: This macro must be used *after* SAVE_ALL because it corrupts the - * original rbp. - */ -.macro ENCODE_FRAME_POINTER -#ifdef CONFIG_FRAME_POINTER - mov %esp, %ebp - andl $0x7fffffff, %ebp -#endif -.endm - .macro RESTORE_INT_REGS popl %ebx popl %ecx @@ -1505,6 +1489,7 @@ END(int3) ENTRY(general_protection) + ASM_CLAC pushl $do_general_protection jmp common_exception END(general_protection) diff -Nru linux-4.19.98/arch/x86/entry/vdso/vdso32-setup.c linux-4.19.118/arch/x86/entry/vdso/vdso32-setup.c --- linux-4.19.98/arch/x86/entry/vdso/vdso32-setup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/entry/vdso/vdso32-setup.c 2020-04-23 08:30:24.000000000 +0000 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include diff -Nru linux-4.19.98/arch/x86/events/amd/core.c linux-4.19.118/arch/x86/events/amd/core.c --- linux-4.19.98/arch/x86/events/amd/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/events/amd/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -245,6 +245,7 @@ [PERF_COUNT_HW_CPU_CYCLES] = 0x0076, [PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0, [PERF_COUNT_HW_CACHE_REFERENCES] = 0xff60, + [PERF_COUNT_HW_CACHE_MISSES] = 0x0964, [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 0x00c2, [PERF_COUNT_HW_BRANCH_MISSES] = 0x00c3, [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 0x0287, diff -Nru linux-4.19.98/arch/x86/events/amd/uncore.c linux-4.19.118/arch/x86/events/amd/uncore.c --- linux-4.19.98/arch/x86/events/amd/uncore.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/events/amd/uncore.c 2020-04-23 08:30:24.000000000 +0000 @@ -193,20 +193,18 @@ /* * NB and Last level cache counters (MSRs) are shared across all cores - * that share the same NB / Last level cache. Interrupts can be directed - * to a single target core, however, event counts generated by processes - * running on other cores cannot be masked out. So we do not support - * sampling and per-thread events. + * that share the same NB / Last level cache. On family 16h and below, + * Interrupts can be directed to a single target core, however, event + * counts generated by processes running on other cores cannot be masked + * out. So we do not support sampling and per-thread events via + * CAP_NO_INTERRUPT, and we do not enable counter overflow interrupts: */ - if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) - return -EINVAL; /* NB and Last level cache counters do not have usr/os/guest/host bits */ if (event->attr.exclude_user || event->attr.exclude_kernel || event->attr.exclude_host || event->attr.exclude_guest) return -EINVAL; - /* and we do not enable counter overflow interrupts */ hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB; hwc->idx = -1; @@ -314,6 +312,7 @@ .start = amd_uncore_start, .stop = amd_uncore_stop, .read = amd_uncore_read, + .capabilities = PERF_PMU_CAP_NO_INTERRUPT, }; static struct pmu amd_llc_pmu = { @@ -324,6 +323,7 @@ .start = amd_uncore_start, .stop = amd_uncore_stop, .read = amd_uncore_read, + .capabilities = PERF_PMU_CAP_NO_INTERRUPT, }; static struct amd_uncore *amd_uncore_alloc(unsigned int cpu) diff -Nru linux-4.19.98/arch/x86/events/intel/ds.c linux-4.19.118/arch/x86/events/intel/ds.c --- linux-4.19.98/arch/x86/events/intel/ds.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/events/intel/ds.c 2020-04-23 08:30:24.000000000 +0000 @@ -1402,6 +1402,8 @@ old = ((s64)(prev_raw_count << shift) >> shift); local64_add(new - old + count * period, &event->count); + local64_set(&hwc->period_left, -new); + perf_event_update_userpage(event); return 0; diff -Nru linux-4.19.98/arch/x86/events/intel/pt.c linux-4.19.118/arch/x86/events/intel/pt.c --- linux-4.19.98/arch/x86/events/intel/pt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/events/intel/pt.c 2020-04-23 08:30:24.000000000 +0000 @@ -1213,7 +1213,8 @@ static void pt_event_addr_filters_sync(struct perf_event *event) { struct perf_addr_filters_head *head = perf_event_addr_filters(event); - unsigned long msr_a, msr_b, *offs = event->addr_filters_offs; + unsigned long msr_a, msr_b; + struct perf_addr_filter_range *fr = event->addr_filter_ranges; struct pt_filters *filters = event->hw.addr_filters; struct perf_addr_filter *filter; int range = 0; @@ -1222,12 +1223,12 @@ return; list_for_each_entry(filter, &head->list, entry) { - if (filter->path.dentry && !offs[range]) { + if (filter->path.dentry && !fr[range].start) { msr_a = msr_b = 0; } else { /* apply the offset */ - msr_a = filter->offset + offs[range]; - msr_b = filter->size + msr_a - 1; + msr_a = fr[range].start; + msr_b = msr_a + fr[range].size - 1; } filters->filter[range].msr_a = msr_a; diff -Nru linux-4.19.98/arch/x86/hyperv/hv_init.c linux-4.19.118/arch/x86/hyperv/hv_init.c --- linux-4.19.98/arch/x86/hyperv/hv_init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/hyperv/hv_init.c 2020-04-23 08:30:24.000000000 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include #include #ifdef CONFIG_HYPERV_TSCPAGE @@ -427,11 +428,14 @@ } EXPORT_SYMBOL_GPL(hyperv_cleanup); -void hyperv_report_panic(struct pt_regs *regs, long err) +void hyperv_report_panic(struct pt_regs *regs, long err, bool in_die) { static bool panic_reported; u64 guest_id; + if (in_die && !panic_on_oops) + return; + /* * We prefer to report panic on 'die' chain as we have proper * registers to report, but if we miss it (e.g. on BUG()) we need diff -Nru linux-4.19.98/arch/x86/include/asm/apic.h linux-4.19.118/arch/x86/include/asm/apic.h --- linux-4.19.98/arch/x86/include/asm/apic.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/apic.h 2020-04-23 08:30:24.000000000 +0000 @@ -448,6 +448,14 @@ apic_eoi(); } + +static inline bool lapic_vector_set_in_irr(unsigned int vector) +{ + u32 irr = apic_read(APIC_IRR + (vector / 32 * 0x10)); + + return !!(irr & (1U << (vector % 32))); +} + static inline unsigned default_get_apic_id(unsigned long x) { unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); diff -Nru linux-4.19.98/arch/x86/include/asm/frame.h linux-4.19.118/arch/x86/include/asm/frame.h --- linux-4.19.98/arch/x86/include/asm/frame.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/frame.h 2020-04-23 08:30:24.000000000 +0000 @@ -22,6 +22,35 @@ pop %_ASM_BP .endm +#ifdef CONFIG_X86_64 +/* + * This is a sneaky trick to help the unwinder find pt_regs on the stack. The + * frame pointer is replaced with an encoded pointer to pt_regs. The encoding + * is just setting the LSB, which makes it an invalid stack address and is also + * a signal to the unwinder that it's a pt_regs pointer in disguise. + * + * NOTE: This macro must be used *after* PUSH_AND_CLEAR_REGS because it corrupts + * the original rbp. + */ +.macro ENCODE_FRAME_POINTER ptregs_offset=0 + leaq 1+\ptregs_offset(%rsp), %rbp +.endm +#else /* !CONFIG_X86_64 */ +/* + * This is a sneaky trick to help the unwinder find pt_regs on the stack. The + * frame pointer is replaced with an encoded pointer to pt_regs. The encoding + * is just clearing the MSB, which makes it an invalid stack address and is also + * a signal to the unwinder that it's a pt_regs pointer in disguise. + * + * NOTE: This macro must be used *after* SAVE_ALL because it corrupts the + * original ebp. + */ +.macro ENCODE_FRAME_POINTER + mov %esp, %ebp + andl $0x7fffffff, %ebp +.endm +#endif /* CONFIG_X86_64 */ + #else /* !__ASSEMBLY__ */ #define FRAME_BEGIN \ @@ -30,12 +59,32 @@ #define FRAME_END "pop %" _ASM_BP "\n" +#ifdef CONFIG_X86_64 +#define ENCODE_FRAME_POINTER \ + "lea 1(%rsp), %rbp\n\t" +#else /* !CONFIG_X86_64 */ +#define ENCODE_FRAME_POINTER \ + "movl %esp, %ebp\n\t" \ + "andl $0x7fffffff, %ebp\n\t" +#endif /* CONFIG_X86_64 */ + #endif /* __ASSEMBLY__ */ #define FRAME_OFFSET __ASM_SEL(4, 8) #else /* !CONFIG_FRAME_POINTER */ +#ifdef __ASSEMBLY__ + +.macro ENCODE_FRAME_POINTER ptregs_offset=0 +.endm + +#else /* !__ASSEMBLY */ + +#define ENCODE_FRAME_POINTER + +#endif + #define FRAME_BEGIN #define FRAME_END #define FRAME_OFFSET 0 diff -Nru linux-4.19.98/arch/x86/include/asm/kvm_host.h linux-4.19.118/arch/x86/include/asm/kvm_host.h --- linux-4.19.98/arch/x86/include/asm/kvm_host.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/kvm_host.h 2020-04-23 08:30:24.000000000 +0000 @@ -350,12 +350,12 @@ void (*set_cr3)(struct kvm_vcpu *vcpu, unsigned long root); unsigned long (*get_cr3)(struct kvm_vcpu *vcpu); u64 (*get_pdptr)(struct kvm_vcpu *vcpu, int index); - int (*page_fault)(struct kvm_vcpu *vcpu, gva_t gva, u32 err, + int (*page_fault)(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 err, bool prefault); void (*inject_page_fault)(struct kvm_vcpu *vcpu, struct x86_exception *fault); - gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t gva, u32 access, - struct x86_exception *exception); + gpa_t (*gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t gva_or_gpa, + u32 access, struct x86_exception *exception); gpa_t (*translate_gpa)(struct kvm_vcpu *vcpu, gpa_t gpa, u32 access, struct x86_exception *exception); int (*sync_page)(struct kvm_vcpu *vcpu, @@ -1040,7 +1040,7 @@ void (*load_eoi_exitmap)(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap); void (*set_virtual_apic_mode)(struct kvm_vcpu *vcpu); void (*set_apic_access_page_addr)(struct kvm_vcpu *vcpu, hpa_t hpa); - void (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu, int vector); + int (*deliver_posted_interrupt)(struct kvm_vcpu *vcpu, int vector); int (*sync_pir_to_irr)(struct kvm_vcpu *vcpu); int (*set_tss_addr)(struct kvm *kvm, unsigned int addr); int (*set_identity_map_addr)(struct kvm *kvm, u64 ident_addr); @@ -1070,7 +1070,7 @@ bool (*xsaves_supported)(void); bool (*umip_emulated)(void); - int (*check_nested_events)(struct kvm_vcpu *vcpu, bool external_intr); + int (*check_nested_events)(struct kvm_vcpu *vcpu); void (*request_immediate_exit)(struct kvm_vcpu *vcpu); void (*sched_in)(struct kvm_vcpu *kvm, int cpu); @@ -1354,7 +1354,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu); -int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, u64 error_code, +int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code, void *insn, int insn_len); void kvm_mmu_invlpg(struct kvm_vcpu *vcpu, gva_t gva); void kvm_mmu_invpcid_gva(struct kvm_vcpu *vcpu, gva_t gva, unsigned long pcid); diff -Nru linux-4.19.98/arch/x86/include/asm/microcode_amd.h linux-4.19.118/arch/x86/include/asm/microcode_amd.h --- linux-4.19.98/arch/x86/include/asm/microcode_amd.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/microcode_amd.h 2020-04-23 08:30:24.000000000 +0000 @@ -41,7 +41,7 @@ unsigned int mpb[0]; }; -#define PATCH_MAX_SIZE PAGE_SIZE +#define PATCH_MAX_SIZE (3 * PAGE_SIZE) #ifdef CONFIG_MICROCODE_AMD extern void __init load_ucode_amd_bsp(unsigned int family); diff -Nru linux-4.19.98/arch/x86/include/asm/mshyperv.h linux-4.19.118/arch/x86/include/asm/mshyperv.h --- linux-4.19.98/arch/x86/include/asm/mshyperv.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/mshyperv.h 2020-04-23 08:30:24.000000000 +0000 @@ -338,7 +338,7 @@ void __init hyperv_init(void); void hyperv_setup_mmu_ops(void); -void hyperv_report_panic(struct pt_regs *regs, long err); +void hyperv_report_panic(struct pt_regs *regs, long err, bool in_die); void hyperv_report_panic_msg(phys_addr_t pa, size_t size); bool hv_is_hyperv_initialized(void); void hyperv_cleanup(void); diff -Nru linux-4.19.98/arch/x86/include/asm/msr-index.h linux-4.19.118/arch/x86/include/asm/msr-index.h --- linux-4.19.98/arch/x86/include/asm/msr-index.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/msr-index.h 2020-04-23 08:30:24.000000000 +0000 @@ -455,6 +455,8 @@ #define MSR_K7_HWCR 0xc0010015 #define MSR_K7_HWCR_SMMLOCK_BIT 0 #define MSR_K7_HWCR_SMMLOCK BIT_ULL(MSR_K7_HWCR_SMMLOCK_BIT) +#define MSR_K7_HWCR_IRPERF_EN_BIT 30 +#define MSR_K7_HWCR_IRPERF_EN BIT_ULL(MSR_K7_HWCR_IRPERF_EN_BIT) #define MSR_K7_FID_VID_CTL 0xc0010041 #define MSR_K7_FID_VID_STATUS 0xc0010042 diff -Nru linux-4.19.98/arch/x86/include/asm/nmi.h linux-4.19.118/arch/x86/include/asm/nmi.h --- linux-4.19.98/arch/x86/include/asm/nmi.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/nmi.h 2020-04-23 08:30:24.000000000 +0000 @@ -41,7 +41,6 @@ struct list_head list; nmi_handler_t handler; u64 max_duration; - struct irq_work irq_work; unsigned long flags; const char *name; }; diff -Nru linux-4.19.98/arch/x86/include/asm/pgtable.h linux-4.19.118/arch/x86/include/asm/pgtable.h --- linux-4.19.98/arch/x86/include/asm/pgtable.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/pgtable.h 2020-04-23 08:30:24.000000000 +0000 @@ -608,12 +608,15 @@ return __pmd(val); } -/* mprotect needs to preserve PAT bits when updating vm_page_prot */ +/* + * mprotect needs to preserve PAT and encryption bits when updating + * vm_page_prot + */ #define pgprot_modify pgprot_modify static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot) { pgprotval_t preservebits = pgprot_val(oldprot) & _PAGE_CHG_MASK; - pgprotval_t addbits = pgprot_val(newprot); + pgprotval_t addbits = pgprot_val(newprot) & ~_PAGE_CHG_MASK; return __pgprot(preservebits | addbits); } diff -Nru linux-4.19.98/arch/x86/include/asm/pgtable_32.h linux-4.19.118/arch/x86/include/asm/pgtable_32.h --- linux-4.19.98/arch/x86/include/asm/pgtable_32.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/pgtable_32.h 2020-04-23 08:30:24.000000000 +0000 @@ -106,6 +106,6 @@ * with only a host target support using a 32-bit type for internal * representation. */ -#define LOWMEM_PAGES ((((2<<31) - __PAGE_OFFSET) >> PAGE_SHIFT)) +#define LOWMEM_PAGES ((((_ULL(2)<<31) - __PAGE_OFFSET) >> PAGE_SHIFT)) #endif /* _ASM_X86_PGTABLE_32_H */ diff -Nru linux-4.19.98/arch/x86/include/asm/pgtable_types.h linux-4.19.118/arch/x86/include/asm/pgtable_types.h --- linux-4.19.98/arch/x86/include/asm/pgtable_types.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/include/asm/pgtable_types.h 2020-04-23 08:30:24.000000000 +0000 @@ -124,7 +124,7 @@ */ #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY | \ - _PAGE_SOFT_DIRTY | _PAGE_DEVMAP) + _PAGE_SOFT_DIRTY | _PAGE_DEVMAP | _PAGE_ENC) #define _HPAGE_CHG_MASK (_PAGE_CHG_MASK | _PAGE_PSE) /* diff -Nru linux-4.19.98/arch/x86/kernel/acpi/boot.c linux-4.19.118/arch/x86/kernel/acpi/boot.c --- linux-4.19.98/arch/x86/kernel/acpi/boot.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/acpi/boot.c 2020-04-23 08:30:24.000000000 +0000 @@ -1752,7 +1752,7 @@ new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1)); val = cmpxchg(lock, old, new); } while (unlikely (val != old)); - return (new < 3) ? -1 : 0; + return ((new & 0x3) < 3) ? -1 : 0; } int __acpi_release_global_lock(unsigned int *lock) diff -Nru linux-4.19.98/arch/x86/kernel/acpi/cstate.c linux-4.19.118/arch/x86/kernel/acpi/cstate.c --- linux-4.19.98/arch/x86/kernel/acpi/cstate.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/acpi/cstate.c 2020-04-23 08:30:24.000000000 +0000 @@ -133,7 +133,8 @@ /* Make sure we are running on right CPU */ - retval = work_on_cpu(cpu, acpi_processor_ffh_cstate_probe_cpu, cx); + retval = call_on_cpu(cpu, acpi_processor_ffh_cstate_probe_cpu, cx, + false); if (retval == 0) { /* Use the hint in CST */ percpu_entry->states[cx->index].eax = cx->address; diff -Nru linux-4.19.98/arch/x86/kernel/apic/msi.c linux-4.19.118/arch/x86/kernel/apic/msi.c --- linux-4.19.98/arch/x86/kernel/apic/msi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/apic/msi.c 2020-04-23 08:30:24.000000000 +0000 @@ -26,10 +26,8 @@ static struct irq_domain *msi_default_domain; -static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) +static void __irq_msi_compose_msg(struct irq_cfg *cfg, struct msi_msg *msg) { - struct irq_cfg *cfg = irqd_cfg(data); - msg->address_hi = MSI_ADDR_BASE_HI; if (x2apic_enabled()) @@ -50,6 +48,127 @@ MSI_DATA_VECTOR(cfg->vector); } +static void irq_msi_compose_msg(struct irq_data *data, struct msi_msg *msg) +{ + __irq_msi_compose_msg(irqd_cfg(data), msg); +} + +static void irq_msi_update_msg(struct irq_data *irqd, struct irq_cfg *cfg) +{ + struct msi_msg msg[2] = { [1] = { }, }; + + __irq_msi_compose_msg(cfg, msg); + irq_data_get_irq_chip(irqd)->irq_write_msi_msg(irqd, msg); +} + +static int +msi_set_affinity(struct irq_data *irqd, const struct cpumask *mask, bool force) +{ + struct irq_cfg old_cfg, *cfg = irqd_cfg(irqd); + struct irq_data *parent = irqd->parent_data; + unsigned int cpu; + int ret; + + /* Save the current configuration */ + cpu = cpumask_first(irq_data_get_effective_affinity_mask(irqd)); + old_cfg = *cfg; + + /* Allocate a new target vector */ + ret = parent->chip->irq_set_affinity(parent, mask, force); + if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE) + return ret; + + /* + * For non-maskable and non-remapped MSI interrupts the migration + * to a different destination CPU and a different vector has to be + * done careful to handle the possible stray interrupt which can be + * caused by the non-atomic update of the address/data pair. + * + * Direct update is possible when: + * - The MSI is maskable (remapped MSI does not use this code path)). + * The quirk bit is not set in this case. + * - The new vector is the same as the old vector + * - The old vector is MANAGED_IRQ_SHUTDOWN_VECTOR (interrupt starts up) + * - The new destination CPU is the same as the old destination CPU + */ + if (!irqd_msi_nomask_quirk(irqd) || + cfg->vector == old_cfg.vector || + old_cfg.vector == MANAGED_IRQ_SHUTDOWN_VECTOR || + cfg->dest_apicid == old_cfg.dest_apicid) { + irq_msi_update_msg(irqd, cfg); + return ret; + } + + /* + * Paranoia: Validate that the interrupt target is the local + * CPU. + */ + if (WARN_ON_ONCE(cpu != smp_processor_id())) { + irq_msi_update_msg(irqd, cfg); + return ret; + } + + /* + * Redirect the interrupt to the new vector on the current CPU + * first. This might cause a spurious interrupt on this vector if + * the device raises an interrupt right between this update and the + * update to the final destination CPU. + * + * If the vector is in use then the installed device handler will + * denote it as spurious which is no harm as this is a rare event + * and interrupt handlers have to cope with spurious interrupts + * anyway. If the vector is unused, then it is marked so it won't + * trigger the 'No irq handler for vector' warning in do_IRQ(). + * + * This requires to hold vector lock to prevent concurrent updates to + * the affected vector. + */ + lock_vector_lock(); + + /* + * Mark the new target vector on the local CPU if it is currently + * unused. Reuse the VECTOR_RETRIGGERED state which is also used in + * the CPU hotplug path for a similar purpose. This cannot be + * undone here as the current CPU has interrupts disabled and + * cannot handle the interrupt before the whole set_affinity() + * section is done. In the CPU unplug case, the current CPU is + * about to vanish and will not handle any interrupts anymore. The + * vector is cleaned up when the CPU comes online again. + */ + if (IS_ERR_OR_NULL(this_cpu_read(vector_irq[cfg->vector]))) + this_cpu_write(vector_irq[cfg->vector], VECTOR_RETRIGGERED); + + /* Redirect it to the new vector on the local CPU temporarily */ + old_cfg.vector = cfg->vector; + irq_msi_update_msg(irqd, &old_cfg); + + /* Now transition it to the target CPU */ + irq_msi_update_msg(irqd, cfg); + + /* + * All interrupts after this point are now targeted at the new + * vector/CPU. + * + * Drop vector lock before testing whether the temporary assignment + * to the local CPU was hit by an interrupt raised in the device, + * because the retrigger function acquires vector lock again. + */ + unlock_vector_lock(); + + /* + * Check whether the transition raced with a device interrupt and + * is pending in the local APICs IRR. It is safe to do this outside + * of vector lock as the irq_desc::lock of this interrupt is still + * held and interrupts are disabled: The check is not accessing the + * underlying vector store. It's just checking the local APIC's + * IRR. + */ + if (lapic_vector_set_in_irr(cfg->vector)) + irq_data_get_irq_chip(irqd)->irq_retrigger(irqd); + + return ret; +} + /* * IRQ Chip for MSI PCI/PCI-X/PCI-Express Devices, * which implement the MSI or MSI-X Capability Structure. @@ -61,6 +180,7 @@ .irq_ack = irq_chip_ack_parent, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_compose_msi_msg = irq_msi_compose_msg, + .irq_set_affinity = msi_set_affinity, .flags = IRQCHIP_SKIP_SET_WAKE, }; @@ -149,6 +269,8 @@ } if (!msi_default_domain) pr_warn("failed to initialize irqdomain for MSI/MSI-x.\n"); + else + msi_default_domain->flags |= IRQ_DOMAIN_MSI_NOMASK_QUIRK; } #ifdef CONFIG_IRQ_REMAP diff -Nru linux-4.19.98/arch/x86/kernel/cpu/amd.c linux-4.19.118/arch/x86/kernel/cpu/amd.c --- linux-4.19.98/arch/x86/kernel/cpu/amd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/amd.c 2020-04-23 08:30:24.000000000 +0000 @@ -25,6 +25,7 @@ static const int amd_erratum_383[]; static const int amd_erratum_400[]; +static const int amd_erratum_1054[]; static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum); /* @@ -983,6 +984,15 @@ /* AMD CPUs don't reset SS attributes on SYSRET, Xen does. */ if (!cpu_has(c, X86_FEATURE_XENPV)) set_cpu_bug(c, X86_BUG_SYSRET_SS_ATTRS); + + /* + * Turn on the Instructions Retired free counter on machines not + * susceptible to erratum #1054 "Instructions Retired Performance + * Counter May Be Inaccurate". + */ + if (cpu_has(c, X86_FEATURE_IRPERF) && + !cpu_has_amd_erratum(c, amd_erratum_1054)) + msr_set_bit(MSR_K7_HWCR, MSR_K7_HWCR_IRPERF_EN_BIT); } #ifdef CONFIG_X86_32 @@ -1110,6 +1120,10 @@ static const int amd_erratum_383[] = AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0, 0, 0xff, 0xf)); +/* #1054: Instructions Retired Performance Counter May Be Inaccurate */ +static const int amd_erratum_1054[] = + AMD_OSVW_ERRATUM(0, AMD_MODEL_RANGE(0x17, 0, 0, 0x2f, 0xf)); + static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum) { diff -Nru linux-4.19.98/arch/x86/kernel/cpu/common.c linux-4.19.118/arch/x86/kernel/cpu/common.c --- linux-4.19.98/arch/x86/kernel/cpu/common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/common.c 2020-04-23 08:30:24.000000000 +0000 @@ -387,7 +387,7 @@ * cpuid bit to be set. We need to ensure that we * update that bit in this CPU's "cpu_info". */ - get_cpu_cap(c); + set_cpu_cap(c, X86_FEATURE_OSPKE); } #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS diff -Nru linux-4.19.98/arch/x86/kernel/cpu/intel_rdt.c linux-4.19.118/arch/x86/kernel/cpu/intel_rdt.c --- linux-4.19.98/arch/x86/kernel/cpu/intel_rdt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/intel_rdt.c 2020-04-23 08:30:24.000000000 +0000 @@ -555,6 +555,8 @@ d->id = id; cpumask_set_cpu(cpu, &d->cpu_mask); + rdt_domain_reconfigure_cdp(r); + if (r->alloc_capable && domain_setup_ctrlval(r, d)) { kfree(d); return; diff -Nru linux-4.19.98/arch/x86/kernel/cpu/intel_rdt.h linux-4.19.118/arch/x86/kernel/cpu/intel_rdt.h --- linux-4.19.98/arch/x86/kernel/cpu/intel_rdt.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/intel_rdt.h 2020-04-23 08:30:24.000000000 +0000 @@ -567,5 +567,6 @@ void cqm_handle_limbo(struct work_struct *work); bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d); void __check_limbo(struct rdt_domain *d, bool force_free); +void rdt_domain_reconfigure_cdp(struct rdt_resource *r); #endif /* _ASM_X86_INTEL_RDT_H */ diff -Nru linux-4.19.98/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c linux-4.19.118/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c --- linux-4.19.98/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c 2020-04-23 08:30:24.000000000 +0000 @@ -1777,6 +1777,19 @@ return 0; } +/* Restore the qos cfg state when a domain comes online */ +void rdt_domain_reconfigure_cdp(struct rdt_resource *r) +{ + if (!r->alloc_capable) + return; + + if (r == &rdt_resources_all[RDT_RESOURCE_L2DATA]) + l2_qos_cfg_update(&r->alloc_enabled); + + if (r == &rdt_resources_all[RDT_RESOURCE_L3DATA]) + l3_qos_cfg_update(&r->alloc_enabled); +} + /* * Enable or disable the MBA software controller * which helps user specify bandwidth in MBps. @@ -2005,7 +2018,7 @@ if (rdt_mon_capable) { ret = mongroup_create_dir(rdtgroup_default.kn, - NULL, "mon_groups", + &rdtgroup_default, "mon_groups", &kn_mongrp); if (ret) { dentry = ERR_PTR(ret); @@ -2167,7 +2180,11 @@ list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) { free_rmid(sentry->mon.rmid); list_del(&sentry->mon.crdtgrp_list); - kfree(sentry); + + if (atomic_read(&sentry->waitcount) != 0) + sentry->flags = RDT_DELETED; + else + kfree(sentry); } } @@ -2205,7 +2222,11 @@ kernfs_remove(rdtgrp->kn); list_del(&rdtgrp->rdtgroup_list); - kfree(rdtgrp); + + if (atomic_read(&rdtgrp->waitcount) != 0) + rdtgrp->flags = RDT_DELETED; + else + kfree(rdtgrp); } /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */ update_closid_rmid(cpu_online_mask, &rdtgroup_default); @@ -2407,7 +2428,7 @@ /* * Create the mon_data directory first. */ - ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn); + ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn); if (ret) return ret; @@ -2560,7 +2581,7 @@ uint files = 0; int ret; - prdtgrp = rdtgroup_kn_lock_live(prgrp_kn); + prdtgrp = rdtgroup_kn_lock_live(parent_kn); rdt_last_cmd_clear(); if (!prdtgrp) { ret = -ENODEV; @@ -2635,7 +2656,7 @@ kernfs_activate(kn); /* - * The caller unlocks the prgrp_kn upon success. + * The caller unlocks the parent_kn upon success. */ return 0; @@ -2646,7 +2667,7 @@ out_free_rgrp: kfree(rdtgrp); out_unlock: - rdtgroup_kn_unlock(prgrp_kn); + rdtgroup_kn_unlock(parent_kn); return ret; } @@ -2684,7 +2705,7 @@ */ list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list); - rdtgroup_kn_unlock(prgrp_kn); + rdtgroup_kn_unlock(parent_kn); return ret; } @@ -2727,7 +2748,7 @@ * Create an empty mon_groups directory to hold the subset * of tasks and cpus to monitor. */ - ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL); + ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL); if (ret) { rdt_last_cmd_puts("kernfs subdir error\n"); goto out_del_list; @@ -2743,7 +2764,7 @@ out_common_fail: mkdir_rdt_prepare_clean(rdtgrp); out_unlock: - rdtgroup_kn_unlock(prgrp_kn); + rdtgroup_kn_unlock(parent_kn); return ret; } @@ -2869,13 +2890,13 @@ closid_free(rdtgrp->closid); free_rmid(rdtgrp->mon.rmid); + rdtgroup_ctrl_remove(kn, rdtgrp); + /* * Free all the child monitor group rmids. */ free_all_child_rdtgrp(rdtgrp); - rdtgroup_ctrl_remove(kn, rdtgrp); - return 0; } @@ -2902,7 +2923,8 @@ * If the rdtgroup is a mon group and parent directory * is a valid "mon_groups" directory, remove the mon group. */ - if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn) { + if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn && + rdtgrp != &rdtgroup_default) { if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP || rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { ret = rdtgroup_ctrl_remove(kn, rdtgrp); diff -Nru linux-4.19.98/arch/x86/kernel/cpu/mcheck/mce_amd.c linux-4.19.118/arch/x86/kernel/cpu/mcheck/mce_amd.c --- linux-4.19.98/arch/x86/kernel/cpu/mcheck/mce_amd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/mcheck/mce_amd.c 2020-04-23 08:30:24.000000000 +0000 @@ -1117,9 +1117,12 @@ .store = store, }; +static void threshold_block_release(struct kobject *kobj); + static struct kobj_type threshold_ktype = { .sysfs_ops = &threshold_ops, .default_attrs = default_attrs, + .release = threshold_block_release, }; static const char *get_name(unsigned int bank, struct threshold_block *b) @@ -1152,8 +1155,9 @@ return buf_mcatype; } -static int allocate_threshold_blocks(unsigned int cpu, unsigned int bank, - unsigned int block, u32 address) +static int allocate_threshold_blocks(unsigned int cpu, struct threshold_bank *tb, + unsigned int bank, unsigned int block, + u32 address) { struct threshold_block *b = NULL; u32 low, high; @@ -1197,16 +1201,12 @@ INIT_LIST_HEAD(&b->miscj); - if (per_cpu(threshold_banks, cpu)[bank]->blocks) { - list_add(&b->miscj, - &per_cpu(threshold_banks, cpu)[bank]->blocks->miscj); - } else { - per_cpu(threshold_banks, cpu)[bank]->blocks = b; - } + if (tb->blocks) + list_add(&b->miscj, &tb->blocks->miscj); + else + tb->blocks = b; - err = kobject_init_and_add(&b->kobj, &threshold_ktype, - per_cpu(threshold_banks, cpu)[bank]->kobj, - get_name(bank, b)); + err = kobject_init_and_add(&b->kobj, &threshold_ktype, tb->kobj, get_name(bank, b)); if (err) goto out_free; recurse: @@ -1214,7 +1214,7 @@ if (!address) return 0; - err = allocate_threshold_blocks(cpu, bank, block, address); + err = allocate_threshold_blocks(cpu, tb, bank, block, address); if (err) goto out_free; @@ -1299,8 +1299,6 @@ goto out_free; } - per_cpu(threshold_banks, cpu)[bank] = b; - if (is_shared_bank(bank)) { refcount_set(&b->cpus, 1); @@ -1311,9 +1309,13 @@ } } - err = allocate_threshold_blocks(cpu, bank, 0, msr_ops.misc(bank)); - if (!err) - goto out; + err = allocate_threshold_blocks(cpu, b, bank, 0, msr_ops.misc(bank)); + if (err) + goto out_free; + + per_cpu(threshold_banks, cpu)[bank] = b; + + return 0; out_free: kfree(b); @@ -1322,8 +1324,12 @@ return err; } -static void deallocate_threshold_block(unsigned int cpu, - unsigned int bank) +static void threshold_block_release(struct kobject *kobj) +{ + kfree(to_block(kobj)); +} + +static void deallocate_threshold_block(unsigned int cpu, unsigned int bank) { struct threshold_block *pos = NULL; struct threshold_block *tmp = NULL; @@ -1333,13 +1339,11 @@ return; list_for_each_entry_safe(pos, tmp, &head->blocks->miscj, miscj) { - kobject_put(&pos->kobj); list_del(&pos->miscj); - kfree(pos); + kobject_put(&pos->kobj); } - kfree(per_cpu(threshold_banks, cpu)[bank]->blocks); - per_cpu(threshold_banks, cpu)[bank]->blocks = NULL; + kobject_put(&head->blocks->kobj); } static void __threshold_remove_blocks(struct threshold_bank *b) diff -Nru linux-4.19.98/arch/x86/kernel/cpu/mcheck/mce_intel.c linux-4.19.118/arch/x86/kernel/cpu/mcheck/mce_intel.c --- linux-4.19.98/arch/x86/kernel/cpu/mcheck/mce_intel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/mcheck/mce_intel.c 2020-04-23 08:30:24.000000000 +0000 @@ -489,17 +489,18 @@ return; if ((val & 3UL) == 1UL) { - /* PPIN available but disabled: */ + /* PPIN locked in disabled mode */ return; } - /* If PPIN is disabled, but not locked, try to enable: */ - if (!(val & 3UL)) { + /* If PPIN is disabled, try to enable */ + if (!(val & 2UL)) { wrmsrl_safe(MSR_PPIN_CTL, val | 2UL); rdmsrl_safe(MSR_PPIN_CTL, &val); } - if ((val & 3UL) == 2UL) + /* Is the enable bit set? */ + if (val & 2UL) set_cpu_cap(c, X86_FEATURE_INTEL_PPIN); } } diff -Nru linux-4.19.98/arch/x86/kernel/cpu/mshyperv.c linux-4.19.118/arch/x86/kernel/cpu/mshyperv.c --- linux-4.19.98/arch/x86/kernel/cpu/mshyperv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/mshyperv.c 2020-04-23 08:30:24.000000000 +0000 @@ -250,6 +250,16 @@ cpuid_eax(HYPERV_CPUID_NESTED_FEATURES); } + /* + * Hyper-V expects to get crash register data or kmsg when + * crash enlightment is available and system crashes. Set + * crash_kexec_post_notifiers to be true to make sure that + * calling crash enlightment interface before running kdump + * kernel. + */ + if (ms_hyperv.misc_features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) + crash_kexec_post_notifiers = true; + #ifdef CONFIG_X86_LOCAL_APIC if (ms_hyperv.features & HV_X64_ACCESS_FREQUENCY_MSRS && ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) { diff -Nru linux-4.19.98/arch/x86/kernel/cpu/tsx.c linux-4.19.118/arch/x86/kernel/cpu/tsx.c --- linux-4.19.98/arch/x86/kernel/cpu/tsx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/cpu/tsx.c 2020-04-23 08:30:24.000000000 +0000 @@ -115,11 +115,12 @@ tsx_disable(); /* - * tsx_disable() will change the state of the - * RTM CPUID bit. Clear it here since it is now - * expected to be not set. + * tsx_disable() will change the state of the RTM and HLE CPUID + * bits. Clear them here since they are now expected to be not + * set. */ setup_clear_cpu_cap(X86_FEATURE_RTM); + setup_clear_cpu_cap(X86_FEATURE_HLE); } else if (tsx_ctrl_state == TSX_CTRL_ENABLE) { /* @@ -131,10 +132,10 @@ tsx_enable(); /* - * tsx_enable() will change the state of the - * RTM CPUID bit. Force it here since it is now - * expected to be set. + * tsx_enable() will change the state of the RTM and HLE CPUID + * bits. Force them here since they are now expected to be set. */ setup_force_cpu_cap(X86_FEATURE_RTM); + setup_force_cpu_cap(X86_FEATURE_HLE); } } diff -Nru linux-4.19.98/arch/x86/kernel/ftrace.c linux-4.19.118/arch/x86/kernel/ftrace.c --- linux-4.19.98/arch/x86/kernel/ftrace.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/ftrace.c 2020-04-23 08:30:24.000000000 +0000 @@ -35,6 +35,7 @@ #ifdef CONFIG_DYNAMIC_FTRACE int ftrace_arch_code_modify_prepare(void) + __acquires(&text_mutex) { mutex_lock(&text_mutex); set_kernel_text_rw(); @@ -43,6 +44,7 @@ } int ftrace_arch_code_modify_post_process(void) + __releases(&text_mutex) { set_all_modules_text_ro(); set_kernel_text_ro(); diff -Nru linux-4.19.98/arch/x86/kernel/ftrace_32.S linux-4.19.118/arch/x86/kernel/ftrace_32.S --- linux-4.19.98/arch/x86/kernel/ftrace_32.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/ftrace_32.S 2020-04-23 08:30:24.000000000 +0000 @@ -9,6 +9,7 @@ #include #include #include +#include #ifdef CC_USING_FENTRY # define function_hook __fentry__ @@ -131,6 +132,8 @@ pushl %ecx pushl %ebx + ENCODE_FRAME_POINTER + movl 12*4(%esp), %eax /* Load ip (1st parameter) */ subl $MCOUNT_INSN_SIZE, %eax /* Adjust ip */ #ifdef CC_USING_FENTRY diff -Nru linux-4.19.98/arch/x86/kernel/ftrace_64.S linux-4.19.118/arch/x86/kernel/ftrace_64.S --- linux-4.19.98/arch/x86/kernel/ftrace_64.S 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/ftrace_64.S 2020-04-23 08:30:24.000000000 +0000 @@ -9,6 +9,7 @@ #include #include #include +#include .code64 .section .entry.text, "ax" @@ -222,6 +223,8 @@ leaq MCOUNT_REG_SIZE+8*2(%rsp), %rcx movq %rcx, RSP(%rsp) + ENCODE_FRAME_POINTER + /* regs go into 4th parameter */ leaq (%rsp), %rcx diff -Nru linux-4.19.98/arch/x86/kernel/kgdb.c linux-4.19.118/arch/x86/kernel/kgdb.c --- linux-4.19.98/arch/x86/kernel/kgdb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/kgdb.c 2020-04-23 08:30:24.000000000 +0000 @@ -438,7 +438,7 @@ */ void kgdb_roundup_cpus(unsigned long flags) { - apic->send_IPI_allbutself(APIC_DM_NMI); + apic->send_IPI_allbutself(NMI_VECTOR); } #endif diff -Nru linux-4.19.98/arch/x86/kernel/nmi.c linux-4.19.118/arch/x86/kernel/nmi.c --- linux-4.19.98/arch/x86/kernel/nmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/nmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -102,18 +102,22 @@ } fs_initcall(nmi_warning_debugfs); -static void nmi_max_handler(struct irq_work *w) +static void nmi_check_duration(struct nmiaction *action, u64 duration) { - struct nmiaction *a = container_of(w, struct nmiaction, irq_work); + u64 whole_msecs = READ_ONCE(action->max_duration); int remainder_ns, decimal_msecs; - u64 whole_msecs = READ_ONCE(a->max_duration); + + if (duration < nmi_longest_ns || duration < action->max_duration) + return; + + action->max_duration = duration; remainder_ns = do_div(whole_msecs, (1000 * 1000)); decimal_msecs = remainder_ns / 1000; printk_ratelimited(KERN_INFO "INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n", - a->handler, whole_msecs, decimal_msecs); + action->handler, whole_msecs, decimal_msecs); } static int nmi_handle(unsigned int type, struct pt_regs *regs) @@ -140,11 +144,7 @@ delta = sched_clock() - delta; trace_nmi_handler(a->handler, (int)delta, thishandled); - if (delta < nmi_longest_ns || delta < a->max_duration) - continue; - - a->max_duration = delta; - irq_work_queue(&a->irq_work); + nmi_check_duration(a, delta); } rcu_read_unlock(); @@ -162,8 +162,6 @@ if (!action->handler) return -EINVAL; - init_irq_work(&action->irq_work, nmi_max_handler); - raw_spin_lock_irqsave(&desc->lock, flags); /* diff -Nru linux-4.19.98/arch/x86/kernel/sysfb_simplefb.c linux-4.19.118/arch/x86/kernel/sysfb_simplefb.c --- linux-4.19.98/arch/x86/kernel/sysfb_simplefb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kernel/sysfb_simplefb.c 2020-04-23 08:30:24.000000000 +0000 @@ -94,11 +94,11 @@ if (si->orig_video_isVGA == VIDEO_TYPE_VLFB) size <<= 16; length = mode->height * mode->stride; - length = PAGE_ALIGN(length); if (length > size) { printk(KERN_WARNING "sysfb: VRAM smaller than advertised\n"); return -EINVAL; } + length = PAGE_ALIGN(length); /* setup IORESOURCE_MEM as framebuffer memory */ memset(&res, 0, sizeof(res)); diff -Nru linux-4.19.98/arch/x86/kvm/cpuid.c linux-4.19.118/arch/x86/kvm/cpuid.c --- linux-4.19.98/arch/x86/kvm/cpuid.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/cpuid.c 2020-04-23 08:30:24.000000000 +0000 @@ -509,7 +509,8 @@ entry->edx |= F(SPEC_CTRL); if (boot_cpu_has(X86_FEATURE_STIBP)) entry->edx |= F(INTEL_STIBP); - if (boot_cpu_has(X86_FEATURE_SSBD)) + if (boot_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) || + boot_cpu_has(X86_FEATURE_AMD_SSBD)) entry->edx |= F(SPEC_CTRL_SSBD); /* * We emulate ARCH_CAPABILITIES in software even diff -Nru linux-4.19.98/arch/x86/kvm/emulate.c linux-4.19.118/arch/x86/kvm/emulate.c --- linux-4.19.98/arch/x86/kvm/emulate.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/emulate.c 2020-04-23 08:30:24.000000000 +0000 @@ -5112,6 +5112,7 @@ ctxt->fetch.ptr = ctxt->fetch.data; ctxt->fetch.end = ctxt->fetch.data + insn_len; ctxt->opcode_len = 1; + ctxt->intercept = x86_intercept_none; if (insn_len > 0) memcpy(ctxt->fetch.data, insn, insn_len); else { @@ -5164,16 +5165,28 @@ ctxt->ad_bytes = def_ad_bytes ^ 6; break; case 0x26: /* ES override */ + has_seg_override = true; + ctxt->seg_override = VCPU_SREG_ES; + break; case 0x2e: /* CS override */ + has_seg_override = true; + ctxt->seg_override = VCPU_SREG_CS; + break; case 0x36: /* SS override */ + has_seg_override = true; + ctxt->seg_override = VCPU_SREG_SS; + break; case 0x3e: /* DS override */ has_seg_override = true; - ctxt->seg_override = (ctxt->b >> 3) & 3; + ctxt->seg_override = VCPU_SREG_DS; break; case 0x64: /* FS override */ + has_seg_override = true; + ctxt->seg_override = VCPU_SREG_FS; + break; case 0x65: /* GS override */ has_seg_override = true; - ctxt->seg_override = ctxt->b & 7; + ctxt->seg_override = VCPU_SREG_GS; break; case 0x40 ... 0x4f: /* REX */ if (mode != X86EMUL_MODE_PROT64) @@ -5257,10 +5270,15 @@ } break; case Escape: - if (ctxt->modrm > 0xbf) - opcode = opcode.u.esc->high[ctxt->modrm - 0xc0]; - else + if (ctxt->modrm > 0xbf) { + size_t size = ARRAY_SIZE(opcode.u.esc->high); + u32 index = array_index_nospec( + ctxt->modrm - 0xc0, size); + + opcode = opcode.u.esc->high[index]; + } else { opcode = opcode.u.esc->op[(ctxt->modrm >> 3) & 7]; + } break; case InstrDual: if ((ctxt->modrm >> 6) == 3) diff -Nru linux-4.19.98/arch/x86/kvm/hyperv.c linux-4.19.118/arch/x86/kvm/hyperv.c --- linux-4.19.98/arch/x86/kvm/hyperv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/hyperv.c 2020-04-23 08:30:24.000000000 +0000 @@ -792,11 +792,12 @@ u32 index, u64 *pdata) { struct kvm_hv *hv = &vcpu->kvm->arch.hyperv; + size_t size = ARRAY_SIZE(hv->hv_crash_param); - if (WARN_ON_ONCE(index >= ARRAY_SIZE(hv->hv_crash_param))) + if (WARN_ON_ONCE(index >= size)) return -EINVAL; - *pdata = hv->hv_crash_param[index]; + *pdata = hv->hv_crash_param[array_index_nospec(index, size)]; return 0; } @@ -835,11 +836,12 @@ u32 index, u64 data) { struct kvm_hv *hv = &vcpu->kvm->arch.hyperv; + size_t size = ARRAY_SIZE(hv->hv_crash_param); - if (WARN_ON_ONCE(index >= ARRAY_SIZE(hv->hv_crash_param))) + if (WARN_ON_ONCE(index >= size)) return -EINVAL; - hv->hv_crash_param[index] = data; + hv->hv_crash_param[array_index_nospec(index, size)] = data; return 0; } diff -Nru linux-4.19.98/arch/x86/kvm/i8259.c linux-4.19.118/arch/x86/kvm/i8259.c --- linux-4.19.98/arch/x86/kvm/i8259.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/i8259.c 2020-04-23 08:30:24.000000000 +0000 @@ -460,10 +460,14 @@ switch (addr) { case 0x20: case 0x21: + pic_lock(s); + pic_ioport_write(&s->pics[0], addr, data); + pic_unlock(s); + break; case 0xa0: case 0xa1: pic_lock(s); - pic_ioport_write(&s->pics[addr >> 7], addr, data); + pic_ioport_write(&s->pics[1], addr, data); pic_unlock(s); break; case 0x4d0: diff -Nru linux-4.19.98/arch/x86/kvm/ioapic.c linux-4.19.118/arch/x86/kvm/ioapic.c --- linux-4.19.98/arch/x86/kvm/ioapic.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/ioapic.c 2020-04-23 08:30:24.000000000 +0000 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -73,13 +74,14 @@ default: { u32 redir_index = (ioapic->ioregsel - 0x10) >> 1; - u64 redir_content; + u64 redir_content = ~0ULL; - if (redir_index < IOAPIC_NUM_PINS) - redir_content = - ioapic->redirtbl[redir_index].bits; - else - redir_content = ~0ULL; + if (redir_index < IOAPIC_NUM_PINS) { + u32 index = array_index_nospec( + redir_index, IOAPIC_NUM_PINS); + + redir_content = ioapic->redirtbl[index].bits; + } result = (ioapic->ioregsel & 0x1) ? (redir_content >> 32) & 0xffffffff : @@ -297,6 +299,7 @@ ioapic_debug("change redir index %x val %x\n", index, val); if (index >= IOAPIC_NUM_PINS) return; + index = array_index_nospec(index, IOAPIC_NUM_PINS); e = &ioapic->redirtbl[index]; mask_before = e->fields.mask; /* Preserve read-only fields */ diff -Nru linux-4.19.98/arch/x86/kvm/irq_comm.c linux-4.19.118/arch/x86/kvm/irq_comm.c --- linux-4.19.98/arch/x86/kvm/irq_comm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/irq_comm.c 2020-04-23 08:30:24.000000000 +0000 @@ -427,7 +427,7 @@ kvm_set_msi_irq(vcpu->kvm, entry, &irq); - if (irq.level && kvm_apic_match_dest(vcpu, NULL, 0, + if (irq.trig_mode && kvm_apic_match_dest(vcpu, NULL, 0, irq.dest_id, irq.dest_mode)) __set_bit(irq.vector, ioapic_handled_vectors); } diff -Nru linux-4.19.98/arch/x86/kvm/lapic.c linux-4.19.118/arch/x86/kvm/lapic.c --- linux-4.19.98/arch/x86/kvm/lapic.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/lapic.c 2020-04-23 08:30:24.000000000 +0000 @@ -633,9 +633,11 @@ static bool pv_eoi_get_pending(struct kvm_vcpu *vcpu) { u8 val; - if (pv_eoi_get_user(vcpu, &val) < 0) + if (pv_eoi_get_user(vcpu, &val) < 0) { apic_debug("Can't read EOI MSR value: 0x%llx\n", (unsigned long long)vcpu->arch.pv_eoi.msr_val); + return false; + } return val & 0x1; } @@ -1060,11 +1062,8 @@ apic_clear_vector(vector, apic->regs + APIC_TMR); } - if (vcpu->arch.apicv_active) - kvm_x86_ops->deliver_posted_interrupt(vcpu, vector); - else { + if (kvm_x86_ops->deliver_posted_interrupt(vcpu, vector)) { kvm_lapic_set_irr(vector, apic); - kvm_make_request(KVM_REQ_EVENT, vcpu); kvm_vcpu_kick(vcpu); } @@ -1862,15 +1861,20 @@ case APIC_LVTTHMR: case APIC_LVTPC: case APIC_LVT1: - case APIC_LVTERR: + case APIC_LVTERR: { /* TODO: Check vector */ + size_t size; + u32 index; + if (!kvm_apic_sw_enabled(apic)) val |= APIC_LVT_MASKED; - - val &= apic_lvt_mask[(reg - APIC_LVTT) >> 4]; + size = ARRAY_SIZE(apic_lvt_mask); + index = array_index_nospec( + (reg - APIC_LVTT) >> 4, size); + val &= apic_lvt_mask[index]; kvm_lapic_set_reg(apic, reg, val); - break; + } case APIC_LVTT: if (!kvm_apic_sw_enabled(apic)) diff -Nru linux-4.19.98/arch/x86/kvm/mmu.c linux-4.19.118/arch/x86/kvm/mmu.c --- linux-4.19.98/arch/x86/kvm/mmu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/mmu.c 2020-04-23 08:30:24.000000000 +0000 @@ -1184,12 +1184,12 @@ return __mmu_gfn_lpage_is_disallowed(gfn, level, slot); } -static int host_mapping_level(struct kvm *kvm, gfn_t gfn) +static int host_mapping_level(struct kvm_vcpu *vcpu, gfn_t gfn) { unsigned long page_size; int i, ret = 0; - page_size = kvm_host_page_size(kvm, gfn); + page_size = kvm_host_page_size(vcpu, gfn); for (i = PT_PAGE_TABLE_LEVEL; i <= PT_MAX_HUGEPAGE_LEVEL; ++i) { if (page_size >= KVM_HPAGE_SIZE(i)) @@ -1239,7 +1239,7 @@ if (unlikely(*force_pt_level)) return PT_PAGE_TABLE_LEVEL; - host_level = host_mapping_level(vcpu->kvm, large_gfn); + host_level = host_mapping_level(vcpu, large_gfn); if (host_level == PT_PAGE_TABLE_LEVEL) return host_level; @@ -3390,7 +3390,7 @@ * - true: let the vcpu to access on the same address again. * - false: let the real page fault path to fix it. */ -static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level, +static bool fast_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int level, u32 error_code) { struct kvm_shadow_walk_iterator iterator; @@ -3410,7 +3410,7 @@ do { u64 new_spte; - for_each_shadow_entry_lockless(vcpu, gva, iterator, spte) + for_each_shadow_entry_lockless(vcpu, cr2_or_gpa, iterator, spte) if (!is_shadow_present_pte(spte) || iterator.level < level) break; @@ -3488,7 +3488,7 @@ } while (true); - trace_fast_page_fault(vcpu, gva, error_code, iterator.sptep, + trace_fast_page_fault(vcpu, cr2_or_gpa, error_code, iterator.sptep, spte, fault_handled); walk_shadow_page_lockless_end(vcpu); @@ -3496,10 +3496,11 @@ } static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, - gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable); + gpa_t cr2_or_gpa, kvm_pfn_t *pfn, bool write, + bool *writable); static int make_mmu_pages_available(struct kvm_vcpu *vcpu); -static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, u32 error_code, +static int nonpaging_map(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, gfn_t gfn, bool prefault) { int r; @@ -3525,16 +3526,16 @@ gfn &= ~(KVM_PAGES_PER_HPAGE(level) - 1); } - if (fast_page_fault(vcpu, v, level, error_code)) + if (fast_page_fault(vcpu, gpa, level, error_code)) return RET_PF_RETRY; mmu_seq = vcpu->kvm->mmu_notifier_seq; smp_rmb(); - if (try_async_pf(vcpu, prefault, gfn, v, &pfn, write, &map_writable)) + if (try_async_pf(vcpu, prefault, gfn, gpa, &pfn, write, &map_writable)) return RET_PF_RETRY; - if (handle_abnormal_pfn(vcpu, v, gfn, pfn, ACC_ALL, &r)) + if (handle_abnormal_pfn(vcpu, gpa, gfn, pfn, ACC_ALL, &r)) return r; r = RET_PF_RETRY; @@ -3545,7 +3546,7 @@ goto out_unlock; if (likely(!force_pt_level)) transparent_hugepage_adjust(vcpu, gfn, &pfn, &level); - r = __direct_map(vcpu, v, write, map_writable, level, pfn, + r = __direct_map(vcpu, gpa, write, map_writable, level, pfn, prefault, false); out_unlock: spin_unlock(&vcpu->kvm->mmu_lock); @@ -3838,7 +3839,7 @@ } EXPORT_SYMBOL_GPL(kvm_mmu_sync_roots); -static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr, +static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gpa_t vaddr, u32 access, struct x86_exception *exception) { if (exception) @@ -3846,7 +3847,7 @@ return vaddr; } -static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gva_t vaddr, +static gpa_t nonpaging_gva_to_gpa_nested(struct kvm_vcpu *vcpu, gpa_t vaddr, u32 access, struct x86_exception *exception) { @@ -4006,13 +4007,14 @@ walk_shadow_page_lockless_end(vcpu); } -static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, +static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, bool prefault) { - gfn_t gfn = gva >> PAGE_SHIFT; + gfn_t gfn = gpa >> PAGE_SHIFT; int r; - pgprintk("%s: gva %lx error %x\n", __func__, gva, error_code); + /* Note, paging is disabled, ergo gva == gpa. */ + pgprintk("%s: gva %lx error %x\n", __func__, gpa, error_code); if (page_fault_handle_page_track(vcpu, error_code, gfn)) return RET_PF_EMULATE; @@ -4024,11 +4026,12 @@ MMU_WARN_ON(!VALID_PAGE(vcpu->arch.mmu.root_hpa)); - return nonpaging_map(vcpu, gva & PAGE_MASK, + return nonpaging_map(vcpu, gpa & PAGE_MASK, error_code, gfn, prefault); } -static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn) +static int kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + gfn_t gfn) { struct kvm_arch_async_pf arch; @@ -4037,7 +4040,8 @@ arch.direct_map = vcpu->arch.mmu.direct_map; arch.cr3 = vcpu->arch.mmu.get_cr3(vcpu); - return kvm_setup_async_pf(vcpu, gva, kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch); + return kvm_setup_async_pf(vcpu, cr2_or_gpa, + kvm_vcpu_gfn_to_hva(vcpu, gfn), &arch); } bool kvm_can_do_async_pf(struct kvm_vcpu *vcpu) @@ -4054,7 +4058,8 @@ } static bool try_async_pf(struct kvm_vcpu *vcpu, bool prefault, gfn_t gfn, - gva_t gva, kvm_pfn_t *pfn, bool write, bool *writable) + gpa_t cr2_or_gpa, kvm_pfn_t *pfn, bool write, + bool *writable) { struct kvm_memory_slot *slot; bool async; @@ -4074,12 +4079,12 @@ return false; /* *pfn has correct page already */ if (!prefault && kvm_can_do_async_pf(vcpu)) { - trace_kvm_try_async_get_page(gva, gfn); + trace_kvm_try_async_get_page(cr2_or_gpa, gfn); if (kvm_find_async_pf_gfn(vcpu, gfn)) { - trace_kvm_async_pf_doublefault(gva, gfn); + trace_kvm_async_pf_doublefault(cr2_or_gpa, gfn); kvm_make_request(KVM_REQ_APF_HALT, vcpu); return true; - } else if (kvm_arch_setup_async_pf(vcpu, gva, gfn)) + } else if (kvm_arch_setup_async_pf(vcpu, cr2_or_gpa, gfn)) return true; } @@ -4092,6 +4097,12 @@ { int r = 1; +#ifndef CONFIG_X86_64 + /* A 64-bit CR2 should be impossible on 32-bit KVM. */ + if (WARN_ON_ONCE(fault_address >> 32)) + return -EFAULT; +#endif + vcpu->arch.l1tf_flush_l1d = true; switch (vcpu->arch.apf.host_apf_reason) { default: @@ -4129,7 +4140,7 @@ return kvm_mtrr_check_gfn_range_consistency(vcpu, gfn, page_num); } -static int tdp_page_fault(struct kvm_vcpu *vcpu, gva_t gpa, u32 error_code, +static int tdp_page_fault(struct kvm_vcpu *vcpu, gpa_t gpa, u32 error_code, bool prefault) { kvm_pfn_t pfn; @@ -5307,7 +5318,7 @@ return 0; } -int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code, +int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code, void *insn, int insn_len) { int r, emulation_type = 0; @@ -5317,19 +5328,20 @@ /* With shadow page tables, fault_address contains a GVA or nGPA. */ if (vcpu->arch.mmu.direct_map) { vcpu->arch.gpa_available = true; - vcpu->arch.gpa_val = cr2; + vcpu->arch.gpa_val = cr2_or_gpa; } r = RET_PF_INVALID; if (unlikely(error_code & PFERR_RSVD_MASK)) { - r = handle_mmio_page_fault(vcpu, cr2, direct); + r = handle_mmio_page_fault(vcpu, cr2_or_gpa, direct); if (r == RET_PF_EMULATE) goto emulate; } if (r == RET_PF_INVALID) { - r = vcpu->arch.mmu.page_fault(vcpu, cr2, lower_32_bits(error_code), - false); + r = vcpu->arch.mmu.page_fault(vcpu, cr2_or_gpa, + lower_32_bits(error_code), + false); WARN_ON(r == RET_PF_INVALID); } @@ -5347,7 +5359,7 @@ */ if (vcpu->arch.mmu.direct_map && (error_code & PFERR_NESTED_GUEST_PAGE) == PFERR_NESTED_GUEST_PAGE) { - kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(cr2)); + kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(cr2_or_gpa)); return 1; } @@ -5362,7 +5374,7 @@ * explicitly shadowing L1's page tables, i.e. unprotecting something * for L1 isn't going to magically fix whatever issue cause L2 to fail. */ - if (!mmio_info_in_cache(vcpu, cr2, direct) && !is_guest_mode(vcpu)) + if (!mmio_info_in_cache(vcpu, cr2_or_gpa, direct) && !is_guest_mode(vcpu)) emulation_type = EMULTYPE_ALLOW_RETRY; emulate: /* @@ -5375,7 +5387,7 @@ if (unlikely(insn && !insn_len)) return 1; - er = x86_emulate_instruction(vcpu, cr2, emulation_type, insn, insn_len); + er = x86_emulate_instruction(vcpu, cr2_or_gpa, emulation_type, insn, insn_len); switch (er) { case EMULATE_DONE: diff -Nru linux-4.19.98/arch/x86/kvm/mmutrace.h linux-4.19.118/arch/x86/kvm/mmutrace.h --- linux-4.19.98/arch/x86/kvm/mmutrace.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/mmutrace.h 2020-04-23 08:30:24.000000000 +0000 @@ -249,13 +249,13 @@ TRACE_EVENT( fast_page_fault, - TP_PROTO(struct kvm_vcpu *vcpu, gva_t gva, u32 error_code, + TP_PROTO(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u32 error_code, u64 *sptep, u64 old_spte, bool retry), - TP_ARGS(vcpu, gva, error_code, sptep, old_spte, retry), + TP_ARGS(vcpu, cr2_or_gpa, error_code, sptep, old_spte, retry), TP_STRUCT__entry( __field(int, vcpu_id) - __field(gva_t, gva) + __field(gpa_t, cr2_or_gpa) __field(u32, error_code) __field(u64 *, sptep) __field(u64, old_spte) @@ -265,7 +265,7 @@ TP_fast_assign( __entry->vcpu_id = vcpu->vcpu_id; - __entry->gva = gva; + __entry->cr2_or_gpa = cr2_or_gpa; __entry->error_code = error_code; __entry->sptep = sptep; __entry->old_spte = old_spte; @@ -273,9 +273,9 @@ __entry->retry = retry; ), - TP_printk("vcpu %d gva %lx error_code %s sptep %p old %#llx" + TP_printk("vcpu %d gva %llx error_code %s sptep %p old %#llx" " new %llx spurious %d fixed %d", __entry->vcpu_id, - __entry->gva, __print_flags(__entry->error_code, "|", + __entry->cr2_or_gpa, __print_flags(__entry->error_code, "|", kvm_mmu_trace_pferr_flags), __entry->sptep, __entry->old_spte, __entry->new_spte, __spte_satisfied(old_spte), __spte_satisfied(new_spte) diff -Nru linux-4.19.98/arch/x86/kvm/mtrr.c linux-4.19.118/arch/x86/kvm/mtrr.c --- linux-4.19.98/arch/x86/kvm/mtrr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/mtrr.c 2020-04-23 08:30:24.000000000 +0000 @@ -194,11 +194,15 @@ break; case MSR_MTRRfix16K_80000 ... MSR_MTRRfix16K_A0000: *seg = 1; - *unit = msr - MSR_MTRRfix16K_80000; + *unit = array_index_nospec( + msr - MSR_MTRRfix16K_80000, + MSR_MTRRfix16K_A0000 - MSR_MTRRfix16K_80000 + 1); break; case MSR_MTRRfix4K_C0000 ... MSR_MTRRfix4K_F8000: *seg = 2; - *unit = msr - MSR_MTRRfix4K_C0000; + *unit = array_index_nospec( + msr - MSR_MTRRfix4K_C0000, + MSR_MTRRfix4K_F8000 - MSR_MTRRfix4K_C0000 + 1); break; default: return false; diff -Nru linux-4.19.98/arch/x86/kvm/paging_tmpl.h linux-4.19.118/arch/x86/kvm/paging_tmpl.h --- linux-4.19.98/arch/x86/kvm/paging_tmpl.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/paging_tmpl.h 2020-04-23 08:30:24.000000000 +0000 @@ -36,7 +36,7 @@ #define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT #define PT_HAVE_ACCESSED_DIRTY(mmu) true #ifdef CONFIG_X86_64 - #define PT_MAX_FULL_LEVELS 4 + #define PT_MAX_FULL_LEVELS PT64_ROOT_MAX_LEVEL #define CMPXCHG cmpxchg #else #define CMPXCHG cmpxchg64 @@ -273,11 +273,11 @@ } /* - * Fetch a guest pte for a guest virtual address + * Fetch a guest pte for a guest virtual address, or for an L2's GPA. */ static int FNAME(walk_addr_generic)(struct guest_walker *walker, struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, - gva_t addr, u32 access) + gpa_t addr, u32 access) { int ret; pt_element_t pte; @@ -478,7 +478,7 @@ } static int FNAME(walk_addr)(struct guest_walker *walker, - struct kvm_vcpu *vcpu, gva_t addr, u32 access) + struct kvm_vcpu *vcpu, gpa_t addr, u32 access) { return FNAME(walk_addr_generic)(walker, vcpu, &vcpu->arch.mmu, addr, access); @@ -593,7 +593,7 @@ * If the guest tries to write a write-protected page, we need to * emulate this operation, return 1 to indicate this case. */ -static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, +static int FNAME(fetch)(struct kvm_vcpu *vcpu, gpa_t addr, struct guest_walker *gw, int write_fault, int hlevel, kvm_pfn_t pfn, bool map_writable, bool prefault, @@ -747,7 +747,7 @@ * Returns: 1 if we need to emulate the instruction, 0 otherwise, or * a negative value on error. */ -static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, u32 error_code, +static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gpa_t addr, u32 error_code, bool prefault) { int write_fault = error_code & PFERR_WRITE_MASK; @@ -926,18 +926,19 @@ spin_unlock(&vcpu->kvm->mmu_lock); } -static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access, +/* Note, @addr is a GPA when gva_to_gpa() translates an L2 GPA to an L1 GPA. */ +static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gpa_t addr, u32 access, struct x86_exception *exception) { struct guest_walker walker; gpa_t gpa = UNMAPPED_GVA; int r; - r = FNAME(walk_addr)(&walker, vcpu, vaddr, access); + r = FNAME(walk_addr)(&walker, vcpu, addr, access); if (r) { gpa = gfn_to_gpa(walker.gfn); - gpa |= vaddr & ~PAGE_MASK; + gpa |= addr & ~PAGE_MASK; } else if (exception) *exception = walker.fault; @@ -945,7 +946,8 @@ } #if PTTYPE != PTTYPE_EPT -static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, +/* Note, gva_to_gpa_nested() is only used to translate L2 GVAs. */ +static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gpa_t vaddr, u32 access, struct x86_exception *exception) { @@ -953,6 +955,11 @@ gpa_t gpa = UNMAPPED_GVA; int r; +#ifndef CONFIG_X86_64 + /* A 64-bit GVA should be impossible on 32-bit KVM. */ + WARN_ON_ONCE(vaddr >> 32); +#endif + r = FNAME(walk_addr_nested)(&walker, vcpu, vaddr, access); if (r) { diff -Nru linux-4.19.98/arch/x86/kvm/pmu.h linux-4.19.118/arch/x86/kvm/pmu.h --- linux-4.19.98/arch/x86/kvm/pmu.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/pmu.h 2020-04-23 08:30:24.000000000 +0000 @@ -2,6 +2,8 @@ #ifndef __KVM_X86_PMU_H #define __KVM_X86_PMU_H +#include + #define vcpu_to_pmu(vcpu) (&(vcpu)->arch.pmu) #define pmu_to_vcpu(pmu) (container_of((pmu), struct kvm_vcpu, arch.pmu)) #define pmc_to_pmu(pmc) (&(pmc)->vcpu->arch.pmu) @@ -86,8 +88,12 @@ static inline struct kvm_pmc *get_gp_pmc(struct kvm_pmu *pmu, u32 msr, u32 base) { - if (msr >= base && msr < base + pmu->nr_arch_gp_counters) - return &pmu->gp_counters[msr - base]; + if (msr >= base && msr < base + pmu->nr_arch_gp_counters) { + u32 index = array_index_nospec(msr - base, + pmu->nr_arch_gp_counters); + + return &pmu->gp_counters[index]; + } return NULL; } @@ -97,8 +103,12 @@ { int base = MSR_CORE_PERF_FIXED_CTR0; - if (msr >= base && msr < base + pmu->nr_arch_fixed_counters) - return &pmu->fixed_counters[msr - base]; + if (msr >= base && msr < base + pmu->nr_arch_fixed_counters) { + u32 index = array_index_nospec(msr - base, + pmu->nr_arch_fixed_counters); + + return &pmu->fixed_counters[index]; + } return NULL; } diff -Nru linux-4.19.98/arch/x86/kvm/pmu_intel.c linux-4.19.118/arch/x86/kvm/pmu_intel.c --- linux-4.19.98/arch/x86/kvm/pmu_intel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/pmu_intel.c 2020-04-23 08:30:24.000000000 +0000 @@ -87,10 +87,14 @@ static unsigned intel_find_fixed_event(int idx) { - if (idx >= ARRAY_SIZE(fixed_pmc_events)) + u32 event; + size_t size = ARRAY_SIZE(fixed_pmc_events); + + if (idx >= size) return PERF_COUNT_HW_MAX; - return intel_arch_events[fixed_pmc_events[idx]].event_type; + event = fixed_pmc_events[array_index_nospec(idx, size)]; + return intel_arch_events[event].event_type; } /* check if a PMC is enabled by comparing it with globl_ctrl bits. */ @@ -131,16 +135,20 @@ struct kvm_pmu *pmu = vcpu_to_pmu(vcpu); bool fixed = idx & (1u << 30); struct kvm_pmc *counters; + unsigned int num_counters; idx &= ~(3u << 30); - if (!fixed && idx >= pmu->nr_arch_gp_counters) - return NULL; - if (fixed && idx >= pmu->nr_arch_fixed_counters) + if (fixed) { + counters = pmu->fixed_counters; + num_counters = pmu->nr_arch_fixed_counters; + } else { + counters = pmu->gp_counters; + num_counters = pmu->nr_arch_gp_counters; + } + if (idx >= num_counters) return NULL; - counters = fixed ? pmu->fixed_counters : pmu->gp_counters; *mask &= pmu->counter_bitmask[fixed ? KVM_PMC_FIXED : KVM_PMC_GP]; - - return &counters[idx]; + return &counters[array_index_nospec(idx, num_counters)]; } static bool intel_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr) diff -Nru linux-4.19.98/arch/x86/kvm/svm.c linux-4.19.118/arch/x86/kvm/svm.c --- linux-4.19.98/arch/x86/kvm/svm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/svm.c 2020-04-23 08:30:24.000000000 +0000 @@ -1298,6 +1298,47 @@ control->pause_filter_count, old); } +/* + * The default MMIO mask is a single bit (excluding the present bit), + * which could conflict with the memory encryption bit. Check for + * memory encryption support and override the default MMIO mask if + * memory encryption is enabled. + */ +static __init void svm_adjust_mmio_mask(void) +{ + unsigned int enc_bit, mask_bit; + u64 msr, mask; + + /* If there is no memory encryption support, use existing mask */ + if (cpuid_eax(0x80000000) < 0x8000001f) + return; + + /* If memory encryption is not enabled, use existing mask */ + rdmsrl(MSR_K8_SYSCFG, msr); + if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT)) + return; + + enc_bit = cpuid_ebx(0x8000001f) & 0x3f; + mask_bit = boot_cpu_data.x86_phys_bits; + + /* Increment the mask bit if it is the same as the encryption bit */ + if (enc_bit == mask_bit) + mask_bit++; + + /* + * If the mask bit location is below 52, then some bits above the + * physical addressing limit will always be reserved, so use the + * rsvd_bits() function to generate the mask. This mask, along with + * the present bit, will be used to generate a page fault with + * PFER.RSV = 1. + * + * If the mask bit location is 52 (or above), then clear the mask. + */ + mask = (mask_bit < 52) ? rsvd_bits(mask_bit, 51) | PT_PRESENT_MASK : 0; + + kvm_mmu_set_mmio_spte_mask(mask, mask); +} + static __init int svm_hardware_setup(void) { int cpu; @@ -1352,6 +1393,8 @@ } } + svm_adjust_mmio_mask(); + for_each_possible_cpu(cpu) { r = svm_cpu_init(cpu); if (r) @@ -1874,6 +1917,10 @@ static struct kvm *svm_vm_alloc(void) { struct kvm_svm *kvm_svm = vzalloc(sizeof(struct kvm_svm)); + + if (!kvm_svm) + return NULL; + return &kvm_svm->kvm; } @@ -5140,8 +5187,11 @@ return; } -static void svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec) +static int svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec) { + if (!vcpu->arch.apicv_active) + return -1; + kvm_lapic_set_irr(vec, vcpu->arch.apic); smp_mb__after_atomic(); @@ -5150,6 +5200,8 @@ kvm_cpu_get_apicid(vcpu->cpu)); else kvm_vcpu_wake_up(vcpu); + + return 0; } static bool svm_dy_apicv_has_pending_interrupt(struct kvm_vcpu *vcpu) diff -Nru linux-4.19.98/arch/x86/kvm/vmx.c linux-4.19.118/arch/x86/kvm/vmx.c --- linux-4.19.98/arch/x86/kvm/vmx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/vmx.c 2020-04-23 08:30:24.000000000 +0000 @@ -2156,43 +2156,15 @@ } #ifdef CONFIG_KEXEC_CORE -/* - * This bitmap is used to indicate whether the vmclear - * operation is enabled on all cpus. All disabled by - * default. - */ -static cpumask_t crash_vmclear_enabled_bitmap = CPU_MASK_NONE; - -static inline void crash_enable_local_vmclear(int cpu) -{ - cpumask_set_cpu(cpu, &crash_vmclear_enabled_bitmap); -} - -static inline void crash_disable_local_vmclear(int cpu) -{ - cpumask_clear_cpu(cpu, &crash_vmclear_enabled_bitmap); -} - -static inline int crash_local_vmclear_enabled(int cpu) -{ - return cpumask_test_cpu(cpu, &crash_vmclear_enabled_bitmap); -} - static void crash_vmclear_local_loaded_vmcss(void) { int cpu = raw_smp_processor_id(); struct loaded_vmcs *v; - if (!crash_local_vmclear_enabled(cpu)) - return; - list_for_each_entry(v, &per_cpu(loaded_vmcss_on_cpu, cpu), loaded_vmcss_on_cpu_link) vmcs_clear(v->vmcs); } -#else -static inline void crash_enable_local_vmclear(int cpu) { } -static inline void crash_disable_local_vmclear(int cpu) { } #endif /* CONFIG_KEXEC_CORE */ static void __loaded_vmcs_clear(void *arg) @@ -2204,19 +2176,24 @@ return; /* vcpu migration can race with cpu offline */ if (per_cpu(current_vmcs, cpu) == loaded_vmcs->vmcs) per_cpu(current_vmcs, cpu) = NULL; - crash_disable_local_vmclear(cpu); + + vmcs_clear(loaded_vmcs->vmcs); + if (loaded_vmcs->shadow_vmcs && loaded_vmcs->launched) + vmcs_clear(loaded_vmcs->shadow_vmcs); + list_del(&loaded_vmcs->loaded_vmcss_on_cpu_link); /* - * we should ensure updating loaded_vmcs->loaded_vmcss_on_cpu_link - * is before setting loaded_vmcs->vcpu to -1 which is done in - * loaded_vmcs_init. Otherwise, other cpu can see vcpu = -1 fist - * then adds the vmcs into percpu list before it is deleted. + * Ensure all writes to loaded_vmcs, including deleting it from its + * current percpu list, complete before setting loaded_vmcs->vcpu to + * -1, otherwise a different cpu can see vcpu == -1 first and add + * loaded_vmcs to its percpu list before it's deleted from this cpu's + * list. Pairs with the smp_rmb() in vmx_vcpu_load_vmcs(). */ smp_wmb(); - loaded_vmcs_init(loaded_vmcs); - crash_enable_local_vmclear(cpu); + loaded_vmcs->cpu = -1; + loaded_vmcs->launched = 0; } static void loaded_vmcs_clear(struct loaded_vmcs *loaded_vmcs) @@ -3067,18 +3044,17 @@ if (!already_loaded) { loaded_vmcs_clear(vmx->loaded_vmcs); local_irq_disable(); - crash_disable_local_vmclear(cpu); /* - * Read loaded_vmcs->cpu should be before fetching - * loaded_vmcs->loaded_vmcss_on_cpu_link. - * See the comments in __loaded_vmcs_clear(). + * Ensure loaded_vmcs->cpu is read before adding loaded_vmcs to + * this cpu's percpu list, otherwise it may not yet be deleted + * from its previous cpu's percpu list. Pairs with the + * smb_wmb() in __loaded_vmcs_clear(). */ smp_rmb(); list_add(&vmx->loaded_vmcs->loaded_vmcss_on_cpu_link, &per_cpu(loaded_vmcss_on_cpu, cpu)); - crash_enable_local_vmclear(cpu); local_irq_enable(); } @@ -4422,21 +4398,6 @@ !hv_get_vp_assist_page(cpu)) return -EFAULT; - INIT_LIST_HEAD(&per_cpu(loaded_vmcss_on_cpu, cpu)); - INIT_LIST_HEAD(&per_cpu(blocked_vcpu_on_cpu, cpu)); - spin_lock_init(&per_cpu(blocked_vcpu_on_cpu_lock, cpu)); - - /* - * Now we can enable the vmclear operation in kdump - * since the loaded_vmcss_on_cpu list on this cpu - * has been initialized. - * - * Though the cpu is not in VMX operation now, there - * is no problem to enable the vmclear operation - * for the loaded_vmcss_on_cpu list is empty! - */ - crash_enable_local_vmclear(cpu); - rdmsrl(MSR_IA32_FEATURE_CONTROL, old); test_bits = FEATURE_CONTROL_LOCKED; @@ -5302,6 +5263,9 @@ static int get_ept_level(struct kvm_vcpu *vcpu) { + /* Nested EPT currently only supports 4-level walks. */ + if (is_guest_mode(vcpu) && nested_cpu_has_ept(get_vmcs12(vcpu))) + return 4; if (cpu_has_vmx_ept_5levels() && (cpuid_maxphyaddr(vcpu) > 48)) return 5; return 4; @@ -5722,6 +5686,26 @@ (ss.selector & SEGMENT_RPL_MASK)); } +static bool nested_vmx_check_io_bitmaps(struct kvm_vcpu *vcpu, + unsigned int port, int size); +static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu, + struct vmcs12 *vmcs12) +{ + unsigned long exit_qualification; + unsigned short port; + int size; + + if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) + return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING); + + exit_qualification = vmcs_readl(EXIT_QUALIFICATION); + + port = exit_qualification >> 16; + size = (exit_qualification & 7) + 1; + + return nested_vmx_check_io_bitmaps(vcpu, port, size); +} + /* * Check if guest state is valid. Returns true if valid, false if * not. @@ -6261,24 +6245,29 @@ * 2. If target vcpu isn't running(root mode), kick it to pick up the * interrupt from PIR in next vmentry. */ -static void vmx_deliver_posted_interrupt(struct kvm_vcpu *vcpu, int vector) +static int vmx_deliver_posted_interrupt(struct kvm_vcpu *vcpu, int vector) { struct vcpu_vmx *vmx = to_vmx(vcpu); int r; r = vmx_deliver_nested_posted_interrupt(vcpu, vector); if (!r) - return; + return 0; + + if (!vcpu->arch.apicv_active) + return -1; if (pi_test_and_set_pir(vector, &vmx->pi_desc)) - return; + return 0; /* If a previous notification has sent the IPI, nothing to do. */ if (pi_test_and_set_on(&vmx->pi_desc)) - return; + return 0; if (!kvm_vcpu_trigger_posted_interrupt(vcpu, false)) kvm_vcpu_kick(vcpu); + + return 0; } /* @@ -6926,8 +6915,13 @@ static int vmx_interrupt_allowed(struct kvm_vcpu *vcpu) { - return (!to_vmx(vcpu)->nested.nested_run_pending && - vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) && + if (to_vmx(vcpu)->nested.nested_run_pending) + return false; + + if (is_guest_mode(vcpu) && nested_exit_on_intr(vcpu)) + return true; + + return (vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) && !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & (GUEST_INTR_STATE_STI | GUEST_INTR_STATE_MOV_SS)); } @@ -8793,8 +8787,10 @@ /* _system ok, nested_vmx_check_permission has verified cpl=0 */ if (kvm_write_guest_virt_system(vcpu, gva, &field_value, (is_long_mode(vcpu) ? 8 : 4), - &e)) + &e)) { kvm_inject_page_fault(vcpu, &e); + return 1; + } } nested_vmx_succeed(vcpu); @@ -9464,23 +9460,17 @@ static const int kvm_vmx_max_exit_handlers = ARRAY_SIZE(kvm_vmx_exit_handlers); -static bool nested_vmx_exit_handled_io(struct kvm_vcpu *vcpu, - struct vmcs12 *vmcs12) +/* + * Return true if an IO instruction with the specified port and size should cause + * a VM-exit into L1. + */ +bool nested_vmx_check_io_bitmaps(struct kvm_vcpu *vcpu, unsigned int port, + int size) { - unsigned long exit_qualification; + struct vmcs12 *vmcs12 = get_vmcs12(vcpu); gpa_t bitmap, last_bitmap; - unsigned int port; - int size; u8 b; - if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) - return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING); - - exit_qualification = vmcs_readl(EXIT_QUALIFICATION); - - port = exit_qualification >> 16; - size = (exit_qualification & 7) + 1; - last_bitmap = (gpa_t)-1; b = -1; @@ -10992,6 +10982,10 @@ static struct kvm *vmx_vm_alloc(void) { struct kvm_vmx *kvm_vmx = vzalloc(sizeof(struct kvm_vmx)); + + if (!kvm_vmx) + return NULL; + return &kvm_vmx->kvm; } @@ -12966,7 +12960,7 @@ } } -static int vmx_check_nested_events(struct kvm_vcpu *vcpu, bool external_intr) +static int vmx_check_nested_events(struct kvm_vcpu *vcpu) { struct vcpu_vmx *vmx = to_vmx(vcpu); unsigned long exit_qual; @@ -13004,8 +12998,7 @@ return 0; } - if ((kvm_cpu_has_interrupt(vcpu) || external_intr) && - nested_exit_on_intr(vcpu)) { + if (kvm_cpu_has_interrupt(vcpu) && nested_exit_on_intr(vcpu)) { if (block_nested_events) return -EBUSY; nested_vmx_vmexit(vcpu, EXIT_REASON_EXTERNAL_INTERRUPT, 0, 0); @@ -13583,17 +13576,8 @@ vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; if (likely(!vmx->fail)) { - /* - * TODO: SDM says that with acknowledge interrupt on - * exit, bit 31 of the VM-exit interrupt information - * (valid interrupt) is always set to 1 on - * EXIT_REASON_EXTERNAL_INTERRUPT, so we shouldn't - * need kvm_cpu_has_interrupt(). See the commit - * message for details. - */ - if (nested_exit_intr_ack_set(vcpu) && - exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT && - kvm_cpu_has_interrupt(vcpu)) { + if (exit_reason == EXIT_REASON_EXTERNAL_INTERRUPT && + nested_exit_intr_ack_set(vcpu)) { int irq = kvm_cpu_get_interrupt(vcpu); WARN_ON(irq < 0); vmcs12->vm_exit_intr_info = irq | @@ -13670,6 +13654,40 @@ to_vmx(vcpu)->nested.sync_shadow_vmcs = true; } +static int vmx_check_intercept_io(struct kvm_vcpu *vcpu, + struct x86_instruction_info *info) +{ + struct vmcs12 *vmcs12 = get_vmcs12(vcpu); + unsigned short port; + bool intercept; + int size; + + if (info->intercept == x86_intercept_in || + info->intercept == x86_intercept_ins) { + port = info->src_val; + size = info->dst_bytes; + } else { + port = info->dst_val; + size = info->src_bytes; + } + + /* + * If the 'use IO bitmaps' VM-execution control is 0, IO instruction + * VM-exits depend on the 'unconditional IO exiting' VM-execution + * control. + * + * Otherwise, IO instruction VM-exits are controlled by the IO bitmaps. + */ + if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS)) + intercept = nested_cpu_has(vmcs12, + CPU_BASED_UNCOND_IO_EXITING); + else + intercept = nested_vmx_check_io_bitmaps(vcpu, port, size); + + /* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED. */ + return intercept ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE; +} + static int vmx_check_intercept(struct kvm_vcpu *vcpu, struct x86_instruction_info *info, enum x86_intercept_stage stage) @@ -13677,19 +13695,45 @@ struct vmcs12 *vmcs12 = get_vmcs12(vcpu); struct x86_emulate_ctxt *ctxt = &vcpu->arch.emulate_ctxt; + switch (info->intercept) { /* * RDPID causes #UD if disabled through secondary execution controls. * Because it is marked as EmulateOnUD, we need to intercept it here. */ - if (info->intercept == x86_intercept_rdtscp && - !nested_cpu_has2(vmcs12, SECONDARY_EXEC_RDTSCP)) { - ctxt->exception.vector = UD_VECTOR; - ctxt->exception.error_code_valid = false; - return X86EMUL_PROPAGATE_FAULT; - } + case x86_intercept_rdtscp: + if (!nested_cpu_has2(vmcs12, SECONDARY_EXEC_RDTSCP)) { + ctxt->exception.vector = UD_VECTOR; + ctxt->exception.error_code_valid = false; + return X86EMUL_PROPAGATE_FAULT; + } + break; + + case x86_intercept_in: + case x86_intercept_ins: + case x86_intercept_out: + case x86_intercept_outs: + return vmx_check_intercept_io(vcpu, info); + + case x86_intercept_lgdt: + case x86_intercept_lidt: + case x86_intercept_lldt: + case x86_intercept_ltr: + case x86_intercept_sgdt: + case x86_intercept_sidt: + case x86_intercept_sldt: + case x86_intercept_str: + if (!nested_cpu_has2(vmcs12, SECONDARY_EXEC_DESC)) + return X86EMUL_CONTINUE; + + /* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED. */ + break; /* TODO: check more intercepts... */ - return X86EMUL_CONTINUE; + default: + break; + } + + return X86EMUL_UNHANDLEABLE; } #ifdef CONFIG_X86_64 @@ -14506,7 +14550,7 @@ static int __init vmx_init(void) { - int r; + int r, cpu; #if IS_ENABLED(CONFIG_HYPERV) /* @@ -14557,6 +14601,12 @@ } } + for_each_possible_cpu(cpu) { + INIT_LIST_HEAD(&per_cpu(loaded_vmcss_on_cpu, cpu)); + INIT_LIST_HEAD(&per_cpu(blocked_vcpu_on_cpu, cpu)); + spin_lock_init(&per_cpu(blocked_vcpu_on_cpu_lock, cpu)); + } + #ifdef CONFIG_KEXEC_CORE rcu_assign_pointer(crash_vmclear_loaded_vmcss, crash_vmclear_local_loaded_vmcss); diff -Nru linux-4.19.98/arch/x86/kvm/x86.c linux-4.19.118/arch/x86/kvm/x86.c --- linux-4.19.98/arch/x86/kvm/x86.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/x86.c 2020-04-23 08:30:24.000000000 +0000 @@ -92,6 +92,8 @@ static u64 __read_mostly efer_reserved_bits = ~((u64)EFER_SCE); #endif +static u64 __read_mostly cr4_reserved_bits = CR4_RESERVED_BITS; + #define VM_STAT(x, ...) offsetof(struct kvm, stat.x), KVM_STAT_VM, ## __VA_ARGS__ #define VCPU_STAT(x, ...) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU, ## __VA_ARGS__ @@ -793,9 +795,38 @@ } EXPORT_SYMBOL_GPL(kvm_set_xcr); +static u64 kvm_host_cr4_reserved_bits(struct cpuinfo_x86 *c) +{ + u64 reserved_bits = CR4_RESERVED_BITS; + + if (!cpu_has(c, X86_FEATURE_XSAVE)) + reserved_bits |= X86_CR4_OSXSAVE; + + if (!cpu_has(c, X86_FEATURE_SMEP)) + reserved_bits |= X86_CR4_SMEP; + + if (!cpu_has(c, X86_FEATURE_SMAP)) + reserved_bits |= X86_CR4_SMAP; + + if (!cpu_has(c, X86_FEATURE_FSGSBASE)) + reserved_bits |= X86_CR4_FSGSBASE; + + if (!cpu_has(c, X86_FEATURE_PKU)) + reserved_bits |= X86_CR4_PKE; + + if (!cpu_has(c, X86_FEATURE_LA57) && + !(cpuid_ecx(0x7) & bit(X86_FEATURE_LA57))) + reserved_bits |= X86_CR4_LA57; + + if (!cpu_has(c, X86_FEATURE_UMIP) && !kvm_x86_ops->umip_emulated()) + reserved_bits |= X86_CR4_UMIP; + + return reserved_bits; +} + static int kvm_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) { - if (cr4 & CR4_RESERVED_BITS) + if (cr4 & cr4_reserved_bits) return -EINVAL; if (!guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && (cr4 & X86_CR4_OSXSAVE)) @@ -961,9 +992,11 @@ static int __kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val) { + size_t size = ARRAY_SIZE(vcpu->arch.db); + switch (dr) { case 0 ... 3: - vcpu->arch.db[dr] = val; + vcpu->arch.db[array_index_nospec(dr, size)] = val; if (!(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)) vcpu->arch.eff_db[dr] = val; break; @@ -1000,9 +1033,11 @@ int kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val) { + size_t size = ARRAY_SIZE(vcpu->arch.db); + switch (dr) { case 0 ... 3: - *val = vcpu->arch.db[dr]; + *val = vcpu->arch.db[array_index_nospec(dr, size)]; break; case 4: /* fall through */ @@ -2269,7 +2304,10 @@ default: if (msr >= MSR_IA32_MC0_CTL && msr < MSR_IA32_MCx_CTL(bank_num)) { - u32 offset = msr - MSR_IA32_MC0_CTL; + u32 offset = array_index_nospec( + msr - MSR_IA32_MC0_CTL, + MSR_IA32_MCx_CTL(bank_num) - MSR_IA32_MC0_CTL); + /* only 0 or all 1s can be written to IA32_MCi_CTL * some Linux kernels though clear bit 10 in bank 4 to * workaround a BIOS/GART TBL issue on AMD K8s, ignore @@ -2681,7 +2719,10 @@ default: if (msr >= MSR_IA32_MC0_CTL && msr < MSR_IA32_MCx_CTL(bank_num)) { - u32 offset = msr - MSR_IA32_MC0_CTL; + u32 offset = array_index_nospec( + msr - MSR_IA32_MC0_CTL, + MSR_IA32_MCx_CTL(bank_num) - MSR_IA32_MC0_CTL); + data = vcpu->arch.mce_banks[offset]; break; } @@ -3234,6 +3275,9 @@ if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED)) return; + if (vcpu->arch.st.steal.preempted) + return; + vcpu->arch.st.steal.preempted = KVM_VCPU_PREEMPTED; kvm_write_guest_offset_cached(vcpu->kvm, &vcpu->arch.st.stime, @@ -5977,11 +6021,11 @@ return r; } -static bool reexecute_instruction(struct kvm_vcpu *vcpu, gva_t cr2, +static bool reexecute_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, bool write_fault_to_shadow_pgtable, int emulation_type) { - gpa_t gpa = cr2; + gpa_t gpa = cr2_or_gpa; kvm_pfn_t pfn; if (!(emulation_type & EMULTYPE_ALLOW_RETRY)) @@ -5995,7 +6039,7 @@ * Write permission should be allowed since only * write access need to be emulated. */ - gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL); + gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2_or_gpa, NULL); /* * If the mapping is invalid in guest, let cpu retry @@ -6052,10 +6096,10 @@ } static bool retry_instruction(struct x86_emulate_ctxt *ctxt, - unsigned long cr2, int emulation_type) + gpa_t cr2_or_gpa, int emulation_type) { struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt); - unsigned long last_retry_eip, last_retry_addr, gpa = cr2; + unsigned long last_retry_eip, last_retry_addr, gpa = cr2_or_gpa; last_retry_eip = vcpu->arch.last_retry_eip; last_retry_addr = vcpu->arch.last_retry_addr; @@ -6084,14 +6128,14 @@ if (x86_page_table_writing_insn(ctxt)) return false; - if (ctxt->eip == last_retry_eip && last_retry_addr == cr2) + if (ctxt->eip == last_retry_eip && last_retry_addr == cr2_or_gpa) return false; vcpu->arch.last_retry_eip = ctxt->eip; - vcpu->arch.last_retry_addr = cr2; + vcpu->arch.last_retry_addr = cr2_or_gpa; if (!vcpu->arch.mmu.direct_map) - gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2, NULL); + gpa = kvm_mmu_gva_to_gpa_write(vcpu, cr2_or_gpa, NULL); kvm_mmu_unprotect_page(vcpu->kvm, gpa_to_gfn(gpa)); @@ -6252,11 +6296,8 @@ return false; } -int x86_emulate_instruction(struct kvm_vcpu *vcpu, - unsigned long cr2, - int emulation_type, - void *insn, - int insn_len) +int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + int emulation_type, void *insn, int insn_len) { int r; struct x86_emulate_ctxt *ctxt = &vcpu->arch.emulate_ctxt; @@ -6299,7 +6340,7 @@ if (r != EMULATION_OK) { if (emulation_type & EMULTYPE_TRAP_UD) return EMULATE_FAIL; - if (reexecute_instruction(vcpu, cr2, write_fault_to_spt, + if (reexecute_instruction(vcpu, cr2_or_gpa, write_fault_to_spt, emulation_type)) return EMULATE_DONE; if (ctxt->have_exception) { @@ -6329,7 +6370,7 @@ return EMULATE_DONE; } - if (retry_instruction(ctxt, cr2, emulation_type)) + if (retry_instruction(ctxt, cr2_or_gpa, emulation_type)) return EMULATE_DONE; /* this is needed for vmware backdoor interface to work since it @@ -6341,7 +6382,7 @@ restart: /* Save the faulting GPA (cr2) in the address field */ - ctxt->exception.address = cr2; + ctxt->exception.address = cr2_or_gpa; r = x86_emulate_insn(ctxt); @@ -6349,7 +6390,7 @@ return EMULATE_DONE; if (r == EMULATION_FAILED) { - if (reexecute_instruction(vcpu, cr2, write_fault_to_spt, + if (reexecute_instruction(vcpu, cr2_or_gpa, write_fault_to_spt, emulation_type)) return EMULATE_DONE; @@ -6753,7 +6794,7 @@ * If reserved bit is not supported, clear the present bit to disable * mmio page fault. */ - if (IS_ENABLED(CONFIG_X86_64) && maxphyaddr == 52) + if (maxphyaddr == 52) mask &= ~1ull; kvm_mmu_set_mmio_spte_mask(mask, mask); @@ -7083,7 +7124,7 @@ kvm_x86_ops->update_cr8_intercept(vcpu, tpr, max_irr); } -static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win) +static int inject_pending_event(struct kvm_vcpu *vcpu) { int r; @@ -7119,7 +7160,7 @@ * from L2 to L1. */ if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) { - r = kvm_x86_ops->check_nested_events(vcpu, req_int_win); + r = kvm_x86_ops->check_nested_events(vcpu); if (r != 0) return r; } @@ -7169,7 +7210,7 @@ * KVM_REQ_EVENT only on certain events and not unconditionally? */ if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) { - r = kvm_x86_ops->check_nested_events(vcpu, req_int_win); + r = kvm_x86_ops->check_nested_events(vcpu); if (r != 0) return r; } @@ -7642,7 +7683,7 @@ goto out; } - if (inject_pending_event(vcpu, req_int_win) != 0) + if (inject_pending_event(vcpu) != 0) req_immediate_exit = true; else { /* Enable SMI/NMI/IRQ window open exits if needed. @@ -7853,7 +7894,7 @@ static inline bool kvm_vcpu_running(struct kvm_vcpu *vcpu) { if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) - kvm_x86_ops->check_nested_events(vcpu, false); + kvm_x86_ops->check_nested_events(vcpu); return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE && !vcpu->arch.apf.halted); @@ -8225,6 +8266,8 @@ struct kvm_mp_state *mp_state) { vcpu_load(vcpu); + if (kvm_mpx_supported()) + kvm_load_guest_fpu(vcpu); kvm_apic_accept_events(vcpu); if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED && @@ -8233,6 +8276,8 @@ else mp_state->mp_state = vcpu->arch.mp_state; + if (kvm_mpx_supported()) + kvm_put_guest_fpu(vcpu); vcpu_put(vcpu); return 0; } @@ -8648,13 +8693,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) { - vcpu->arch.apf.msr_val = 0; - - vcpu_load(vcpu); - kvm_mmu_unload(vcpu); - vcpu_put(vcpu); - - kvm_x86_ops->vcpu_free(vcpu); + kvm_arch_vcpu_free(vcpu); } void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) @@ -8847,6 +8886,8 @@ if (r != 0) return r; + cr4_reserved_bits = kvm_host_cr4_reserved_bits(&boot_cpu_data); + if (kvm_has_tsc_control) { /* * Make sure the user can only configure tsc_khz values that @@ -9188,6 +9229,13 @@ { int i; + /* + * Clear out the previous array pointers for the KVM_MR_MOVE case. The + * old arrays will be freed by __kvm_set_memory_region() if installing + * the new memslot is successful. + */ + memset(&slot->arch, 0, sizeof(slot->arch)); + for (i = 0; i < KVM_NR_PAGE_SIZES; ++i) { struct kvm_lpage_info *linfo; unsigned long ugfn; @@ -9262,6 +9310,10 @@ const struct kvm_userspace_memory_region *mem, enum kvm_mr_change change) { + if (change == KVM_MR_MOVE) + return kvm_arch_create_memslot(kvm, memslot, + mem->memory_size >> PAGE_SHIFT); + return 0; } @@ -9505,7 +9557,7 @@ work->arch.cr3 != vcpu->arch.mmu.get_cr3(vcpu)) return; - vcpu->arch.mmu.page_fault(vcpu, work->gva, 0, true); + vcpu->arch.mmu.page_fault(vcpu, work->cr2_or_gpa, 0, true); } static inline u32 kvm_async_pf_hash_fn(gfn_t gfn) @@ -9588,7 +9640,7 @@ { struct x86_exception fault; - trace_kvm_async_pf_not_present(work->arch.token, work->gva); + trace_kvm_async_pf_not_present(work->arch.token, work->cr2_or_gpa); kvm_add_async_pf_gfn(vcpu, work->arch.gfn); if (!(vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED) || @@ -9616,7 +9668,7 @@ work->arch.token = ~0; /* broadcast wakeup */ else kvm_del_async_pf_gfn(vcpu, work->arch.gfn); - trace_kvm_async_pf_ready(work->arch.token, work->gva); + trace_kvm_async_pf_ready(work->arch.token, work->cr2_or_gpa); if (vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED && !apf_get_user(vcpu, &val)) { diff -Nru linux-4.19.98/arch/x86/kvm/x86.h linux-4.19.118/arch/x86/kvm/x86.h --- linux-4.19.98/arch/x86/kvm/x86.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/kvm/x86.h 2020-04-23 08:30:24.000000000 +0000 @@ -284,7 +284,7 @@ bool kvm_mtrr_check_gfn_range_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, int page_num); bool kvm_vector_hashing_enabled(void); -int x86_emulate_instruction(struct kvm_vcpu *vcpu, unsigned long cr2, +int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int emulation_type, void *insn, int insn_len); #define KVM_SUPPORTED_XCR0 (XFEATURE_MASK_FP | XFEATURE_MASK_SSE \ diff -Nru linux-4.19.98/arch/x86/lib/x86-opcode-map.txt linux-4.19.118/arch/x86/lib/x86-opcode-map.txt --- linux-4.19.98/arch/x86/lib/x86-opcode-map.txt 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/lib/x86-opcode-map.txt 2020-04-23 08:30:24.000000000 +0000 @@ -909,7 +909,7 @@ GrpTable: Grp3_2 0: TEST Ev,Iz -1: +1: TEST Ev,Iz 2: NOT Ev 3: NEG Ev 4: MUL rAX,Ev diff -Nru linux-4.19.98/arch/x86/mm/fault.c linux-4.19.118/arch/x86/mm/fault.c --- linux-4.19.98/arch/x86/mm/fault.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/mm/fault.c 2020-04-23 08:30:24.000000000 +0000 @@ -273,7 +273,7 @@ return pmd_k; } -void vmalloc_sync_all(void) +static void vmalloc_sync(void) { unsigned long address; @@ -300,6 +300,16 @@ } } +void vmalloc_sync_mappings(void) +{ + vmalloc_sync(); +} + +void vmalloc_sync_unmappings(void) +{ + vmalloc_sync(); +} + /* * 32-bit: * @@ -402,11 +412,23 @@ #else /* CONFIG_X86_64: */ -void vmalloc_sync_all(void) +void vmalloc_sync_mappings(void) { + /* + * 64-bit mappings might allocate new p4d/pud pages + * that need to be propagated to all tasks' PGDs. + */ sync_global_pgds(VMALLOC_START & PGDIR_MASK, VMALLOC_END); } +void vmalloc_sync_unmappings(void) +{ + /* + * Unmappings never allocate or free p4d/pud pages. + * No work is required here. + */ +} + /* * 64-bit: * diff -Nru linux-4.19.98/arch/x86/mm/init_32.c linux-4.19.118/arch/x86/mm/init_32.c --- linux-4.19.98/arch/x86/mm/init_32.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/mm/init_32.c 2020-04-23 08:30:24.000000000 +0000 @@ -860,18 +860,15 @@ return __add_pages(nid, start_pfn, nr_pages, altmap, want_memblock); } -#ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct zone *zone; - zone = page_zone(pfn_to_page(start_pfn)); - return __remove_pages(zone, start_pfn, nr_pages, altmap); + __remove_pages(start_pfn, nr_pages, altmap); } #endif -#endif int kernel_set_to_readonly __read_mostly; diff -Nru linux-4.19.98/arch/x86/mm/init_64.c linux-4.19.118/arch/x86/mm/init_64.c --- linux-4.19.98/arch/x86/mm/init_64.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/mm/init_64.c 2020-04-23 08:30:24.000000000 +0000 @@ -1132,7 +1132,6 @@ remove_pagetable(start, end, false, altmap); } -#ifdef CONFIG_MEMORY_HOTREMOVE static void __meminit kernel_physical_mapping_remove(unsigned long start, unsigned long end) { @@ -1142,25 +1141,15 @@ remove_pagetable(start, end, true, NULL); } -int __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +void __ref arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct page *page = pfn_to_page(start_pfn); - struct zone *zone; - int ret; - /* With altmap the first mapped page is offset from @start */ - if (altmap) - page += vmem_altmap_offset(altmap); - zone = page_zone(page); - ret = __remove_pages(zone, start_pfn, nr_pages, altmap); - WARN_ON_ONCE(ret); + __remove_pages(start_pfn, nr_pages, altmap); kernel_physical_mapping_remove(start, start + size); - - return ret; } -#endif #endif /* CONFIG_MEMORY_HOTPLUG */ static struct kcore_list kcore_vsyscall; diff -Nru linux-4.19.98/arch/x86/mm/pageattr.c linux-4.19.118/arch/x86/mm/pageattr.c --- linux-4.19.98/arch/x86/mm/pageattr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/mm/pageattr.c 2020-04-23 08:30:24.000000000 +0000 @@ -2126,19 +2126,13 @@ .pgd = pgd, .numpages = numpages, .mask_set = __pgprot(0), - .mask_clr = __pgprot(0), + .mask_clr = __pgprot(~page_flags & (_PAGE_NX|_PAGE_RW)), .flags = 0, }; if (!(__supported_pte_mask & _PAGE_NX)) goto out; - if (!(page_flags & _PAGE_NX)) - cpa.mask_clr = __pgprot(_PAGE_NX); - - if (!(page_flags & _PAGE_RW)) - cpa.mask_clr = __pgprot(_PAGE_RW); - if (!(page_flags & _PAGE_ENC)) cpa.mask_clr = pgprot_encrypted(cpa.mask_clr); diff -Nru linux-4.19.98/arch/x86/mm/tlb.c linux-4.19.118/arch/x86/mm/tlb.c --- linux-4.19.98/arch/x86/mm/tlb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/mm/tlb.c 2020-04-23 08:30:24.000000000 +0000 @@ -664,9 +664,6 @@ * that UV should be updated so that smp_call_function_many(), * etc, are optimal on UV. */ - unsigned int cpu; - - cpu = smp_processor_id(); cpumask = uv_flush_tlb_others(cpumask, info); if (cpumask) smp_call_function_many(cpumask, flush_tlb_func_remote, diff -Nru linux-4.19.98/arch/x86/platform/efi/efi.c linux-4.19.118/arch/x86/platform/efi/efi.c --- linux-4.19.98/arch/x86/platform/efi/efi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/platform/efi/efi.c 2020-04-23 08:30:24.000000000 +0000 @@ -480,7 +480,6 @@ efi_char16_t *c16; char vendor[100] = "unknown"; int i = 0; - void *tmp; #ifdef CONFIG_X86_32 if (boot_params.efi_info.efi_systab_hi || @@ -505,14 +504,16 @@ /* * Show what we know for posterity */ - c16 = tmp = early_memremap(efi.systab->fw_vendor, 2); + c16 = early_memremap_ro(efi.systab->fw_vendor, + sizeof(vendor) * sizeof(efi_char16_t)); if (c16) { - for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i) - vendor[i] = *c16++; + for (i = 0; i < sizeof(vendor) - 1 && c16[i]; ++i) + vendor[i] = c16[i]; vendor[i] = '\0'; - } else + early_memunmap(c16, sizeof(vendor) * sizeof(efi_char16_t)); + } else { pr_err("Could not map the firmware vendor!\n"); - early_memunmap(tmp, 2); + } pr_info("EFI v%u.%.02u by %s\n", efi.systab->hdr.revision >> 16, @@ -929,16 +930,14 @@ if (efi_alloc_page_tables()) { pr_err("Failed to allocate EFI page tables\n"); - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); - return; + goto err; } efi_merge_regions(); new_memmap = efi_map_regions(&count, &pg_shift); if (!new_memmap) { pr_err("Error reallocating memory, EFI runtime non-functional!\n"); - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); - return; + goto err; } pa = __pa(new_memmap); @@ -952,8 +951,7 @@ if (efi_memmap_init_late(pa, efi.memmap.desc_size * count)) { pr_err("Failed to remap late EFI memory map\n"); - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); - return; + goto err; } if (efi_enabled(EFI_DBG)) { @@ -961,12 +959,11 @@ efi_print_memmap(); } - BUG_ON(!efi.systab); + if (WARN_ON(!efi.systab)) + goto err; - if (efi_setup_page_tables(pa, 1 << pg_shift)) { - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); - return; - } + if (efi_setup_page_tables(pa, 1 << pg_shift)) + goto err; efi_sync_low_kernel_mappings(); @@ -986,9 +983,9 @@ } if (status != EFI_SUCCESS) { - pr_alert("Unable to switch EFI into virtual mode (status=%lx)!\n", - status); - panic("EFI call to SetVirtualAddressMap() failed!"); + pr_err("Unable to switch EFI into virtual mode (status=%lx)!\n", + status); + goto err; } /* @@ -1015,6 +1012,10 @@ /* clean DUMMY object */ efi_delete_dummy_variable(); + return; + +err: + clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); } void __init efi_enter_virtual_mode(void) diff -Nru linux-4.19.98/arch/x86/platform/efi/efi_64.c linux-4.19.118/arch/x86/platform/efi/efi_64.c --- linux-4.19.98/arch/x86/platform/efi/efi_64.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/platform/efi/efi_64.c 2020-04-23 08:30:24.000000000 +0000 @@ -313,7 +313,7 @@ static inline phys_addr_t virt_to_phys_or_null_size(void *va, unsigned long size) { - bool bad_size; + phys_addr_t pa; if (!va) return 0; @@ -321,16 +321,13 @@ if (virt_addr_valid(va)) return virt_to_phys(va); - /* - * A fully aligned variable on the stack is guaranteed not to - * cross a page bounary. Try to catch strings on the stack by - * checking that 'size' is a power of two. - */ - bad_size = size > PAGE_SIZE || !is_power_of_2(size); + pa = slow_virt_to_phys(va); - WARN_ON(!IS_ALIGNED((unsigned long)va, size) || bad_size); + /* check if the object crosses a page boundary */ + if (WARN_ON((pa ^ (pa + size - 1)) & PAGE_MASK)) + return 0; - return slow_virt_to_phys(va); + return pa; } #define virt_to_phys_or_null(addr) \ @@ -389,11 +386,12 @@ return 0; page = alloc_page(GFP_KERNEL|__GFP_DMA32); - if (!page) - panic("Unable to allocate EFI runtime stack < 4GB\n"); + if (!page) { + pr_err("Unable to allocate EFI runtime stack < 4GB\n"); + return 1; + } - efi_scratch.phys_stack = virt_to_phys(page_address(page)); - efi_scratch.phys_stack += PAGE_SIZE; /* stack grows down */ + efi_scratch.phys_stack = page_to_phys(page + 1); /* stack grows down */ npages = (_etext - _text) >> PAGE_SHIFT; text = __pa(_text); @@ -789,6 +787,8 @@ efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor, u32 *attr, unsigned long *data_size, void *data) { + u8 buf[24] __aligned(8); + efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd)); efi_status_t status; u32 phys_name, phys_vendor, phys_attr; u32 phys_data_size, phys_data; @@ -796,14 +796,19 @@ spin_lock_irqsave(&efi_runtime_lock, flags); + *vnd = *vendor; + phys_data_size = virt_to_phys_or_null(data_size); - phys_vendor = virt_to_phys_or_null(vendor); + phys_vendor = virt_to_phys_or_null(vnd); phys_name = virt_to_phys_or_null_size(name, efi_name_size(name)); phys_attr = virt_to_phys_or_null(attr); phys_data = virt_to_phys_or_null_size(data, *data_size); - status = efi_thunk(get_variable, phys_name, phys_vendor, - phys_attr, phys_data_size, phys_data); + if (!phys_name || (data && !phys_data)) + status = EFI_INVALID_PARAMETER; + else + status = efi_thunk(get_variable, phys_name, phys_vendor, + phys_attr, phys_data_size, phys_data); spin_unlock_irqrestore(&efi_runtime_lock, flags); @@ -814,19 +819,25 @@ efi_thunk_set_variable(efi_char16_t *name, efi_guid_t *vendor, u32 attr, unsigned long data_size, void *data) { + u8 buf[24] __aligned(8); + efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd)); u32 phys_name, phys_vendor, phys_data; efi_status_t status; unsigned long flags; spin_lock_irqsave(&efi_runtime_lock, flags); + *vnd = *vendor; + phys_name = virt_to_phys_or_null_size(name, efi_name_size(name)); - phys_vendor = virt_to_phys_or_null(vendor); + phys_vendor = virt_to_phys_or_null(vnd); phys_data = virt_to_phys_or_null_size(data, data_size); - /* If data_size is > sizeof(u32) we've got problems */ - status = efi_thunk(set_variable, phys_name, phys_vendor, - attr, data_size, phys_data); + if (!phys_name || (data && !phys_data)) + status = EFI_INVALID_PARAMETER; + else + status = efi_thunk(set_variable, phys_name, phys_vendor, + attr, data_size, phys_data); spin_unlock_irqrestore(&efi_runtime_lock, flags); @@ -838,6 +849,8 @@ u32 attr, unsigned long data_size, void *data) { + u8 buf[24] __aligned(8); + efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd)); u32 phys_name, phys_vendor, phys_data; efi_status_t status; unsigned long flags; @@ -845,13 +858,17 @@ if (!spin_trylock_irqsave(&efi_runtime_lock, flags)) return EFI_NOT_READY; + *vnd = *vendor; + phys_name = virt_to_phys_or_null_size(name, efi_name_size(name)); - phys_vendor = virt_to_phys_or_null(vendor); + phys_vendor = virt_to_phys_or_null(vnd); phys_data = virt_to_phys_or_null_size(data, data_size); - /* If data_size is > sizeof(u32) we've got problems */ - status = efi_thunk(set_variable, phys_name, phys_vendor, - attr, data_size, phys_data); + if (!phys_name || (data && !phys_data)) + status = EFI_INVALID_PARAMETER; + else + status = efi_thunk(set_variable, phys_name, phys_vendor, + attr, data_size, phys_data); spin_unlock_irqrestore(&efi_runtime_lock, flags); @@ -863,21 +880,29 @@ efi_char16_t *name, efi_guid_t *vendor) { + u8 buf[24] __aligned(8); + efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd)); efi_status_t status; u32 phys_name_size, phys_name, phys_vendor; unsigned long flags; spin_lock_irqsave(&efi_runtime_lock, flags); + *vnd = *vendor; + phys_name_size = virt_to_phys_or_null(name_size); - phys_vendor = virt_to_phys_or_null(vendor); + phys_vendor = virt_to_phys_or_null(vnd); phys_name = virt_to_phys_or_null_size(name, *name_size); - status = efi_thunk(get_next_variable, phys_name_size, - phys_name, phys_vendor); + if (!phys_name) + status = EFI_INVALID_PARAMETER; + else + status = efi_thunk(get_next_variable, phys_name_size, + phys_name, phys_vendor); spin_unlock_irqrestore(&efi_runtime_lock, flags); + *vendor = *vnd; return status; } diff -Nru linux-4.19.98/arch/x86/xen/enlighten_pv.c linux-4.19.118/arch/x86/xen/enlighten_pv.c --- linux-4.19.98/arch/x86/xen/enlighten_pv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/arch/x86/xen/enlighten_pv.c 2020-04-23 08:30:24.000000000 +0000 @@ -908,14 +908,15 @@ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) { int ret; +#ifdef CONFIG_X86_64 + unsigned int which; + u64 base; +#endif ret = 0; switch (msr) { #ifdef CONFIG_X86_64 - unsigned which; - u64 base; - case MSR_FS_BASE: which = SEGBASE_FS; goto set; case MSR_KERNEL_GS_BASE: which = SEGBASE_GS_USER; goto set; case MSR_GS_BASE: which = SEGBASE_GS_KERNEL; goto set; diff -Nru linux-4.19.98/block/bfq-cgroup.c linux-4.19.118/block/bfq-cgroup.c --- linux-4.19.98/block/bfq-cgroup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/block/bfq-cgroup.c 2020-04-23 08:30:24.000000000 +0000 @@ -525,12 +525,13 @@ */ entity = &bfqg->entity; for_each_entity(entity) { - bfqg = container_of(entity, struct bfq_group, entity); - if (bfqg != bfqd->root_group) { - parent = bfqg_parent(bfqg); + struct bfq_group *curr_bfqg = container_of(entity, + struct bfq_group, entity); + if (curr_bfqg != bfqd->root_group) { + parent = bfqg_parent(curr_bfqg); if (!parent) parent = bfqd->root_group; - bfq_group_set_parent(bfqg, parent); + bfq_group_set_parent(curr_bfqg, parent); } } diff -Nru linux-4.19.98/block/bfq-iosched.c linux-4.19.118/block/bfq-iosched.c --- linux-4.19.98/block/bfq-iosched.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/block/bfq-iosched.c 2020-04-23 08:30:24.000000000 +0000 @@ -5156,20 +5156,28 @@ return bfqq; } -static void bfq_idle_slice_timer_body(struct bfq_queue *bfqq) +static void +bfq_idle_slice_timer_body(struct bfq_data *bfqd, struct bfq_queue *bfqq) { - struct bfq_data *bfqd = bfqq->bfqd; enum bfqq_expiration reason; unsigned long flags; spin_lock_irqsave(&bfqd->lock, flags); - bfq_clear_bfqq_wait_request(bfqq); + /* + * Considering that bfqq may be in race, we should firstly check + * whether bfqq is in service before doing something on it. If + * the bfqq in race is not in service, it has already been expired + * through __bfq_bfqq_expire func and its wait_request flags has + * been cleared in __bfq_bfqd_reset_in_service func. + */ if (bfqq != bfqd->in_service_queue) { spin_unlock_irqrestore(&bfqd->lock, flags); return; } + bfq_clear_bfqq_wait_request(bfqq); + if (bfq_bfqq_budget_timeout(bfqq)) /* * Also here the queue can be safely expired @@ -5214,7 +5222,7 @@ * early. */ if (bfqq) - bfq_idle_slice_timer_body(bfqq); + bfq_idle_slice_timer_body(bfqd, bfqq); return HRTIMER_NORESTART; } diff -Nru linux-4.19.98/block/blk-ioc.c linux-4.19.118/block/blk-ioc.c --- linux-4.19.98/block/blk-ioc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/block/blk-ioc.c 2020-04-23 08:30:24.000000000 +0000 @@ -87,6 +87,7 @@ * making it impossible to determine icq_cache. Record it in @icq. */ icq->__rcu_icq_cache = et->icq_cache; + icq->flags |= ICQ_DESTROYED; call_rcu(&icq->__rcu_head, icq_free_icq_rcu); } @@ -230,15 +231,21 @@ { unsigned long flags; + rcu_read_lock(); while (!list_empty(icq_list)) { struct io_cq *icq = list_entry(icq_list->next, struct io_cq, q_node); struct io_context *ioc = icq->ioc; spin_lock_irqsave(&ioc->lock, flags); + if (icq->flags & ICQ_DESTROYED) { + spin_unlock_irqrestore(&ioc->lock, flags); + continue; + } ioc_destroy_icq(icq); spin_unlock_irqrestore(&ioc->lock, flags); } + rcu_read_unlock(); } /** diff -Nru linux-4.19.98/block/blk-lib.c linux-4.19.118/block/blk-lib.c --- linux-4.19.98/block/blk-lib.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/block/blk-lib.c 2020-04-23 08:30:24.000000000 +0000 @@ -52,15 +52,14 @@ if ((sector | nr_sects) & bs_mask) return -EINVAL; - while (nr_sects) { - unsigned int req_sects = nr_sects; - sector_t end_sect; + if (!nr_sects) + return -EINVAL; - if (!req_sects) - goto fail; - req_sects = min(req_sects, bio_allowed_max_sectors(q)); + while (nr_sects) { + sector_t req_sects = min_t(sector_t, nr_sects, + bio_allowed_max_sectors(q)); - end_sect = sector + req_sects; + WARN_ON_ONCE((req_sects << 9) > UINT_MAX); bio = next_bio(bio, 0, gfp_mask); bio->bi_iter.bi_sector = sector; @@ -68,8 +67,8 @@ bio_set_op_attrs(bio, op, 0); bio->bi_iter.bi_size = req_sects << 9; + sector += req_sects; nr_sects -= req_sects; - sector = end_sect; /* * We can loop for a long time in here, if someone does @@ -82,14 +81,6 @@ *biop = bio; return 0; - -fail: - if (bio) { - submit_bio_wait(bio); - bio_put(bio); - } - *biop = NULL; - return -EOPNOTSUPP; } EXPORT_SYMBOL(__blkdev_issue_discard); diff -Nru linux-4.19.98/block/blk-merge.c linux-4.19.118/block/blk-merge.c --- linux-4.19.98/block/blk-merge.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/block/blk-merge.c 2020-04-23 08:30:24.000000000 +0000 @@ -309,13 +309,7 @@ void blk_recount_segments(struct request_queue *q, struct bio *bio) { - unsigned short seg_cnt; - - /* estimate segment number by bi_vcnt for non-cloned bio */ - if (bio_flagged(bio, BIO_CLONED)) - seg_cnt = bio_segments(bio); - else - seg_cnt = bio->bi_vcnt; + unsigned short seg_cnt = bio_segments(bio); if (test_bit(QUEUE_FLAG_NO_SG_MERGE, &q->queue_flags) && (seg_cnt < queue_max_segments(q))) diff -Nru linux-4.19.98/block/blk-settings.c linux-4.19.118/block/blk-settings.c --- linux-4.19.98/block/blk-settings.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/block/blk-settings.c 2020-04-23 08:30:24.000000000 +0000 @@ -717,6 +717,9 @@ printk(KERN_NOTICE "%s: Warning: Device %s is misaligned\n", top, bottom); } + + t->backing_dev_info->io_pages = + t->limits.max_sectors >> (PAGE_SHIFT - 9); } EXPORT_SYMBOL(disk_stack_limits); diff -Nru linux-4.19.98/crypto/af_alg.c linux-4.19.118/crypto/af_alg.c --- linux-4.19.98/crypto/af_alg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/crypto/af_alg.c 2020-04-23 08:30:24.000000000 +0000 @@ -139,11 +139,13 @@ sk = ask->parent; ask = alg_sk(sk); - lock_sock(sk); + local_bh_disable(); + bh_lock_sock(sk); ask->nokey_refcnt -= nokey; if (!last) last = !--ask->refcnt; - release_sock(sk); + bh_unlock_sock(sk); + local_bh_enable(); if (last) sock_put(sk); diff -Nru linux-4.19.98/crypto/algapi.c linux-4.19.118/crypto/algapi.c --- linux-4.19.98/crypto/algapi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/crypto/algapi.c 2020-04-23 08:30:24.000000000 +0000 @@ -649,11 +649,9 @@ void crypto_drop_spawn(struct crypto_spawn *spawn) { - if (!spawn->alg) - return; - down_write(&crypto_alg_sem); - list_del(&spawn->list); + if (spawn->alg) + list_del(&spawn->list); up_write(&crypto_alg_sem); } EXPORT_SYMBOL_GPL(crypto_drop_spawn); @@ -661,22 +659,16 @@ static struct crypto_alg *crypto_spawn_alg(struct crypto_spawn *spawn) { struct crypto_alg *alg; - struct crypto_alg *alg2; down_read(&crypto_alg_sem); alg = spawn->alg; - alg2 = alg; - if (alg2) - alg2 = crypto_mod_get(alg2); - up_read(&crypto_alg_sem); - - if (!alg2) { - if (alg) - crypto_shoot_alg(alg); - return ERR_PTR(-EAGAIN); + if (alg && !crypto_mod_get(alg)) { + alg->cra_flags |= CRYPTO_ALG_DYING; + alg = NULL; } + up_read(&crypto_alg_sem); - return alg; + return alg ?: ERR_PTR(-EAGAIN); } struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type, diff -Nru linux-4.19.98/crypto/api.c linux-4.19.118/crypto/api.c --- linux-4.19.98/crypto/api.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/crypto/api.c 2020-04-23 08:30:24.000000000 +0000 @@ -349,13 +349,12 @@ return len; } -void crypto_shoot_alg(struct crypto_alg *alg) +static void crypto_shoot_alg(struct crypto_alg *alg) { down_write(&crypto_alg_sem); alg->cra_flags |= CRYPTO_ALG_DYING; up_write(&crypto_alg_sem); } -EXPORT_SYMBOL_GPL(crypto_shoot_alg); struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, u32 mask) diff -Nru linux-4.19.98/crypto/internal.h linux-4.19.118/crypto/internal.h --- linux-4.19.98/crypto/internal.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/crypto/internal.h 2020-04-23 08:30:24.000000000 +0000 @@ -79,7 +79,6 @@ void crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list, struct crypto_alg *nalg); void crypto_remove_final(struct list_head *list); -void crypto_shoot_alg(struct crypto_alg *alg); struct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type, u32 mask); void *crypto_create_tfm(struct crypto_alg *alg, diff -Nru linux-4.19.98/crypto/pcrypt.c linux-4.19.118/crypto/pcrypt.c --- linux-4.19.98/crypto/pcrypt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/crypto/pcrypt.c 2020-04-23 08:30:24.000000000 +0000 @@ -130,7 +130,6 @@ struct padata_priv *padata = pcrypt_request_padata(preq); padata->info = err; - req->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; padata_do_serial(padata); } @@ -394,7 +393,7 @@ int ret; pinst->kobj.kset = pcrypt_kset; - ret = kobject_add(&pinst->kobj, NULL, name); + ret = kobject_add(&pinst->kobj, NULL, "%s", name); if (!ret) kobject_uevent(&pinst->kobj, KOBJ_ADD); @@ -505,11 +504,12 @@ static void __exit pcrypt_exit(void) { + crypto_unregister_template(&pcrypt_tmpl); + pcrypt_fini_padata(&pencrypt); pcrypt_fini_padata(&pdecrypt); kset_unregister(pcrypt_kset); - crypto_unregister_template(&pcrypt_tmpl); } module_init(pcrypt_init); diff -Nru linux-4.19.98/crypto/tgr192.c linux-4.19.118/crypto/tgr192.c --- linux-4.19.98/crypto/tgr192.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/crypto/tgr192.c 2020-04-23 08:30:24.000000000 +0000 @@ -25,8 +25,9 @@ #include #include #include -#include #include +#include +#include #define TGR192_DIGEST_SIZE 24 #define TGR160_DIGEST_SIZE 20 @@ -468,10 +469,9 @@ u64 a, b, c, aa, bb, cc; u64 x[8]; int i; - const __le64 *ptr = (const __le64 *)data; for (i = 0; i < 8; i++) - x[i] = le64_to_cpu(ptr[i]); + x[i] = get_unaligned_le64(data + i * sizeof(__le64)); /* save */ a = aa = tctx->a; diff -Nru linux-4.19.98/debian/README.source linux-4.19.118/debian/README.source --- linux-4.19.98/debian/README.source 2020-01-26 13:26:48.000000000 +0000 +++ linux-4.19.118/debian/README.source 2020-04-22 13:32:02.000000000 +0000 @@ -1,3 +1,9 @@ +Checklist for uploaders +======================= + +There is a checklist in the kernel-team.git repository; see +. + Updating the upstream source ============================ diff -Nru linux-4.19.98/debian/changelog linux-4.19.118/debian/changelog --- linux-4.19.98/debian/changelog 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/changelog 2020-04-26 13:04:11.000000000 +0000 @@ -1,3 +1,1847 @@ +linux (4.19.118-1) buster; urgency=medium + + * New upstream stable update: + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.99 + - Revert "efi: Fix debugobjects warning on 'efi_rts_work'" + - xfs: Sanity check flags of Q_XQUOTARM call + - [x86] mfd: intel-lpss: Add default I2C device properties for Gemini Lake + - SUNRPC: Fix svcauth_gss_proxy_init() + - [powerpc*] pseries: Enable support for ibm,drc-info property + - tipc: update mon's self addr when node addr generated + - tipc: fix wrong timeout input for tipc_wait_for_cond() + - mt7601u: fix bbp version check in mt7601u_wait_bbp_ready + - [armhf] crypto: sun4i-ss - fix big endian issues + - perf map: No need to adjust the long name of modules + - ipmi: Fix memory leak in __ipmi_bmc_register (CVE-2019-19046) + - ixgbe: don't clear IPsec sa counters on HW clearing + - drm/virtio: fix bounds check in virtio_gpu_cmd_get_capset() + - iio: fix position relative kernel version + - apparmor: Fix network performance issue in aa_label_sk_perm + - ALSA: hda: fix unused variable warning + - apparmor: don't try to replace stale label in ptrace access check + - firmware: coreboot: Let OF core populate platform device + - bridge: br_arp_nd_proxy: set icmp6_router if neigh has NTF_ROUTER + - [arm64] drm/hisilicon: hibmc: Don't overwrite fb helper surface depth + - IB/rxe: replace kvfree with vfree + - [amd64] IB/hfi1: Add mtu check for operational data VLs + - genirq/debugfs: Reinstate full OF path for domain name + - [arm64] usb: dwc3: add EXTCON dependency for qcom + - cfg80211: regulatory: make initialization more robust + - [x86] mei: replace POLL* with EPOLL* for write queues. + - [arm64] drm/msm: fix unsigned comparison with less than zero + - ALSA: usb-audio: update quirk for B&W PX to remove microphone + - iwlwifi: nvm: get num of hw addresses from firmware + - netfilter: nft_osf: usage from output path is not valid + - [x86] pwm: lpss: Release runtime-pm reference from the driver's remove + callback + - [powerpc*] pseries/memory-hotplug: Fix return value type of + find_aa_index + - rtlwifi: rtl8821ae: replace _rtl8821ae_mrate_idx_to_arfr_id with generic + version + - netfilter: nf_flow_table: do not remove offload when other netns's + interface is down + - tipc: eliminate message disordering during binding table update + - [arm64] net: socionext: Add dummy PHY register read in phy_write() + - [arm64,armhf] drm/sun4i: hdmi: Fix double flag assignation + - [arm64] net: hns3: add error handler for hns3_nic_init_vector_data() + - pcrypt: use format specifier in kobject_add + - [armhf] ASoC: sun8i-codec: add missing route for ADC + - [arm64] pinctrl: meson-gxl: remove invalid GPIOX tsin_a pins + - [armhf] bus: ti-sysc: Add mcasp optional clocks flag + - exportfs: fix 'passing zero to ERR_PTR()' warning + - net: always initialize pagedlen + - net: phy: Fix not to call phy_resume() if PHY is not attached + - [amd64] IB/hfi1: Correctly process FECN and BECN in packets + - IB/rxe: Fix incorrect cache cleanup in error flow + - ipv6: add missing tx timestamping on IPPROTO_RAW + - [arm64] net: hns3: fix error handling int the hns3_get_vector_ring_chain + - vxlan: changelink: Fix handling of default remotes + - fork,memcg: fix crash in free_thread_stack on memcg charge fail + - [armhf] clk: highbank: fix refcount leak in hb_clk_init() + - [armhf] clk: ti: fix refcount leak in ti_dt_clocks_register() + - [armhf] clk: socfpga: fix refcount leak + - [armhf] clk: samsung: exynos4: fix refcount leak in exynos4_get_xom() + - [armhf] clk: imx6q: fix refcount leak in imx6q_clocks_init() + - [armhf] clk: imx6sx: fix refcount leak in imx6sx_clocks_init() + - [armhf] clk: armada-370: fix refcount leak in a370_clk_init() + - [armel] clk: kirkwood: fix refcount leak in kirkwood_clk_init() + - [armhf] clk: armada-xp: fix refcount leak in axp_clk_init() + - [armhf] clk: mv98dx3236: fix refcount leak in mv98dx3236_clk_init() + - [armhf] clk: dove: fix refcount leak in dove_clk_init() + - drm: Fix error handling in drm_legacy_addctx + - [armhf] drm/etnaviv: fix some off by one bugs + - drm/fb-helper: generic: Fix setup error path + - fork, memcg: fix cached_stacks case + - [amd64] IB/usnic: Fix out of bounds index check in query pkey + - RDMA/ocrdma: Fix out of bounds index check in query pkey + - RDMA/qedr: Fix out of bounds index check in query pkey + - RDMA/iw_cxgb4: Fix the unchecked ep dereference + - net: phy: micrel: set soft_reset callback to genphy_soft_reset for + KSZ9031 + - [armhf] memory: tegra: Don't invoke Tegra30+ specific memory timing setup + on Tegra20 + - [armhf] drm/etnaviv: NULL vs IS_ERR() buf in etnaviv_core_dump() + - kbuild: mark prepare0 as PHONY to fix external module build + - crypto: tgr192 - fix unaligned memory access + - [armhf] ASoC: imx-sgtl5000: put of nodes if finding codec fails + - IB/iser: Pass the correct number of entries for dma mapped SGL + - [arm64] net: hns3: fix wrong combined count returned by ethtool -l + - IB/mlx5: Don't override existing ip_protocol + - rtc: cmos: ignore bogus century byte + - [i386] spi/topcliff_pch: Fix potential NULL dereference on allocation + error + - [arm64] net: hns3: fix bug of ethtool_ops.get_channels for VF + - [armhf] clk: sunxi-ng: sun8i-a23: Enable PLL-MIPI LDOs when ungating it + - iwlwifi: mvm: avoid possible access out of array. + - net/mlx5: Take lock with IRQs disabled to avoid deadlock + - ip_tunnel: Fix route fl4 init in ip_md_tunnel_xmit + - iwlwifi: mvm: fix A-MPDU reference assignment + - [armhf] bus: ti-sysc: Fix timer handling with drop pm_runtime_irq_safe() + - [x86] tty: ipwireless: Fix potential NULL pointer dereference + - driver: uio: fix possible memory leak in __uio_register_device + - driver: uio: fix possible use-after-free in __uio_register_device + - driver core: Fix DL_FLAG_AUTOREMOVE_SUPPLIER device link flag handling + - driver core: Avoid careless re-use of existing device links + - driver core: Do not resume suppliers under device_links_write_lock() + - driver core: Fix handling of runtime PM flags in device_link_add() + - driver core: Do not call rpm_put_suppliers() in pm_runtime_drop_link() + - drm/xen-front: Fix mmap attributes for display buffers + - iwlwifi: mvm: fix RSS config command + - [mips*] rtc: ds1672: fix unintended sign extension + - ath10k: fix dma unmap direction for management frames + - net: phy: fixed_phy: Fix fixed_phy not checking GPIO + - rtc: ds1307: rx8130: Fix alarm handling + - net/smc: original socket family in inet_sock_diag + - [arm64] rtc: pm8xxx: fix unintended sign extension + - iw_cxgb4: use tos when importing the endpoint + - iw_cxgb4: use tos when finding ipv6 routes + - xsk: add missing smp_rmb() in xsk_mmap + - [armhf] drm/etnaviv: potential NULL dereference + - RDMA/mlx5: Fix memory leak in case we fail to add an IB device + - driver core: Fix possible supplier PM-usage counter imbalance + - [armhf] usb: phy: twl6030-usb: fix possible use-after-free on remove + - block: don't use bio->bi_vcnt to figure out segment number + - keys: Timestamp new keys + - [armhf] net: dsa: b53: Fix default VLAN ID + - [armhf] net: dsa: b53: Properly account for VLAN filtering + - [armhf] net: dsa: b53: Do not program CPU port's PVID + - mt76: usb: fix possible memory leak in mt76u_buf_free + - vfio_pci: Enable memory accesses before calling pci_map_rom + - mdio_bus: Fix PTR_ERR() usage after initialization to constant + - [powerpc*] KVM: Release all hardware TCE tables attached to a group + - [x86] staging: r8822be: check kzalloc return or bail + - [arm*] dmaengine: mv_xor: Use correct device for DMA API + - cdc-wdm: pass return value of recover_from_urb_loss + - brcmfmac: create debugfs files for bus-specific layer + - net/mlx5: Delete unused FPGA QPN variable + - drm/nouveau/bios/ramcfg: fix missing parentheses when calculating RON + - drm/nouveau/pmu: don't print reply values if exec is false + - drm/nouveau: fix missing break in switch statement + - driver core: Fix PM-runtime for links added during consumer probe + - [arm64] ASoC: qcom: Fix of-node refcount unbalance in + apq8016_sbc_parse_of() + - [arm64,armhf] net: dsa: fix unintended change of bridge interface STP + state + - fs/nfs: Fix nfs_parse_devname to not modify it's argument + - [x86] staging: rtlwifi: Use proper enum for return in + halmac_parse_psd_data_88xx + - [ppc64el] 64s: Fix logic when handling unknown CPU features + - NFS: Fix a soft lockup in the delegation recovery code + - perf: Copy parent's address filter offsets on clone + - perf, pt, coresight: Fix address filters for vmas with non-zero offset + - [armhf] clocksource/drivers/sun5i: Fail gracefully when clock rate is + unavailable + - [armhf] clocksource/drivers/exynos_mct: Fix error path in timer + resources initialization + - [x86] platform/x86: wmi: fix potential null pointer dereference + - NFS/pnfs: Bulk destroy of layouts needs to be safe w.r.t. umount + - ath10k: Fix length of wmi tlv command for protected mgmt frames + - netfilter: nft_set_hash: fix lookups with fixed size hash on big endian + - netfilter: nft_set_hash: bogus element self comparison from deactivation + path + - net: sched: act_csum: Fix csum calc for tagged packets + - [arm*] hwrng: bcm2835 - fix probe as platform device + - [amd64] iommu/vt-d: Fix NULL pointer reference in intel_svm_bind_mm() + - NFS: Add missing encode / decode sequence_maxsz to v4.2 operations + - NFSv4/flexfiles: Fix invalid deref in FF_LAYOUT_DEVID_NODE() + - [amd64] net: aquantia: fixed instack structure overflow + - media: dvb/earth-pt1: fix wrong initialization for demod blocks + - rbd: clear ->xferred on error from rbd_obj_issue_copyup() + - PCI: Fix "try" semantics of bus and slot reset + - scsi: megaraid_sas: reduce module load time + - xen, cpu_hotplug: Prevent an out of bounds access + - net/mlx5: Fix multiple updates of steering rules in parallel + - net/mlx5e: IPoIB, Fix RX checksum statistics update + - [arm64,armhf] soc: amlogic: gx-socinfo: Add mask for each SoC packages + - media: ivtv: update *pos correctly in ivtv_read_pos() + - media: cx18: update *pos correctly in cx18_read_pos() + - [armhf] media: wl128x: Fix an error code in fm_download_firmware() + - media: cx23885: check allocation return + - jfs: fix bogus variable self-initialization + - [armhf] dts: sun9i: optimus: Fix fixed-regulators + - net: phy: don't clear BMCR in genphy_soft_reset + - [armhf] OMAP2+: Fix potentially uninitialized return value for + _setup_reset() + - [arm64,armhf] net: dsa: Avoid null pointer when failing to connect to + PHY + - media: tw5864: Fix possible NULL pointer dereference in + tw5864_handle_frame + - [arm64,armhf] spi: tegra114: clear packed bit for unpacked mode + - [arm64,armhf] spi: tegra114: fix for unpacked mode transfers + - [arm64,armhf] spi: tegra114: terminate dma and reset on transfer timeout + - [arm64,armhf] spi: tegra114: flush fifos + - [arm64,armhf] spi: tegra114: configure dma burst size to fifo trig level + - [armhf] bus: ti-sysc: Fix sysc_unprepare() when no clocks have been + allocated + - [arm*] spi: bcm2835aux: fix driver to not allow 65535 (=-1) cs-gpios + - drm/fb-helper: generic: Call drm_client_add() after setup is done + - [arm64] vdso: don't leak kernel addresses + - rtc: Fix timestamp value for RTC_TIMESTAMP_BEGIN_1900 + - bpf: Add missed newline in verifier verbose log + - [x86] drm/vmwgfx: Remove set but not used variable 'restart' + - scsi: qla2xxx: Unregister chrdev if module initialization fails + - net/sched: cbs: fix port_rate miscalculation + - ACPI: button: reinitialize button state upon resume + - [arm64,armhf] firmware: arm_scmi: fix of_node leak in scmi_mailbox_check + - rxrpc: Fix detection of out of order acks + - scsi: target/core: Fix a race condition in the LUN lookup code + - brcmfmac: fix leak of mypkt on error return path + - [arm64] net: hns3: fix for vport->bw_limit overflow problem + - [x86] hwmon: (w83627hf) Use request_muxed_region for Super-IO accesses + - perf/core: Fix the address filtering fix + - [arm64,armhf] soc: amlogic: meson-gx-pwrc-vpu: Fix power on/off register + bitmask + - [x86] platform/x86: alienware-wmi: fix kfree on potentially + uninitialized pointer + - tipc: set sysctl_tipc_rmem and named_timeout right range + - usb: typec: tcpm: Notify the tcpc to start connection-detection for SRPs + - [arm64] net: hns3: fix loop condition of hns3_get_tx_timeo_queue_info() + - 6lowpan: Off by one handling ->nexthdr + - ALSA: usb-audio: Handle the error from + snd_usb_mixer_apply_create_quirk() + - afs: Fix AFS file locking to allow fine grained locks + - afs: Further fix file locking + - NFS: Don't interrupt file writeout due to fatal errors + - scsi: qla2xxx: Fix a format specifier + - scsi: qla2xxx: Fix error handling in qlt_alloc_qfull_cmd() + - scsi: qla2xxx: Avoid that qlt_send_resp_ctio() corrupts memory + - [ppc64el] KVM: PPC: Book3S HV: Fix lockdep warning when entering the + guest + - netfilter: nft_flow_offload: add entry to flowtable after confirmation + - packet: in recvmsg msg_name return at least sizeof sockaddr_ll + - ASoC: fix valid stream condition + - [arm*] dwc2: gadget: Fix completed transfer size calculation in DDMA + - IB/mlx5: Add missing XRC options to QP optional params mask + - RDMA/rxe: Consider skb reserve space based on netdev of GID + - [amd64] iommu/vt-d: Make kernel parameter igfx_off work with vIOMMU + - [arm64] dmaengine: tegra210-adma: restore channel status + - mmc: core: fix possible use after free of host + - ath10k: Fix encoding for protected management frames + - afs: Fix the afs.cell and afs.volume xattr handlers + - l2tp: Fix possible NULL pointer dereference + - [x86] platform/x86: alienware-wmi: printing the wrong error code + - netfilter: ebtables: CONFIG_COMPAT: reject trailing data after last rule + - [arm64,armhf] pwm: meson: Consider 128 a valid pre-divider + - [arm64,armhf] pwm: meson: Don't disable PWM when setting duty repeatedly + - nfp: bpf: fix static check error through tightening shift amount + adjustment + - netfilter: nf_tables: correct NFT_LOGLEVEL_MAX value + - [arm*] thermal: cpu_cooling: Actually trace CPU load in + thermal_power_cpu_get_power + - EDAC/mc: Fix edac_mc_find() in case no device is found + - afs: Fix key leak in afs_release() and afs_evict_inode() + - afs: Don't invalidate callback if AFS_VNODE_DIR_VALID not set + - afs: Fix lock-wait/callback-break double locking + - afs: Fix double inc of vnode->cb_break + - [armhf] dts: sun8i-h3: Fix wifi in Beelink X2 DT + - [arm64] clk: meson: gxbb: no spread spectrum on mpll0 + - [arm64] clk: meson: axg: spread spectrum is on mpll2 + - [arm64] dmaengine: tegra210-adma: Fix crash during probe + - [arm64] dts: meson: libretech-cc: set eMMC as removable + - RDMA/qedr: Fix incorrect device rate. + - [x86] crypto: ccp - fix AES CFB error exposed by new test vectors + - [x86] crypto: ccp - Fix 3DES complaint from ccp-crypto module + - iommu: Add missing new line for dma type + - iommu: Use right function to get group for device + - signal/cifs: Fix cifs_put_tcp_session to call send_sig instead of + force_sig + - inet: frags: call inet_frags_fini() after unregister_pernet_subsys() + - [arm64] net: hns3: fix a memory leak issue for + hclge_map_unmap_ring_to_vf_vector + - [x86] netvsc: unshare skb in VF rx handler + - net: core: support XDP generic on stacked devices. + - RDMA/uverbs: check for allocation failure in uapi_add_elm() + - net: don't clear sock->sk early to avoid trouble in strparser + - [arm64] phy: qcom-qusb2: fix missing assignment of ret when calling + clk_prepare_enable + - [arm64] clk: sunxi-ng: sun50i-h6-r: Fix incorrect W1 clock gate register + - media: vivid: fix incorrect assignment operation when setting video mode + - [arm64] crypto: inside-secure - fix zeroing of the request in + ahash_exit_inv + - [arm64] crypto: inside-secure - fix queued len computation + - mpls: fix warning with multi-label encap + - [arm64] dts: meson-gxm-khadas-vim2: fix gpio-keys-polled node + - [arm64] dts: meson-gxm-khadas-vim2: fix Bluetooth support + - [amd64] iommu/vt-d: Duplicate iommu_resv_region objects per device list + - qed: iWARP - Use READ_ONCE and smp_store_release to access ep->state + - qed: iWARP - fix uninitialized callback + - [powerpc*] cacheinfo: add cacheinfo_teardown, cacheinfo_rebuild + - [powerpc*] pseries/mobility: rebuild cacheinfo hierarchy post-migration + - bpf: fix the check that forwarding is enabled in bpf_ipv6_fib_lookup + - [amd64] IB/hfi1: Handle port down properly in pio + - [arm64] drm/msm/mdp5: Fix mdp5_cfg_init error return + - net: netem: fix backlog accounting for corrupted GSO frames + - net/udp_gso: Allow TX timestamp with UDP GSO + - [s390x] net/af_iucv: build proper skbs for HiperTransport + - [s390x] net/af_iucv: always register net_device notifier + - [armhf] ASoC: ti: davinci-mcasp: Fix slot mask settings when using + multiple AXRs + - rtc: pcf8563: Fix interrupt trigger method + - rtc: pcf8563: Clear event flags and disable interrupts before requesting + irq + - net/sched: cbs: Fix error path of cbs_module_init + - [arm64] drm/msm/a3xx: remove TPL1 regs from snapshot + - ip6_fib: Don't discard nodes with valid routing information in + fib6_locate_1() + - perf/ioctl: Add check for the sample_period value + - [x86] dmaengine: hsu: Revert "set HSU_CH_MTSR to memory width" + - tools: bpftool: use correct argument in cgroup errors + - fork,memcg: alloc_thread_stack_node needs to set tsk->stack + - bnxt_en: Fix ethtool selftest crash under error conditions. + - bnxt_en: Suppress error messages when querying DSCP DCB capabilities. + - [amd64] iommu: Make iommu_disable safer + - [x86] mfd: intel-lpss: Release IDA resources + - rxrpc: Fix uninitialized error code in rxrpc_send_data_packet() + - xprtrdma: Fix use-after-free in rpcrdma_post_recvs + - PM: ACPI/PCI: Resume all devices during hibernation + - ACPI: PM: Simplify and fix PM domain hibernation callbacks + - ACPI: PM: Introduce "poweroff" callbacks for ACPI PM domain and LPSS + - devres: allow const resource arguments + - [arm64] RDMA/hns: Fixs hw access invalid dma memory error + - ceph: fix "ceph.dir.rctime" vxattr value + - xdp: fix possible cq entry leak + - scsi: libfc: fix null pointer dereference on a null lport + - xfrm interface: ifname may be wrong in logs + - [armhf] clk: sunxi-ng: v3s: add the missing PLL_DDR1 + - PM: sleep: Fix possible overflow in pm_system_cancel_wakeup() + - libertas_tf: Use correct channel range in lbtf_geo_init + - qed: reduce maximum stack frame size + - usb: host: xhci-hub: fix extra endianness conversion + - [x86] crypto: ccp - Reduce maximum stack usage + - tipc: reduce risk of wakeup queue starvation + - net/mlx5: Fix mlx5_ifc_query_lag_out_bits + - cifs: fix rmmod regression in cifs.ko caused by force_sig changes + - net: fix bpf_xdp_adjust_head regression for generic-XDP + - cxgb4: smt: Add lock for atomic_dec_and_test + - ext4: set error return correctly when ext4_htree_store_dirent fails + - [arm64] RDMA/hns: Bugfix for slab-out-of-bounds when unloading hip08 + driver + - [arm64] RDMA/hns: bugfix for slab-out-of-bounds when loading hip08 + driver + - net/rds: Add a few missing rds_stat_names entries + - tools: bpftool: fix arguments for p_err() in do_event_pipe() + - tools: bpftool: fix format strings and arguments for jsonw_printf() + - bnxt_en: Fix handling FRAG_ERR when NVM_INSTALL_UPDATE cmd fails + - signal: Allow cifs and drbd to receive their terminating signals + - [ppc64el] 64s/radix: Fix memory hot-unplug page table split + - [x86] dmaengine: dw: platform: Switch to acpi_dma_controller_register() + - mac80211: minstrel_ht: fix per-group max throughput rate initialization + - i40e: reduce stack usage in i40e_set_fc + - [armhf] 8896/1: VDSO: Don't leak kernel addresses + - [mips*] avoid explicit UB in assignment of mips_io_port_base + - media: em28xx: Fix exception handling in em28xx_alloc_urbs() + - ahci: Do not export local variable ahci_em_messages + - rxrpc: Fix lack of conn cleanup when local endpoint is cleaned up + - Partially revert "kfifo: fix kfifo_alloc() and kfifo_init()" + - hwmon: (lm75) Fix write operations for negative temperatures + - net/sched: cbs: Set default link speed to 10 Mbps in cbs_set_port_rate + - power: supply: Init device wakeup after device_add() + - [x86] perf: Fix the dependency of the x86 insn decoder selftest + - irqdomain: Add the missing assignment of domain->fwnode for named fwnode + - bcma: fix incorrect update of BCMA_CORE_PCI_MDIO_DATA + - bcache: Fix an error code in bch_dump_read() + - netfilter: ctnetlink: honor IPS_OFFLOAD flag + - [arm64] wcn36xx: use dynamic allocation for large variables + - xsk: avoid store-tearing when assigning queues + - xsk: avoid store-tearing when assigning umem + - led: triggers: Fix dereferencing of null pointer + - [arm64] net: hns3: fix error VF index when setting VLAN offload + - rtlwifi: Fix file release memory leak + - f2fs: fix wrong error injection path in inc_valid_block_count() + - f2fs: fix error path of f2fs_convert_inline_page() + - [x86] scsi: fnic: fix msix interrupt allocation + - Btrfs: fix hang when loading existing inode cache off disk + - Btrfs: fix inode cache waiters hanging on failure to start caching + thread + - Btrfs: fix inode cache waiters hanging on path allocation failure + - btrfs: use correct count in btrfs_file_write_iter() + - ixgbe: sync the first fragment unconditionally + - ath10k: adjust skb length in ath10k_sdio_mbox_rx_packet + - RDMA/cma: Fix false error message + - net/rds: Fix 'ib_evt_handler_call' element in 'rds_ib_stat_names' + - bnxt_en: Increase timeout for HWRM_DBG_COREDUMP_XX commands + - f2fs: fix to avoid accessing uninitialized field of inode page in + is_alive() + - [powerpc*] mm/mce: Keep irqs disabled during lockless page table walk + - bpf: fix BTF limits + - [amd64] iommu: Wait for completion of IOTLB flush in attach_device + - [amd64] net: aquantia: Fix aq_vec_isr_legacy() return value + - cxgb4: Signedness bug in init_one() + - [arm64] net: hisilicon: Fix signedness bug in hix5hd2_dev_probe() + - [arm64] net: netsec: Fix signedness bug in netsec_probe() + - [arm64,armhf] net: stmmac: dwmac-meson8b: Fix signedness bug in probe + - of: mdio: Fix a signedness bug in of_phy_get_and_connect() + - [arm64] net: ethernet: stmmac: Fix signedness bug in + ipq806x_gmac_of_parse() + - net: sched: cbs: Avoid division by zero when calculating the port rate + - nvme: retain split access workaround for capability reads + - [arm64,armhf] net: stmmac: gmac4+: Not all Unicast addresses may be + available + - rxrpc: Fix trace-after-put looking at the put connection record + - mac80211: accept deauth frames in IBSS mode + - llc: fix another potential sk_buff leak in llc_ui_sendmsg() + - llc: fix sk_buff refcounting in llc_conn_state_process() + - ip6erspan: remove the incorrect mtu limit for ip6erspan + - [arm64,armhf] net: stmmac: fix length of PTP clock's name string + - [arm64,armhf] net: stmmac: fix disabling flexible PPS output + - sctp: add chunks to sk_backlog when the newsk sk_socket is not set + - [s390x] qeth: Fix error handling during VNICC initialization + - [s390x] qeth: Fix initialization of vnicc cmd masks during set online + - act_mirred: Fix mirred_init_module error handling + - net: avoid possible false sharing in sk_leave_memory_pressure() + - net: add {READ|WRITE}_ONCE() annotations on ->rskq_accept_head + - tcp: annotate lockless access to tcp_memory_pressure + - net/smc: receive returns without data + - net/smc: receive pending data after RCV_SHUTDOWN + - [arm64] drm/msm/dsi: Implement reset correctly + - [armhf] dmaengine: imx-sdma: fix size check for sdma script_number + - [arm64] hibernate: check pgd table allocation + - net: netem: fix error path for corrupted GSO frames + - net: netem: correct the parent's backlog when corrupted packet was + dropped + - xsk: Fix registration of Rx-only sockets + - bpf, offload: Unlock on error in bpf_offload_dev_create() + - afs: Fix missing timeout reset + - [x86] hv_netvsc: Fix offset usage in netvsc_send_table() + - [x86] hv_netvsc: Fix send_table offset in case of a host bug + - afs: Fix large file support + - [armhf] hwrng: omap3-rom - Fix missing clock by probing with device tree + - [mips64el,mipsel] Loongson: Fix return value of loongson_hwmon_init + - [x86] hv_netvsc: flag software created hash value + - net: neigh: use long type to store jiffies delta + - packet: fix data-race in fanout_flow_is_huge() + - affs: fix a memory leak in affs_remount + - afs: Remove set but not used variables 'before', 'after' + - [armhf] dmaengine: ti: edma: fix missed failure handling + - drm/radeon: fix bad DMA from INTERRUPT_CNTL2 + - [arm64] dts: meson-gxm-khadas-vim2: fix uart_A bluetooth node + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.100 + - can, slip: Protect tty->disc_data in write_wakeup and close with RCU + - [x86] firestream: fix memory leaks + - gtp: make sure only SOCK_DGRAM UDP sockets are accepted + - ipv6: sr: remove SKB_GSO_IPXIP6 on End.D* actions + - net: cxgb3_main: Add CAP_NET_ADMIN check to CHELSIO_GET_MEM + - net: ip6_gre: fix moving ip6gre between namespaces + - net, ip6_tunnel: fix namespaces move + - net, ip_tunnel: fix namespaces move + - net: rtnetlink: validate IFLA_MTU attribute in rtnl_create_link() + - net_sched: fix datalen for ematch + - net-sysfs: Fix reference count leak in rx|netdev_queue_add_kobject + - net-sysfs: fix netdev_queue_add_kobject() breakage + - net-sysfs: Call dev_hold always in netdev_queue_add_kobject + - net-sysfs: Call dev_hold always in rx_queue_add_kobject + - net-sysfs: Fix reference count leak + - net: usb: lan78xx: Add .ndo_features_check + - Revert "udp: do rmem bulk free even if the rx sk queue is empty" + - tcp_bbr: improve arithmetic division in bbr_update_bw() + - tcp: do not leave dangling pointers in tp->highest_sack + - tun: add mutex_unlock() call and napi.skb clearing in tun_get_user() + - afs: Fix characters allowed into cell names + - hwmon: (adt7475) Make volt2reg return same reg as reg2volt input + - hwmon: (core) Do not use device managed functions for memory allocations + - PCI: Mark AMD Navi14 GPU rev 0xc5 ATS as broken + - tracing: trigger: Replace unneeded RCU-list traversals + - Input: keyspan-remote - fix control-message timeouts + - [x86] Revert "Input: synaptics-rmi4 - don't increment rmiaddr for SMBus + transfers" + - [arm64,armhf] mmc: tegra: fix SDR50 tuning override + - mmc: sdhci: fix minimum clock rate for v3 controller + - [arm64] Documentation: Document arm64 kpti control + - Input: sur40 - fix interface sanity checks + - Input: gtco - fix endpoint sanity check + - Input: aiptek - fix endpoint sanity check + - Input: pegasus_notetaker - fix endpoint sanity check + - [armhf] Input: sun4i-ts - add a check for + devm_thermal_zone_of_sensor_register + - netfilter: nft_osf: add missing check for DREG attribute + - hwmon: (nct7802) Fix voltage limits to wrong registers + - do_last(): fetch directory ->i_mode and ->i_uid before it's too late + (CVE-2020-8428) + - sd: Fix REQ_OP_ZONE_REPORT completion handling + - [i386] crypto: geode-aes - switch to skcipher for cbc(aes) fallback + - media: v4l2-ioctl.c: zero reserved fields for S/TRY_FMT + - scsi: iscsi: Avoid potential deadlock in iscsi_if_rx func + - netfilter: ipset: use bitmap infrastructure completely + - netfilter: nf_tables: add __nft_chain_type_get() + - mm/memory_hotplug: make remove_memory() take the device_hotplug_lock + - mm, sparse: drop pgdat_resize_lock in sparse_add/remove_one_section() + - mm, sparse: pass nid instead of pgdat to sparse_add_one_section() + - drivers/base/memory.c: remove an unnecessary check on NR_MEM_SECTIONS + - mm, memory_hotplug: add nid parameter to arch_remove_memory + - mm/memory_hotplug: release memory resource after arch_remove_memory() + - drivers/base/memory.c: clean up relics in function parameters + - mm, memory_hotplug: update a comment in unregister_memory() + - mm/memory_hotplug: make unregister_memory_section() never fail + - mm/memory_hotplug: make __remove_section() never fail + - [powerpc*] mm: Fix section mismatch warning + - mm/memory_hotplug: make __remove_pages() and arch_remove_memory() never + fail + - [s390x] mm: implement arch_remove_memory() + - mm/memory_hotplug: allow arch_remove_memory() without + CONFIG_MEMORY_HOTREMOVE + - drivers/base/memory: pass a block_id to init_memory_block() + - mm/memory_hotplug: create memory block devices after arch_add_memory() + - mm/memory_hotplug: remove memory block devices before + arch_remove_memory() + - mm/memory_hotplug: make unregister_memory_block_under_nodes() never fail + - mm/memory_hotplug: remove "zone" parameter from + sparse_remove_one_section + - mm/hotplug: kill is_dev_zone() usage in __remove_pages() + - drivers/base/node.c: simplify unregister_memory_block_under_nodes() + - mm/memunmap: don't access uninitialized memmap in memunmap_pages() + - mm/memory_hotplug: fix try_offline_node() + - mm/memory_hotplug: shrink zones when offlining memory + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.101 + - orinoco_usb: fix interface sanity check + - rsi_91x_usb: fix interface sanity check + - USB: serial: ir-usb: add missing endpoint sanity check + - USB: serial: ir-usb: fix link-speed handling + - USB: serial: ir-usb: fix IrLAP framing + - [arm64,armhf] usb: dwc3: turn off VBUS when leaving host mode + - staging: wlan-ng: ensure error return is actually returned + - [x86] staging: vt6656: correct packet types for CTS protect, mode. + - [x86] staging: vt6656: use NULLFUCTION stack on mac80211 + - [x86] staging: vt6656: Fix false Tx excessive retries reporting. + - [arm64,armel] serial: 8250_bcm2835aux: Fix line mismatch on driver + unbind + - component: do not dereference opaque pointer in debugfs + - [x86] mei: me: add comet point (lake) H device ids + - crypto: chelsio - fix writing tfm flags to wrong place + - cifs: Fix memory allocation in __smb2_handle_cancelled_cmd() + - ath9k: fix storage endpoint lookup + - brcmfmac: fix interface sanity check + - rtl8xxxu: fix interface sanity check + - zd1211rw: fix storage endpoint lookup + - net_sched: ematch: reject invalid TCF_EM_SIMPLE + - net_sched: fix ops->bind_class() implementations + - HID: multitouch: Add LG MELF0410 I2C touchscreen support + - HID: Add quirk for Xin-Mo Dual Controller + - HID: ite: Add USB id match for Acer SW5-012 keyboard dock + - [x86] HID: Add quirk for incorrect input length on Lenovo Y720 + - drivers/hid/hid-multitouch.c: fix a possible null pointer access. + - [arm64] phy: qcom-qmp: Increase PHY ready timeout + - drivers/net/b44: Change to non-atomic bit operations on pwol_mask + - [i386] net: wan: sdla: Fix cast from pointer to integer of different + size + - [arm64] gpio: max77620: Add missing dependency on GPIOLIB_IRQCHIP + - atm: eni: fix uninitialized variable warning + - HID: steam: Fix input device disappearing + - [x86] platform/x86: dell-laptop: disable kbd backlight on Inspiron 10xx + - [amd64] PCI: Add DMA alias quirk for Intel VCA NTB + - [amd64] iommu: Support multiple PCI DMA aliases in IRQ Remapping + - usb-storage: Disable UAS on JMicron SATA enclosure + - sched/fair: Add tmp_alone_branch assertion + - sched/fair: Fix insertion in rq->leaf_cfs_rq_list + - rsi: fix use-after-free on probe errors + - rsi: fix memory leak on failed URB submission + - rsi: fix non-atomic allocation in completion handler + - crypto: af_alg - Use bh_lock_sock in sk_destruct + - block: cleanup __blkdev_issue_discard() + - block: fix 32 bit overflow in __blkdev_issue_discard() + - [arm64] KVM: Write arch.mdcr_el2 changes since last vcpu_load on VHE + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.102 + - vfs: fix do_last() regression + - crypto: pcrypt - Fix user-after-free on module unload + - perf c2c: Fix return type for histogram sorting comparision functions + - PM / devfreq: Add new name attribute for sysfs + - tools lib: Fix builds when glibc contains strlcpy() + - ext4: validate the debug_want_extra_isize mount option at parse time + - mm/mempolicy.c: fix out of bounds write in mpol_parse_str() + - reiserfs: Fix memory leak of journal device string + - media: digitv: don't continue if remote control state can't be read + - media: af9005: uninitialized variable printked + - media: vp7045: do not read uninitialized values if usb transfer fails + - media: gspca: zero usb_buf + - media: dvb-usb/dvb-usb-urb.c: initialize actlen to 0 + - tomoyo: Use atomic_t for statistics counter + - ttyprintk: fix a potential deadlock in interrupt context issue + - Bluetooth: Fix race condition in hci_release_sock() + - cgroup: Prevent double killing of css when enabling threaded cgroup + - [armhf] dts: sun8i: a83t: Correct USB3503 GPIOs polarity + - [armhf] dts: am57xx-beagle-x15/am57xx-idk: Remove "gpios" for endpoint + dt nodes + - [armhf] dts: beagle-x15-common: Model 5V0 regulator + - [arm64] clk: sunxi-ng: h6-r: Fix AR100/R_APB2 parent order + - mac80211: mesh: restrict airtime metric to peered established plinks + - ASoC: rt5640: Fix NULL dereference on module unload + - ixgbevf: Remove limit of 10 entries for unicast filter list + - ixgbe: Fix calculation of queue with VFs and flow director on interface + flap + - igb: Fix SGMII SFP module discovery for 100FX/LX. + - [x86] platform/x86: GPD pocket fan: Allow somewhat lower/higher + temperature limits + - qmi_wwan: Add support for Quectel RM500Q + - wireless: fix enabling channel 12 for custom regulatory domain + - cfg80211: Fix radar event during another phy CAC + - mac80211: Fix TKIP replay protection immediately after key setup + - netfilter: nft_tunnel: ERSPAN_VERSION must not be null + - [armhf] net: dsa: bcm_sf2: Configure IMP port for 2Gb/sec + - bnxt_en: Fix ipv6 RFS filter matching logic. + - iwlwifi: Don't ignore the cap field upon mcc update + - [armhf] dts: am335x-boneblack-common: fix memory size + - vti[6]: fix packet tx through bpf_redirect() + - xfrm interface: fix packet tx through bpf_redirect() + - xfrm: interface: do not confirm neighbor when do pmtu update + - scsi: fnic: do not queue commands during fwreset + - [armhf] 8955/1: virt: Relax arch timer version check during early boot + - [arm64] tee: optee: Fix compilation issue with nommu + - airo: Fix possible info leak in AIROOLDIOCTL/SIOCDEVPRIVATE + - airo: Add missing CAP_NET_ADMIN check in AIROOLDIOCTL/SIOCDEVPRIVATE + - r8152: get default setting of WOL before initializing + - qlcnic: Fix CPU soft lockup while collecting firmware dump + - seq_tab_next() should increase position index + - l2t_seq_next should increase position index + - net: Fix skb->csum update in inet_proto_csum_replace16(). + - btrfs: do not zero f_bavail if we have available space + - perf report: Fix no libunwind compiled warning break s390 issue + - mm/migrate.c: also overwrite error when it is bigger than zero + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.103 + - [armhf] Revert "drm/sun4i: dsi: Change the start delay calculation" + - ovl: fix lseek overflow on 32bit + - kernel/module: Fix memleak in module_add_modinfo_attrs() + - media: iguanair: fix endpoint sanity check + - ocfs2: fix oops when writing cloned file + - [x86] cpu: Update cached HLE state on write to TSX_CTRL_CPUID_CLEAR + - udf: Allow writing to 'Rewritable' partitions + - printk: fix exclusive_console replaying + - iwlwifi: mvm: fix NVM check for 3168 devices + - gtp: use __GFP_NOWARN to avoid memalloc warning + - l2tp: Allow duplicate session creation with UDP + - net_sched: fix an OOB access in cls_tcindex + - [arm64,armhf] net: stmmac: Delete txtimer in suspend() + - bnxt_en: Fix TC queue mapping. + - tcp: clear tp->total_retrans in tcp_disconnect() + - tcp: clear tp->delivered in tcp_disconnect() + - tcp: clear tp->data_segs{in|out} in tcp_disconnect() + - tcp: clear tp->segs_{in|out} in tcp_disconnect() + - rxrpc: Fix use-after-free in rxrpc_put_local() + - rxrpc: Fix insufficient receive notification generation + - rxrpc: Fix missing active use pinning of rxrpc_local object + - rxrpc: Fix NULL pointer deref due to call->conn being cleared on + disconnect + - media: uvcvideo: Avoid cyclic entity chains due to malformed USB + descriptors + - ipc/msg.c: consolidate all xxxctl_down() functions + - tracing: Fix sched switch start/stop refcount racy updates + - rcu: Avoid data-race in rcu_gp_fqs_check_wake() + - brcmfmac: Fix memory leak in brcmf_usbdev_qinit + - usb: gadget: f_ncm: Use atomic_t to track in-flight request + - usb: gadget: f_ecm: Use atomic_t to track in-flight request + - ALSA: usb-audio: Fix endianess in descriptor validation + - ALSA: dummy: Fix PCM format loop in proc output + - mm/memory_hotplug: fix remove_memory() lockdep splat + - mm: move_pages: report the number of non-attempted pages + - media/v4l2-core: set pages dirty upon releasing DMA buffers + - media: v4l2-core: compat: ignore native command codes + - media: v4l2-rect.h: fix v4l2_rect_map_inside() top/left adjustments + - irqdomain: Fix a memory leak in irq_domain_push_irq() + - [x86] platform/x86: intel_scu_ipc: Fix interrupt support + - [x86] ALSA: hda: Add Clevo W65_67SB the power_save blacklist + - [arm64] KVM: Correct PSTATE on exception entry + - [arm64,armhf] KVM: Correct CPSR on exception entry + - [arm64,armhf] KVM: Correct AArch32 SPSR on exception entry + - [arm64] KVM: Only sign-extend MMIO up to register width + - [s390x] mm: fix dynamic pagetable upgrade for hugetlbfs + - [powerpc*] pseries: Advance pfn if section is not present in + lmb_is_removable() + - smb3: fix signing verification of large reads + - [arm64,armhf] PCI: tegra: Fix return value check of + pm_runtime_get_sync() + - [arm64,armhf] mmc: spi: Toggle SPI polarity, do not hardcode it + - [x86] ACPI: video: Do not export a non working backlight interface on MSI + MS-7721 boards + - [x86] ACPI / battery: Deal with design or full capacity being reported + as -1 + - [x86] ACPI / battery: Use design-cap for capacity calculations if + full-cap is not available + - [x86] ACPI / battery: Deal better with neither design nor full capacity + not being reported + - alarmtimer: Unregister wakeup source when module get fails + - ubifs: Reject unsupported ioctl flags explicitly + - ubifs: don't trigger assertion on invalid no-key filename + - ubifs: Fix FS_IOC_SETFLAGS unexpectedly clearing encrypt flag + - ubifs: Fix deadlock in concurrent bulk-read and writepage + - [i386] crypto: geode-aes - convert to skcipher API and make thread-safe + - [x86] hv_balloon: Balloon up according to request page number + - mfd: axp20x: Mark AXP20X_VBUS_IPSOUT_MGMT as volatile + - crypto: api - Check spawn->alg under lock in crypto_drop_spawn + - scsi: qla2xxx: Fix mtcp dump collection failure + - ovl: fix wrong WARN_ON() in ovl_cache_update_ino() + - f2fs: choose hardlimit when softlimit is larger than hardlimit in + f2fs_statfs_project() + - f2fs: fix miscounted block limit in f2fs_statfs_project() + - f2fs: code cleanup for f2fs_statfs_project() + - PM: core: Fix handling of devices deleted during system-wide resume + - dm zoned: support zone sizes smaller than 128MiB + - dm space map common: fix to ensure new block isn't already in use + - dm crypt: fix benbi IV constructor crash if used in authenticated mode + - dm: fix potential for q->make_request_fn NULL pointer + - dm writecache: fix incorrect flush sequence when doing SSD mode commit + - padata: Remove broken queue flushing + - tracing: Annotate ftrace_graph_hash pointer with __rcu + - tracing: Annotate ftrace_graph_notrace_hash pointer with __rcu + - ftrace: Add comment to why rcu_dereference_sched() is open coded + - ftrace: Protect ftrace_graph_hash with ftrace_sync + - [x86] crypto: ccp - set max RSA modulus size for v3 platform devices as + well + - crypto: pcrypt - Do not clear MAY_SLEEP flag in original request + - crypto: api - Fix race condition in crypto_spawn_alg + - scsi: qla2xxx: Fix unbound NVME response length + - NFS: Fix memory leaks and corruption in readdir + - NFS: Directory page cache pages need to be locked when read + - jbd2_seq_info_next should increase position index + - Btrfs: fix missing hole after hole punching and fsync when using + NO_HOLES + - btrfs: set trans->drity in btrfs_commit_transaction + - Btrfs: fix race between adding and putting tree mod seq elements and + nodes + - [armhf] tegra: Enable PLLP bypass during Tegra124 LP1 + - iwlwifi: don't throw error when trying to remove IGTK + - mwifiex: fix unbalanced locking in mwifiex_process_country_ie() + - sunrpc: expiry_time should be seconds not timeval + - gfs2: move setting current->backing_dev_info + - gfs2: fix O_SYNC write handling + - drm/rect: Avoid division by zero + - media: rc: ensure lirc is initialized before registering input device + - xen/balloon: Support xend-based toolstack take two + - watchdog: fix UAF in reboot notifier handling in watchdog core code + - bcache: add readahead cache policy options via sysfs interface + - eventfd: track eventfd_signal() recursion depth + - aio: prevent potential eventfd recursion on poll + - [x86] KVM: Refactor picdev_write() to prevent Spectre-v1/L1TF attacks + - [x86] KVM: Refactor prefix decoding to prevent Spectre-v1/L1TF attacks + - [x86] KVM: Protect pmu_intel.c from Spectre-v1/L1TF attacks + - [x86] KVM: Protect DR-based index computations from Spectre-v1/L1TF + attacks + - [x86] KVM: Protect kvm_lapic_reg_write() from Spectre-v1/L1TF attacks + - [x86] KVM: Protect kvm_hv_msr_[get|set]_crash_data() from Spectre-v1/L1TF + attacks + - [x86] KVM: Protect ioapic_write_indirect() from Spectre-v1/L1TF attacks + - [x86] KVM: Protect MSR-based index computations in pmu.h from + Spectre-v1/L1TF attacks + - [x86] KVM: Protect ioapic_read_indirect() from Spectre-v1/L1TF attacks + - [x86] KVM: Protect MSR-based index computations from Spectre-v1/L1TF + attacks in x86.c + - [x86] KVM: Protect x86_decode_insn from Spectre-v1/L1TF attacks + - [x86] KVM: Protect MSR-based index computations in + fixed_msr_to_seg_unit() from Spectre-v1/L1TF attacks + - [x86] KVM: Fix potential put_fpu() w/o load_fpu() on MPX platform + - [ppc64el] KVM: Book3S HV: Uninit vCPU if vcore creation fails + - [ppc64el] KVM: Book3S PR: Free shared page if mmu initialization fails + - [x86] kvm: Be careful not to clear KVM_VCPU_FLUSH_TLB bit + (CVE-2019-3016) + - [x86] KVM: Don't let userspace set host-reserved cr4 bits + - [x86] KVM: Free wbinvd_dirty_mask if vCPU creation fails + - [s390x] KVM: do not clobber registers during guest reset/store status + - [arm64,armhf] clk: tegra: Mark fuse clock as critical + - percpu: Separate decrypted varaibles anytime encryption can be enabled + - scsi: qla2xxx: Fix the endianness of the qla82xx_get_fw_size() return + type + - scsi: csiostor: Adjust indentation in csio_device_reset + - scsi: qla4xxx: Adjust indentation in qla4xxx_mem_free + - scsi: ufs: Recheck bkops level if bkops is disabled + - [arm64] phy: qualcomm: Adjust indentation in read_poll_timeout + - ext2: Adjust indentation in ext2_fill_super + - [arm64] drm: msm: mdp4: Adjust indentation in mdp4_dsi_encoder_enable + - IB/mlx5: Fix outstanding_pi index for GSI qps + - IB/core: Fix ODP get user pages flow + - nfsd: fix delay timer on 32-bit architectures + - nfsd: fix jiffies/time_t mixup in LRU list + - nfsd: Return the correct number of bytes written to the file + - ubi: fastmap: Fix inverted logic in seen selfcheck + - ubi: Fix an error pointer dereference in error handling code + - bonding/alb: properly access headers in bond_alb_xmit() + - [armhf] net: dsa: bcm_sf2: Only 7278 supports 2Gb/sec IMP port + - [arm64,armhf] net: mvneta: move rx_dropped and rx_errors in per-cpu + stats + - net_sched: fix a resource leak in tcindex_set_parms() + - net/mlx5: IPsec, Fix esp modify function attribute + - net/mlx5: IPsec, fix memory leak at mlx5_fpga_ipsec_delete_sa_ctx + - [arm64] net: macb: Remove unnecessary alignment check for TSO + - [arm64] net: macb: Limit maximum GEM TX length in TSO + - [armhf] net: dsa: b53: Always use dev->vlan_enabled in + b53_configure_vlan() + - ext4: fix deadlock allocating crypto bounce page from mempool + - btrfs: use bool argument in free_root_pointers() + - btrfs: free block groups after free'ing fs trees + - btrfs: flush write bio if we loop in extent_write_cache_pages + - [x86] KVM: mmu: Apply max PA check for MMIO sptes to 32-bit KVM + - [x86] KVM: Use gpa_t for cr2/gpa to fix TDP support on 32-bit KVM + - [x86] KVM: nVMX: vmread should not set rflags to specify success in case + of #PF + - KVM: Use vcpu-specific gva->hva translation when querying host page size + - KVM: Play nice with read-only memslots when querying host page size + - mm: zero remaining unavailable struct pages + - mm: return zero_resv_unavail optimization + - mm/page_alloc.c: fix uninitialized memmaps on a partially populated last + section + - cifs: fail i/o on soft mounts if sessionsetup errors out + - [x86] apic/msi: Plug non-maskable MSI affinity race + - clocksource: Prevent double add_timer_on() for watchdog_timer + - perf/core: Fix mlock accounting in perf_mmap() + - rxrpc: Fix service call disconnection + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.104 + - ASoC: pcm: update FE/BE trigger order based on the command + - [x86] hv_sock: Remove the accept port restriction + - IB/mlx4: Fix memory leak in add_gid error flow + - RDMA/netlink: Do not always generate an ACK for some netlink operations + - RDMA/core: Fix locking in ib_uverbs_event_read + - scsi: ufs: Fix ufshcd_probe_hba() reture value in case + ufshcd_scsi_add_wlus() fails + - PCI/IOV: Fix memory leak in pci_iov_add_virtfn() + - ath10k: pci: Only dump ATH10K_MEM_REGION_TYPE_IOREG when safe + - PCI: Don't disable bridge BARs when assigning bus resources + - nfs: NFS_SWAP should depend on SWAP + - NFS: Revalidate the file size on a fatal write error + - NFS/pnfs: Fix pnfs_generic_prepare_to_resend_writes() + - NFSv4: try lease recovery on NFS4ERR_EXPIRED + - [arm64] serial: uartps: Add a timeout to the tx empty wait + - [arm64] gpio: zynq: Report gpio direction at boot + - spi: spi-mem: Add extra sanity checks on the op param + - spi: spi-mem: Fix inverted logic in op sanity check + - rtc: cmos: Stop using shared IRQ + - [x86] platform/x86: intel_mid_powerbtn: Take a copy of ddata + - [powerpc*] pseries/vio: Fix iommu_table use-after-free refcount warning + - [powerpc*] pseries: Allow not having ibm, + hypertas-functions::hcall-multi-tce for DDW + - [arm64] iommu/arm-smmu-v3: Populate VMID field for CMDQ_OP_TLBI_NH_VA + - [arm64,armhf] KVM: vgic-its: Fix restoration of unmapped collections + - [armel,armhf] 8949/1: mm: mark free_memmap as __init + - [arm64] cpufeature: Fix the type of no FP/SIMD capability + - [arm64] ptrace: nofpsimd: Fail FP/SIMD regset operations + - [arm64,armhf] KVM: Fix young bit from mmu notifier + - [arm64,armhf] KVM: Fix DFSR setting for non-LPAE aarch32 guests + - [arm64,armhf] KVM: Make inject_abt32() inject an external abort instead + - [arm64] KVM: pmu: Don't increment SW_INCR if PMCR.E is unset + - mtd: onenand_base: Adjust indentation in onenand_read_ops_nolock + - mwifiex: Fix possible buffer overflows in mwifiex_ret_wmm_get_status() + - mwifiex: Fix possible buffer overflows in mwifiex_cmd_append_vsie_tlv() + - libertas: don't exit from lbs_ibss_join_existing() with RCU read lock + held + - libertas: make lbs_ibss_join_existing() return error code on rates + overflow + - scsi: megaraid_sas: Do not initiate OCR if controller is not in ready + state + - [x86] stackframe: Move ENCODE_FRAME_POINTER to asm/frame.h + - [x86] x86/stackframe, x86/ftrace: Add pt_regs frame annotations + - [arm64] serial: uartps: Move the spinlock after the read of the tx empty + - padata: fix null pointer deref of pd->pinst + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.105 + - Input: synaptics - switch T470s to RMI4 by default + - Input: synaptics - enable SMBus on ThinkPad L470 + - Input: synaptics - remove the LEN0049 dmi id from topbuttonpad list + - ALSA: usb-audio: Fix UAC2/3 effect unit parsing + - ALSA: hda/realtek - Fix silent output on MSI-GL73 + - ALSA: usb-audio: Apply sample rate quirk for Audioengine D1 + - [arm64] cpufeature: Set the FP/SIMD compat HWCAP bits properly + - [arm64] nofpsmid: Handle TIF_FOREIGN_FPSTATE flag cleanly + - ALSA: usb-audio: sound: usb: usb true/false for bool return type + - ALSA: usb-audio: Add clock validity quirk for Denon MC7000/MCX8000 + - ext4: don't assume that mmp_nodename/bdevname have NUL + - ext4: fix support for inode sizes > 1024 bytes + - ext4: fix checksum errors with indexed dirs + - ext4: add cond_resched() to ext4_protect_reserved_inode (CVE-2020-8992) + - ext4: improve explanation of a mount failure caused by a misconfigured + kernel + - Btrfs: fix race between using extent maps and merging them + - btrfs: ref-verify: fix memory leaks + - btrfs: print message when tree-log replay starts + - btrfs: log message when rw remount is attempted with unclean tree-log + - [arm64] ssbs: Fix context-switch when SSBS is present on all CPUs + - [x86] perf/x86/amd: Add missing L2 misses event spec to AMD Family 17h's + event map + - nvme: fix the parameter order for nvme_get_log in nvme_get_fw_slot_info + - [amd64] IB/hfi1: Acquire lock to release TID entries when user file is + closed + - [amd64] IB/hfi1: Close window for pq and request coliding + - IB/rdmavt: Reset all QPs when the device is shut down + - RDMA/core: Fix invalid memory access in spec_filter_size + - [amd64] RDMA/hfi1: Fix memory leak in _dev_comp_vect_mappings_create + - RDMA/rxe: Fix soft lockup problem due to using tasklets in softirq + - RDMA/core: Fix protection fault in get_pkey_idx_qp_list + - [s390x] time: Fix clk type in get_tod_clock + - [x86] perf/x86/intel: Fix inaccurate period in context switch for auto- + reload + - NFSv4.1 make cachethis=no for writes + - jbd2: move the clearing of b_modified flag to the journal_unmap_buffer() + - jbd2: do not clear the BH_Mapped flag when forgetting a metadata buffer + - [x86] KVM: mmu: Fix struct guest_walker arrays for 5-level paging + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.106 + - core: Don't skip generic XDP program execution for cloned SKBs + - enic: prevent waking up stopped tx queues over watchdog reset + - net/smc: fix leak of kernel memory to user space + - net/sched: matchall: add missing validation of TCA_MATCHALL_FLAGS + - net/sched: flower: add missing validation of TCA_FLOWER_FLAGS + - [x86] KVM: nVMX: Use correct root level for nested EPT shadow page + tables + - [x86] drm/gma500: Fixup fbdev stolen size usage evaluation + - cpu/hotplug, stop_machine: Fix stop_machine vs hotplug order + - brcmfmac: Fix use after free in brcmf_sdio_readframes() + - ext4: fix ext4_dax_read/write inode locking sequence for IOCB_NOWAIT + - ALSA: ctl: allow TLV read operation for callback type of element in + locked case + - [powerpc*] powernv/iov: Ensure the pdn for VFs always contains a valid + PE number + - [amd64] iommu/vt-d: Fix off-by-one in PASID allocation + - [x86] pinctrl: baytrail: Do not clear IRQ flags on direct-irq enabled + pins + - [x86] efi: Map the entire EFI vendor string before copying it + - [mips64el,mipsel] Loongson: Fix potential NULL dereference in + loongson3_platform_init() + - [arm*] usb: dwc2: Fix IN FIFO allocation + - [armel,armhf] clocksource/drivers/bcm2835_timer: Fix memory leak of + timer + - jbd2: clear JBD2_ABORT flag before journal_reset to update log tail info + when load journal + - [armhf] pwm: omap-dmtimer: Simplify error handling + - [s390x] pci: Fix possible deadlock in recover_store() + - [powerpc*] iov: Move VF pdev fixup into pcibios_fixup_iov() + - tracing: Fix tracing_stat return values in error handling paths + - tracing: Fix very unlikely race of registering two stat tracers + - ext4, jbd2: ensure panic when aborting with zero errno + - ath10k: Correct the DMA direction for management tx buffers + - nbd: add a flush_workqueue in nbd_start_device + - [s390x] KVM: ENOTSUPP -> EOPNOTSUPP fixups + - [arm64] clk: qcom: rcg2: Don't crash if our parent can't be found; + return an error + - drm/amdgpu: remove 4 set but not used variable in + amdgpu_atombios_get_connector_info_from_object_table + - [arm64,armhf] regulator: rk808: Lower log level on optional GPIOs being + not available + - NFC: port100: Convert cpu_to_le16(le16_to_cpu(E1) + E2) to use + le16_add_cpu(). + - selinux: fall back to ref-walk if audit is required + - selinux: ensure we cleanup the internal AVC counters on error in + avc_insert() + - media: cx23885: Add support for AVerMedia CE310B + - PCI: Add generic quirk for increasing D3hot delay + - PCI: Increase D3 delay for AMD Ryzen5/7 XHCI controllers + - media: v4l2-device.h: Explicitly compare grp{id,mask} to zero in + v4l2_device macros + - reiserfs: Fix spurious unlock in reiserfs_fill_super() error handling + - fore200e: Fix incorrect checks of NULL pointer dereference + - netfilter: nft_tunnel: add the missing ERSPAN_VERSION nla_policy + - ALSA: usx2y: Adjust indentation in snd_usX2Y_hwdep_dsp_status + - orinoco: avoid assertion in case of NULL pointer + - ACPICA: Disassembler: create buffer fields in ACPI_PARSE_LOAD_PASS1 + - scsi: ufs: Complete pending requests in host reset and restore path + - scsi: aic7xxx: Adjust indentation in ahc_find_syncrate + - selinux: ensure we cleanup the internal AVC counters on error in + avc_update() + - dmaengine: Store module owner in dma_device struct + - [arm64] clk: sunxi-ng: add mux and pll notifiers for A64 CPU clock + - tools lib api fs: Fix gcc9 stringop-truncation compilation error + - [x86] ACPI: button: Add DMI quirk for Razer Blade Stealth 13 late 2019 + lid switch + - mlx5: work around high stack usage with gcc + - drm: remove the newline for CRC source name. + - usbip: Fix unsafe unaligned pointer usage + - udf: Fix free space reporting for metadata and virtual partitions + - staging: rtl8188: avoid excessive stack usage + - [amd64] IB/hfi1: Add software counter for ctxt0 seq drop + - [armhf] soc/tegra: fuse: Correct straps' address for older Tegra124 + device trees + - [x86] efi: Don't panic or BUG() on non-critical error conditions + - rcu: Use WRITE_ONCE() for assignments to ->pprev for hlist_nulls + - [x86] nmi: Remove irq_work from the long duration NMI handler + - driver core: platform: Prevent resouce overflow from causing infinite + loops + - driver core: Print device when resources present in really_probe() + - bpf: Return -EBADRQC for invalid map type in __bpf_tx_xdp_map + - drm/nouveau/secboot/gm20b: initialize pointer in gm20b_secboot_new() + - drm/nouveau/gr/gk20a,gm200-: add terminators to method lists read from + fw + - drm/nouveau: Fix copy-paste error in nouveau_fence_wait_uevent_handler + - drm/nouveau/fault/gv100-: fix memory leak on module unload + - [x86] drm/vmwgfx: prevent memory leak in vmw_cmdbuf_res_add + - [armhf] usb: musb: omap2430: Get rid of musb .set_vbus for omap2430 glue + - [arm64] iommu/arm-smmu-v3: Use WRITE_ONCE() when changing validity of an + STE + - f2fs: set I_LINKABLE early to avoid wrong access by vfs + - f2fs: free sysfs kobject + - scsi: iscsi: Don't destroy session if there are outstanding connections + - watchdog/softlockup: Enforce that timestamp is valid on boot + - f2fs: fix memleak of kobject + - [x86] mm: Fix NX bit clearing issue in kernel_map_pages_in_pgd + - [armhf] pwm: omap-dmtimer: Remove PWM chip in .remove before making it + unfunctional + - btrfs: fix possible NULL-pointer dereference in integrity checks + - btrfs: safely advance counter when looking up bio csums + - btrfs: device stats, log when stats are zeroed + - module: avoid setting info->name early in case we can fall back to + info->mod->name + - ALSA: hda/hdmi - add retry logic to parse_intel_hdmi() + - driver core: platform: fix u32 greater or equal to zero comparison + - ALSA: hda - Add docking station support for Lenovo Thinkpad T420s + - drm/nouveau/mmu: fix comptag memory leak + - [powerpc*] sriov: Remove VF eeh_dev state when disabling SR-IOV + - bcache: cached_dev_free needs to put the sb page + - [amd64] iommu/vt-d: Remove unnecessary WARN_ON_ONCE() + - jbd2: switch to use jbd2_journal_abort() when failed to submit the + commit record + - jbd2: make sure ESHUTDOWN to be recorded in the journal superblock + - iwlegacy: ensure loop counter addr does not wrap and cause an infinite + loop + - cifs: fix NULL dereference in match_prepath + - bpf: map_seq_next should always increase position index + - ceph: check availability of mds cluster on mount after wait timeout + - [arm64,armhf] irqchip/gic-v3: Only provision redistributors that are + enabled in ACPI + - drm/nouveau/disp/nv50-: prevent oops when no channel method map provided + - ftrace: fpid_next() should increase position index + - trigger_next should increase position index + - radeon: insert 10ms sleep in dce5_crtc_load_lut + - ocfs2: fix a NULL pointer dereference when call + ocfs2_update_inode_fsync_trans() + - reiserfs: prevent NULL pointer dereference in reiserfs_insert_item() + - bcache: explicity type cast in bset_bkey_last() + - [arm64,armhf] irqchip/gic-v3-its: Reference to its_invall_cmd descriptor + when building INVALL + - iwlwifi: mvm: Fix thermal zone registration + - brd: check and limit max_part par + - NFS: Fix memory leaks + - help_next should increase position index + - cifs: log warning message (once) if out of disk space + - virtio_balloon: prevent pfn array overflow + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.107 + - [arm64] iommu/qcom: Fix bogus detach logic + - ALSA: hda: Use scnprintf() for printing texts for sysfs/procfs + - [x86] ALSA: hda/realtek - Apply quirk for MSI GP63, too + - [x86] ALSA: hda/realtek - Apply quirk for yet another MSI laptop + - [armhf] ASoC: sun8i-codec: Fix setting DAI data format + - ecryptfs: fix a memory leak bug in parse_tag_1_packet() + - ecryptfs: fix a memory leak bug in ecryptfs_init_messaging() + - [x86] thunderbolt: Prevent crash if non-active NVMem file is read + - USB: misc: iowarrior: add support for 2 OEMed devices + - USB: misc: iowarrior: add support for the 28 and 28L devices + - USB: misc: iowarrior: add support for the 100 device + - floppy: check FDC index for errors before assigning it (CVE-2020-9383) + - vt: fix scrollback flushing on background consoles + - vt: selection, handle pending signals in paste_selection + - vt: vt_ioctl: fix race in VT_RESIZEX + - [arm*] staging: android: ashmem: Disallow ashmem memory from being + remapped (CVE-2020-0009) + - [x86] staging: vt6656: fix sign of rx_dbm to bb_pre_ed_rssi. + - xhci: Force Maximum Packet size for Full-speed bulk devices to valid + range. + - xhci: fix runtime pm enabling for quirky Intel hosts + - xhci: Fix memory leak when caching protocol extended capability PSI + tables - take 2 + - usb: host: xhci: update event ring dequeue pointer on purpose + - USB: core: add endpoint-blacklist quirk + - USB: quirks: blacklist duplicate ep on Sound Devices USBPre2 + - usb: uas: fix a plug & unplug racing + - USB: Fix novation SourceControl XL after suspend + - USB: hub: Don't record a connect-change event during reset-resume + - USB: hub: Fix the broken detection of USB3 device in SMSC hub + - [arm*] usb: dwc2: Fix SET/CLEAR_FEATURE and GET_STATUS flows + - [arm64,armhf] usb: dwc3: gadget: Check for IOC/LST bit in TRB->ctrl + fields + - staging: rtl8188eu: Fix potential security hole + - staging: rtl8188eu: Fix potential overuse of kernel memory + - staging: rtl8723bs: Fix potential security hole + - staging: rtl8723bs: Fix potential overuse of kernel memory + - [powerpc*] tm: Fix clearing MSR[TS] in current when reclaiming on signal + delivery + - jbd2: fix ocfs2 corrupt when clearing block group bits + - [x86] mce/amd: Publish the bank pointer only after setup has succeeded + - [x86] mce/amd: Fix kobject lifetime + - [x86] cpu/amd: Enable the fixed Instructions Retired counter IRPERF + - serial: 8250: Check UPF_IRQ_SHARED in advance + - [armhf] tty: serial: imx: setup the correct sg entry for tx dma + - serdev: ttyport: restore client ops on deregistration + - Revert "ipc,sem: remove uneeded sem_undo_list lock usage in exit_sem()" + - mm/memcontrol.c: lost css_put in memcg_expand_shrinker_maps() + - nvme-multipath: Fix memory leak with ana_log_buf + - genirq/irqdomain: Make sure all irq domain flags are distinct + - mm/vmscan.c: don't round up scan size for online memory cgroup + - drm/amdgpu/soc15: fix xclk for raven + - [x86] xhci: apply XHCI_PME_STUCK_QUIRK to Intel Comet Lake platforms + - [x86] KVM: nVMX: Don't emulate instructions in guest mode + (CVE-2020-2732) + - [x86] KVM: don't notify userspace IOAPIC on edge-triggered interrupt EOI + - drm/nouveau/kms/gv100-: Re-set LUT after clearing for modesets + - ext4: fix a data race in EXT4_I(inode)->i_disksize + - ext4: add cond_resched() to __ext4_find_entry() + - ext4: fix potential race between online resizing and write operations + - ext4: fix potential race between s_group_info online resizing and access + - ext4: fix potential race between s_flex_groups online resizing and + access + - ext4: fix mount failure with quota configured as module + - ext4: rename s_journal_flag_rwsem to s_writepages_rwsem + - ext4: fix race between writepages and enabling EXT4_EXTENTS_FL + - [x86] KVM: nVMX: Refactor IO bitmap checks into helper function + - [x86] KVM: nVMX: Check IO instruction VM-exit conditions + - [x86] KVM: nVMX: handle nested posted interrupts when apicv is disabled + for L1 + - [x86] KVM: apic: avoid calculating pending eoi from an uninitialized val + - btrfs: fix bytes_may_use underflow in prealloc error condtition + - btrfs: reset fs_root to NULL on error in open_ctree + - btrfs: do not check delayed items are empty for single transaction + cleanup + - Btrfs: fix btrfs_wait_ordered_range() so that it waits for all ordered + extents + - scsi: Revert "target: iscsi: Wait for all commands to finish before + freeing a session" + - usb: gadget: composite: Fix bMaxPower for SuperSpeedPlus + - [arm*] usb: dwc2: Fix in ISOC request length checking + - staging: rtl8723bs: fix copy of overlapping memory + - ecryptfs: replace BUG_ON with error handling code + - genirq/proc: Reject invalid affinity masks (again) + - bpf, offload: Replace bitwise AND by logical AND in + bpf_prog_offload_info_fill + - ALSA: seq: Avoid concurrent access to queue flags + - ALSA: seq: Fix concurrent access to queue current tick/time + - netfilter: xt_hashlimit: limit the max size of hashtable + - rxrpc: Fix call RCU cleanup using non-bh-safe locks + - ata: ahci: Add shutdown to freeze hardware resources of ahci + - xen: Enable interrupts when calling _cond_resched() + - [s390x] mm: Explicitly compare PAGE_DEFAULT_KEY against zero in + storage_key_init_range + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.108 + - [arm64,armhf] irqchip/gic-v3-its: Fix misuse of GENMASK macro + - iwlwifi: pcie: fix rb_allocator workqueue allocation + - ipmi:ssif: Handle a possible NULL pointer reference + - [arm64] drm/msm: Set dma maximum segment size for mdss + - dax: pass NOWAIT flag to iomap_apply + - mac80211: consider more elements in parsing CRC + - cfg80211: check wiphy driver existence for drvinfo report + - [s390x] zcrypt: fix card and queue total counter wrap + - qmi_wwan: re-add DW5821e pre-production variant + - qmi_wwan: unconditionally reject 2 ep interfaces + - [arm64] soc/tegra: fuse: Fix build with Tegra194 configuration + - net: ena: fix potential crash when rxfh key is NULL + - net: ena: fix uses of round_jiffies() + - net: ena: add missing ethtool TX timestamping indication + - net: ena: fix incorrect default RSS key + - net: ena: rss: fix failure to get indirection table + - net: ena: rss: store hash function as values and not bits + - net: ena: fix incorrectly saving queue numbers when setting RSS + indirection table + - net: ena: ethtool: use correct value for crc32 hash + - net: ena: ena-com.c: prevent NULL pointer dereference + - cifs: Fix mode output in debugging statements + - cfg80211: add missing policy for NL80211_ATTR_STATUS_CODE + - sysrq: Restore original console_loglevel when sysrq disabled + - sysrq: Remove duplicated sysrq message + - net: fib_rules: Correctly set table field when table number exceeds 8 + bits + - net: sched: correct flower port blocking + - sctp: move the format error check out of __sctp_sf_do_9_1_abort + - ipv6: Fix route replacement with dev-only route + - ipv6: Fix nlmsg_flags when splitting a multipath route + - qede: Fix race between rdma destroy workqueue and link change event + - ext4: potential crash on allocation error in ext4_alloc_flex_bg_array() + - audit: fix error handling in audit_data_to_entry() + - ACPICA: Introduce ACPI_ACCESS_BYTE_WIDTH() macro + - [arm64,x86] ACPI: watchdog: Fix gas->access_width usage + - [x86] KVM: VMX: check descriptor table exits on instruction emulation + - HID: ite: Only bind to keyboard USB interface on Acer SW5-012 keyboard + dock + - HID: core: fix off-by-one memset in hid_report_raw_event() + - HID: core: increase HID report buffer size to 8KiB + - tracing: Disable trace_printk() on post poned tests + - Revert "PM / devfreq: Modify the device name as devfreq(X) for sysfs" + - amdgpu/gmc_v9: save/restore sdpif regs during S3 + - vhost: Check docket sk_family instead of call getname (CVE-2020-10942) + - HID: alps: Fix an error handling path in 'alps_input_configured()' + - HID: hiddev: Fix race in in hiddev_disconnect() + - [x86] hv_netvsc: Fix unwanted wakeup in netvsc_attach() + - [s390x] qeth: vnicc Fix EOPNOTSUPP precedence + - net: netlink: cap max groups which will be considered in netlink_bind() + - [amd64] net: atlantic: fix use after free kasan warn + - [amd64] net: atlantic: fix potential error handling + - net/smc: no peer ID in CLC decline for SMCD + - net: ena: make ena rxfh support ETH_RSS_HASH_NO_CHANGE + - namei: only return -ECHILD from follow_dotdot_rcu() + - mwifiex: drop most magic numbers from + mwifiex_process_tdls_action_frame() + - [x86] KVM: SVM: Override default MMIO mask if memory encryption is + enabled + - KVM: Check for a bad hva before dropping into the ghc slow path + - sched/fair: Optimize update_blocked_averages() + - sched/fair: Fix O(nr_cgroups) in the load balancing path + - perf stat: Use perf_evsel__is_clocki() for clock events + - perf stat: Fix shadow stats for clock events + - [arm64] drivers: net: xgene: Fix the order of the arguments of + 'alloc_etherdev_mqs()' + - kprobes: Set unoptimized flag after unoptimizing code + - [armhf] pwm: omap-dmtimer: put_device() after of_find_device_by_node() + - perf hists browser: Restore ESC as "Zoom out" of DSO/thread/etc + - [x86] KVM: Remove spurious kvm_mmu_unload() from vcpu destruction path + - [x86] KVM: Remove spurious clearing of async #PF MSR + - netfilter: nft_tunnel: no need to call htons() when dumping ports + - mm/huge_memory.c: use head to check huge zero page + - mm, thp: fix defrag setting if newline is not used + - audit: always check the netlink payload length in audit_receive_msg() + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.109 + - [x86] EDAC/amd64: Set grain per DIMM + - ALSA: hda/realtek - Fix a regression for mute led on Lenovo Carbon X1 + - [armhf] net: dsa: bcm_sf2: Forcibly configure IMP port for 1Gb/sec + - kprobes: Fix optimize_kprobe()/unoptimize_kprobe() cancellation logic + - [x86] ALSA: hda: do not override bus codec_mask in link_get() + - usb: gadget: composite: Support more than 500mA MaxPower + - usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags + - usb: gadget: serial: fix Tx stall after buffer overflow + - [arm64] drm/msm/mdp5: rate limit pp done timeout warnings + - [arm64] drm: msm: Fix return type of dsi_mgr_connector_mode_valid for + kCFI + - scsi: megaraid_sas: silence a warning + - [arm64] drm/msm/dsi: save pll state before dsi host is powered off + - [arm64] drm/msm/dsi/pll: call vco set rate explicitly + - [armhf] net: dsa: b53: Ensure the default VID is untagged + - [s390x] cio: cio_ignore_proc_seq_next should increase position index + - [s390x] qdio: fill SL with absolute addresses + - ice: Don't tell the OS that link is going down + - [arm64] net: thunderx: workaround BGX TX Underflow issue + - ALSA: hda/realtek - Add Headset Mic supported + - ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Master + - cifs: don't leak -EAGAIN for stat() during reconnect + - usb: storage: Add quirk for Samsung Fit flash + - usb: quirks: add NO_LPM quirk for Logitech Screen Share + - [arm64,armhf] usb: dwc3: gadget: Update chain bit correctly when using + sg list + - usb: core: hub: fix unhandled return by employing a void function + - usb: core: hub: do error out if usb_autopm_get_interface() fails + - usb: core: port: do error out if usb_autopm_get_interface() fails + - vgacon: Fix a UAF in vgacon_invert_region (CVE-2020-8647, CVE-2020-8649) + - mm, numa: fix bad pmd by atomically check for pmd_trans_huge when + marking page tables prot_numa + - mm: fix possible PMD dirty bit lost in set_pmd_migration_entry() + - fat: fix uninit-memory access for partial initialized inode + - [arm64] tty:serial:mvebu-uart:fix a wrong return + - serial: 8250_exar: add support for ACCES cards + - vt: selection, close sel_buffer race (CVE-2020-8648) + - vt: selection, push console lock down + - vt: selection, push sel_lock up + - [arm64,armhf] media: v4l2-mem2mem.c: fix broken links + - [x86] pkeys: Manually set X86_FEATURE_OSPKE to preserve existing changes + - [arm64,armhf] dmaengine: tegra-apb: Fix use-after-free + - [arm64,armhf] dmaengine: tegra-apb: Prevent race conditions of tasklet + vs free list + - dm cache: fix a crash due to incorrect work item cancelling + - dm: report suspended device during destroy + - dm writecache: verify watermark during resume + - [x86] ASoC: topology: Fix memleak in soc_tplg_link_elems_load() + - [x86] ASoC: topology: Fix memleak in soc_tplg_manifest_load() + - [x86] ASoC: intel: skl: Fix pin debug prints + - [x86] ASoC: intel: skl: Fix possible buffer overflow in debug outputs + - [armhf] dmaengine: imx-sdma: remove dma_slave_config direction usage and + leave sdma_event_enable() + - ASoC: pcm: Fix possible buffer overflow in dpcm state sysfs output + - ASoC: dapm: Correct DAPM handling of active widgets during shutdown + - [armhf] drm/sun4i: Fix DE2 VI layer format support + - [armhf] drm/sun4i: de2/de3: Remove unsupported VI layer formats + - RDMA/iwcm: Fix iwcm work deallocation + - RMDA/cm: Fix missing ib_cm_destroy_id() in ib_cm_insert_listen() + - [amd64] IB/hfi1, qib: Ensure RCU is locked when accessing list + - [armhf] ARM: imx: build v7_cpu_resume() unconditionally + - hwmon: (adt7462) Fix an error return in ADT7462_REG_VOLT() + - [powerpc*] fix hardware PMU exception bug on PowerVM compatibility mode + systems + - [amd64] efi/x86: Align GUIDs to their size in the mixed mode runtime + wrapper + - [amd64] efi/x86: Handle by-ref arguments covering multiple pages in + mixed mode + - dm integrity: fix a deadlock due to offloading to an incorrect workqueue + - scsi: pm80xx: Fixed kernel panic during error recovery for SATA drive + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.110 + - [x86] KVM: SVM: fix up incorrect backport + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.111 + - phy: Revert toggling reset changes. + - net: phy: Avoid multiple suspends + - cgroup, netclassid: periodically release file_lock on classid updating + - gre: fix uninit-value in __iptunnel_pull_header + - inet_diag: return classid for all socket types + - ipv6/addrconf: call ipv6_mc_up() for non-Ethernet interface + - ipvlan: add cond_resched_rcu() while processing muticast backlog + - ipvlan: do not add hardware address of master to its unicast filter list + - ipvlan: do not use cond_resched_rcu() in ipvlan_process_multicast() + - ipvlan: don't deref eth hdr before checking it's set + - net/ipv6: use configured metric when add peer route + - netlink: Use netlink header as base to calculate bad attribute offset + - net: macsec: update SCI upon MAC address change. + - net: nfc: fix bounds checking bugs on "pipe" + - net/packet: tpacket_rcv: do not increment ring index on drop + - [arm64,armhf] net: stmmac: dwmac1000: Disable ACS if enhanced descs are + not used + - r8152: check disconnect status after long sleep + - sfc: detach from cb_page in efx_copy_channel() + - bnxt_en: reinitialize IRQs when MTU is modified + - cgroup: memcg: net: do not associate sock with unrelated cgroup + - net: memcg: late association of sock to memcg + - net: memcg: fix lockdep splat in inet_csk_accept() + - devlink: validate length of param values + - nl802154: add missing attribute validation + - nl802154: add missing attribute validation for dev_type + - can: add missing attribute validation for termination + - macsec: add missing attribute validation for port + - net: fq: add missing attribute validation for orphan mask + - team: add missing attribute validation for port ifindex + - team: add missing attribute validation for array index + - nfc: add missing attribute validation for SE API + - nfc: add missing attribute validation for deactivate target + - nfc: add missing attribute validation for vendor subcommand + - net: phy: fix MDIO bus PM PHY resuming + - net/ipv6: need update peer route when modify metric + - net/ipv6: remove the old peer route if change it to a new one + - tipc: add missing attribute validation for MTU property + - devlink: validate length of region addr/len + - bonding/alb: make sure arp header is pulled before accessing it + - slip: make slhc_compress() more robust against malicious packets + - [armhf] net: fec: validate the new settings in fec_enet_set_coalesce() + - macvlan: add cond_resched() during multicast processing + - cgroup: cgroup_procs_next should increase position index + - cgroup: Iterate tasks that did not finish do_exit() + - iwlwifi: mvm: Do not require PHY_SKU NVM section for 3168 devices + - virtio-blk: fix hw_queue stopped on arbitrary error + - [amd64] iommu/vt-d: quirk_ioat_snb_local_iommu: replace WARN_TAINT with + pr_warn + add_taint + - netfilter: nf_conntrack: ct_cpu_seq_next should increase position index + - netfilter: synproxy: synproxy_cpu_seq_next should increase position + index + - netfilter: xt_recent: recent_seq_next should increase position index + - netfilter: x_tables: xt_mttg_seq_next should increase position index + - workqueue: don't use wq_select_unbound_cpu() for bound works + - drm/amd/display: remove duplicated assignment to grph_obj_type + - cifs_atomic_open(): fix double-put on late allocation failure + - gfs2_atomic_open(): fix O_EXCL|O_CREAT handling on cold dcache + - [x86] KVM: clear stale x86_emulate_ctxt->intercept value + - efi: Fix a race and a buffer overflow while reading efivars via sysfs + - efi: Make efi_rts_work accessible to efi page fault handler + - mt76: fix array overflow on receiving too many fragments for a packet + - [x86] mce: Fix logic and comments around MSR_PPIN_CTL + - [arm64] iommu/dma: Fix MSI reservation allocation + - [amd64] iommu/vt-d: dmar: replace WARN_TAINT with pr_warn + add_taint + - [amd64] iommu/vt-d: Fix a bug in intel_iommu_iova_to_phys() for huge + page + - batman-adv: Don't schedule OGM for disabled interface + - [arm64] pinctrl: meson-gxl: fix GPIOX sdio pins + - pinctrl: core: Remove extra kref_get which blocks hogs being freed + - [arm64,armhf] i2c: gpio: suppress error on probe defer + - nl80211: add missing attribute validation for critical protocol + indication + - nl80211: add missing attribute validation for beacon report scanning + - nl80211: add missing attribute validation for channel switch + - perf bench futex-wake: Restore thread count default to online CPU count + - netfilter: cthelper: add missing attribute validation for cthelper + - netfilter: nft_payload: add missing attribute validation for payload + csum flags + - netfilter: nft_tunnel: add missing attribute validation for tunnels + - [amd64] iommu/vt-d: Fix the wrong printing in RHSA parsing + - [amd64] iommu/vt-d: Ignore devices with out-of-spec domain number + - [arm64,x86] i2c: acpi: put device when verifying client fails + - ipv6: restrict IPV6_ADDRFORM operation + - net/smc: check for valid ib_client_data + - net/smc: cancel event worker during device removal + - efi: Add a sanity check to efivar_store_raw() + - batman-adv: Avoid free/alloc race when handling OGM2 buffer + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.112 + - [x86] perf/amd/uncore: Replace manual sampling check with + CAP_NO_INTERRUPT flag + - [armhf] mmc: sdhci-omap: Add platform specific reset callback + - [armhf] mmc: sdhci-omap: Workaround errata regarding SDR104/HS200 tuning + failures (i929) + - ACPI: watchdog: Allow disabling WDAT at boot + - HID: apple: Add support for recent firmware on Magic Keyboards + - [x86] HID: i2c-hid: add Trekstor Surfbook E11B to descriptor override + - cfg80211: check reg_rule for NULL in handle_channel_custom() + - scsi: libfc: free response frame from GPN_ID + - net: usb: qmi_wwan: restore mtu min/max values after raw_ip switch + - mac80211: rx: avoid RCU list traversal under mutex + - signal: avoid double atomic counter increments for user accounting + - slip: not call free_netdev before rtnl_unlock in slip_open + - [x86,arm64] hinic: fix a irq affinity bug + - [x86,arm64] hinic: fix a bug of setting hw_ioctxt + - sfc: fix timestamp reconstruction at 16-bit rollover points + - jbd2: fix data races at struct journal_head + - [armhf] mmc: sdhci-omap: Don't finish_mrq() on a command error during + tuning + - [armhf] mmc: sdhci-omap: Fix Tuning procedure for temperatures < -20C + - driver core: Remove the link if there is no driver with AUTO flag + - driver core: Fix adding device links to probing suppliers + - driver core: Make driver core own stateful device links + - driver core: Add device link flag DL_FLAG_AUTOPROBE_CONSUMER + - driver core: Remove device link creation limitation + - driver core: Fix creation of device links with PM-runtime flags + - mm: slub: add missing TID bump in kmem_cache_alloc_bulk() + - efi: Fix debugobjects warning on 'efi_rts_work' + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.113 + - [arm64] spi: qup: call spi_qup_pm_resume_runtime before suspending + - [amd64] spi: pxa2xx: Add CS control clock quirk + - [armhf] drm/exynos: dsi: fix workaround for the legacy clock name + - [arm64] drivers/perf: arm_pmu_acpi: Fix incorrect checking of gicc + pointer + - dm bio record: save/restore bi_end_io and bi_integrity + - dm integrity: use dm_bio_record and dm_bio_restore + - xenbus: req->body should be updated before req->state + - xenbus: req->err should be updated before req->state + - block, bfq: fix overwrite of bfq_group pointer in bfq_find_set_group() + - USB: Disable LPM on WD19's Realtek Hub + - usb: quirks: add NO_LPM quirk for RTL8153 based ethernet adapters + - USB: serial: option: add ME910G1 ECM composition 0x110b + - [arm64,armhf] usb: host: xhci-plat: add a shutdown + - USB: serial: pl2303: add device-id for HP LD381 + - [x86] usb: xhci: apply XHCI_SUSPEND_DELAY to AMD XHCI controller + 1022:145c + - ALSA: line6: Fix endless MIDI read loop + - ALSA: seq: virmidi: Fix running status after receiving sysex + - ALSA: seq: oss: Fix running status after receiving sysex + - ALSA: pcm: oss: Avoid plugin buffer overflow + - ALSA: pcm: oss: Remove WARNING from snd_pcm_plug_alloc() checks + - [armhf] iio: st_sensors: remap SMO8840 to LIS2DH12 + - mmc: rtsx_pci: Fix support for speed-modes that relies on tuning + - staging: rtl8188eu: Add device id for MERCUSYS MW150US v2 + - staging/speakup: fix get_word non-space look-ahead + - [x86] intel_th: Fix user-visible error codes + - [x86] intel_th: pci: Add Elkhart Lake CPU support + - xhci: Do not open code __print_symbolic() in xhci trace events + - btrfs: fix log context list corruption after rename whiteout error + - drm/amd/amdgpu: Fix GPR read from debugfs (v2) + - drm/lease: fix WARNING in idr_destroy + - memcg: fix NULL pointer dereference in + __mem_cgroup_usage_unregister_event + - mm: slub: be more careful about the double cmpxchg of freelist + - mm, slub: prevent kmalloc_node crashes and memory leaks + - page-flags: fix a crash at SetPageError(THP_SWAP) + - [x86] mm: split vmalloc_sync_all() (Closes: #953017) + - USB: cdc-acm: fix close_delay and closing_wait units in TIOCSSERIAL + - USB: cdc-acm: fix rounding error in TIOCSSERIAL + - futex: Fix inode life-time issue + - futex: Unbreak futex hashing + - Revert "vrf: mark skb for multicast or link-local as enslaved to VRF" + - Revert "ipv6: Fix handling of LLA with VRF and sockets bound to VRF" + - ALSA: hda/realtek: Fix pop noise on ALC225 + - [arm64] smp: fix smp_send_stop() behaviour + - [arm64] smp: fix crash_smp_send_stop() behaviour + - [arm64,armhf] drm/bridge: dw-hdmi: fix AVI frame colorimetry + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.114 + - mmc: core: Allow host controllers to require R1B for CMD6 + - mmc: core: Respect MMC_CAP_NEED_RSP_BUSY for erase/trim/discard + - mmc: core: Respect MMC_CAP_NEED_RSP_BUSY for eMMC sleep command + - [armhf] mmc: sdhci-omap: Fix busy detection by enabling + MMC_CAP_NEED_RSP_BUSY + - [arm64,armhf] mmc: sdhci-tegra: Fix busy detection by enabling + MMC_CAP_NEED_RSP_BUSY + - geneve: move debug check after netdev unregister + - macsec: restrict to ethernet devices + - net: cbs: Fix software cbs to consider packet sending time + - [armhf] net: dsa: Fix duplicate frames flooded by learning + - [arm64,armhf] net: mvneta: Fix the case where the last poll did not + process all rx + - net/packet: tpacket_rcv: avoid a producer race condition + - net: qmi_wwan: add support for ASKEY WWHC050 + - net_sched: cls_route: remove the right filter from hashtable + - net_sched: keep alloc_hash updated after hash allocation + - [arm64,armhf] net: stmmac: dwmac-rk: fix error path in rk_gmac_probe + - slcan: not call free_netdev before rtnl_unlock in slcan_open + - bnxt_en: fix memory leaks in bnxt_dcbnl_ieee_getets() + - bnxt_en: Reset rings if ring reservation fails during open() + - net: ip_gre: Separate ERSPAN newlink / changelink callbacks + - net: ip_gre: Accept IFLA_INFO_DATA-less configuration + - r8169: re-enable MSI on RTL8168c + - tcp: repair: fix TCP_QUEUE_SEQ implementation + - vxlan: check return value of gro_cells_init() + - cgroup-v1: cgroup_pidlist_next should update position index + - nfs: add minor version to nfs_server_key for fscache + - drivers/of/of_mdio.c:fix of_mdiobus_register() + - cgroup1: don't call release_agent when it is "" + - [s390x] qeth: handle error when backing RX buffer + - scsi: ipr: Fix softlockup when rescanning devices in petitboot + - mac80211: Do not send mesh HWMP PREQ if HWMP is disabled + - [x86] ftrace: Anotate text_mutex split between + ftrace_arch_code_modify_post_process() and + ftrace_arch_code_modify_prepare() + - [x86] Input: synaptics - enable RMI on HP Envy 13-ad105ng + - Input: avoid BIT() macro usage in the serio.h UAPI header + - ceph: check POOL_FLAG_FULL/NEARFULL in addition to OSDMAP_FULL/NEARFULL + - perf probe: Do not depend on dwfl_module_addrsym() + - scsi: sd: Fix optimal I/O size for devices that change reported values + - nl80211: fix NL80211_ATTR_CHANNEL_WIDTH attribute type + - mac80211: mark station unauthorized before key removal + - [x86] gpiolib: acpi: Correct comment for HP x2 10 honor_wakeup quirk + - gpiolib: acpi: Rework honor_wakeup option into an ignore_wake option + - [x86] gpiolib: acpi: Add quirk to ignore EC wakeups on HP x2 10 BYT + + AXP288 model + - genirq: Fix reference leaks on irq affinity notifiers + - xfrm: handle NETDEV_UNREGISTER for xfrm device + - vti[6]: fix packet tx through bpf_redirect() in XinY cases + - RDMA/mlx5: Block delay drop to unprivileged users + - xfrm: fix uctx len check in verify_sec_ctx_len + - xfrm: add the missing verify_sec_ctx_len check in xfrm_add_acquire + - xfrm: policy: Fix doulbe free in xfrm_policy_timer + - afs: Fix some tracing details + - netfilter: flowtable: reload ip{v6}h in nf_flow_tuple_ip{v6} + - netfilter: nft_fwd_netdev: validate family and chain type + - bpf/btf: Fix BTF verification of enum members in struct/union + - vti6: Fix memory leak of skb if input policy check fails + - mac80211: add option for setting control flags + - mac80211: set IEEE80211_TX_CTRL_PORT_CTRL_PROTO for nl80211 TX + - USB: serial: option: add support for ASKEY WWHC050 + - USB: serial: option: add BroadMobi BM806U + - USB: serial: option: add Wistron Neweb D19Q1 + - USB: cdc-acm: restore capability check order + - USB: serial: io_edgeport: fix slab-out-of-bounds read in + edge_interrupt_callback + - [arm64,armhf] usb: musb: fix crash with highmen PIO and usbmon + - media: flexcop-usb: fix endpoint sanity check + - media: usbtv: fix control-message timeouts + - staging: rtl8188eu: Add ASUS USB-N10 Nano B1 to device table + - [x86] ahci: Add Intel Comet Lake H RAID PCI ID + - libfs: fix infoleak in simple_attr_read() + - media: ov519: add missing endpoint sanity checks (CVE-2020-11608) + - media: dib0700: fix rc endpoint lookup + - media: stv06xx: add missing descriptor sanity checks (CVE-2020-11609) + - media: xirlink_cit: add missing descriptor sanity checks + (CVE-2020-11668) + - mac80211: Check port authorization in the ieee80211_tx_dequeue() case + - mac80211: fix authentication with iwlwifi/mvm + - vt: selection, introduce vc_is_sel + - vt: ioctl, switch VT_IS_IN_USE and VT_BUSY to inlines + - vt: switch vt_dont_switch to bool + - vt: vt_ioctl: remove unnecessary console allocation checks + - vt: vt_ioctl: fix VT_DISALLOCATE freeing in-use virtual console + - vt: vt_ioctl: fix use-after-free in vt_in_use() + - [x86] platform: pmc_atom: Add Lex 2I385SW to critclk_systems DMI table + - bpf: Explicitly memset the bpf_attr structure + - bpf: Explicitly memset some bpf info structures declared on the stack + - [x86] gpiolib: acpi: Add quirk to ignore EC wakeups on HP x2 10 CHT + + AXP288 model + - perf map: Fix off by one in strncpy() size argument + - [armel] bcm2835-rpi-zero-w: Add missing pinctrl name + - [armhf] dts: N900: fix onenand timings + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.115 + - ipv4: fix a RCU-list lock in fib_triestat_seq_show + - net, ip_tunnel: fix interface lookup with no key + - sctp: fix refcount bug in sctp_wfree + - sctp: fix possibly using a bad saddr with a given dst + - nvme-rdma: Avoid double freeing of async event data + - drm/bochs: downgrade pci_request_region failure from error to warning + - drm/amdgpu: fix typo for vcn1 idle check + - [x86] tools/power turbostat: Fix gcc build warnings + - [x86] tools/power turbostat: Fix missing SYS_LPI counter on some + Chromebooks + - [armhf] drm/etnaviv: replace MMU flush marker with flush sequence + - media: rc: IR signal for Panasonic air conditioner too long + - misc: rtsx: set correct pcr_ops for rts522A + - [x86] mei: me: add cedar fork device ids + - ALSA: hda/ca0132 - Add Recon3Di quirk to handle integrated sound on EVGA + X99 Classified motherboard + - rxrpc: Fix sendmsg(MSG_WAITALL) handling + - net: Fix Tx hash bound checking + - padata: always acquire cpu_hotplug_lock before pinst->lock + - mm: mempolicy: require at least one nodeid for MPOL_PREFERRED + (CVE-2020-11565) + - ipv6: don't auto-add link-local address to lag ports + - [armhf] net: dsa: bcm_sf2: Do not register slave MDIO bus with OF + - [armhf] net: dsa: bcm_sf2: Ensure correct sub-node is parsed + - net: phy: micrel: kszphy_resume(): add delay after genphy_resume() + before accessing PHY registers + - [arm64,armhf] net: stmmac: dwmac1000: fix out-of-bounds mac address reg + setting + - slcan: Don't transmit uninitialized stack data in padding + (CVE-2020-11494) + - random: always use batched entropy for get_random_u{32,64} + - [arm64,armhf] usb: dwc3: gadget: Wrap around when skip TRBs + - [armhf] hwrng: imx-rngc - fix an error path + - [amd64] IB/hfi1: Call kobject_put() when kobject_init_and_add() fails + - [amd64] IB/hfi1: Fix memory leaks in sysfs registration and + unregistration + - ceph: remove the extra slashes in the server path + - ceph: canonicalize server path in place + - RDMA/ucma: Put a lock around every call to the rdma_cm layer + - RDMA/cma: Teach lockdep about the order of rtnl and lock + - Bluetooth: RFCOMM: fix ODEBUG bug in rfcomm_dev_ioctl + - RDMA/cm: Update num_paths in cma_resolve_iboe_route error flow + - fbcon: fix null-ptr-deref in fbcon_switch + - [arm64] clk: qcom: rcg: Return failure for RCG update + - [arm64] drm/msm: stop abusing dma_map/unmap for cache + - [arm64] Fix size of __early_cpu_boot_status + - [arm64] rpmsg: glink: Remove chunk size word align warning + - [arm64,armhf] usb: dwc3: don't set gadget->is_otg flag + - drm_dp_mst_topology: fix broken drm_dp_sideband_parse_remote_dpcd_read() + - [arm64] drm/msm: Use the correct dma_sync calls in msm_gem + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.116 + - [armhf] dts: sun8i-a83t-tbs-a711: HM5065 doesn't like such a high + voltage + - [arm64,armhf] bus: sunxi-rsb: Return correct data when mixing 16-bit and + 8-bit reads + - [x86,arm64] hinic: fix a bug of waitting for IO stopped + - [x86,arm64] hinic: fix wrong para of wait_for_completion_timeout + - cxgb4/ptp: pass the sign of offset delta in FW CMD + - qlcnic: Fix bad kzalloc null test + - [armhf] cpufreq: imx6q: Fixes unwanted cpu overclocking on i.MX6ULL + - [arm64] media: venus: hfi_parser: Ignore HEVC encoding for V1 + - null_blk: Fix the null_add_dev() error path + - null_blk: Handle null_add_dev() failures properly + - null_blk: fix spurious IO errors after failed past-wp access + - xhci: bail out early if driver can't accress host in resume + - [x86] Don't let pgprot_modify() change the page encryption bit + - block: keep bdi->io_pages in sync with max_sectors_kb for stacked + devices + - sched: Avoid scale real weight down to zero + - libata: Remove extra scsi_host_put() in ata_scsi_add_hosts() + - [amd64,x86] pstore/platform: fix potential mem leak if pstore_init_fs + failed + - gfs2: Don't demote a glock until its revokes are written + - [i386] efi/x86: Ignore the memory attributes table on i386 + - genirq/irqdomain: Check pointer in irq_domain_alloc_irqs_hierarchy() + - block: Fix use-after-free issue accessing struct io_cq + - [arm64,armhf] usb: dwc3: core: add support for disabling SS instances in + park mode + - [arm64,armhf] irqchip/gic-v4: Provide irq_retrigger to avoid circular + locking dependency + - md: check arrays is suspended in mddev_detach before call quiesce + operations + - firmware: fix a double abort case with fw_load_sysfs_fallback + - block, bfq: fix use-after-free in bfq_idle_slice_timer_body + - btrfs: qgroup: ensure qgroup_rescan_running is only set when the worker + is at least queued + - btrfs: remove a BUG_ON() from merge_reloc_roots() + - btrfs: track reloc roots based on their commit root bytenr + - IB/mlx5: Replace tunnel mpls capability bits for tunnel_offloads + - uapi: rename ext2_swab() to swab() and share globally in swab.h + - slub: improve bit diffusion for freelist ptr obfuscation + - ASoC: fix regwmask + - ASoC: dapm: connect virtual mux with default value + - ASoC: dpcm: allow start or stop during pause for backend + - [x86] ASoC: topology: use name_prefix for new kcontrol + - usb: gadget: f_fs: Fix use after free issue as part of queue failure + - usb: gadget: composite: Inform controller driver of self-powered + - ALSA: hda: Add driver blacklist + - ALSA: hda: Fix potential access overflow in beep helper + - ALSA: ice1724: Fix invalid access for enumerated ctl items + - ALSA: pcm: oss: Fix regression by buffer overflow fix + - ALSA: doc: Document PC Beep Hidden Register on Realtek ALC256 + - ALSA: hda/realtek - Set principled PC Beep configuration for ALC256 + - [x86] ALSA: hda/realtek - Remove now-unnecessary XPS 13 headphone noise + fixups + - [x86] ALSA: hda/realtek - Add quirk for MSI GL63 + - [x86] acpi: ignore unspecified bit positions in the ACPI global lock + field + - nvme-fc: Revert "add module to ops template to allow module references" + - nvme: Treat discovery subsystems as unique subsystems + - PCI: pciehp: Fix indefinite wait on sysfs requests + - PCI/ASPM: Clear the correct bits when enabling L1 substates + - PCI: Add boot interrupt quirk mechanism for Xeon chipsets + - tpm: Don't make log failures fatal + - tpm: tpm1_bios_measurements_next should increase position index + - tpm: tpm2_bios_measurements_next should increase position index + - KEYS: reaching the keys quotas correctly + - [amd64,x86] pstore: pstore_ftrace_seq_next should increase position + index + - [mips*el] tlbex: Fix LDDIR usage in setup_pw() for Loongson-3 + - [mips*/octeon] irq: Fix potential NULL pointer dereference + - ath9k: Handle txpower changes even when TPC is disabled + - signal: Extend exec_id to 64bits + - [i386] x86/entry/32: Add missing ASM_CLAC to general_protection entry + - [x86] KVM: nVMX: Properly handle userspace interrupt window request + - [s390x] KVM: vsie: Fix region 1 ASCE sanity shadow address checks + - [s390x] KVM: vsie: Fix delivery of addressing exceptions + - [x86] KVM: Allocate new rmap and large page tracking when moving memslot + - [x86] KVM: VMX: Always VMCLEAR in-use VMCSes during crash with kexec + support + - [x86] KVM: Gracefully handle __vmalloc() failure during VM allocation + - [x86] KVM: VMX: fix crash cleanup when KVM wasn't used + - CIFS: Fix bug which the return value by asynchronous read is error + - Btrfs: fix crash during unmount due to race with delayed inode workers + - btrfs: set update the uuid generation as soon as possible + - btrfs: drop block from cache on error in relocation + - btrfs: fix missing file extent item for hole after ranged fsync + - btrfs: fix missing semaphore unlock in btrfs_sync_file + - [powerpc*] pseries: Drop pointless static qualifier in + vpa_debugfs_init() + - [x86] speculation: Remove redundant arch_smt_update() invocation + - mm: Use fixed constant in page_frag_alloc instead of size + 1 + - dm writecache: add cond_resched to avoid CPU hangs + - [s390x] scsi: zfcp: fix missing erp_lock in port recovery trigger for + point-to-point + - [arm64] armv8_deprecated: Fix undef_hook mask for thumb setend + - [armhf] drm/etnaviv: rework perfmon query infrastructure + - [powerpc*] pseries: Avoid NULL pointer dereference when drmem is + unavailable + - NFS: Fix a page leak in nfs_destroy_unlinked_subrequests() + - ext4: fix a data race at inode->i_blocks + - fs/filesystems.c: downgrade user-reachable WARN_ONCE() to pr_warn_once() + - ocfs2: no need try to truncate file beyond i_size + - [s390x] diag: fix display of diagnose call statistics + - [x86] Input: i8042 - add Acer Aspire 5738z to nomux list + - kmod: make request_module() return an error when autoloading is disabled + - [powerpc*] cpufreq: powernv: Fix use-after-free + - hfsplus: fix crash and filesystem corruption when deleting files + - libata: Return correct status in sata_pmp_eh_recover_pm() when + ATA_DFLAG_DETACH is set + - ipmi: fix hung processes in __get_guid() + - xen/blkfront: fix memory allocation flags in blkfront_setup_indirect() + - [powerpc*] powernv/idle: Restore AMR/UAMOR/AMOR after idle + (CVE-2020-11669) + - [powerpc*] 64/tm: Don't let userspace set regs->trap via sigreturn + - [powerpc*] hash64/devmap: Use H_PAGE_THP_HUGE when setting up huge + devmap PTE entries + - [powerpc*] xive: Use XIVE_BAD_IRQ instead of zero to catch non + configured IPIs + - [powerpc*] kprobes: Ignore traps that happened in real mode + - scsi: mpt3sas: Fix kernel panic observed on soft HBA unplug + - [powerpc*] Add attributes for setjmp/longjmp + - [powerpc*] Make setjmp/longjmp signature standard + - btrfs: use nofs allocations for running delayed items + - dm zoned: remove duplicate nr_rnd_zones increase in dmz_init_zone() + - drm/dp_mst: Fix clearing payload state on topology disable + - drm: Remove PageReserved manipulation from drm_pci_alloc + - ftrace/kprobe: Show the maxactive number on kprobe_events + - [armhf] etnaviv: perfmon: fix total and idle HI cyleces readout + - [amd64] efi/x86: Fix the deletion of variables in mixed mode + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.117 + - [amd64,arm64] amd-xgbe: Use __napi_schedule() in BH context + - net: ipv6: do not consider routes via gateways for anycast address check + - net: revert default NAPI poll timeout to 2 jiffies + - [arm64,armhf] net: stmmac: dwmac-sunxi: Provide TX and RX fifo sizes + - ovl: fix value of i_ino for lower hardlink corner case + - scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic + - jbd2: improve comments about freeing data buffers whose page mapping is + NULL + - ext4: fix incorrect group count in ext4_fill_super error message + - ext4: fix incorrect inodes per group in error message + - [x86] ASoC: Intel: mrfld: fix incorrect check on p->sink + - [x86] ASoC: Intel: mrfld: return error codes when an error occurs + - ALSA: usb-audio: Filter error from connector kctl ops, too + - ALSA: usb-audio: Don't override ignore_ctl_error value from the map + - ALSA: usb-audio: Don't create jack controls for PCM terminals + - ALSA: usb-audio: Check mapping at creating connector controls, too + - keys: Fix proc_keys_next to increase position index + - tracing: Fix the race between registering 'snapshot' event trigger and + triggering 'snapshot' operation + - btrfs: check commit root generation in should_ignore_root + - mac80211_hwsim: Use kstrndup() in place of kasprintf() + - [arm64,armhf] usb: dwc3: gadget: don't enable interrupt when disabling + endpoint + - [arm64,armhf] usb: dwc3: gadget: Don't clear flags before transfer ended + - ext4: do not zeroout extents beyond i_disksize + - [x86] kvm: Host feature SSBD doesn't imply guest feature SPEC_CTRL_SSBD + - scsi: target: fix hang when multiple threads try to destroy the same + iscsi session + - [x86] microcode/AMD: Increase microcode PATCH_MAX_SIZE + - wil6210: check rx_buff_mgmt before accessing it + - wil6210: ignore HALP ICR if already handled + - wil6210: add general initialization/size checks + - wil6210: make sure Rx ring sizes are correlated + - wil6210: remove reset file from debugfs + - mm/vmalloc.c: move 'area->pages' after if statement + https://www.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.19.118 + - [armel,armhf] bpf: Fix offset overflow for BPF_MEM BPF_DW + - scsi: sg: add sg_remove_request in sg_common_write + - ext4: use non-movable memory for superblock readahead + - [arm64,armhf] watchdog: sp805: fix restart handler + - [armel,armhf] arm, bpf: Fix bugs with ALU64 {RSH, ARSH} BPF_K shift by 0 + - netfilter: nf_tables: report EOPNOTSUPP on unsupported flags/object type + - [arm64] irqchip/mbigen: Free msi_desc on device teardown + - ALSA: hda: Don't release card at firmware loading error + - of: overlay: kmemleak in dup_and_fixup_symbol_prop() + - [x86] Hyper-V: Report crash register data or kmsg before running crash + kernel + - rbd: avoid a deadlock on header_rwsem when flushing notifies + - rbd: call rbd_dev_unprobe() after unwatching and flushing notifies + - xsk: Add missing check on user supplied headroom size + - [x86] Hyper-V: Unload vmbus channel in hv panic callback + - [x86] Hyper-V: Free hv_panic_page when fail to register kmsg dump + - [x86] Hyper-V: Trigger crash enlightenment only once during system + crash. + - [x86] Hyper-V: Report crash register data when sysctl_record_panic_msg + is not set + - [x86] Hyper-V: Report crash data in die() when panic_on_oops is set + - power: supply: bq27xxx_battery: Silence deferred-probe error + - [arm64,armhf] clk: tegra: Fix Tegra PMC clock out parents + - [armhf] soc: imx: gpc: fix power up sequencing + - NFSv4/pnfs: Return valid stateids in nfs_layout_find_inode_by_stateid() + - NFS: direct.c: Fix memory leak of dreq when nfs_get_lock_context fails + - [s390x] cpuinfo: fix wrong output when CPU0 is offline + - [s390x] cpum_sf: Fix wrong page count in error message + - ext4: do not commit super on read-only bdev + - cifs: Allocate encryption header through kmalloc + - include/linux/swapops.h: correct guards for non_swap_entry() + - percpu_counter: fix a data race at vm_committed_as + - [s390x] KVM: vsie: Fix possible race when shadowing region 3 tables + - [x86] ACPI: fix CPU hotplug deadlock + - [amd64] drm/amdkfd: kfree the wrong pointer + - NFS: Fix memory leaks in nfs_pageio_stop_mirroring() + - f2fs: fix NULL pointer dereference in f2fs_write_begin() + - [arm*] drm/vc4: Fix HDMI mode validation + - [amd64] iommu/vt-d: Fix mm reference leak + - power: supply: axp288_fuel_gauge: Broaden vendor check for Intel Compute + Sticks. + - libnvdimm: Out of bounds read in __nd_ioctl() + - f2fs: fix to wait all node page writeback + - [armhf] net: dsa: bcm_sf2: Fix overflow checks + - fbdev: potential information leak in do_fb_ioctl() + - mtd: lpddr: Fix a double free in probe() + - mtd: phram: fix a double free issue in error path + - KEYS: Don't write out to userspace while holding key semaphore + - bpf: fix buggy r0 retval refinement for tracing helpers + + [ Salvatore Bonaccorso ] + * Refresh "Revert "objtool: Fix CONFIG_STACK_VALIDATION=y warning for + out-of-tree modules"" for context changes in 4.19.99 + * Refresh "ARM: dts: bcm283x: Correct vchiq compatible string" for context + changes in 4.19.99 + * Drop "tools/lib/api/fs/fs.c: Fix misuse of strncpy()" + * Refresh "net: ena: add MAX_QUEUES_EXT get feature admin command" for + context changes in 4.19.108 + * [rt] Update to 4.19.115-rt48: + - Revert "genirq: Do not invoke the affinity callback via a workqueue on + RT" + * [rt] Refresh "pci/switchtec: Don't use completion's wait queue" for + context changes in 4.19.116 + * Refresh "firmware: Remove redundant log messages from drivers" for context + changes in 4.19.118 + * f2fs: fix to avoid memory leakage in f2fs_listxattr (CVE-2020-0067) + * net: ipv6: add net argument to ip6_dst_lookup_flow + * net: ipv6_stub: use ip6_dst_lookup_flow instead of ip6_dst_lookup + (CVE-2020-1749) + * blktrace: Protect q->blk_trace with RCU (CVE-2019-19768) + * blktrace: fix dereference after null check + + [ Ben Hutchings ] + * [x86] Drop "Add a SysRq option to lift kernel lockdown" (Closes: #947021) + - This patch allowed remotely disabling lockdown using usbip + - Lockdown can be disabled by running "mokutil --disable-validation", + rebooting, and confirming the change when prompted + * debian/README.source: Refer to upload checklist in kernel-team.git + * Bump ABI to 9 + + [ YunQiang Su ] + * [mips*] enable CONFIG_MIPS_O32_FP64_SUPPORT. + * [mips*] enable CONFIG_CPU_HAS_MSA except octeon. + + [ Steve McIntyre ] + * [arm64] Include the Hisilicon Hibmc drm driver in fb-modules + (Closes: #951274) + + [ Noah Meyerhans ] + * [cloud] Enable CONFIG_KSM + (Closes: #955366) + + -- Ben Hutchings Sun, 26 Apr 2020 14:04:11 +0100 + linux (4.19.98-1) buster; urgency=medium * New upstream stable update: diff -Nru linux-4.19.98/debian/config/amd64/config.cloud-amd64 linux-4.19.118/debian/config/amd64/config.cloud-amd64 --- linux-4.19.98/debian/config/amd64/config.cloud-amd64 2020-01-26 13:26:48.000000000 +0000 +++ linux-4.19.118/debian/config/amd64/config.cloud-amd64 2020-04-25 22:11:32.000000000 +0000 @@ -1376,7 +1376,6 @@ ## ## file: mm/Kconfig ## -# CONFIG_KSM is not set # CONFIG_ZSWAP is not set ## diff -Nru linux-4.19.98/debian/config/defines linux-4.19.118/debian/config/defines --- linux-4.19.98/debian/config/defines 2020-01-26 13:26:48.000000000 +0000 +++ linux-4.19.118/debian/config/defines 2020-04-22 13:32:13.000000000 +0000 @@ -1,5 +1,5 @@ [abi] -abiname: 8 +abiname: 9 ignore-changes: __cpuhp_* bpf_analyzer diff -Nru linux-4.19.98/debian/config/kernelarch-mips/config linux-4.19.118/debian/config/kernelarch-mips/config --- linux-4.19.98/debian/config/kernelarch-mips/config 2020-01-26 13:26:48.000000000 +0000 +++ linux-4.19.118/debian/config/kernelarch-mips/config 2020-04-17 00:32:09.000000000 +0000 @@ -1,6 +1,7 @@ ## ## file: arch/mips/Kconfig ## +CONFIG_CPU_HAS_MSA=y CONFIG_RELOCATABLE=y CONFIG_RELOCATION_TABLE_SIZE=0x00140000 CONFIG_RANDOMIZE_BASE=y @@ -8,6 +9,7 @@ CONFIG_SECCOMP=y CONFIG_PCI=y # CONFIG_RAPIDIO is not set +CONFIG_MIPS_O32_FP64_SUPPORT=y #. Ignored in 32-bit configurations CONFIG_MIPS32_O32=y CONFIG_MIPS32_N32=y diff -Nru linux-4.19.98/debian/config/kernelarch-mips/config.boston linux-4.19.118/debian/config/kernelarch-mips/config.boston --- linux-4.19.98/debian/config/kernelarch-mips/config.boston 2020-01-26 13:26:48.000000000 +0000 +++ linux-4.19.118/debian/config/kernelarch-mips/config.boston 2020-04-17 00:32:09.000000000 +0000 @@ -5,7 +5,6 @@ CONFIG_MIPS_GENERIC=y ## end choice CONFIG_MIPS_CPS=y -CONFIG_CPU_HAS_MSA=y CONFIG_HIGHMEM=y CONFIG_NR_CPUS=16 diff -Nru linux-4.19.98/debian/config/kernelarch-mips/config.octeon linux-4.19.118/debian/config/kernelarch-mips/config.octeon --- linux-4.19.98/debian/config/kernelarch-mips/config.octeon 2020-01-26 13:26:48.000000000 +0000 +++ linux-4.19.118/debian/config/kernelarch-mips/config.octeon 2020-04-17 00:32:09.000000000 +0000 @@ -8,6 +8,7 @@ # CONFIG_32BIT is not set CONFIG_64BIT=y ## end choice +# CONFIG_CPU_HAS_MSA is not set CONFIG_SMP=y # CONFIG_HOTPLUG_CPU is not set CONFIG_NR_CPUS=64 diff -Nru linux-4.19.98/debian/config.defines.dump linux-4.19.118/debian/config.defines.dump --- linux-4.19.98/debian/config.defines.dump 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/config.defines.dump 2020-04-26 13:04:11.000000000 +0000 @@ -8,7 +8,7 @@ (dp4 Vabiname p5 -V8 +V9 p6 sVignore-changes p7 @@ -2949,7 +2949,7 @@ (dp1579 Vsource p1580 -V4.19.98-1 +V4.19.118-1 p1581 sVupstream p1582 @@ -2961,6 +2961,6 @@ p1585 sVabiname p1586 -V4.19.0-8 +V4.19.0-9 p1587 ss. \ No newline at end of file diff -Nru linux-4.19.98/debian/control linux-4.19.118/debian/control --- linux-4.19.98/debian/control 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/control 2020-04-26 13:04:11.000000000 +0000 @@ -12,7 +12,7 @@ Vcs-Browser: https://salsa.debian.org/kernel-team/linux Vcs-Git: https://salsa.debian.org/kernel-team/linux.git -Package: linux-support-4.19.0-8 +Package: linux-support-4.19.0-9 Architecture: all Section: devel Depends: ${python3:Depends}, ${misc:Depends} @@ -187,7 +187,7 @@ appropriate version for the running kernel. Build-Profiles: -Package: linux-bootwrapper-4.19.0-8 +Package: linux-bootwrapper-4.19.0-9 Architecture: powerpc powerpcspe ppc64 Depends: ${shlibs:Depends}, ${misc:Depends} Description: Boot wrapper tools for Linux 4.19 on PowerPC @@ -211,26 +211,26 @@ Build-Profiles: Multi-Arch: foreign -Package: linux-headers-4.19.0-8-common +Package: linux-headers-4.19.0-9-common Architecture: all Depends: ${misc:Depends} -Description: Common header files for Linux 4.19.0-8 +Description: Common header files for Linux 4.19.0-9 This package provides the common kernel header files for Linux kernel - version 4.19.0-8, generally used for building out-of-tree kernel modules. + version 4.19.0-9, generally used for building out-of-tree kernel modules. To obtain a complete set of headers you also need to install the - linux-headers-4.19.0-8-(flavour) package, matching the flavour of the + linux-headers-4.19.0-9-(flavour) package, matching the flavour of the kernel you intend the build for. Build-Profiles: Multi-Arch: foreign -Package: linux-headers-4.19.0-8-common-rt +Package: linux-headers-4.19.0-9-common-rt Architecture: all Depends: ${misc:Depends} -Description: Common header files for Linux 4.19.0-8-rt +Description: Common header files for Linux 4.19.0-9-rt This package provides the common kernel header files for Linux kernel - version 4.19.0-8 with the PREEMPT_RT featureset, generally used for + version 4.19.0-9 with the PREEMPT_RT featureset, generally used for building out-of-tree kernel modules. To obtain a complete set of headers - you also need to install the linux-headers-4.19.0-8-(flavour) package, + you also need to install the linux-headers-4.19.0-9-(flavour) package, matching the flavour of the kernel you intend the build for. Build-Profiles: Multi-Arch: foreign @@ -246,18 +246,18 @@ libraries. Multi-Arch: same -Package: linux-headers-4.19.0-8-all +Package: linux-headers-4.19.0-9-all Architecture: alpha amd64 arm64 armel armhf hppa i386 ia64 m68k mips mips64 mips64el mips64r6 mips64r6el mipsel mipsr6 mipsr6el powerpc powerpcspe ppc64 ppc64el riscv64 s390x sh4 sparc64 -Depends: linux-headers-4.19.0-8-all-${kernel:Arch} (= ${binary:Version}), ${misc:Depends} +Depends: linux-headers-4.19.0-9-all-${kernel:Arch} (= ${binary:Version}), ${misc:Depends} Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: linux-headers-4.19.0-8-all-alpha +Package: linux-headers-4.19.0-9-all-alpha Architecture: alpha -Depends: ${misc:Depends}, linux-headers-4.19.0-8-alpha-generic (= ${binary:Version}), linux-headers-4.19.0-8-alpha-smp (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-alpha-generic (= ${binary:Version}), linux-headers-4.19.0-9-alpha-smp (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree @@ -277,7 +277,7 @@ Build-Profiles: Multi-Arch: same -Package: kernel-image-4.19.0-8-alpha-generic-di +Package: kernel-image-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard @@ -287,511 +287,511 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: nic-modules-4.19.0-8-alpha-generic-di +Package: nic-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, nic-shared-modules-4.19.0-8-alpha-generic-di, i2c-modules-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di, zlib-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, nic-shared-modules-4.19.0-9-alpha-generic-di, i2c-modules-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di, zlib-modules-4.19.0-9-alpha-generic-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-alpha-generic-di +Package: nic-wireless-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, nic-shared-modules-4.19.0-8-alpha-generic-di, usb-modules-4.19.0-8-alpha-generic-di, pcmcia-modules-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, nic-shared-modules-4.19.0-9-alpha-generic-di, usb-modules-4.19.0-9-alpha-generic-di, pcmcia-modules-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-alpha-generic-di +Package: nic-shared-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: serial-modules-4.19.0-8-alpha-generic-di +Package: serial-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, pcmcia-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, pcmcia-modules-4.19.0-9-alpha-generic-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-alpha-generic-di +Package: usb-serial-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, usb-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, usb-modules-4.19.0-9-alpha-generic-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: ppp-modules-4.19.0-8-alpha-generic-di +Package: ppp-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, serial-modules-4.19.0-8-alpha-generic-di, zlib-modules-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, serial-modules-4.19.0-9-alpha-generic-di, zlib-modules-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: pata-modules-4.19.0-8-alpha-generic-di +Package: pata-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, ata-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, ata-modules-4.19.0-9-alpha-generic-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-alpha-generic-di +Package: cdrom-core-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, scsi-core-modules-4.19.0-8-alpha-generic-di, isofs-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, scsi-core-modules-4.19.0-9-alpha-generic-di, isofs-modules-4.19.0-9-alpha-generic-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-alpha-generic-di +Package: scsi-core-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: scsi-modules-4.19.0-8-alpha-generic-di +Package: scsi-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, scsi-core-modules-4.19.0-8-alpha-generic-di, cdrom-core-modules-4.19.0-8-alpha-generic-di, ata-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, scsi-core-modules-4.19.0-9-alpha-generic-di, cdrom-core-modules-4.19.0-9-alpha-generic-di, ata-modules-4.19.0-9-alpha-generic-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-alpha-generic-di +Package: scsi-nic-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-alpha-generic-di, nic-modules-4.19.0-8-alpha-generic-di +Depends: scsi-modules-4.19.0-9-alpha-generic-di, nic-modules-4.19.0-9-alpha-generic-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: loop-modules-4.19.0-8-alpha-generic-di +Package: loop-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: btrfs-modules-4.19.0-8-alpha-generic-di +Package: btrfs-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di, zlib-modules-4.19.0-8-alpha-generic-di, compress-modules-4.19.0-8-alpha-generic-di, md-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di, zlib-modules-4.19.0-9-alpha-generic-di, compress-modules-4.19.0-9-alpha-generic-di, md-modules-4.19.0-9-alpha-generic-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: ext4-modules-4.19.0-8-alpha-generic-di +Package: ext4-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: isofs-modules-4.19.0-8-alpha-generic-di +Package: isofs-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: jfs-modules-4.19.0-8-alpha-generic-di +Package: jfs-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: xfs-modules-4.19.0-8-alpha-generic-di +Package: xfs-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: fat-modules-4.19.0-8-alpha-generic-di +Package: fat-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: md-modules-4.19.0-8-alpha-generic-di +Package: md-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: multipath-modules-4.19.0-8-alpha-generic-di +Package: multipath-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, md-modules-4.19.0-8-alpha-generic-di, scsi-core-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, md-modules-4.19.0-9-alpha-generic-di, scsi-core-modules-4.19.0-9-alpha-generic-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: usb-modules-4.19.0-8-alpha-generic-di +Package: usb-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-alpha-generic-di +Package: usb-storage-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, scsi-core-modules-4.19.0-8-alpha-generic-di, usb-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, scsi-core-modules-4.19.0-9-alpha-generic-di, usb-modules-4.19.0-9-alpha-generic-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: fb-modules-4.19.0-8-alpha-generic-di +Package: fb-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, i2c-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, i2c-modules-4.19.0-9-alpha-generic-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: input-modules-4.19.0-8-alpha-generic-di +Package: input-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, usb-modules-4.19.0-8-alpha-generic-di, i2c-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, usb-modules-4.19.0-9-alpha-generic-di, i2c-modules-4.19.0-9-alpha-generic-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: event-modules-4.19.0-8-alpha-generic-di +Package: event-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: mouse-modules-4.19.0-8-alpha-generic-di +Package: mouse-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, event-modules-4.19.0-8-alpha-generic-di, input-modules-4.19.0-8-alpha-generic-di, usb-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, event-modules-4.19.0-9-alpha-generic-di, input-modules-4.19.0-9-alpha-generic-di, usb-modules-4.19.0-9-alpha-generic-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: nic-pcmcia-modules-4.19.0-8-alpha-generic-di +Package: nic-pcmcia-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: nic-pcmcia-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, nic-shared-modules-4.19.0-8-alpha-generic-di, nic-wireless-modules-4.19.0-8-alpha-generic-di, pcmcia-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, nic-shared-modules-4.19.0-9-alpha-generic-di, nic-wireless-modules-4.19.0-9-alpha-generic-di, pcmcia-modules-4.19.0-9-alpha-generic-di Description: Common PCMCIA NIC drivers This package contains common PCMCIA NIC drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: pcmcia-modules-4.19.0-8-alpha-generic-di +Package: pcmcia-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: pcmcia-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: Common PCMCIA drivers This package contains common PCMCIA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-alpha-generic-di +Package: nic-usb-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, nic-shared-modules-4.19.0-8-alpha-generic-di, nic-wireless-modules-4.19.0-8-alpha-generic-di, usb-modules-4.19.0-8-alpha-generic-di, crc-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, nic-shared-modules-4.19.0-9-alpha-generic-di, nic-wireless-modules-4.19.0-9-alpha-generic-di, usb-modules-4.19.0-9-alpha-generic-di, crc-modules-4.19.0-9-alpha-generic-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: sata-modules-4.19.0-8-alpha-generic-di +Package: sata-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, scsi-core-modules-4.19.0-8-alpha-generic-di, ata-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, scsi-core-modules-4.19.0-9-alpha-generic-di, ata-modules-4.19.0-9-alpha-generic-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: i2c-modules-4.19.0-8-alpha-generic-di +Package: i2c-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: crc-modules-4.19.0-8-alpha-generic-di +Package: crc-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: crypto-modules-4.19.0-8-alpha-generic-di +Package: crypto-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-alpha-generic-di +Package: crypto-dm-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, md-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, md-modules-4.19.0-9-alpha-generic-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: ata-modules-4.19.0-8-alpha-generic-di +Package: ata-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, scsi-core-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, scsi-core-modules-4.19.0-9-alpha-generic-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: nbd-modules-4.19.0-8-alpha-generic-di +Package: nbd-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: squashfs-modules-4.19.0-8-alpha-generic-di +Package: squashfs-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di, compress-modules-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di, compress-modules-4.19.0-9-alpha-generic-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: zlib-modules-4.19.0-8-alpha-generic-di +Package: zlib-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: compress-modules-4.19.0-8-alpha-generic-di +Package: compress-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: fuse-modules-4.19.0-8-alpha-generic-di +Package: fuse-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: srm-modules-4.19.0-8-alpha-generic-di +Package: srm-modules-4.19.0-9-alpha-generic-di Architecture: alpha Section: debian-installer Priority: standard Provides: srm-modules -Depends: kernel-image-4.19.0-8-alpha-generic-di +Depends: kernel-image-4.19.0-9-alpha-generic-di Description: SRM modules This package contains the srm_env module which provides access to the SRM environment. Build-Profiles: -Kernel-Version: 4.19.0-8-alpha-generic +Kernel-Version: 4.19.0-9-alpha-generic Package-Type: udeb -Package: linux-image-4.19.0-8-alpha-generic +Package: linux-image-4.19.0-9-alpha-generic Architecture: alpha -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [alpha] | linux-initramfs-tool [alpha] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [alpha] | linux-initramfs-tool [alpha] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [alpha] Suggests: linux-doc-4.19, debian-kernel-handbook, aboot [alpha], fdutils [alpha] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -800,31 +800,31 @@ extended kernel start address (Wildfire, Titan, Marvel). Build-Profiles: -Package: linux-headers-4.19.0-8-alpha-generic +Package: linux-headers-4.19.0-9-alpha-generic Architecture: alpha -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-alpha-generic +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-alpha-generic This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-alpha-generic, generally used for building + Linux kernel 4.19.0-9-alpha-generic, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-alpha-generic, and can be used for + /usr/src/linux-headers-4.19.0-9-alpha-generic, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-alpha-generic package. + linux-image-4.19.0-9-alpha-generic package. Build-Profiles: -Package: linux-image-4.19.0-8-alpha-generic-dbg +Package: linux-image-4.19.0-9-alpha-generic-dbg Architecture: alpha Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-alpha-generic +Description: Debug symbols for linux-image-4.19.0-9-alpha-generic This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-alpha-generic. + modules in linux-image-4.19.0-9-alpha-generic. Build-Profiles: -Package: linux-image-4.19.0-8-alpha-smp +Package: linux-image-4.19.0-9-alpha-smp Architecture: alpha -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [alpha] | linux-initramfs-tool [alpha] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [alpha] | linux-initramfs-tool [alpha] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [alpha] Suggests: linux-doc-4.19, debian-kernel-handbook, aboot [alpha], fdutils [alpha] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -833,38 +833,38 @@ extended kernel start address (Wildfire, Titan, Marvel). Build-Profiles: -Package: linux-headers-4.19.0-8-alpha-smp +Package: linux-headers-4.19.0-9-alpha-smp Architecture: alpha -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-alpha-smp +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-alpha-smp This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-alpha-smp, generally used for building out-of-tree + Linux kernel 4.19.0-9-alpha-smp, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-alpha-smp, and can be used for building + /usr/src/linux-headers-4.19.0-9-alpha-smp, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-alpha-smp package. + linux-image-4.19.0-9-alpha-smp package. Build-Profiles: -Package: linux-image-4.19.0-8-alpha-smp-dbg +Package: linux-image-4.19.0-9-alpha-smp-dbg Architecture: alpha Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-alpha-smp +Description: Debug symbols for linux-image-4.19.0-9-alpha-smp This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-alpha-smp. + modules in linux-image-4.19.0-9-alpha-smp. Build-Profiles: -Package: linux-headers-4.19.0-8-all-amd64 +Package: linux-headers-4.19.0-9-all-amd64 Architecture: amd64 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-amd64 (= ${binary:Version}), linux-headers-4.19.0-8-cloud-amd64 (= ${binary:Version}), linux-headers-4.19.0-8-rt-amd64 (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-amd64 (= ${binary:Version}), linux-headers-4.19.0-9-cloud-amd64 (= ${binary:Version}), linux-headers-4.19.0-9-rt-amd64 (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-amd64-di +Package: kernel-image-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard @@ -874,614 +874,614 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: nic-modules-4.19.0-8-amd64-di +Package: nic-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-amd64-di, nic-shared-modules-4.19.0-8-amd64-di, i2c-modules-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di, mtd-core-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, nic-shared-modules-4.19.0-9-amd64-di, i2c-modules-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di, mtd-core-modules-4.19.0-9-amd64-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-amd64-di +Package: nic-wireless-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-amd64-di, nic-shared-modules-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di, mmc-core-modules-4.19.0-8-amd64-di, pcmcia-modules-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, nic-shared-modules-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di, mmc-core-modules-4.19.0-9-amd64-di, pcmcia-modules-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-amd64-di +Package: nic-shared-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: serial-modules-4.19.0-8-amd64-di +Package: serial-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-amd64-di, pcmcia-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, pcmcia-modules-4.19.0-9-amd64-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-amd64-di +Package: usb-serial-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: ppp-modules-4.19.0-8-amd64-di +Package: ppp-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-amd64-di, serial-modules-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, serial-modules-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: pata-modules-4.19.0-8-amd64-di +Package: pata-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-amd64-di, ata-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, ata-modules-4.19.0-9-amd64-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-amd64-di +Package: cdrom-core-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-amd64-di, scsi-core-modules-4.19.0-8-amd64-di, isofs-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, scsi-core-modules-4.19.0-9-amd64-di, isofs-modules-4.19.0-9-amd64-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-amd64-di +Package: firewire-core-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-amd64-di, scsi-core-modules-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, scsi-core-modules-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-amd64-di +Package: scsi-core-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: scsi-modules-4.19.0-8-amd64-di +Package: scsi-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-amd64-di, scsi-core-modules-4.19.0-8-amd64-di, cdrom-core-modules-4.19.0-8-amd64-di, ata-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, scsi-core-modules-4.19.0-9-amd64-di, cdrom-core-modules-4.19.0-9-amd64-di, ata-modules-4.19.0-9-amd64-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-amd64-di +Package: scsi-nic-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-amd64-di, nic-modules-4.19.0-8-amd64-di +Depends: scsi-modules-4.19.0-9-amd64-di, nic-modules-4.19.0-9-amd64-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: loop-modules-4.19.0-8-amd64-di +Package: loop-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-amd64-di +Package: btrfs-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di, compress-modules-4.19.0-8-amd64-di, md-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di, compress-modules-4.19.0-9-amd64-di, md-modules-4.19.0-9-amd64-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: ext4-modules-4.19.0-8-amd64-di +Package: ext4-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: isofs-modules-4.19.0-8-amd64-di +Package: isofs-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: jfs-modules-4.19.0-8-amd64-di +Package: jfs-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: xfs-modules-4.19.0-8-amd64-di +Package: xfs-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: fat-modules-4.19.0-8-amd64-di +Package: fat-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: fat-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: md-modules-4.19.0-8-amd64-di +Package: md-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: multipath-modules-4.19.0-8-amd64-di +Package: multipath-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-amd64-di, md-modules-4.19.0-8-amd64-di, scsi-core-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, md-modules-4.19.0-9-amd64-di, scsi-core-modules-4.19.0-9-amd64-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: usb-modules-4.19.0-8-amd64-di +Package: usb-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-amd64-di +Package: usb-storage-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-amd64-di, scsi-core-modules-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, scsi-core-modules-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: pcmcia-storage-modules-4.19.0-8-amd64-di +Package: pcmcia-storage-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: pcmcia-storage-modules -Depends: kernel-image-4.19.0-8-amd64-di, cdrom-core-modules-4.19.0-8-amd64-di, pcmcia-modules-4.19.0-8-amd64-di, ata-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, cdrom-core-modules-4.19.0-9-amd64-di, pcmcia-modules-4.19.0-9-amd64-di, ata-modules-4.19.0-9-amd64-di Description: PCMCIA storage drivers This package contains PCMCIA storage drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: fb-modules-4.19.0-8-amd64-di +Package: fb-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-amd64-di, i2c-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, i2c-modules-4.19.0-9-amd64-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: input-modules-4.19.0-8-amd64-di +Package: input-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di, i2c-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di, i2c-modules-4.19.0-9-amd64-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: event-modules-4.19.0-8-amd64-di +Package: event-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: mouse-modules-4.19.0-8-amd64-di +Package: mouse-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-amd64-di, event-modules-4.19.0-8-amd64-di, input-modules-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, event-modules-4.19.0-9-amd64-di, input-modules-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: nic-pcmcia-modules-4.19.0-8-amd64-di +Package: nic-pcmcia-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: nic-pcmcia-modules -Depends: kernel-image-4.19.0-8-amd64-di, nic-shared-modules-4.19.0-8-amd64-di, nic-wireless-modules-4.19.0-8-amd64-di, pcmcia-modules-4.19.0-8-amd64-di, mmc-core-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, nic-shared-modules-4.19.0-9-amd64-di, nic-wireless-modules-4.19.0-9-amd64-di, pcmcia-modules-4.19.0-9-amd64-di, mmc-core-modules-4.19.0-9-amd64-di Description: Common PCMCIA NIC drivers This package contains common PCMCIA NIC drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: pcmcia-modules-4.19.0-8-amd64-di +Package: pcmcia-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: pcmcia-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: Common PCMCIA drivers This package contains common PCMCIA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-amd64-di +Package: nic-usb-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-amd64-di, nic-shared-modules-4.19.0-8-amd64-di, nic-wireless-modules-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, nic-shared-modules-4.19.0-9-amd64-di, nic-wireless-modules-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: sata-modules-4.19.0-8-amd64-di +Package: sata-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-amd64-di, scsi-core-modules-4.19.0-8-amd64-di, ata-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, scsi-core-modules-4.19.0-9-amd64-di, ata-modules-4.19.0-9-amd64-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: acpi-modules-4.19.0-8-amd64-di +Package: acpi-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: acpi-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: ACPI support modules This package contains kernel modules for ACPI. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: i2c-modules-4.19.0-8-amd64-di +Package: i2c-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: crc-modules-4.19.0-8-amd64-di +Package: crc-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: crypto-modules-4.19.0-8-amd64-di +Package: crypto-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-amd64-di +Package: crypto-dm-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-amd64-di, md-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, md-modules-4.19.0-9-amd64-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: efi-modules-4.19.0-8-amd64-di +Package: efi-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: efi-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: EFI modules This package contains EFI modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: ata-modules-4.19.0-8-amd64-di +Package: ata-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-amd64-di, scsi-core-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, scsi-core-modules-4.19.0-9-amd64-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-amd64-di +Package: mmc-core-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: mmc-modules-4.19.0-8-amd64-di +Package: mmc-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-amd64-di, mmc-core-modules-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, mmc-core-modules-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: nbd-modules-4.19.0-8-amd64-di +Package: nbd-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-amd64-di +Package: squashfs-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-amd64-di, compress-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, compress-modules-4.19.0-9-amd64-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: speakup-modules-4.19.0-8-amd64-di +Package: speakup-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: speakup-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: speakup modules This package contains speakup modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: uinput-modules-4.19.0-8-amd64-di +Package: uinput-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: sound-modules-4.19.0-8-amd64-di +Package: sound-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-amd64-di, i2c-modules-4.19.0-8-amd64-di, usb-modules-4.19.0-8-amd64-di, pcmcia-modules-4.19.0-8-amd64-di, firewire-core-modules-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, i2c-modules-4.19.0-9-amd64-di, usb-modules-4.19.0-9-amd64-di, pcmcia-modules-4.19.0-9-amd64-di, firewire-core-modules-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: compress-modules-4.19.0-8-amd64-di +Package: compress-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: udf-modules-4.19.0-8-amd64-di +Package: udf-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-amd64-di, crc-modules-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di, crc-modules-4.19.0-9-amd64-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: fuse-modules-4.19.0-8-amd64-di +Package: fuse-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-amd64-di +Package: mtd-core-modules-4.19.0-9-amd64-di Architecture: amd64 Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-amd64-di +Depends: kernel-image-4.19.0-9-amd64-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-amd64 +Kernel-Version: 4.19.0-9-amd64 Package-Type: udeb Package: linux-image-amd64-signed-template @@ -1492,84 +1492,84 @@ service. Build-Profiles: -Package: linux-image-4.19.0-8-amd64-unsigned +Package: linux-image-4.19.0-9-amd64-unsigned Architecture: amd64 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [amd64] | linux-initramfs-tool [amd64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [amd64] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-pc [amd64] | grub-efi-amd64 [amd64] | extlinux [amd64] -Replaces: linux-image-4.19.0-8-amd64 +Replaces: linux-image-4.19.0-9-amd64 Breaks: xserver-xorg-input-vmmouse (<< 1:13.0.99) [amd64], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-amd64 +Conflicts: linux-image-4.19.0-9-amd64 Description: Linux 4.19 for 64-bit PCs The Linux kernel 4.19 and modules for use on PCs with AMD64, Intel 64 or VIA Nano processors. Build-Profiles: -Package: linux-headers-4.19.0-8-amd64 +Package: linux-headers-4.19.0-9-amd64 Architecture: amd64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 -Description: Header files for Linux 4.19.0-8-amd64 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 +Description: Header files for Linux 4.19.0-9-amd64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-amd64, generally used for building out-of-tree + Linux kernel 4.19.0-9-amd64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-amd64, and can be used for building + /usr/src/linux-headers-4.19.0-9-amd64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-amd64 package. + linux-image-4.19.0-9-amd64 package. Build-Profiles: -Package: linux-image-4.19.0-8-amd64-dbg +Package: linux-image-4.19.0-9-amd64-dbg Architecture: amd64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-amd64 +Description: Debug symbols for linux-image-4.19.0-9-amd64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-amd64. + modules in linux-image-4.19.0-9-amd64. Build-Profiles: -Package: linux-image-4.19.0-8-cloud-amd64-unsigned +Package: linux-image-4.19.0-9-cloud-amd64-unsigned Architecture: amd64 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [amd64] | linux-initramfs-tool [amd64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [amd64] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-pc [amd64] | grub-efi-amd64 [amd64] | extlinux [amd64] -Replaces: linux-image-4.19.0-8-cloud-amd64 +Replaces: linux-image-4.19.0-9-cloud-amd64 Breaks: xserver-xorg-input-vmmouse (<< 1:13.0.99) [amd64], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-cloud-amd64 +Conflicts: linux-image-4.19.0-9-cloud-amd64 Description: Linux 4.19 for x86-64 cloud The Linux kernel 4.19 and modules for use on Amazon EC2, Google Compute Engine and Microsoft Azure cloud platforms. Build-Profiles: -Package: linux-headers-4.19.0-8-cloud-amd64 +Package: linux-headers-4.19.0-9-cloud-amd64 Architecture: amd64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 -Description: Header files for Linux 4.19.0-8-cloud-amd64 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 +Description: Header files for Linux 4.19.0-9-cloud-amd64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-cloud-amd64, generally used for building out-of-tree + Linux kernel 4.19.0-9-cloud-amd64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-cloud-amd64, and can be used for building + /usr/src/linux-headers-4.19.0-9-cloud-amd64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-cloud-amd64 package. + linux-image-4.19.0-9-cloud-amd64 package. Build-Profiles: -Package: linux-image-4.19.0-8-cloud-amd64-dbg +Package: linux-image-4.19.0-9-cloud-amd64-dbg Architecture: amd64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-cloud-amd64 +Description: Debug symbols for linux-image-4.19.0-9-cloud-amd64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-cloud-amd64. + modules in linux-image-4.19.0-9-cloud-amd64. Build-Profiles: -Package: linux-image-4.19.0-8-rt-amd64-unsigned +Package: linux-image-4.19.0-9-rt-amd64-unsigned Architecture: amd64 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [amd64] | linux-initramfs-tool [amd64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [amd64] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-pc [amd64] | grub-efi-amd64 [amd64] | extlinux [amd64] -Replaces: linux-image-4.19.0-8-rt-amd64 +Replaces: linux-image-4.19.0-9-rt-amd64 Breaks: xserver-xorg-input-vmmouse (<< 1:13.0.99) [amd64], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-rt-amd64 +Conflicts: linux-image-4.19.0-9-rt-amd64 Description: Linux 4.19 for 64-bit PCs, PREEMPT_RT The Linux kernel 4.19 and modules for use on PCs with AMD64, Intel 64 or VIA Nano processors. @@ -1577,38 +1577,38 @@ This kernel includes the PREEMPT_RT realtime patch set. Build-Profiles: -Package: linux-headers-4.19.0-8-rt-amd64 +Package: linux-headers-4.19.0-9-rt-amd64 Architecture: amd64 -Depends: linux-headers-4.19.0-8-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 -Description: Header files for Linux 4.19.0-8-rt-amd64 +Depends: linux-headers-4.19.0-9-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 +Description: Header files for Linux 4.19.0-9-rt-amd64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-rt-amd64, generally used for building out-of-tree + Linux kernel 4.19.0-9-rt-amd64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-rt-amd64, and can be used for building + /usr/src/linux-headers-4.19.0-9-rt-amd64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-rt-amd64 package. + linux-image-4.19.0-9-rt-amd64 package. Build-Profiles: -Package: linux-image-4.19.0-8-rt-amd64-dbg +Package: linux-image-4.19.0-9-rt-amd64-dbg Architecture: amd64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-rt-amd64 +Description: Debug symbols for linux-image-4.19.0-9-rt-amd64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-rt-amd64. + modules in linux-image-4.19.0-9-rt-amd64. Build-Profiles: -Package: linux-headers-4.19.0-8-all-arm64 +Package: linux-headers-4.19.0-9-all-arm64 Architecture: arm64 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-arm64 (= ${binary:Version}), linux-headers-4.19.0-8-rt-arm64 (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-arm64 (= ${binary:Version}), linux-headers-4.19.0-9-rt-arm64 (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-arm64-di +Package: kernel-image-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard @@ -1618,494 +1618,494 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: nic-modules-4.19.0-8-arm64-di +Package: nic-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-arm64-di, nic-shared-modules-4.19.0-8-arm64-di, i2c-modules-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di, mtd-core-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, nic-shared-modules-4.19.0-9-arm64-di, i2c-modules-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di, mtd-core-modules-4.19.0-9-arm64-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-arm64-di +Package: nic-wireless-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-arm64-di, nic-shared-modules-4.19.0-8-arm64-di, usb-modules-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, nic-shared-modules-4.19.0-9-arm64-di, usb-modules-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-arm64-di +Package: nic-shared-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-arm64-di +Package: usb-serial-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-arm64-di, usb-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, usb-modules-4.19.0-9-arm64-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: ppp-modules-4.19.0-8-arm64-di +Package: ppp-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-arm64-di +Package: cdrom-core-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-arm64-di, scsi-core-modules-4.19.0-8-arm64-di, isofs-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, scsi-core-modules-4.19.0-9-arm64-di, isofs-modules-4.19.0-9-arm64-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-arm64-di +Package: scsi-core-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: scsi-modules-4.19.0-8-arm64-di +Package: scsi-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-arm64-di, scsi-core-modules-4.19.0-8-arm64-di, cdrom-core-modules-4.19.0-8-arm64-di, ata-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, scsi-core-modules-4.19.0-9-arm64-di, cdrom-core-modules-4.19.0-9-arm64-di, ata-modules-4.19.0-9-arm64-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-arm64-di +Package: scsi-nic-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-arm64-di, nic-modules-4.19.0-8-arm64-di +Depends: scsi-modules-4.19.0-9-arm64-di, nic-modules-4.19.0-9-arm64-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: loop-modules-4.19.0-8-arm64-di +Package: loop-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-arm64-di +Package: btrfs-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di, compress-modules-4.19.0-8-arm64-di, md-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di, compress-modules-4.19.0-9-arm64-di, md-modules-4.19.0-9-arm64-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: ext4-modules-4.19.0-8-arm64-di +Package: ext4-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: isofs-modules-4.19.0-8-arm64-di +Package: isofs-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: jfs-modules-4.19.0-8-arm64-di +Package: jfs-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: xfs-modules-4.19.0-8-arm64-di +Package: xfs-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: fat-modules-4.19.0-8-arm64-di +Package: fat-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: md-modules-4.19.0-8-arm64-di +Package: md-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: multipath-modules-4.19.0-8-arm64-di +Package: multipath-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-arm64-di, md-modules-4.19.0-8-arm64-di, scsi-core-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, md-modules-4.19.0-9-arm64-di, scsi-core-modules-4.19.0-9-arm64-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: usb-modules-4.19.0-8-arm64-di +Package: usb-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-arm64-di +Package: usb-storage-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-arm64-di, scsi-core-modules-4.19.0-8-arm64-di, usb-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, scsi-core-modules-4.19.0-9-arm64-di, usb-modules-4.19.0-9-arm64-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: fb-modules-4.19.0-8-arm64-di +Package: fb-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-arm64-di, i2c-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, i2c-modules-4.19.0-9-arm64-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: input-modules-4.19.0-8-arm64-di +Package: input-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-arm64-di, usb-modules-4.19.0-8-arm64-di, i2c-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, usb-modules-4.19.0-9-arm64-di, i2c-modules-4.19.0-9-arm64-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: event-modules-4.19.0-8-arm64-di +Package: event-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-arm64-di +Package: nic-usb-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-arm64-di, nic-shared-modules-4.19.0-8-arm64-di, nic-wireless-modules-4.19.0-8-arm64-di, usb-modules-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, nic-shared-modules-4.19.0-9-arm64-di, nic-wireless-modules-4.19.0-9-arm64-di, usb-modules-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: sata-modules-4.19.0-8-arm64-di +Package: sata-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-arm64-di, scsi-core-modules-4.19.0-8-arm64-di, ata-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, scsi-core-modules-4.19.0-9-arm64-di, ata-modules-4.19.0-9-arm64-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: i2c-modules-4.19.0-8-arm64-di +Package: i2c-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: crc-modules-4.19.0-8-arm64-di +Package: crc-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: crypto-modules-4.19.0-8-arm64-di +Package: crypto-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-arm64-di +Package: crypto-dm-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-arm64-di, md-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, md-modules-4.19.0-9-arm64-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: efi-modules-4.19.0-8-arm64-di +Package: efi-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: efi-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: EFI modules This package contains EFI modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: ata-modules-4.19.0-8-arm64-di +Package: ata-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-arm64-di, scsi-core-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, scsi-core-modules-4.19.0-9-arm64-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: mmc-modules-4.19.0-8-arm64-di +Package: mmc-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-arm64-di, usb-modules-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, usb-modules-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: nbd-modules-4.19.0-8-arm64-di +Package: nbd-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-arm64-di +Package: squashfs-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-arm64-di, compress-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, compress-modules-4.19.0-9-arm64-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: uinput-modules-4.19.0-8-arm64-di +Package: uinput-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: compress-modules-4.19.0-8-arm64-di +Package: compress-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: leds-modules-4.19.0-8-arm64-di +Package: leds-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: leds-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: LED modules This package contains LED modules. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: udf-modules-4.19.0-8-arm64-di +Package: udf-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-arm64-di, crc-modules-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di, crc-modules-4.19.0-9-arm64-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: fuse-modules-4.19.0-8-arm64-di +Package: fuse-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-arm64-di +Package: mtd-core-modules-4.19.0-9-arm64-di Architecture: arm64 Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-arm64-di +Depends: kernel-image-4.19.0-9-arm64-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-arm64 +Kernel-Version: 4.19.0-9-arm64 Package-Type: udeb Package: linux-image-arm64-signed-template @@ -2116,86 +2116,86 @@ service. Build-Profiles: -Package: linux-image-4.19.0-8-arm64-unsigned +Package: linux-image-4.19.0-9-arm64-unsigned Architecture: arm64 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [arm64] | linux-initramfs-tool [arm64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [arm64] Suggests: linux-doc-4.19, debian-kernel-handbook -Replaces: linux-image-4.19.0-8-arm64 +Replaces: linux-image-4.19.0-9-arm64 Breaks: libmozjs185-1.0 [arm64], libmozjs-24-0 (<< 24.2.0-5.1~) [arm64], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-arm64 +Conflicts: linux-image-4.19.0-9-arm64 Description: Linux 4.19 for 64-bit ARMv8 machines The Linux kernel 4.19 and modules for use on 64-bit ARMv8 machines. Build-Profiles: -Package: linux-headers-4.19.0-8-arm64 +Package: linux-headers-4.19.0-9-arm64 Architecture: arm64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-arm64 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-arm64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-arm64, generally used for building out-of-tree + Linux kernel 4.19.0-9-arm64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-arm64, and can be used for building + /usr/src/linux-headers-4.19.0-9-arm64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-arm64 package. + linux-image-4.19.0-9-arm64 package. Build-Profiles: -Package: linux-image-4.19.0-8-arm64-dbg +Package: linux-image-4.19.0-9-arm64-dbg Architecture: arm64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-arm64 +Description: Debug symbols for linux-image-4.19.0-9-arm64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-arm64. + modules in linux-image-4.19.0-9-arm64. Build-Profiles: -Package: linux-image-4.19.0-8-rt-arm64-unsigned +Package: linux-image-4.19.0-9-rt-arm64-unsigned Architecture: arm64 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [arm64] | linux-initramfs-tool [arm64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [arm64] Suggests: linux-doc-4.19, debian-kernel-handbook -Replaces: linux-image-4.19.0-8-rt-arm64 +Replaces: linux-image-4.19.0-9-rt-arm64 Breaks: libmozjs185-1.0 [arm64], libmozjs-24-0 (<< 24.2.0-5.1~) [arm64], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-rt-arm64 +Conflicts: linux-image-4.19.0-9-rt-arm64 Description: Linux 4.19 for 64-bit ARMv8 machines, PREEMPT_RT The Linux kernel 4.19 and modules for use on 64-bit ARMv8 machines. . This kernel includes the PREEMPT_RT realtime patch set. Build-Profiles: -Package: linux-headers-4.19.0-8-rt-arm64 +Package: linux-headers-4.19.0-9-rt-arm64 Architecture: arm64 -Depends: linux-headers-4.19.0-8-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-rt-arm64 +Depends: linux-headers-4.19.0-9-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-rt-arm64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-rt-arm64, generally used for building out-of-tree + Linux kernel 4.19.0-9-rt-arm64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-rt-arm64, and can be used for building + /usr/src/linux-headers-4.19.0-9-rt-arm64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-rt-arm64 package. + linux-image-4.19.0-9-rt-arm64 package. Build-Profiles: -Package: linux-image-4.19.0-8-rt-arm64-dbg +Package: linux-image-4.19.0-9-rt-arm64-dbg Architecture: arm64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-rt-arm64 +Description: Debug symbols for linux-image-4.19.0-9-rt-arm64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-rt-arm64. + modules in linux-image-4.19.0-9-rt-arm64. Build-Profiles: -Package: linux-headers-4.19.0-8-all-armel +Package: linux-headers-4.19.0-9-all-armel Architecture: armel -Depends: ${misc:Depends}, linux-headers-4.19.0-8-marvell (= ${binary:Version}), linux-headers-4.19.0-8-rpi (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-marvell (= ${binary:Version}), linux-headers-4.19.0-9-rpi (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-marvell-di +Package: kernel-image-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard @@ -2205,497 +2205,497 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: nic-modules-4.19.0-8-marvell-di +Package: nic-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-marvell-di, nic-shared-modules-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di, zlib-modules-4.19.0-8-marvell-di, mtd-core-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, nic-shared-modules-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di, zlib-modules-4.19.0-9-marvell-di, mtd-core-modules-4.19.0-9-marvell-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-marvell-di +Package: nic-shared-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-marvell-di +Package: usb-serial-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-marvell-di, usb-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, usb-modules-4.19.0-9-marvell-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: ppp-modules-4.19.0-8-marvell-di +Package: ppp-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-marvell-di, zlib-modules-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, zlib-modules-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-marvell-di +Package: cdrom-core-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-marvell-di, scsi-core-modules-4.19.0-8-marvell-di, isofs-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, scsi-core-modules-4.19.0-9-marvell-di, isofs-modules-4.19.0-9-marvell-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-marvell-di +Package: scsi-core-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: loop-modules-4.19.0-8-marvell-di +Package: loop-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: ipv6-modules-4.19.0-8-marvell-di +Package: ipv6-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: ipv6-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: IPv6 driver This package contains the IPv6 driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: btrfs-modules-4.19.0-8-marvell-di +Package: btrfs-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di, zlib-modules-4.19.0-8-marvell-di, compress-modules-4.19.0-8-marvell-di, md-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di, zlib-modules-4.19.0-9-marvell-di, compress-modules-4.19.0-9-marvell-di, md-modules-4.19.0-9-marvell-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: ext4-modules-4.19.0-8-marvell-di +Package: ext4-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: isofs-modules-4.19.0-8-marvell-di +Package: isofs-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: jffs2-modules-4.19.0-8-marvell-di +Package: jffs2-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: jffs2-modules -Depends: kernel-image-4.19.0-8-marvell-di, zlib-modules-4.19.0-8-marvell-di, compress-modules-4.19.0-8-marvell-di, mtd-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, zlib-modules-4.19.0-9-marvell-di, compress-modules-4.19.0-9-marvell-di, mtd-modules-4.19.0-9-marvell-di Description: JFFS2 filesystem support This package contains the JFFS2 filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: jfs-modules-4.19.0-8-marvell-di +Package: jfs-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: fat-modules-4.19.0-8-marvell-di +Package: fat-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: minix-modules-4.19.0-8-marvell-di +Package: minix-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: minix-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: Minix filesystem support This package contains the Minix filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: md-modules-4.19.0-8-marvell-di +Package: md-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: multipath-modules-4.19.0-8-marvell-di +Package: multipath-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-marvell-di, md-modules-4.19.0-8-marvell-di, scsi-core-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, md-modules-4.19.0-9-marvell-di, scsi-core-modules-4.19.0-9-marvell-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: usb-modules-4.19.0-8-marvell-di +Package: usb-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-marvell-di +Package: usb-storage-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-marvell-di, scsi-core-modules-4.19.0-8-marvell-di, usb-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, scsi-core-modules-4.19.0-9-marvell-di, usb-modules-4.19.0-9-marvell-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: fb-modules-4.19.0-8-marvell-di +Package: fb-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-marvell-di, usb-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, usb-modules-4.19.0-9-marvell-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: input-modules-4.19.0-8-marvell-di +Package: input-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-marvell-di, usb-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, usb-modules-4.19.0-9-marvell-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: event-modules-4.19.0-8-marvell-di +Package: event-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: mouse-modules-4.19.0-8-marvell-di +Package: mouse-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-marvell-di, event-modules-4.19.0-8-marvell-di, input-modules-4.19.0-8-marvell-di, usb-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, event-modules-4.19.0-9-marvell-di, input-modules-4.19.0-9-marvell-di, usb-modules-4.19.0-9-marvell-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-marvell-di +Package: nic-usb-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-marvell-di, nic-shared-modules-4.19.0-8-marvell-di, usb-modules-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, nic-shared-modules-4.19.0-9-marvell-di, usb-modules-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: sata-modules-4.19.0-8-marvell-di +Package: sata-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-marvell-di, scsi-core-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, scsi-core-modules-4.19.0-9-marvell-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: crc-modules-4.19.0-8-marvell-di +Package: crc-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: crypto-modules-4.19.0-8-marvell-di +Package: crypto-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-marvell-di +Package: crypto-dm-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-marvell-di, md-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, md-modules-4.19.0-9-marvell-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-marvell-di +Package: mmc-core-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: mmc-modules-4.19.0-8-marvell-di +Package: mmc-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-marvell-di, mmc-core-modules-4.19.0-8-marvell-di, usb-modules-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, mmc-core-modules-4.19.0-9-marvell-di, usb-modules-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: nbd-modules-4.19.0-8-marvell-di +Package: nbd-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: squashfs-modules-4.19.0-8-marvell-di +Package: squashfs-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-marvell-di, compress-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, compress-modules-4.19.0-9-marvell-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: uinput-modules-4.19.0-8-marvell-di +Package: uinput-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: zlib-modules-4.19.0-8-marvell-di +Package: zlib-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: compress-modules-4.19.0-8-marvell-di +Package: compress-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: leds-modules-4.19.0-8-marvell-di +Package: leds-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: leds-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: LED modules This package contains LED modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: udf-modules-4.19.0-8-marvell-di +Package: udf-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-marvell-di, crc-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, crc-modules-4.19.0-9-marvell-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: fuse-modules-4.19.0-8-marvell-di +Package: fuse-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: mtd-modules-4.19.0-8-marvell-di +Package: mtd-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: mtd-modules -Depends: kernel-image-4.19.0-8-marvell-di, mtd-core-modules-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di, mtd-core-modules-4.19.0-9-marvell-di Description: MTD driver modules This package contains MTD driver modules. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-marvell-di +Package: mtd-core-modules-4.19.0-9-marvell-di Architecture: armel Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-marvell-di +Depends: kernel-image-4.19.0-9-marvell-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-marvell +Kernel-Version: 4.19.0-9-marvell Package-Type: udeb -Package: linux-image-4.19.0-8-marvell +Package: linux-image-4.19.0-9-marvell Architecture: armel -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armel] | linux-initramfs-tool [armel] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armel] | linux-initramfs-tool [armel] Recommends: firmware-linux-free, ${kernel:Recommends}, u-boot-tools [armel], apparmor [armel] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: flash-kernel (<< 3.57~) [armel], initramfs-tools (<< 0.120+deb8u2) @@ -2704,31 +2704,31 @@ based systems (https://wiki.debian.org/ArmEabiPort#Supported_hardware). Build-Profiles: -Package: linux-headers-4.19.0-8-marvell +Package: linux-headers-4.19.0-9-marvell Architecture: armel -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm -Description: Header files for Linux 4.19.0-8-marvell +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm +Description: Header files for Linux 4.19.0-9-marvell This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-marvell, generally used for building out-of-tree + Linux kernel 4.19.0-9-marvell, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-marvell, and can be used for building + /usr/src/linux-headers-4.19.0-9-marvell, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-marvell package. + linux-image-4.19.0-9-marvell package. Build-Profiles: -Package: linux-image-4.19.0-8-marvell-dbg +Package: linux-image-4.19.0-9-marvell-dbg Architecture: armel Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-marvell +Description: Debug symbols for linux-image-4.19.0-9-marvell This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-marvell. + modules in linux-image-4.19.0-9-marvell. Build-Profiles: -Package: linux-image-4.19.0-8-rpi +Package: linux-image-4.19.0-9-rpi Architecture: armel -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armel] | linux-initramfs-tool [armel] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armel] | linux-initramfs-tool [armel] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [armel] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -2737,38 +2737,38 @@ Zero based systems. Build-Profiles: -Package: linux-headers-4.19.0-8-rpi +Package: linux-headers-4.19.0-9-rpi Architecture: armel -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm -Description: Header files for Linux 4.19.0-8-rpi +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm +Description: Header files for Linux 4.19.0-9-rpi This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-rpi, generally used for building out-of-tree kernel + Linux kernel 4.19.0-9-rpi, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-rpi, and can be used for building modules - that load into the kernel provided by the linux-image-4.19.0-8-rpi + /usr/src/linux-headers-4.19.0-9-rpi, and can be used for building modules + that load into the kernel provided by the linux-image-4.19.0-9-rpi package. Build-Profiles: -Package: linux-image-4.19.0-8-rpi-dbg +Package: linux-image-4.19.0-9-rpi-dbg Architecture: armel Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-rpi +Description: Debug symbols for linux-image-4.19.0-9-rpi This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-rpi. + modules in linux-image-4.19.0-9-rpi. Build-Profiles: -Package: linux-headers-4.19.0-8-all-armhf +Package: linux-headers-4.19.0-9-all-armhf Architecture: armhf -Depends: ${misc:Depends}, linux-headers-4.19.0-8-armmp (= ${binary:Version}), linux-headers-4.19.0-8-armmp-lpae (= ${binary:Version}), linux-headers-4.19.0-8-rt-armmp (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-armmp (= ${binary:Version}), linux-headers-4.19.0-9-armmp-lpae (= ${binary:Version}), linux-headers-4.19.0-9-rt-armmp (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-armmp-di +Package: kernel-image-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard @@ -2778,511 +2778,511 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: nic-modules-4.19.0-8-armmp-di +Package: nic-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-armmp-di, nic-shared-modules-4.19.0-8-armmp-di, i2c-modules-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di, zlib-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, nic-shared-modules-4.19.0-9-armmp-di, i2c-modules-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di, zlib-modules-4.19.0-9-armmp-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-armmp-di +Package: nic-wireless-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-armmp-di, nic-shared-modules-4.19.0-8-armmp-di, usb-modules-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, nic-shared-modules-4.19.0-9-armmp-di, usb-modules-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-armmp-di +Package: nic-shared-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-armmp-di +Package: usb-serial-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-armmp-di, usb-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, usb-modules-4.19.0-9-armmp-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: ppp-modules-4.19.0-8-armmp-di +Package: ppp-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-armmp-di, zlib-modules-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, zlib-modules-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: pata-modules-4.19.0-8-armmp-di +Package: pata-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: pata-modules -Depends: kernel-image-4.19.0-8-armmp-di, ata-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, ata-modules-4.19.0-9-armmp-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-armmp-di +Package: cdrom-core-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-armmp-di, scsi-core-modules-4.19.0-8-armmp-di, isofs-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, scsi-core-modules-4.19.0-9-armmp-di, isofs-modules-4.19.0-9-armmp-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-armmp-di +Package: scsi-core-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: scsi-modules-4.19.0-8-armmp-di +Package: scsi-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-armmp-di, scsi-core-modules-4.19.0-8-armmp-di, cdrom-core-modules-4.19.0-8-armmp-di, ata-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, scsi-core-modules-4.19.0-9-armmp-di, cdrom-core-modules-4.19.0-9-armmp-di, ata-modules-4.19.0-9-armmp-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-armmp-di +Package: scsi-nic-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-armmp-di, nic-modules-4.19.0-8-armmp-di +Depends: scsi-modules-4.19.0-9-armmp-di, nic-modules-4.19.0-9-armmp-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: loop-modules-4.19.0-8-armmp-di +Package: loop-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: btrfs-modules-4.19.0-8-armmp-di +Package: btrfs-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di, zlib-modules-4.19.0-8-armmp-di, compress-modules-4.19.0-8-armmp-di, md-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di, zlib-modules-4.19.0-9-armmp-di, compress-modules-4.19.0-9-armmp-di, md-modules-4.19.0-9-armmp-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: ext4-modules-4.19.0-8-armmp-di +Package: ext4-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: isofs-modules-4.19.0-8-armmp-di +Package: isofs-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: jfs-modules-4.19.0-8-armmp-di +Package: jfs-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: fat-modules-4.19.0-8-armmp-di +Package: fat-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: md-modules-4.19.0-8-armmp-di +Package: md-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: multipath-modules-4.19.0-8-armmp-di +Package: multipath-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-armmp-di, md-modules-4.19.0-8-armmp-di, scsi-core-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, md-modules-4.19.0-9-armmp-di, scsi-core-modules-4.19.0-9-armmp-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: usb-modules-4.19.0-8-armmp-di +Package: usb-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-armmp-di +Package: usb-storage-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-armmp-di, scsi-core-modules-4.19.0-8-armmp-di, usb-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, scsi-core-modules-4.19.0-9-armmp-di, usb-modules-4.19.0-9-armmp-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: fb-modules-4.19.0-8-armmp-di +Package: fb-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-armmp-di, i2c-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, i2c-modules-4.19.0-9-armmp-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: input-modules-4.19.0-8-armmp-di +Package: input-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-armmp-di, usb-modules-4.19.0-8-armmp-di, i2c-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, usb-modules-4.19.0-9-armmp-di, i2c-modules-4.19.0-9-armmp-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: event-modules-4.19.0-8-armmp-di +Package: event-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-armmp-di +Package: nic-usb-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-armmp-di, nic-shared-modules-4.19.0-8-armmp-di, nic-wireless-modules-4.19.0-8-armmp-di, usb-modules-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, nic-shared-modules-4.19.0-9-armmp-di, nic-wireless-modules-4.19.0-9-armmp-di, usb-modules-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: sata-modules-4.19.0-8-armmp-di +Package: sata-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-armmp-di, scsi-core-modules-4.19.0-8-armmp-di, ata-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, scsi-core-modules-4.19.0-9-armmp-di, ata-modules-4.19.0-9-armmp-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: i2c-modules-4.19.0-8-armmp-di +Package: i2c-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: crc-modules-4.19.0-8-armmp-di +Package: crc-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: crypto-modules-4.19.0-8-armmp-di +Package: crypto-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-armmp-di +Package: crypto-dm-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-armmp-di, md-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, md-modules-4.19.0-9-armmp-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: efi-modules-4.19.0-8-armmp-di +Package: efi-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: efi-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: EFI modules This package contains EFI modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: ata-modules-4.19.0-8-armmp-di +Package: ata-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-armmp-di, scsi-core-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, scsi-core-modules-4.19.0-9-armmp-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: mmc-modules-4.19.0-8-armmp-di +Package: mmc-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-armmp-di, usb-modules-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, usb-modules-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: nbd-modules-4.19.0-8-armmp-di +Package: nbd-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: squashfs-modules-4.19.0-8-armmp-di +Package: squashfs-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-armmp-di, compress-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, compress-modules-4.19.0-9-armmp-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: uinput-modules-4.19.0-8-armmp-di +Package: uinput-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: zlib-modules-4.19.0-8-armmp-di +Package: zlib-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: compress-modules-4.19.0-8-armmp-di +Package: compress-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: leds-modules-4.19.0-8-armmp-di +Package: leds-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: leds-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: LED modules This package contains LED modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: udf-modules-4.19.0-8-armmp-di +Package: udf-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-armmp-di, crc-modules-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di, crc-modules-4.19.0-9-armmp-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: fuse-modules-4.19.0-8-armmp-di +Package: fuse-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: mtd-modules-4.19.0-8-armmp-di +Package: mtd-modules-4.19.0-9-armmp-di Architecture: armhf Section: debian-installer Priority: optional Provides: mtd-modules -Depends: kernel-image-4.19.0-8-armmp-di +Depends: kernel-image-4.19.0-9-armmp-di Description: MTD driver modules This package contains MTD driver modules. Build-Profiles: -Kernel-Version: 4.19.0-8-armmp +Kernel-Version: 4.19.0-9-armmp Package-Type: udeb -Package: linux-image-4.19.0-8-armmp +Package: linux-image-4.19.0-9-armmp Architecture: armhf -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armhf] | linux-initramfs-tool [armhf] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armhf] | linux-initramfs-tool [armhf] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [armhf] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -3292,31 +3292,31 @@ platforms. Build-Profiles: -Package: linux-headers-4.19.0-8-armmp +Package: linux-headers-4.19.0-9-armmp Architecture: armhf -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm -Description: Header files for Linux 4.19.0-8-armmp +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm +Description: Header files for Linux 4.19.0-9-armmp This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-armmp, generally used for building out-of-tree + Linux kernel 4.19.0-9-armmp, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-armmp, and can be used for building + /usr/src/linux-headers-4.19.0-9-armmp, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-armmp package. + linux-image-4.19.0-9-armmp package. Build-Profiles: -Package: linux-image-4.19.0-8-armmp-dbg +Package: linux-image-4.19.0-9-armmp-dbg Architecture: armhf Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-armmp +Description: Debug symbols for linux-image-4.19.0-9-armmp This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-armmp. + modules in linux-image-4.19.0-9-armmp. Build-Profiles: -Package: linux-image-4.19.0-8-armmp-lpae +Package: linux-image-4.19.0-9-armmp-lpae Architecture: armhf -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armhf] | linux-initramfs-tool [armhf] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armhf] | linux-initramfs-tool [armhf] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [armhf] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -3326,31 +3326,31 @@ details of supported platforms.. Build-Profiles: -Package: linux-headers-4.19.0-8-armmp-lpae +Package: linux-headers-4.19.0-9-armmp-lpae Architecture: armhf -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm -Description: Header files for Linux 4.19.0-8-armmp-lpae +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm +Description: Header files for Linux 4.19.0-9-armmp-lpae This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-armmp-lpae, generally used for building out-of-tree + Linux kernel 4.19.0-9-armmp-lpae, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-armmp-lpae, and can be used for building + /usr/src/linux-headers-4.19.0-9-armmp-lpae, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-armmp-lpae package. + linux-image-4.19.0-9-armmp-lpae package. Build-Profiles: -Package: linux-image-4.19.0-8-armmp-lpae-dbg +Package: linux-image-4.19.0-9-armmp-lpae-dbg Architecture: armhf Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-armmp-lpae +Description: Debug symbols for linux-image-4.19.0-9-armmp-lpae This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-armmp-lpae. + modules in linux-image-4.19.0-9-armmp-lpae. Build-Profiles: -Package: linux-image-4.19.0-8-rt-armmp +Package: linux-image-4.19.0-9-rt-armmp Architecture: armhf -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armhf] | linux-initramfs-tool [armhf] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [armhf] | linux-initramfs-tool [armhf] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [armhf] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -3362,38 +3362,38 @@ This kernel includes the PREEMPT_RT realtime patch set. Build-Profiles: -Package: linux-headers-4.19.0-8-rt-armmp +Package: linux-headers-4.19.0-9-rt-armmp Architecture: armhf -Depends: linux-headers-4.19.0-8-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm -Description: Header files for Linux 4.19.0-8-rt-armmp +Depends: linux-headers-4.19.0-9-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-arm +Description: Header files for Linux 4.19.0-9-rt-armmp This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-rt-armmp, generally used for building out-of-tree + Linux kernel 4.19.0-9-rt-armmp, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-rt-armmp, and can be used for building + /usr/src/linux-headers-4.19.0-9-rt-armmp, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-rt-armmp package. + linux-image-4.19.0-9-rt-armmp package. Build-Profiles: -Package: linux-image-4.19.0-8-rt-armmp-dbg +Package: linux-image-4.19.0-9-rt-armmp-dbg Architecture: armhf Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-rt-armmp +Description: Debug symbols for linux-image-4.19.0-9-rt-armmp This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-rt-armmp. + modules in linux-image-4.19.0-9-rt-armmp. Build-Profiles: -Package: linux-headers-4.19.0-8-all-hppa +Package: linux-headers-4.19.0-9-all-hppa Architecture: hppa -Depends: ${misc:Depends}, linux-headers-4.19.0-8-parisc (= ${binary:Version}), linux-headers-4.19.0-8-parisc-smp (= ${binary:Version}), linux-headers-4.19.0-8-parisc64-smp (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-parisc (= ${binary:Version}), linux-headers-4.19.0-9-parisc-smp (= ${binary:Version}), linux-headers-4.19.0-9-parisc64-smp (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-parisc-di +Package: kernel-image-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard @@ -3403,423 +3403,423 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: nic-modules-4.19.0-8-parisc-di +Package: nic-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-parisc-di, nic-shared-modules-4.19.0-8-parisc-di, crc-modules-4.19.0-8-parisc-di, zlib-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, nic-shared-modules-4.19.0-9-parisc-di, crc-modules-4.19.0-9-parisc-di, zlib-modules-4.19.0-9-parisc-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-parisc-di +Package: nic-shared-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: serial-modules-4.19.0-8-parisc-di +Package: serial-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-parisc-di +Package: usb-serial-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-parisc-di, usb-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, usb-modules-4.19.0-9-parisc-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: ppp-modules-4.19.0-8-parisc-di +Package: ppp-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-parisc-di, serial-modules-4.19.0-8-parisc-di, zlib-modules-4.19.0-8-parisc-di, crc-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, serial-modules-4.19.0-9-parisc-di, zlib-modules-4.19.0-9-parisc-di, crc-modules-4.19.0-9-parisc-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: pata-modules-4.19.0-8-parisc-di +Package: pata-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-parisc-di, ata-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, ata-modules-4.19.0-9-parisc-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-parisc-di +Package: cdrom-core-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-parisc-di, scsi-core-modules-4.19.0-8-parisc-di, isofs-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, scsi-core-modules-4.19.0-9-parisc-di, isofs-modules-4.19.0-9-parisc-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-parisc-di +Package: scsi-core-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: scsi-modules-4.19.0-8-parisc-di +Package: scsi-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-parisc-di, scsi-core-modules-4.19.0-8-parisc-di, cdrom-core-modules-4.19.0-8-parisc-di, ata-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, scsi-core-modules-4.19.0-9-parisc-di, cdrom-core-modules-4.19.0-9-parisc-di, ata-modules-4.19.0-9-parisc-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: loop-modules-4.19.0-8-parisc-di +Package: loop-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: btrfs-modules-4.19.0-8-parisc-di +Package: btrfs-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-parisc-di, crc-modules-4.19.0-8-parisc-di, zlib-modules-4.19.0-8-parisc-di, compress-modules-4.19.0-8-parisc-di, md-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, crc-modules-4.19.0-9-parisc-di, zlib-modules-4.19.0-9-parisc-di, compress-modules-4.19.0-9-parisc-di, md-modules-4.19.0-9-parisc-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: ext4-modules-4.19.0-8-parisc-di +Package: ext4-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-parisc-di, crc-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, crc-modules-4.19.0-9-parisc-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: isofs-modules-4.19.0-8-parisc-di +Package: isofs-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: jfs-modules-4.19.0-8-parisc-di +Package: jfs-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: xfs-modules-4.19.0-8-parisc-di +Package: xfs-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-parisc-di, crc-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, crc-modules-4.19.0-9-parisc-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: fat-modules-4.19.0-8-parisc-di +Package: fat-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: md-modules-4.19.0-8-parisc-di +Package: md-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-parisc-di, crc-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, crc-modules-4.19.0-9-parisc-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: multipath-modules-4.19.0-8-parisc-di +Package: multipath-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-parisc-di, md-modules-4.19.0-8-parisc-di, scsi-core-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, md-modules-4.19.0-9-parisc-di, scsi-core-modules-4.19.0-9-parisc-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: usb-modules-4.19.0-8-parisc-di +Package: usb-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-parisc-di +Package: usb-storage-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-parisc-di, scsi-core-modules-4.19.0-8-parisc-di, usb-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, scsi-core-modules-4.19.0-9-parisc-di, usb-modules-4.19.0-9-parisc-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: input-modules-4.19.0-8-parisc-di +Package: input-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-parisc-di, usb-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, usb-modules-4.19.0-9-parisc-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: event-modules-4.19.0-8-parisc-di +Package: event-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: mouse-modules-4.19.0-8-parisc-di +Package: mouse-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-parisc-di, event-modules-4.19.0-8-parisc-di, input-modules-4.19.0-8-parisc-di, usb-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, event-modules-4.19.0-9-parisc-di, input-modules-4.19.0-9-parisc-di, usb-modules-4.19.0-9-parisc-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-parisc-di +Package: nic-usb-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-parisc-di, nic-shared-modules-4.19.0-8-parisc-di, usb-modules-4.19.0-8-parisc-di, crc-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, nic-shared-modules-4.19.0-9-parisc-di, usb-modules-4.19.0-9-parisc-di, crc-modules-4.19.0-9-parisc-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: sata-modules-4.19.0-8-parisc-di +Package: sata-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-parisc-di, scsi-core-modules-4.19.0-8-parisc-di, ata-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, scsi-core-modules-4.19.0-9-parisc-di, ata-modules-4.19.0-9-parisc-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: crc-modules-4.19.0-8-parisc-di +Package: crc-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: crypto-modules-4.19.0-8-parisc-di +Package: crypto-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-parisc-di +Package: crypto-dm-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-parisc-di, md-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, md-modules-4.19.0-9-parisc-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: ata-modules-4.19.0-8-parisc-di +Package: ata-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-parisc-di, scsi-core-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, scsi-core-modules-4.19.0-9-parisc-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: nbd-modules-4.19.0-8-parisc-di +Package: nbd-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: squashfs-modules-4.19.0-8-parisc-di +Package: squashfs-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-parisc-di, compress-modules-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di, compress-modules-4.19.0-9-parisc-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: zlib-modules-4.19.0-8-parisc-di +Package: zlib-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: compress-modules-4.19.0-8-parisc-di +Package: compress-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: fuse-modules-4.19.0-8-parisc-di +Package: fuse-modules-4.19.0-9-parisc-di Architecture: hppa Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-parisc-di +Depends: kernel-image-4.19.0-9-parisc-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc +Kernel-Version: 4.19.0-9-parisc Package-Type: udeb -Package: kernel-image-4.19.0-8-parisc64-smp-di +Package: kernel-image-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard @@ -3829,437 +3829,437 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: nic-modules-4.19.0-8-parisc64-smp-di +Package: nic-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, nic-shared-modules-4.19.0-8-parisc64-smp-di, crc-modules-4.19.0-8-parisc64-smp-di, zlib-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, nic-shared-modules-4.19.0-9-parisc64-smp-di, crc-modules-4.19.0-9-parisc64-smp-di, zlib-modules-4.19.0-9-parisc64-smp-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-parisc64-smp-di +Package: nic-shared-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: serial-modules-4.19.0-8-parisc64-smp-di +Package: serial-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-parisc64-smp-di +Package: usb-serial-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, usb-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, usb-modules-4.19.0-9-parisc64-smp-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: ppp-modules-4.19.0-8-parisc64-smp-di +Package: ppp-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, serial-modules-4.19.0-8-parisc64-smp-di, zlib-modules-4.19.0-8-parisc64-smp-di, crc-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, serial-modules-4.19.0-9-parisc64-smp-di, zlib-modules-4.19.0-9-parisc64-smp-di, crc-modules-4.19.0-9-parisc64-smp-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: pata-modules-4.19.0-8-parisc64-smp-di +Package: pata-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, ata-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, ata-modules-4.19.0-9-parisc64-smp-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-parisc64-smp-di +Package: cdrom-core-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, scsi-core-modules-4.19.0-8-parisc64-smp-di, isofs-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, scsi-core-modules-4.19.0-9-parisc64-smp-di, isofs-modules-4.19.0-9-parisc64-smp-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-parisc64-smp-di +Package: scsi-core-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: scsi-modules-4.19.0-8-parisc64-smp-di +Package: scsi-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, scsi-core-modules-4.19.0-8-parisc64-smp-di, cdrom-core-modules-4.19.0-8-parisc64-smp-di, ata-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, scsi-core-modules-4.19.0-9-parisc64-smp-di, cdrom-core-modules-4.19.0-9-parisc64-smp-di, ata-modules-4.19.0-9-parisc64-smp-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: loop-modules-4.19.0-8-parisc64-smp-di +Package: loop-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: btrfs-modules-4.19.0-8-parisc64-smp-di +Package: btrfs-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, crc-modules-4.19.0-8-parisc64-smp-di, zlib-modules-4.19.0-8-parisc64-smp-di, compress-modules-4.19.0-8-parisc64-smp-di, md-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, crc-modules-4.19.0-9-parisc64-smp-di, zlib-modules-4.19.0-9-parisc64-smp-di, compress-modules-4.19.0-9-parisc64-smp-di, md-modules-4.19.0-9-parisc64-smp-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: ext4-modules-4.19.0-8-parisc64-smp-di +Package: ext4-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, crc-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, crc-modules-4.19.0-9-parisc64-smp-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: isofs-modules-4.19.0-8-parisc64-smp-di +Package: isofs-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: jfs-modules-4.19.0-8-parisc64-smp-di +Package: jfs-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: xfs-modules-4.19.0-8-parisc64-smp-di +Package: xfs-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, crc-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, crc-modules-4.19.0-9-parisc64-smp-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: fat-modules-4.19.0-8-parisc64-smp-di +Package: fat-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: md-modules-4.19.0-8-parisc64-smp-di +Package: md-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, crc-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, crc-modules-4.19.0-9-parisc64-smp-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: multipath-modules-4.19.0-8-parisc64-smp-di +Package: multipath-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, md-modules-4.19.0-8-parisc64-smp-di, scsi-core-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, md-modules-4.19.0-9-parisc64-smp-di, scsi-core-modules-4.19.0-9-parisc64-smp-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: usb-modules-4.19.0-8-parisc64-smp-di +Package: usb-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-parisc64-smp-di +Package: usb-storage-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, scsi-core-modules-4.19.0-8-parisc64-smp-di, usb-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, scsi-core-modules-4.19.0-9-parisc64-smp-di, usb-modules-4.19.0-9-parisc64-smp-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: fb-modules-4.19.0-8-parisc64-smp-di +Package: fb-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: fb-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: input-modules-4.19.0-8-parisc64-smp-di +Package: input-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, usb-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, usb-modules-4.19.0-9-parisc64-smp-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: event-modules-4.19.0-8-parisc64-smp-di +Package: event-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: mouse-modules-4.19.0-8-parisc64-smp-di +Package: mouse-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, event-modules-4.19.0-8-parisc64-smp-di, input-modules-4.19.0-8-parisc64-smp-di, usb-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, event-modules-4.19.0-9-parisc64-smp-di, input-modules-4.19.0-9-parisc64-smp-di, usb-modules-4.19.0-9-parisc64-smp-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-parisc64-smp-di +Package: nic-usb-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, nic-shared-modules-4.19.0-8-parisc64-smp-di, usb-modules-4.19.0-8-parisc64-smp-di, crc-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, nic-shared-modules-4.19.0-9-parisc64-smp-di, usb-modules-4.19.0-9-parisc64-smp-di, crc-modules-4.19.0-9-parisc64-smp-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: sata-modules-4.19.0-8-parisc64-smp-di +Package: sata-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, scsi-core-modules-4.19.0-8-parisc64-smp-di, ata-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, scsi-core-modules-4.19.0-9-parisc64-smp-di, ata-modules-4.19.0-9-parisc64-smp-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: crc-modules-4.19.0-8-parisc64-smp-di +Package: crc-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: crypto-modules-4.19.0-8-parisc64-smp-di +Package: crypto-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-parisc64-smp-di +Package: crypto-dm-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, md-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, md-modules-4.19.0-9-parisc64-smp-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: ata-modules-4.19.0-8-parisc64-smp-di +Package: ata-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, scsi-core-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, scsi-core-modules-4.19.0-9-parisc64-smp-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: nbd-modules-4.19.0-8-parisc64-smp-di +Package: nbd-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: squashfs-modules-4.19.0-8-parisc64-smp-di +Package: squashfs-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di, compress-modules-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di, compress-modules-4.19.0-9-parisc64-smp-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: zlib-modules-4.19.0-8-parisc64-smp-di +Package: zlib-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: compress-modules-4.19.0-8-parisc64-smp-di +Package: compress-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: fuse-modules-4.19.0-8-parisc64-smp-di +Package: fuse-modules-4.19.0-9-parisc64-smp-di Architecture: hppa Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-parisc64-smp-di +Depends: kernel-image-4.19.0-9-parisc64-smp-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-parisc64-smp +Kernel-Version: 4.19.0-9-parisc64-smp Package-Type: udeb -Package: linux-image-4.19.0-8-parisc +Package: linux-image-4.19.0-9-parisc Architecture: hppa -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [hppa] | linux-initramfs-tool [hppa] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [hppa] | linux-initramfs-tool [hppa] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [hppa] Suggests: linux-doc-4.19, debian-kernel-handbook, palo [hppa] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -4268,21 +4268,21 @@ with max 4 GB RAM. Build-Profiles: -Package: linux-headers-4.19.0-8-parisc +Package: linux-headers-4.19.0-9-parisc Architecture: hppa -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8, binutils-hppa64-linux-gnu, gcc-8-hppa64-linux-gnu -Description: Header files for Linux 4.19.0-8-parisc +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8, binutils-hppa64-linux-gnu, gcc-8-hppa64-linux-gnu +Description: Header files for Linux 4.19.0-9-parisc This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-parisc, generally used for building out-of-tree + Linux kernel 4.19.0-9-parisc, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-parisc, and can be used for building + /usr/src/linux-headers-4.19.0-9-parisc, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-parisc package. + linux-image-4.19.0-9-parisc package. Build-Profiles: -Package: linux-image-4.19.0-8-parisc-smp +Package: linux-image-4.19.0-9-parisc-smp Architecture: hppa -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [hppa] | linux-initramfs-tool [hppa] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [hppa] | linux-initramfs-tool [hppa] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [hppa] Suggests: linux-doc-4.19, debian-kernel-handbook, palo [hppa] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -4291,21 +4291,21 @@ with max 4 GB RAM. Build-Profiles: -Package: linux-headers-4.19.0-8-parisc-smp +Package: linux-headers-4.19.0-9-parisc-smp Architecture: hppa -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8, binutils-hppa64-linux-gnu, gcc-8-hppa64-linux-gnu -Description: Header files for Linux 4.19.0-8-parisc-smp +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8, binutils-hppa64-linux-gnu, gcc-8-hppa64-linux-gnu +Description: Header files for Linux 4.19.0-9-parisc-smp This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-parisc-smp, generally used for building out-of-tree + Linux kernel 4.19.0-9-parisc-smp, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-parisc-smp, and can be used for building + /usr/src/linux-headers-4.19.0-9-parisc-smp, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-parisc-smp package. + linux-image-4.19.0-9-parisc-smp package. Build-Profiles: -Package: linux-image-4.19.0-8-parisc64-smp +Package: linux-image-4.19.0-9-parisc64-smp Architecture: hppa -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [hppa] | linux-initramfs-tool [hppa] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [hppa] | linux-initramfs-tool [hppa] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [hppa] Suggests: linux-doc-4.19, debian-kernel-handbook, palo [hppa] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -4314,28 +4314,28 @@ with support for more than 4 GB RAM. Build-Profiles: -Package: linux-headers-4.19.0-8-parisc64-smp +Package: linux-headers-4.19.0-9-parisc64-smp Architecture: hppa -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8, binutils-hppa64-linux-gnu, gcc-8-hppa64-linux-gnu -Description: Header files for Linux 4.19.0-8-parisc64-smp +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8, binutils-hppa64-linux-gnu, gcc-8-hppa64-linux-gnu +Description: Header files for Linux 4.19.0-9-parisc64-smp This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-parisc64-smp, generally used for building + Linux kernel 4.19.0-9-parisc64-smp, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-parisc64-smp, and can be used for building + /usr/src/linux-headers-4.19.0-9-parisc64-smp, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-parisc64-smp package. + linux-image-4.19.0-9-parisc64-smp package. Build-Profiles: -Package: linux-headers-4.19.0-8-all-i386 +Package: linux-headers-4.19.0-9-all-i386 Architecture: i386 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-686 (= ${binary:Version}), linux-headers-4.19.0-8-686-pae (= ${binary:Version}), linux-headers-4.19.0-8-rt-686-pae (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-686 (= ${binary:Version}), linux-headers-4.19.0-9-686-pae (= ${binary:Version}), linux-headers-4.19.0-9-rt-686-pae (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-686-di +Package: kernel-image-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard @@ -4345,617 +4345,617 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: nic-modules-4.19.0-8-686-di +Package: nic-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-686-di, nic-shared-modules-4.19.0-8-686-di, i2c-modules-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di, mtd-core-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, nic-shared-modules-4.19.0-9-686-di, i2c-modules-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di, mtd-core-modules-4.19.0-9-686-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-686-di +Package: nic-wireless-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-686-di, nic-shared-modules-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di, mmc-core-modules-4.19.0-8-686-di, pcmcia-modules-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, nic-shared-modules-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di, mmc-core-modules-4.19.0-9-686-di, pcmcia-modules-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-686-di +Package: nic-shared-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: serial-modules-4.19.0-8-686-di +Package: serial-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-686-di, pcmcia-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, pcmcia-modules-4.19.0-9-686-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-686-di +Package: usb-serial-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: ppp-modules-4.19.0-8-686-di +Package: ppp-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-686-di, serial-modules-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, serial-modules-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: pata-modules-4.19.0-8-686-di +Package: pata-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-686-di, ata-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, ata-modules-4.19.0-9-686-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-686-di +Package: cdrom-core-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-686-di, scsi-core-modules-4.19.0-8-686-di, isofs-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, scsi-core-modules-4.19.0-9-686-di, isofs-modules-4.19.0-9-686-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-686-di +Package: firewire-core-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-686-di, scsi-core-modules-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, scsi-core-modules-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-686-di +Package: scsi-core-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: scsi-modules-4.19.0-8-686-di +Package: scsi-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-686-di, scsi-core-modules-4.19.0-8-686-di, cdrom-core-modules-4.19.0-8-686-di, ata-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, scsi-core-modules-4.19.0-9-686-di, cdrom-core-modules-4.19.0-9-686-di, ata-modules-4.19.0-9-686-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-686-di +Package: scsi-nic-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-686-di, nic-modules-4.19.0-8-686-di +Depends: scsi-modules-4.19.0-9-686-di, nic-modules-4.19.0-9-686-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: loop-modules-4.19.0-8-686-di +Package: loop-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-686-di +Package: btrfs-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di, compress-modules-4.19.0-8-686-di, md-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di, compress-modules-4.19.0-9-686-di, md-modules-4.19.0-9-686-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: ext4-modules-4.19.0-8-686-di +Package: ext4-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: isofs-modules-4.19.0-8-686-di +Package: isofs-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: jfs-modules-4.19.0-8-686-di +Package: jfs-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: xfs-modules-4.19.0-8-686-di +Package: xfs-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: fat-modules-4.19.0-8-686-di +Package: fat-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: fat-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: md-modules-4.19.0-8-686-di +Package: md-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: multipath-modules-4.19.0-8-686-di +Package: multipath-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-686-di, md-modules-4.19.0-8-686-di, scsi-core-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, md-modules-4.19.0-9-686-di, scsi-core-modules-4.19.0-9-686-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: usb-modules-4.19.0-8-686-di +Package: usb-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-686-di +Package: usb-storage-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-686-di, scsi-core-modules-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, scsi-core-modules-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: pcmcia-storage-modules-4.19.0-8-686-di +Package: pcmcia-storage-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: pcmcia-storage-modules -Depends: kernel-image-4.19.0-8-686-di, cdrom-core-modules-4.19.0-8-686-di, pcmcia-modules-4.19.0-8-686-di, ata-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, cdrom-core-modules-4.19.0-9-686-di, pcmcia-modules-4.19.0-9-686-di, ata-modules-4.19.0-9-686-di Description: PCMCIA storage drivers This package contains PCMCIA storage drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: fb-modules-4.19.0-8-686-di +Package: fb-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-686-di, i2c-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, i2c-modules-4.19.0-9-686-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: input-modules-4.19.0-8-686-di +Package: input-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di, i2c-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di, i2c-modules-4.19.0-9-686-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: event-modules-4.19.0-8-686-di +Package: event-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: mouse-modules-4.19.0-8-686-di +Package: mouse-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-686-di, event-modules-4.19.0-8-686-di, input-modules-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, event-modules-4.19.0-9-686-di, input-modules-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: nic-pcmcia-modules-4.19.0-8-686-di +Package: nic-pcmcia-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-pcmcia-modules -Depends: kernel-image-4.19.0-8-686-di, nic-shared-modules-4.19.0-8-686-di, nic-wireless-modules-4.19.0-8-686-di, pcmcia-modules-4.19.0-8-686-di, mmc-core-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, nic-shared-modules-4.19.0-9-686-di, nic-wireless-modules-4.19.0-9-686-di, pcmcia-modules-4.19.0-9-686-di, mmc-core-modules-4.19.0-9-686-di Description: Common PCMCIA NIC drivers This package contains common PCMCIA NIC drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: pcmcia-modules-4.19.0-8-686-di +Package: pcmcia-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: pcmcia-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: Common PCMCIA drivers This package contains common PCMCIA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-686-di +Package: nic-usb-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-686-di, nic-shared-modules-4.19.0-8-686-di, nic-wireless-modules-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, nic-shared-modules-4.19.0-9-686-di, nic-wireless-modules-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: sata-modules-4.19.0-8-686-di +Package: sata-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-686-di, scsi-core-modules-4.19.0-8-686-di, ata-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, scsi-core-modules-4.19.0-9-686-di, ata-modules-4.19.0-9-686-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: acpi-modules-4.19.0-8-686-di +Package: acpi-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: acpi-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: ACPI support modules This package contains kernel modules for ACPI. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: i2c-modules-4.19.0-8-686-di +Package: i2c-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: crc-modules-4.19.0-8-686-di +Package: crc-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: crypto-modules-4.19.0-8-686-di +Package: crypto-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-686-di +Package: crypto-dm-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-686-di, md-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, md-modules-4.19.0-9-686-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: efi-modules-4.19.0-8-686-di +Package: efi-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: efi-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: EFI modules This package contains EFI modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: ata-modules-4.19.0-8-686-di +Package: ata-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-686-di, scsi-core-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, scsi-core-modules-4.19.0-9-686-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-686-di +Package: mmc-core-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: mmc-modules-4.19.0-8-686-di +Package: mmc-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-686-di, mmc-core-modules-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, mmc-core-modules-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: nbd-modules-4.19.0-8-686-di +Package: nbd-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-686-di +Package: squashfs-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-686-di, compress-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, compress-modules-4.19.0-9-686-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: speakup-modules-4.19.0-8-686-di +Package: speakup-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: speakup-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: speakup modules This package contains speakup modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: uinput-modules-4.19.0-8-686-di +Package: uinput-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: sound-modules-4.19.0-8-686-di +Package: sound-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-686-di, i2c-modules-4.19.0-8-686-di, usb-modules-4.19.0-8-686-di, pcmcia-modules-4.19.0-8-686-di, firewire-core-modules-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, i2c-modules-4.19.0-9-686-di, usb-modules-4.19.0-9-686-di, pcmcia-modules-4.19.0-9-686-di, firewire-core-modules-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: compress-modules-4.19.0-8-686-di +Package: compress-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: udf-modules-4.19.0-8-686-di +Package: udf-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-686-di, crc-modules-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di, crc-modules-4.19.0-9-686-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: fuse-modules-4.19.0-8-686-di +Package: fuse-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-686-di +Package: mtd-core-modules-4.19.0-9-686-di Architecture: i386 Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-686-di +Depends: kernel-image-4.19.0-9-686-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-686 +Kernel-Version: 4.19.0-9-686 Package-Type: udeb -Package: kernel-image-4.19.0-8-686-pae-di +Package: kernel-image-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard @@ -4965,614 +4965,614 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: nic-modules-4.19.0-8-686-pae-di +Package: nic-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-686-pae-di, nic-shared-modules-4.19.0-8-686-pae-di, i2c-modules-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di, mtd-core-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, nic-shared-modules-4.19.0-9-686-pae-di, i2c-modules-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di, mtd-core-modules-4.19.0-9-686-pae-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-686-pae-di +Package: nic-wireless-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-686-pae-di, nic-shared-modules-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di, mmc-core-modules-4.19.0-8-686-pae-di, pcmcia-modules-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, nic-shared-modules-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di, mmc-core-modules-4.19.0-9-686-pae-di, pcmcia-modules-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-686-pae-di +Package: nic-shared-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: serial-modules-4.19.0-8-686-pae-di +Package: serial-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-686-pae-di, pcmcia-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, pcmcia-modules-4.19.0-9-686-pae-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-686-pae-di +Package: usb-serial-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: ppp-modules-4.19.0-8-686-pae-di +Package: ppp-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-686-pae-di, serial-modules-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, serial-modules-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: pata-modules-4.19.0-8-686-pae-di +Package: pata-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-686-pae-di, ata-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, ata-modules-4.19.0-9-686-pae-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-686-pae-di +Package: cdrom-core-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-686-pae-di, scsi-core-modules-4.19.0-8-686-pae-di, isofs-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, scsi-core-modules-4.19.0-9-686-pae-di, isofs-modules-4.19.0-9-686-pae-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-686-pae-di +Package: firewire-core-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-686-pae-di, scsi-core-modules-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, scsi-core-modules-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-686-pae-di +Package: scsi-core-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: scsi-modules-4.19.0-8-686-pae-di +Package: scsi-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-686-pae-di, scsi-core-modules-4.19.0-8-686-pae-di, cdrom-core-modules-4.19.0-8-686-pae-di, ata-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, scsi-core-modules-4.19.0-9-686-pae-di, cdrom-core-modules-4.19.0-9-686-pae-di, ata-modules-4.19.0-9-686-pae-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-686-pae-di +Package: scsi-nic-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-686-pae-di, nic-modules-4.19.0-8-686-pae-di +Depends: scsi-modules-4.19.0-9-686-pae-di, nic-modules-4.19.0-9-686-pae-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: loop-modules-4.19.0-8-686-pae-di +Package: loop-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: btrfs-modules-4.19.0-8-686-pae-di +Package: btrfs-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di, compress-modules-4.19.0-8-686-pae-di, md-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di, compress-modules-4.19.0-9-686-pae-di, md-modules-4.19.0-9-686-pae-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: ext4-modules-4.19.0-8-686-pae-di +Package: ext4-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: isofs-modules-4.19.0-8-686-pae-di +Package: isofs-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: jfs-modules-4.19.0-8-686-pae-di +Package: jfs-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: xfs-modules-4.19.0-8-686-pae-di +Package: xfs-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: fat-modules-4.19.0-8-686-pae-di +Package: fat-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: fat-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: md-modules-4.19.0-8-686-pae-di +Package: md-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: multipath-modules-4.19.0-8-686-pae-di +Package: multipath-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-686-pae-di, md-modules-4.19.0-8-686-pae-di, scsi-core-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, md-modules-4.19.0-9-686-pae-di, scsi-core-modules-4.19.0-9-686-pae-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: usb-modules-4.19.0-8-686-pae-di +Package: usb-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-686-pae-di +Package: usb-storage-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-686-pae-di, scsi-core-modules-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, scsi-core-modules-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: pcmcia-storage-modules-4.19.0-8-686-pae-di +Package: pcmcia-storage-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: pcmcia-storage-modules -Depends: kernel-image-4.19.0-8-686-pae-di, cdrom-core-modules-4.19.0-8-686-pae-di, pcmcia-modules-4.19.0-8-686-pae-di, ata-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, cdrom-core-modules-4.19.0-9-686-pae-di, pcmcia-modules-4.19.0-9-686-pae-di, ata-modules-4.19.0-9-686-pae-di Description: PCMCIA storage drivers This package contains PCMCIA storage drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: fb-modules-4.19.0-8-686-pae-di +Package: fb-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-686-pae-di, i2c-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, i2c-modules-4.19.0-9-686-pae-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: input-modules-4.19.0-8-686-pae-di +Package: input-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di, i2c-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di, i2c-modules-4.19.0-9-686-pae-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: event-modules-4.19.0-8-686-pae-di +Package: event-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: mouse-modules-4.19.0-8-686-pae-di +Package: mouse-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-686-pae-di, event-modules-4.19.0-8-686-pae-di, input-modules-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, event-modules-4.19.0-9-686-pae-di, input-modules-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: nic-pcmcia-modules-4.19.0-8-686-pae-di +Package: nic-pcmcia-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-pcmcia-modules -Depends: kernel-image-4.19.0-8-686-pae-di, nic-shared-modules-4.19.0-8-686-pae-di, nic-wireless-modules-4.19.0-8-686-pae-di, pcmcia-modules-4.19.0-8-686-pae-di, mmc-core-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, nic-shared-modules-4.19.0-9-686-pae-di, nic-wireless-modules-4.19.0-9-686-pae-di, pcmcia-modules-4.19.0-9-686-pae-di, mmc-core-modules-4.19.0-9-686-pae-di Description: Common PCMCIA NIC drivers This package contains common PCMCIA NIC drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: pcmcia-modules-4.19.0-8-686-pae-di +Package: pcmcia-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: pcmcia-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: Common PCMCIA drivers This package contains common PCMCIA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-686-pae-di +Package: nic-usb-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-686-pae-di, nic-shared-modules-4.19.0-8-686-pae-di, nic-wireless-modules-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, nic-shared-modules-4.19.0-9-686-pae-di, nic-wireless-modules-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: sata-modules-4.19.0-8-686-pae-di +Package: sata-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-686-pae-di, scsi-core-modules-4.19.0-8-686-pae-di, ata-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, scsi-core-modules-4.19.0-9-686-pae-di, ata-modules-4.19.0-9-686-pae-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: acpi-modules-4.19.0-8-686-pae-di +Package: acpi-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: acpi-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: ACPI support modules This package contains kernel modules for ACPI. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: i2c-modules-4.19.0-8-686-pae-di +Package: i2c-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: crc-modules-4.19.0-8-686-pae-di +Package: crc-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: crypto-modules-4.19.0-8-686-pae-di +Package: crypto-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-686-pae-di +Package: crypto-dm-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-686-pae-di, md-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, md-modules-4.19.0-9-686-pae-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: efi-modules-4.19.0-8-686-pae-di +Package: efi-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: efi-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: EFI modules This package contains EFI modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: ata-modules-4.19.0-8-686-pae-di +Package: ata-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-686-pae-di, scsi-core-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, scsi-core-modules-4.19.0-9-686-pae-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-686-pae-di +Package: mmc-core-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: mmc-modules-4.19.0-8-686-pae-di +Package: mmc-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-686-pae-di, mmc-core-modules-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, mmc-core-modules-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: nbd-modules-4.19.0-8-686-pae-di +Package: nbd-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: squashfs-modules-4.19.0-8-686-pae-di +Package: squashfs-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-686-pae-di, compress-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, compress-modules-4.19.0-9-686-pae-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: speakup-modules-4.19.0-8-686-pae-di +Package: speakup-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: speakup-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: speakup modules This package contains speakup modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: uinput-modules-4.19.0-8-686-pae-di +Package: uinput-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: sound-modules-4.19.0-8-686-pae-di +Package: sound-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-686-pae-di, i2c-modules-4.19.0-8-686-pae-di, usb-modules-4.19.0-8-686-pae-di, pcmcia-modules-4.19.0-8-686-pae-di, firewire-core-modules-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, i2c-modules-4.19.0-9-686-pae-di, usb-modules-4.19.0-9-686-pae-di, pcmcia-modules-4.19.0-9-686-pae-di, firewire-core-modules-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: compress-modules-4.19.0-8-686-pae-di +Package: compress-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: udf-modules-4.19.0-8-686-pae-di +Package: udf-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-686-pae-di, crc-modules-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di, crc-modules-4.19.0-9-686-pae-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: fuse-modules-4.19.0-8-686-pae-di +Package: fuse-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-686-pae-di +Package: mtd-core-modules-4.19.0-9-686-pae-di Architecture: i386 Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-686-pae-di +Depends: kernel-image-4.19.0-9-686-pae-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-686-pae +Kernel-Version: 4.19.0-9-686-pae Package-Type: udeb Package: linux-image-i386-signed-template @@ -5583,49 +5583,49 @@ service. Build-Profiles: -Package: linux-image-4.19.0-8-686-unsigned +Package: linux-image-4.19.0-9-686-unsigned Architecture: i386 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [i386] | linux-initramfs-tool [i386] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [i386] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-pc [i386] | grub-efi-ia32 [i386] | extlinux [i386] -Replaces: linux-image-4.19.0-8-686 +Replaces: linux-image-4.19.0-9-686 Breaks: xserver-xorg-input-vmmouse (<< 1:13.0.99) [i386], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-686 +Conflicts: linux-image-4.19.0-9-686 Description: Linux 4.19 for older PCs The Linux kernel 4.19 and modules for use on PCs with one or more processors not supporting PAE. Build-Profiles: -Package: linux-headers-4.19.0-8-686 +Package: linux-headers-4.19.0-9-686 Architecture: i386 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 -Description: Header files for Linux 4.19.0-8-686 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 +Description: Header files for Linux 4.19.0-9-686 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-686, generally used for building out-of-tree kernel + Linux kernel 4.19.0-9-686, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-686, and can be used for building modules - that load into the kernel provided by the linux-image-4.19.0-8-686 + /usr/src/linux-headers-4.19.0-9-686, and can be used for building modules + that load into the kernel provided by the linux-image-4.19.0-9-686 package. Build-Profiles: -Package: linux-image-4.19.0-8-686-dbg +Package: linux-image-4.19.0-9-686-dbg Architecture: i386 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-686 +Description: Debug symbols for linux-image-4.19.0-9-686 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-686. + modules in linux-image-4.19.0-9-686. Build-Profiles: -Package: linux-image-4.19.0-8-686-pae-unsigned +Package: linux-image-4.19.0-9-686-pae-unsigned Architecture: i386 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [i386] | linux-initramfs-tool [i386] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [i386] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-pc [i386] | grub-efi-ia32 [i386] | extlinux [i386] -Replaces: linux-image-4.19.0-8-686-pae +Replaces: linux-image-4.19.0-9-686-pae Breaks: xserver-xorg-input-vmmouse (<< 1:13.0.99) [i386], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-686-pae +Conflicts: linux-image-4.19.0-9-686-pae Description: Linux 4.19 for modern PCs The Linux kernel 4.19 and modules for use on PCs with one or more processors supporting PAE. @@ -5636,36 +5636,36 @@ Transmeta Efficeon; VIA C7; and some other processors. Build-Profiles: -Package: linux-headers-4.19.0-8-686-pae +Package: linux-headers-4.19.0-9-686-pae Architecture: i386 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 -Description: Header files for Linux 4.19.0-8-686-pae +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 +Description: Header files for Linux 4.19.0-9-686-pae This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-686-pae, generally used for building out-of-tree + Linux kernel 4.19.0-9-686-pae, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-686-pae, and can be used for building + /usr/src/linux-headers-4.19.0-9-686-pae, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-686-pae package. + linux-image-4.19.0-9-686-pae package. Build-Profiles: -Package: linux-image-4.19.0-8-686-pae-dbg +Package: linux-image-4.19.0-9-686-pae-dbg Architecture: i386 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-686-pae +Description: Debug symbols for linux-image-4.19.0-9-686-pae This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-686-pae. + modules in linux-image-4.19.0-9-686-pae. Build-Profiles: -Package: linux-image-4.19.0-8-rt-686-pae-unsigned +Package: linux-image-4.19.0-9-rt-686-pae-unsigned Architecture: i386 Depends: kmod, linux-base (>= 4.3~), ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [i386] | linux-initramfs-tool [i386] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [i386] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-pc [i386] | grub-efi-ia32 [i386] | extlinux [i386] -Replaces: linux-image-4.19.0-8-rt-686-pae +Replaces: linux-image-4.19.0-9-rt-686-pae Breaks: xserver-xorg-input-vmmouse (<< 1:13.0.99) [i386], initramfs-tools (<< 0.120+deb8u2) -Conflicts: linux-image-4.19.0-8-rt-686-pae +Conflicts: linux-image-4.19.0-9-rt-686-pae Description: Linux 4.19 for modern PCs, PREEMPT_RT The Linux kernel 4.19 and modules for use on PCs with one or more processors supporting PAE. @@ -5678,38 +5678,38 @@ This kernel includes the PREEMPT_RT realtime patch set. Build-Profiles: -Package: linux-headers-4.19.0-8-rt-686-pae +Package: linux-headers-4.19.0-9-rt-686-pae Architecture: i386 -Depends: linux-headers-4.19.0-8-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 -Description: Header files for Linux 4.19.0-8-rt-686-pae +Depends: linux-headers-4.19.0-9-common-rt (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-x86 +Description: Header files for Linux 4.19.0-9-rt-686-pae This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-rt-686-pae, generally used for building out-of-tree + Linux kernel 4.19.0-9-rt-686-pae, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-rt-686-pae, and can be used for building + /usr/src/linux-headers-4.19.0-9-rt-686-pae, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-rt-686-pae package. + linux-image-4.19.0-9-rt-686-pae package. Build-Profiles: -Package: linux-image-4.19.0-8-rt-686-pae-dbg +Package: linux-image-4.19.0-9-rt-686-pae-dbg Architecture: i386 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-rt-686-pae +Description: Debug symbols for linux-image-4.19.0-9-rt-686-pae This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-rt-686-pae. + modules in linux-image-4.19.0-9-rt-686-pae. Build-Profiles: -Package: linux-headers-4.19.0-8-all-ia64 +Package: linux-headers-4.19.0-9-all-ia64 Architecture: ia64 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-itanium (= ${binary:Version}), linux-headers-4.19.0-8-mckinley (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-itanium (= ${binary:Version}), linux-headers-4.19.0-9-mckinley (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-itanium-di +Package: kernel-image-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard @@ -5719,545 +5719,545 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: nic-modules-4.19.0-8-itanium-di +Package: nic-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-itanium-di, nic-shared-modules-4.19.0-8-itanium-di, i2c-modules-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di, mtd-core-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, nic-shared-modules-4.19.0-9-itanium-di, i2c-modules-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di, mtd-core-modules-4.19.0-9-itanium-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-itanium-di +Package: nic-shared-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: serial-modules-4.19.0-8-itanium-di +Package: serial-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-itanium-di, pcmcia-modules-4.19.0-8-itanium-di, sn-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, pcmcia-modules-4.19.0-9-itanium-di, sn-modules-4.19.0-9-itanium-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-itanium-di +Package: usb-serial-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-itanium-di, usb-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, usb-modules-4.19.0-9-itanium-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: ppp-modules-4.19.0-8-itanium-di +Package: ppp-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-itanium-di, serial-modules-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, serial-modules-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: pata-modules-4.19.0-8-itanium-di +Package: pata-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-itanium-di, ata-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, ata-modules-4.19.0-9-itanium-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-itanium-di +Package: cdrom-core-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-itanium-di, scsi-core-modules-4.19.0-8-itanium-di, ide-modules-4.19.0-8-itanium-di, isofs-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, scsi-core-modules-4.19.0-9-itanium-di, ide-modules-4.19.0-9-itanium-di, isofs-modules-4.19.0-9-itanium-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-itanium-di +Package: firewire-core-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-itanium-di, scsi-core-modules-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, scsi-core-modules-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-itanium-di +Package: scsi-core-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: scsi-modules-4.19.0-8-itanium-di +Package: scsi-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-itanium-di, scsi-core-modules-4.19.0-8-itanium-di, cdrom-core-modules-4.19.0-8-itanium-di, ata-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, scsi-core-modules-4.19.0-9-itanium-di, cdrom-core-modules-4.19.0-9-itanium-di, ata-modules-4.19.0-9-itanium-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-itanium-di +Package: scsi-nic-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-itanium-di, nic-modules-4.19.0-8-itanium-di +Depends: scsi-modules-4.19.0-9-itanium-di, nic-modules-4.19.0-9-itanium-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: loop-modules-4.19.0-8-itanium-di +Package: loop-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: btrfs-modules-4.19.0-8-itanium-di +Package: btrfs-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di, compress-modules-4.19.0-8-itanium-di, md-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di, compress-modules-4.19.0-9-itanium-di, md-modules-4.19.0-9-itanium-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: ext4-modules-4.19.0-8-itanium-di +Package: ext4-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: isofs-modules-4.19.0-8-itanium-di +Package: isofs-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: jfs-modules-4.19.0-8-itanium-di +Package: jfs-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: xfs-modules-4.19.0-8-itanium-di +Package: xfs-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: fat-modules-4.19.0-8-itanium-di +Package: fat-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: fat-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: md-modules-4.19.0-8-itanium-di +Package: md-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: multipath-modules-4.19.0-8-itanium-di +Package: multipath-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-itanium-di, md-modules-4.19.0-8-itanium-di, scsi-core-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, md-modules-4.19.0-9-itanium-di, scsi-core-modules-4.19.0-9-itanium-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: usb-modules-4.19.0-8-itanium-di +Package: usb-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-itanium-di +Package: usb-storage-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-itanium-di, scsi-core-modules-4.19.0-8-itanium-di, usb-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, scsi-core-modules-4.19.0-9-itanium-di, usb-modules-4.19.0-9-itanium-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: fb-modules-4.19.0-8-itanium-di +Package: fb-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-itanium-di, i2c-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, i2c-modules-4.19.0-9-itanium-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: input-modules-4.19.0-8-itanium-di +Package: input-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-itanium-di, usb-modules-4.19.0-8-itanium-di, i2c-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, usb-modules-4.19.0-9-itanium-di, i2c-modules-4.19.0-9-itanium-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: event-modules-4.19.0-8-itanium-di +Package: event-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: mouse-modules-4.19.0-8-itanium-di +Package: mouse-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-itanium-di, event-modules-4.19.0-8-itanium-di, input-modules-4.19.0-8-itanium-di, usb-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, event-modules-4.19.0-9-itanium-di, input-modules-4.19.0-9-itanium-di, usb-modules-4.19.0-9-itanium-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: pcmcia-modules-4.19.0-8-itanium-di +Package: pcmcia-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: pcmcia-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: Common PCMCIA drivers This package contains common PCMCIA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-itanium-di +Package: nic-usb-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-itanium-di, nic-shared-modules-4.19.0-8-itanium-di, usb-modules-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, nic-shared-modules-4.19.0-9-itanium-di, usb-modules-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: sata-modules-4.19.0-8-itanium-di +Package: sata-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-itanium-di, scsi-core-modules-4.19.0-8-itanium-di, ata-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, scsi-core-modules-4.19.0-9-itanium-di, ata-modules-4.19.0-9-itanium-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: i2c-modules-4.19.0-8-itanium-di +Package: i2c-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: crc-modules-4.19.0-8-itanium-di +Package: crc-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: crypto-modules-4.19.0-8-itanium-di +Package: crypto-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-itanium-di +Package: crypto-dm-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-itanium-di, md-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, md-modules-4.19.0-9-itanium-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: ata-modules-4.19.0-8-itanium-di +Package: ata-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-itanium-di, scsi-core-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, scsi-core-modules-4.19.0-9-itanium-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: nbd-modules-4.19.0-8-itanium-di +Package: nbd-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: squashfs-modules-4.19.0-8-itanium-di +Package: squashfs-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-itanium-di, compress-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, compress-modules-4.19.0-9-itanium-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: uinput-modules-4.19.0-8-itanium-di +Package: uinput-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: compress-modules-4.19.0-8-itanium-di +Package: compress-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: udf-modules-4.19.0-8-itanium-di +Package: udf-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-itanium-di, crc-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, crc-modules-4.19.0-9-itanium-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: fuse-modules-4.19.0-8-itanium-di +Package: fuse-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-itanium-di +Package: mtd-core-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: ide-core-modules-4.19.0-8-itanium-di +Package: ide-core-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: ide-core-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: IDE support This package contains core IDE support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: ide-modules-4.19.0-8-itanium-di +Package: ide-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: standard Provides: ide-modules -Depends: kernel-image-4.19.0-8-itanium-di, ide-core-modules-4.19.0-8-itanium-di, sn-modules-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di, ide-core-modules-4.19.0-9-itanium-di, sn-modules-4.19.0-9-itanium-di Description: IDE drivers This package contains IDE drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: sn-modules-4.19.0-8-itanium-di +Package: sn-modules-4.19.0-9-itanium-di Architecture: ia64 Section: debian-installer Priority: optional Provides: sn-modules -Depends: kernel-image-4.19.0-8-itanium-di +Depends: kernel-image-4.19.0-9-itanium-di Description: SN modules This package contains SN modules for Altix systems Build-Profiles: -Kernel-Version: 4.19.0-8-itanium +Kernel-Version: 4.19.0-9-itanium Package-Type: udeb -Package: linux-image-4.19.0-8-itanium +Package: linux-image-4.19.0-9-itanium Architecture: ia64 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [ia64] | linux-initramfs-tool [ia64] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [ia64] | linux-initramfs-tool [ia64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [ia64] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-efi-ia64 [ia64] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -6266,31 +6266,31 @@ (Merced) processors. Build-Profiles: -Package: linux-headers-4.19.0-8-itanium +Package: linux-headers-4.19.0-9-itanium Architecture: ia64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-itanium +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-itanium This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-itanium, generally used for building out-of-tree + Linux kernel 4.19.0-9-itanium, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-itanium, and can be used for building + /usr/src/linux-headers-4.19.0-9-itanium, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-itanium package. + linux-image-4.19.0-9-itanium package. Build-Profiles: -Package: linux-image-4.19.0-8-itanium-dbg +Package: linux-image-4.19.0-9-itanium-dbg Architecture: ia64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-itanium +Description: Debug symbols for linux-image-4.19.0-9-itanium This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-itanium. + modules in linux-image-4.19.0-9-itanium. Build-Profiles: -Package: linux-image-4.19.0-8-mckinley +Package: linux-image-4.19.0-9-mckinley Architecture: ia64 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [ia64] | linux-initramfs-tool [ia64] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [ia64] | linux-initramfs-tool [ia64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [ia64] Suggests: linux-doc-4.19, debian-kernel-handbook, grub-efi-ia64 [ia64] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -6299,38 +6299,38 @@ 9300/9500/9700-series processors. Build-Profiles: -Package: linux-headers-4.19.0-8-mckinley +Package: linux-headers-4.19.0-9-mckinley Architecture: ia64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-mckinley +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-mckinley This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-mckinley, generally used for building out-of-tree + Linux kernel 4.19.0-9-mckinley, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-mckinley, and can be used for building + /usr/src/linux-headers-4.19.0-9-mckinley, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-mckinley package. + linux-image-4.19.0-9-mckinley package. Build-Profiles: -Package: linux-image-4.19.0-8-mckinley-dbg +Package: linux-image-4.19.0-9-mckinley-dbg Architecture: ia64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-mckinley +Description: Debug symbols for linux-image-4.19.0-9-mckinley This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-mckinley. + modules in linux-image-4.19.0-9-mckinley. Build-Profiles: -Package: linux-headers-4.19.0-8-all-m68k +Package: linux-headers-4.19.0-9-all-m68k Architecture: m68k -Depends: ${misc:Depends}, linux-headers-4.19.0-8-m68k (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-m68k (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-m68k-di +Package: kernel-image-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard @@ -6340,329 +6340,329 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: nic-modules-4.19.0-8-m68k-di +Package: nic-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-m68k-di, nic-shared-modules-4.19.0-8-m68k-di, crc-modules-4.19.0-8-m68k-di, zlib-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, nic-shared-modules-4.19.0-9-m68k-di, crc-modules-4.19.0-9-m68k-di, zlib-modules-4.19.0-9-m68k-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-m68k-di +Package: nic-shared-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: ppp-modules-4.19.0-8-m68k-di +Package: ppp-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-m68k-di, zlib-modules-4.19.0-8-m68k-di, crc-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, zlib-modules-4.19.0-9-m68k-di, crc-modules-4.19.0-9-m68k-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: pata-modules-4.19.0-8-m68k-di +Package: pata-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-m68k-di, ata-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, ata-modules-4.19.0-9-m68k-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-m68k-di +Package: cdrom-core-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-m68k-di, scsi-core-modules-4.19.0-8-m68k-di, ide-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, scsi-core-modules-4.19.0-9-m68k-di, ide-modules-4.19.0-9-m68k-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-m68k-di +Package: scsi-core-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: scsi-modules-4.19.0-8-m68k-di +Package: scsi-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-m68k-di, scsi-core-modules-4.19.0-8-m68k-di, cdrom-core-modules-4.19.0-8-m68k-di, ata-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, scsi-core-modules-4.19.0-9-m68k-di, cdrom-core-modules-4.19.0-9-m68k-di, ata-modules-4.19.0-9-m68k-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: loop-modules-4.19.0-8-m68k-di +Package: loop-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: btrfs-modules-4.19.0-8-m68k-di +Package: btrfs-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-m68k-di, crc-modules-4.19.0-8-m68k-di, zlib-modules-4.19.0-8-m68k-di, compress-modules-4.19.0-8-m68k-di, md-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, crc-modules-4.19.0-9-m68k-di, zlib-modules-4.19.0-9-m68k-di, compress-modules-4.19.0-9-m68k-di, md-modules-4.19.0-9-m68k-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: ext4-modules-4.19.0-8-m68k-di +Package: ext4-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-m68k-di, crc-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, crc-modules-4.19.0-9-m68k-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: isofs-modules-4.19.0-8-m68k-di +Package: isofs-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: fat-modules-4.19.0-8-m68k-di +Package: fat-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: hfs-modules-4.19.0-8-m68k-di +Package: hfs-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: hfs-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: HFS filesystem support This package contains the HFS and HFS+ filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: affs-modules-4.19.0-8-m68k-di +Package: affs-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: affs-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: Amiga filesystem support This package contains the Amiga filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: md-modules-4.19.0-8-m68k-di +Package: md-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-m68k-di, crc-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, crc-modules-4.19.0-9-m68k-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: crc-modules-4.19.0-8-m68k-di +Package: crc-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: crypto-modules-4.19.0-8-m68k-di +Package: crypto-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: ata-modules-4.19.0-8-m68k-di +Package: ata-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-m68k-di, scsi-core-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, scsi-core-modules-4.19.0-9-m68k-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: nbd-modules-4.19.0-8-m68k-di +Package: nbd-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: squashfs-modules-4.19.0-8-m68k-di +Package: squashfs-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-m68k-di, compress-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, compress-modules-4.19.0-9-m68k-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: zlib-modules-4.19.0-8-m68k-di +Package: zlib-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: compress-modules-4.19.0-8-m68k-di +Package: compress-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: udf-modules-4.19.0-8-m68k-di +Package: udf-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-m68k-di, crc-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, crc-modules-4.19.0-9-m68k-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: fuse-modules-4.19.0-8-m68k-di +Package: fuse-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: ide-core-modules-4.19.0-8-m68k-di +Package: ide-core-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: ide-core-modules -Depends: kernel-image-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di Description: IDE support This package contains core IDE support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: ide-modules-4.19.0-8-m68k-di +Package: ide-modules-4.19.0-9-m68k-di Architecture: m68k Section: debian-installer Priority: standard Provides: ide-modules -Depends: kernel-image-4.19.0-8-m68k-di, ide-core-modules-4.19.0-8-m68k-di +Depends: kernel-image-4.19.0-9-m68k-di, ide-core-modules-4.19.0-9-m68k-di Description: IDE drivers This package contains IDE drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-m68k +Kernel-Version: 4.19.0-9-m68k Package-Type: udeb -Package: linux-image-4.19.0-8-m68k +Package: linux-image-4.19.0-9-m68k Architecture: m68k -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [m68k] | linux-initramfs-tool [m68k] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [m68k] | linux-initramfs-tool [m68k] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [m68k] Suggests: linux-doc-4.19, debian-kernel-handbook, vmelilo [m68k], fdutils [m68k] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -6670,38 +6670,38 @@ The Linux kernel 4.19 and modules for use on Motorola MC68020+ family. Build-Profiles: -Package: linux-headers-4.19.0-8-m68k +Package: linux-headers-4.19.0-9-m68k Architecture: m68k -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-m68k +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-m68k This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-m68k, generally used for building out-of-tree kernel + Linux kernel 4.19.0-9-m68k, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-m68k, and can be used for building modules - that load into the kernel provided by the linux-image-4.19.0-8-m68k + /usr/src/linux-headers-4.19.0-9-m68k, and can be used for building modules + that load into the kernel provided by the linux-image-4.19.0-9-m68k package. Build-Profiles: -Package: linux-image-4.19.0-8-m68k-dbg +Package: linux-image-4.19.0-9-m68k-dbg Architecture: m68k Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-m68k +Description: Debug symbols for linux-image-4.19.0-9-m68k This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-m68k. + modules in linux-image-4.19.0-9-m68k. Build-Profiles: -Package: linux-headers-4.19.0-8-all-mips +Package: linux-headers-4.19.0-9-all-mips Architecture: mips -Depends: ${misc:Depends}, linux-headers-4.19.0-8-4kc-malta (= ${binary:Version}), linux-headers-4.19.0-8-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-8-octeon (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-4kc-malta (= ${binary:Version}), linux-headers-4.19.0-9-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-9-octeon (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-4kc-malta-di +Package: kernel-image-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard @@ -6711,557 +6711,557 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: nic-modules-4.19.0-8-4kc-malta-di +Package: nic-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, nic-shared-modules-4.19.0-8-4kc-malta-di, i2c-modules-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di, zlib-modules-4.19.0-8-4kc-malta-di, mtd-core-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, nic-shared-modules-4.19.0-9-4kc-malta-di, i2c-modules-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di, zlib-modules-4.19.0-9-4kc-malta-di, mtd-core-modules-4.19.0-9-4kc-malta-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-4kc-malta-di +Package: nic-wireless-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, nic-shared-modules-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di, mmc-core-modules-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, nic-shared-modules-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di, mmc-core-modules-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-4kc-malta-di +Package: nic-shared-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-4kc-malta-di +Package: usb-serial-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: ppp-modules-4.19.0-8-4kc-malta-di +Package: ppp-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, zlib-modules-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, zlib-modules-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: pata-modules-4.19.0-8-4kc-malta-di +Package: pata-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, ata-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, ata-modules-4.19.0-9-4kc-malta-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-4kc-malta-di +Package: cdrom-core-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, scsi-core-modules-4.19.0-8-4kc-malta-di, isofs-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, scsi-core-modules-4.19.0-9-4kc-malta-di, isofs-modules-4.19.0-9-4kc-malta-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-4kc-malta-di +Package: scsi-core-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: scsi-modules-4.19.0-8-4kc-malta-di +Package: scsi-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, scsi-core-modules-4.19.0-8-4kc-malta-di, cdrom-core-modules-4.19.0-8-4kc-malta-di, ata-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, scsi-core-modules-4.19.0-9-4kc-malta-di, cdrom-core-modules-4.19.0-9-4kc-malta-di, ata-modules-4.19.0-9-4kc-malta-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-4kc-malta-di +Package: scsi-nic-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-4kc-malta-di, nic-modules-4.19.0-8-4kc-malta-di +Depends: scsi-modules-4.19.0-9-4kc-malta-di, nic-modules-4.19.0-9-4kc-malta-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: loop-modules-4.19.0-8-4kc-malta-di +Package: loop-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: btrfs-modules-4.19.0-8-4kc-malta-di +Package: btrfs-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di, zlib-modules-4.19.0-8-4kc-malta-di, compress-modules-4.19.0-8-4kc-malta-di, md-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di, zlib-modules-4.19.0-9-4kc-malta-di, compress-modules-4.19.0-9-4kc-malta-di, md-modules-4.19.0-9-4kc-malta-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: ext4-modules-4.19.0-8-4kc-malta-di +Package: ext4-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: isofs-modules-4.19.0-8-4kc-malta-di +Package: isofs-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: jfs-modules-4.19.0-8-4kc-malta-di +Package: jfs-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: xfs-modules-4.19.0-8-4kc-malta-di +Package: xfs-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: fat-modules-4.19.0-8-4kc-malta-di +Package: fat-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: hfs-modules-4.19.0-8-4kc-malta-di +Package: hfs-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: hfs-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: HFS filesystem support This package contains the HFS and HFS+ filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: affs-modules-4.19.0-8-4kc-malta-di +Package: affs-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: affs-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: Amiga filesystem support This package contains the Amiga filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: minix-modules-4.19.0-8-4kc-malta-di +Package: minix-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: minix-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: Minix filesystem support This package contains the Minix filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: md-modules-4.19.0-8-4kc-malta-di +Package: md-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: multipath-modules-4.19.0-8-4kc-malta-di +Package: multipath-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, md-modules-4.19.0-8-4kc-malta-di, scsi-core-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, md-modules-4.19.0-9-4kc-malta-di, scsi-core-modules-4.19.0-9-4kc-malta-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: usb-modules-4.19.0-8-4kc-malta-di +Package: usb-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-4kc-malta-di +Package: usb-storage-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, scsi-core-modules-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, scsi-core-modules-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: fb-modules-4.19.0-8-4kc-malta-di +Package: fb-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, i2c-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, i2c-modules-4.19.0-9-4kc-malta-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: input-modules-4.19.0-8-4kc-malta-di +Package: input-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di, i2c-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di, i2c-modules-4.19.0-9-4kc-malta-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: event-modules-4.19.0-8-4kc-malta-di +Package: event-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: mouse-modules-4.19.0-8-4kc-malta-di +Package: mouse-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, event-modules-4.19.0-8-4kc-malta-di, input-modules-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, event-modules-4.19.0-9-4kc-malta-di, input-modules-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-4kc-malta-di +Package: nic-usb-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, nic-shared-modules-4.19.0-8-4kc-malta-di, nic-wireless-modules-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, nic-shared-modules-4.19.0-9-4kc-malta-di, nic-wireless-modules-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: sata-modules-4.19.0-8-4kc-malta-di +Package: sata-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, scsi-core-modules-4.19.0-8-4kc-malta-di, ata-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, scsi-core-modules-4.19.0-9-4kc-malta-di, ata-modules-4.19.0-9-4kc-malta-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: i2c-modules-4.19.0-8-4kc-malta-di +Package: i2c-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: crc-modules-4.19.0-8-4kc-malta-di +Package: crc-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: crypto-modules-4.19.0-8-4kc-malta-di +Package: crypto-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-4kc-malta-di +Package: crypto-dm-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, md-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, md-modules-4.19.0-9-4kc-malta-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: ata-modules-4.19.0-8-4kc-malta-di +Package: ata-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, scsi-core-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, scsi-core-modules-4.19.0-9-4kc-malta-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-4kc-malta-di +Package: mmc-core-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: mmc-modules-4.19.0-8-4kc-malta-di +Package: mmc-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, mmc-core-modules-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, mmc-core-modules-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: nbd-modules-4.19.0-8-4kc-malta-di +Package: nbd-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: squashfs-modules-4.19.0-8-4kc-malta-di +Package: squashfs-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, compress-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, compress-modules-4.19.0-9-4kc-malta-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: sound-modules-4.19.0-8-4kc-malta-di +Package: sound-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, i2c-modules-4.19.0-8-4kc-malta-di, usb-modules-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, i2c-modules-4.19.0-9-4kc-malta-di, usb-modules-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: zlib-modules-4.19.0-8-4kc-malta-di +Package: zlib-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: compress-modules-4.19.0-8-4kc-malta-di +Package: compress-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: udf-modules-4.19.0-8-4kc-malta-di +Package: udf-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di, crc-modules-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di, crc-modules-4.19.0-9-4kc-malta-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: fuse-modules-4.19.0-8-4kc-malta-di +Package: fuse-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-4kc-malta-di +Package: mtd-core-modules-4.19.0-9-4kc-malta-di Architecture: mips mipsel Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-4kc-malta-di +Depends: kernel-image-4.19.0-9-4kc-malta-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-4kc-malta +Kernel-Version: 4.19.0-9-4kc-malta Package-Type: udeb -Package: kernel-image-4.19.0-8-octeon-di +Package: kernel-image-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard @@ -7271,485 +7271,485 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: nic-modules-4.19.0-8-octeon-di +Package: nic-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-octeon-di, nic-shared-modules-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di, zlib-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, nic-shared-modules-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di, zlib-modules-4.19.0-9-octeon-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-octeon-di +Package: nic-wireless-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-octeon-di, nic-shared-modules-4.19.0-8-octeon-di, usb-modules-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, nic-shared-modules-4.19.0-9-octeon-di, usb-modules-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-octeon-di +Package: nic-shared-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-octeon-di +Package: usb-serial-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-octeon-di, usb-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, usb-modules-4.19.0-9-octeon-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: ppp-modules-4.19.0-8-octeon-di +Package: ppp-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-octeon-di, zlib-modules-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, zlib-modules-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: pata-modules-4.19.0-8-octeon-di +Package: pata-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-octeon-di +Package: cdrom-core-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-octeon-di, scsi-core-modules-4.19.0-8-octeon-di, isofs-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, scsi-core-modules-4.19.0-9-octeon-di, isofs-modules-4.19.0-9-octeon-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-octeon-di +Package: scsi-core-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: scsi-modules-4.19.0-8-octeon-di +Package: scsi-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-octeon-di, scsi-core-modules-4.19.0-8-octeon-di, cdrom-core-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, scsi-core-modules-4.19.0-9-octeon-di, cdrom-core-modules-4.19.0-9-octeon-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-octeon-di +Package: scsi-nic-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-octeon-di, nic-modules-4.19.0-8-octeon-di +Depends: scsi-modules-4.19.0-9-octeon-di, nic-modules-4.19.0-9-octeon-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: loop-modules-4.19.0-8-octeon-di +Package: loop-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: btrfs-modules-4.19.0-8-octeon-di +Package: btrfs-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di, zlib-modules-4.19.0-8-octeon-di, compress-modules-4.19.0-8-octeon-di, md-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di, zlib-modules-4.19.0-9-octeon-di, compress-modules-4.19.0-9-octeon-di, md-modules-4.19.0-9-octeon-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: ext4-modules-4.19.0-8-octeon-di +Package: ext4-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: isofs-modules-4.19.0-8-octeon-di +Package: isofs-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: jfs-modules-4.19.0-8-octeon-di +Package: jfs-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: xfs-modules-4.19.0-8-octeon-di +Package: xfs-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: fat-modules-4.19.0-8-octeon-di +Package: fat-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: hfs-modules-4.19.0-8-octeon-di +Package: hfs-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: hfs-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: HFS filesystem support This package contains the HFS and HFS+ filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: affs-modules-4.19.0-8-octeon-di +Package: affs-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: affs-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: Amiga filesystem support This package contains the Amiga filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: minix-modules-4.19.0-8-octeon-di +Package: minix-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: minix-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: Minix filesystem support This package contains the Minix filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: md-modules-4.19.0-8-octeon-di +Package: md-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: multipath-modules-4.19.0-8-octeon-di +Package: multipath-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-octeon-di, md-modules-4.19.0-8-octeon-di, scsi-core-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, md-modules-4.19.0-9-octeon-di, scsi-core-modules-4.19.0-9-octeon-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: usb-modules-4.19.0-8-octeon-di +Package: usb-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-octeon-di +Package: usb-storage-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-octeon-di, scsi-core-modules-4.19.0-8-octeon-di, usb-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, scsi-core-modules-4.19.0-9-octeon-di, usb-modules-4.19.0-9-octeon-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: input-modules-4.19.0-8-octeon-di +Package: input-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-octeon-di, usb-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, usb-modules-4.19.0-9-octeon-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: event-modules-4.19.0-8-octeon-di +Package: event-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-octeon-di +Package: nic-usb-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-octeon-di, nic-shared-modules-4.19.0-8-octeon-di, nic-wireless-modules-4.19.0-8-octeon-di, usb-modules-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, nic-shared-modules-4.19.0-9-octeon-di, nic-wireless-modules-4.19.0-9-octeon-di, usb-modules-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: sata-modules-4.19.0-8-octeon-di +Package: sata-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-octeon-di, scsi-core-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, scsi-core-modules-4.19.0-9-octeon-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: crc-modules-4.19.0-8-octeon-di +Package: crc-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: crypto-modules-4.19.0-8-octeon-di +Package: crypto-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-octeon-di +Package: crypto-dm-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-octeon-di, md-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, md-modules-4.19.0-9-octeon-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: nbd-modules-4.19.0-8-octeon-di +Package: nbd-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: squashfs-modules-4.19.0-8-octeon-di +Package: squashfs-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-octeon-di, compress-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, compress-modules-4.19.0-9-octeon-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: rtc-modules-4.19.0-8-octeon-di +Package: rtc-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: rtc-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: RTC modules This package contains RTC modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: sound-modules-4.19.0-8-octeon-di +Package: sound-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-octeon-di, usb-modules-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, usb-modules-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: zlib-modules-4.19.0-8-octeon-di +Package: zlib-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: compress-modules-4.19.0-8-octeon-di +Package: compress-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: udf-modules-4.19.0-8-octeon-di +Package: udf-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-octeon-di, crc-modules-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di, crc-modules-4.19.0-9-octeon-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: fuse-modules-4.19.0-8-octeon-di +Package: fuse-modules-4.19.0-9-octeon-di Architecture: mips mips64 mips64el mipsel Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-octeon-di +Depends: kernel-image-4.19.0-9-octeon-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-octeon +Kernel-Version: 4.19.0-9-octeon Package-Type: udeb -Package: linux-image-4.19.0-8-4kc-malta +Package: linux-image-4.19.0-9-4kc-malta Architecture: mips mipsel -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips mipsel] | linux-initramfs-tool [mips mipsel] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips mipsel] | linux-initramfs-tool [mips mipsel] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mips mipsel] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -7757,31 +7757,31 @@ The Linux kernel 4.19 and modules for use on MIPS Malta boards. Build-Profiles: -Package: linux-headers-4.19.0-8-4kc-malta +Package: linux-headers-4.19.0-9-4kc-malta Architecture: mips mipsel -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-4kc-malta +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-4kc-malta This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-4kc-malta, generally used for building out-of-tree + Linux kernel 4.19.0-9-4kc-malta, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-4kc-malta, and can be used for building + /usr/src/linux-headers-4.19.0-9-4kc-malta, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-4kc-malta package. + linux-image-4.19.0-9-4kc-malta package. Build-Profiles: -Package: linux-image-4.19.0-8-4kc-malta-dbg +Package: linux-image-4.19.0-9-4kc-malta-dbg Architecture: mips mipsel Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-4kc-malta +Description: Debug symbols for linux-image-4.19.0-9-4kc-malta This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-4kc-malta. + modules in linux-image-4.19.0-9-4kc-malta. Build-Profiles: -Package: linux-image-4.19.0-8-5kc-malta +Package: linux-image-4.19.0-9-5kc-malta Architecture: mips mips64 mips64el mipsel -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips mips64 mips64el mipsel] | linux-initramfs-tool [mips mips64 mips64el mipsel] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips mips64 mips64el mipsel] | linux-initramfs-tool [mips mips64 mips64el mipsel] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mips mips64 mips64el mipsel] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -7789,31 +7789,31 @@ The Linux kernel 4.19 and modules for use on MIPS Malta boards (64-bit). Build-Profiles: -Package: linux-headers-4.19.0-8-5kc-malta +Package: linux-headers-4.19.0-9-5kc-malta Architecture: mips mips64 mips64el mipsel -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-5kc-malta +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-5kc-malta This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-5kc-malta, generally used for building out-of-tree + Linux kernel 4.19.0-9-5kc-malta, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-5kc-malta, and can be used for building + /usr/src/linux-headers-4.19.0-9-5kc-malta, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-5kc-malta package. + linux-image-4.19.0-9-5kc-malta package. Build-Profiles: -Package: linux-image-4.19.0-8-5kc-malta-dbg +Package: linux-image-4.19.0-9-5kc-malta-dbg Architecture: mips mips64 mips64el mipsel Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-5kc-malta +Description: Debug symbols for linux-image-4.19.0-9-5kc-malta This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-5kc-malta. + modules in linux-image-4.19.0-9-5kc-malta. Build-Profiles: -Package: linux-image-4.19.0-8-octeon +Package: linux-image-4.19.0-9-octeon Architecture: mips mips64 mips64el mipsel -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips mips64 mips64el mipsel] | linux-initramfs-tool [mips mips64 mips64el mipsel] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips mips64 mips64el mipsel] | linux-initramfs-tool [mips mips64 mips64el mipsel] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mips mips64 mips64el mipsel] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -7821,38 +7821,38 @@ The Linux kernel 4.19 and modules for use on Cavium Networks Octeon. Build-Profiles: -Package: linux-headers-4.19.0-8-octeon +Package: linux-headers-4.19.0-9-octeon Architecture: mips mips64 mips64el mipsel -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-octeon +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-octeon This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-octeon, generally used for building out-of-tree + Linux kernel 4.19.0-9-octeon, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-octeon, and can be used for building + /usr/src/linux-headers-4.19.0-9-octeon, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-octeon package. + linux-image-4.19.0-9-octeon package. Build-Profiles: -Package: linux-image-4.19.0-8-octeon-dbg +Package: linux-image-4.19.0-9-octeon-dbg Architecture: mips mips64 mips64el mipsel Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-octeon +Description: Debug symbols for linux-image-4.19.0-9-octeon This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-octeon. + modules in linux-image-4.19.0-9-octeon. Build-Profiles: -Package: linux-headers-4.19.0-8-all-mips64 +Package: linux-headers-4.19.0-9-all-mips64 Architecture: mips64 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-8-octeon (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-9-octeon (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-5kc-malta-di +Package: kernel-image-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard @@ -7862,566 +7862,566 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: nic-modules-4.19.0-8-5kc-malta-di +Package: nic-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, nic-shared-modules-4.19.0-8-5kc-malta-di, i2c-modules-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di, zlib-modules-4.19.0-8-5kc-malta-di, mtd-core-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, nic-shared-modules-4.19.0-9-5kc-malta-di, i2c-modules-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di, zlib-modules-4.19.0-9-5kc-malta-di, mtd-core-modules-4.19.0-9-5kc-malta-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-5kc-malta-di +Package: nic-wireless-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, nic-shared-modules-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di, mmc-core-modules-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, nic-shared-modules-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di, mmc-core-modules-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-5kc-malta-di +Package: nic-shared-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-5kc-malta-di +Package: usb-serial-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: ppp-modules-4.19.0-8-5kc-malta-di +Package: ppp-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, zlib-modules-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, zlib-modules-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: pata-modules-4.19.0-8-5kc-malta-di +Package: pata-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, ata-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, ata-modules-4.19.0-9-5kc-malta-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-5kc-malta-di +Package: cdrom-core-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, scsi-core-modules-4.19.0-8-5kc-malta-di, isofs-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, scsi-core-modules-4.19.0-9-5kc-malta-di, isofs-modules-4.19.0-9-5kc-malta-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-5kc-malta-di +Package: scsi-core-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: scsi-modules-4.19.0-8-5kc-malta-di +Package: scsi-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, scsi-core-modules-4.19.0-8-5kc-malta-di, cdrom-core-modules-4.19.0-8-5kc-malta-di, ata-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, scsi-core-modules-4.19.0-9-5kc-malta-di, cdrom-core-modules-4.19.0-9-5kc-malta-di, ata-modules-4.19.0-9-5kc-malta-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-5kc-malta-di +Package: scsi-nic-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-5kc-malta-di, nic-modules-4.19.0-8-5kc-malta-di +Depends: scsi-modules-4.19.0-9-5kc-malta-di, nic-modules-4.19.0-9-5kc-malta-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: loop-modules-4.19.0-8-5kc-malta-di +Package: loop-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: btrfs-modules-4.19.0-8-5kc-malta-di +Package: btrfs-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di, zlib-modules-4.19.0-8-5kc-malta-di, compress-modules-4.19.0-8-5kc-malta-di, md-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di, zlib-modules-4.19.0-9-5kc-malta-di, compress-modules-4.19.0-9-5kc-malta-di, md-modules-4.19.0-9-5kc-malta-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: ext4-modules-4.19.0-8-5kc-malta-di +Package: ext4-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: isofs-modules-4.19.0-8-5kc-malta-di +Package: isofs-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: jfs-modules-4.19.0-8-5kc-malta-di +Package: jfs-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: xfs-modules-4.19.0-8-5kc-malta-di +Package: xfs-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: fat-modules-4.19.0-8-5kc-malta-di +Package: fat-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: hfs-modules-4.19.0-8-5kc-malta-di +Package: hfs-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: hfs-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: HFS filesystem support This package contains the HFS and HFS+ filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: affs-modules-4.19.0-8-5kc-malta-di +Package: affs-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: affs-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: Amiga filesystem support This package contains the Amiga filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: minix-modules-4.19.0-8-5kc-malta-di +Package: minix-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: minix-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: Minix filesystem support This package contains the Minix filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: md-modules-4.19.0-8-5kc-malta-di +Package: md-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: multipath-modules-4.19.0-8-5kc-malta-di +Package: multipath-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, md-modules-4.19.0-8-5kc-malta-di, scsi-core-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, md-modules-4.19.0-9-5kc-malta-di, scsi-core-modules-4.19.0-9-5kc-malta-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: usb-modules-4.19.0-8-5kc-malta-di +Package: usb-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-5kc-malta-di +Package: usb-storage-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, scsi-core-modules-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, scsi-core-modules-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: fb-modules-4.19.0-8-5kc-malta-di +Package: fb-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, i2c-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, i2c-modules-4.19.0-9-5kc-malta-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: input-modules-4.19.0-8-5kc-malta-di +Package: input-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di, i2c-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di, i2c-modules-4.19.0-9-5kc-malta-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: event-modules-4.19.0-8-5kc-malta-di +Package: event-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: mouse-modules-4.19.0-8-5kc-malta-di +Package: mouse-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, event-modules-4.19.0-8-5kc-malta-di, input-modules-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, event-modules-4.19.0-9-5kc-malta-di, input-modules-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-5kc-malta-di +Package: nic-usb-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, nic-shared-modules-4.19.0-8-5kc-malta-di, nic-wireless-modules-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, nic-shared-modules-4.19.0-9-5kc-malta-di, nic-wireless-modules-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: sata-modules-4.19.0-8-5kc-malta-di +Package: sata-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, scsi-core-modules-4.19.0-8-5kc-malta-di, ata-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, scsi-core-modules-4.19.0-9-5kc-malta-di, ata-modules-4.19.0-9-5kc-malta-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: i2c-modules-4.19.0-8-5kc-malta-di +Package: i2c-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: crc-modules-4.19.0-8-5kc-malta-di +Package: crc-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: crypto-modules-4.19.0-8-5kc-malta-di +Package: crypto-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-5kc-malta-di +Package: crypto-dm-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, md-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, md-modules-4.19.0-9-5kc-malta-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: ata-modules-4.19.0-8-5kc-malta-di +Package: ata-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, scsi-core-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, scsi-core-modules-4.19.0-9-5kc-malta-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-5kc-malta-di +Package: mmc-core-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: mmc-modules-4.19.0-8-5kc-malta-di +Package: mmc-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: mmc-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, mmc-core-modules-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, mmc-core-modules-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: MMC/SD card modules This package contains modules needed to support MMC (multimedia) and SD cards. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: nbd-modules-4.19.0-8-5kc-malta-di +Package: nbd-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: squashfs-modules-4.19.0-8-5kc-malta-di +Package: squashfs-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, compress-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, compress-modules-4.19.0-9-5kc-malta-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: sound-modules-4.19.0-8-5kc-malta-di +Package: sound-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, i2c-modules-4.19.0-8-5kc-malta-di, usb-modules-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, i2c-modules-4.19.0-9-5kc-malta-di, usb-modules-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: zlib-modules-4.19.0-8-5kc-malta-di +Package: zlib-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: compress-modules-4.19.0-8-5kc-malta-di +Package: compress-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: udf-modules-4.19.0-8-5kc-malta-di +Package: udf-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di, crc-modules-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di, crc-modules-4.19.0-9-5kc-malta-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: fuse-modules-4.19.0-8-5kc-malta-di +Package: fuse-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-5kc-malta-di +Package: mtd-core-modules-4.19.0-9-5kc-malta-di Architecture: mips64 mips64el Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-5kc-malta-di +Depends: kernel-image-4.19.0-9-5kc-malta-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-5kc-malta +Kernel-Version: 4.19.0-9-5kc-malta Package-Type: udeb -Package: linux-headers-4.19.0-8-all-mips64el +Package: linux-headers-4.19.0-9-all-mips64el Architecture: mips64el -Depends: ${misc:Depends}, linux-headers-4.19.0-8-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-8-loongson-3 (= ${binary:Version}), linux-headers-4.19.0-8-octeon (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-9-loongson-3 (= ${binary:Version}), linux-headers-4.19.0-9-octeon (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-loongson-3-di +Package: kernel-image-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard @@ -8431,546 +8431,546 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: nic-modules-4.19.0-8-loongson-3-di +Package: nic-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, nic-shared-modules-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di, zlib-modules-4.19.0-8-loongson-3-di, mtd-core-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, nic-shared-modules-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di, zlib-modules-4.19.0-9-loongson-3-di, mtd-core-modules-4.19.0-9-loongson-3-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-loongson-3-di +Package: nic-wireless-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, nic-shared-modules-4.19.0-8-loongson-3-di, usb-modules-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, nic-shared-modules-4.19.0-9-loongson-3-di, usb-modules-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-loongson-3-di +Package: nic-shared-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-loongson-3-di +Package: usb-serial-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, usb-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, usb-modules-4.19.0-9-loongson-3-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: ppp-modules-4.19.0-8-loongson-3-di +Package: ppp-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, zlib-modules-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, zlib-modules-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: pata-modules-4.19.0-8-loongson-3-di +Package: pata-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, ata-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, ata-modules-4.19.0-9-loongson-3-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-loongson-3-di +Package: cdrom-core-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, scsi-core-modules-4.19.0-8-loongson-3-di, isofs-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, scsi-core-modules-4.19.0-9-loongson-3-di, isofs-modules-4.19.0-9-loongson-3-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-loongson-3-di +Package: firewire-core-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, scsi-core-modules-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, scsi-core-modules-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-loongson-3-di +Package: scsi-core-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: scsi-modules-4.19.0-8-loongson-3-di +Package: scsi-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, scsi-core-modules-4.19.0-8-loongson-3-di, cdrom-core-modules-4.19.0-8-loongson-3-di, ata-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, scsi-core-modules-4.19.0-9-loongson-3-di, cdrom-core-modules-4.19.0-9-loongson-3-di, ata-modules-4.19.0-9-loongson-3-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-loongson-3-di +Package: scsi-nic-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-loongson-3-di, nic-modules-4.19.0-8-loongson-3-di +Depends: scsi-modules-4.19.0-9-loongson-3-di, nic-modules-4.19.0-9-loongson-3-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: loop-modules-4.19.0-8-loongson-3-di +Package: loop-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-loongson-3-di +Package: btrfs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di, zlib-modules-4.19.0-8-loongson-3-di, compress-modules-4.19.0-8-loongson-3-di, md-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di, zlib-modules-4.19.0-9-loongson-3-di, compress-modules-4.19.0-9-loongson-3-di, md-modules-4.19.0-9-loongson-3-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: ext4-modules-4.19.0-8-loongson-3-di +Package: ext4-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: isofs-modules-4.19.0-8-loongson-3-di +Package: isofs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: jfs-modules-4.19.0-8-loongson-3-di +Package: jfs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: xfs-modules-4.19.0-8-loongson-3-di +Package: xfs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: fat-modules-4.19.0-8-loongson-3-di +Package: fat-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: hfs-modules-4.19.0-8-loongson-3-di +Package: hfs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: hfs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: HFS filesystem support This package contains the HFS and HFS+ filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: affs-modules-4.19.0-8-loongson-3-di +Package: affs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: affs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Amiga filesystem support This package contains the Amiga filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: minix-modules-4.19.0-8-loongson-3-di +Package: minix-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: minix-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Minix filesystem support This package contains the Minix filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: nfs-modules-4.19.0-8-loongson-3-di +Package: nfs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: nfs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: NFS filesystem support This package contains the NFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: md-modules-4.19.0-8-loongson-3-di +Package: md-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: multipath-modules-4.19.0-8-loongson-3-di +Package: multipath-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, md-modules-4.19.0-8-loongson-3-di, scsi-core-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, md-modules-4.19.0-9-loongson-3-di, scsi-core-modules-4.19.0-9-loongson-3-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: usb-modules-4.19.0-8-loongson-3-di +Package: usb-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-loongson-3-di +Package: usb-storage-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, scsi-core-modules-4.19.0-8-loongson-3-di, usb-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, scsi-core-modules-4.19.0-9-loongson-3-di, usb-modules-4.19.0-9-loongson-3-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: fb-modules-4.19.0-8-loongson-3-di +Package: fb-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: input-modules-4.19.0-8-loongson-3-di +Package: input-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, usb-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, usb-modules-4.19.0-9-loongson-3-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: event-modules-4.19.0-8-loongson-3-di +Package: event-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-loongson-3-di +Package: nic-usb-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, nic-shared-modules-4.19.0-8-loongson-3-di, nic-wireless-modules-4.19.0-8-loongson-3-di, usb-modules-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, nic-shared-modules-4.19.0-9-loongson-3-di, nic-wireless-modules-4.19.0-9-loongson-3-di, usb-modules-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: sata-modules-4.19.0-8-loongson-3-di +Package: sata-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, scsi-core-modules-4.19.0-8-loongson-3-di, ata-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, scsi-core-modules-4.19.0-9-loongson-3-di, ata-modules-4.19.0-9-loongson-3-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: crc-modules-4.19.0-8-loongson-3-di +Package: crc-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: crypto-modules-4.19.0-8-loongson-3-di +Package: crypto-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-loongson-3-di +Package: crypto-dm-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, md-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, md-modules-4.19.0-9-loongson-3-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: ata-modules-4.19.0-8-loongson-3-di +Package: ata-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, scsi-core-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, scsi-core-modules-4.19.0-9-loongson-3-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: nbd-modules-4.19.0-8-loongson-3-di +Package: nbd-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-loongson-3-di +Package: squashfs-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, compress-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, compress-modules-4.19.0-9-loongson-3-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: speakup-modules-4.19.0-8-loongson-3-di +Package: speakup-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: speakup-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: speakup modules This package contains speakup modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: sound-modules-4.19.0-8-loongson-3-di +Package: sound-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, usb-modules-4.19.0-8-loongson-3-di, firewire-core-modules-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, usb-modules-4.19.0-9-loongson-3-di, firewire-core-modules-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: zlib-modules-4.19.0-8-loongson-3-di +Package: zlib-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: compress-modules-4.19.0-8-loongson-3-di +Package: compress-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: udf-modules-4.19.0-8-loongson-3-di +Package: udf-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-loongson-3-di, crc-modules-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di, crc-modules-4.19.0-9-loongson-3-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: fuse-modules-4.19.0-8-loongson-3-di +Package: fuse-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-loongson-3-di +Package: mtd-core-modules-4.19.0-9-loongson-3-di Architecture: mips64el mipsel Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-loongson-3-di +Depends: kernel-image-4.19.0-9-loongson-3-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-loongson-3 +Kernel-Version: 4.19.0-9-loongson-3 Package-Type: udeb -Package: linux-image-4.19.0-8-loongson-3 +Package: linux-image-4.19.0-9-loongson-3 Architecture: mips64el mipsel -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips64el mipsel] | linux-initramfs-tool [mips64el mipsel] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips64el mipsel] | linux-initramfs-tool [mips64el mipsel] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mips64el mipsel] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -8979,38 +8979,38 @@ systems (e.g. from Loongson or Lemote). Build-Profiles: -Package: linux-headers-4.19.0-8-loongson-3 +Package: linux-headers-4.19.0-9-loongson-3 Architecture: mips64el mipsel -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-loongson-3 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-loongson-3 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-loongson-3, generally used for building out-of-tree + Linux kernel 4.19.0-9-loongson-3, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-loongson-3, and can be used for building + /usr/src/linux-headers-4.19.0-9-loongson-3, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-loongson-3 package. + linux-image-4.19.0-9-loongson-3 package. Build-Profiles: -Package: linux-image-4.19.0-8-loongson-3-dbg +Package: linux-image-4.19.0-9-loongson-3-dbg Architecture: mips64el mipsel Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-loongson-3 +Description: Debug symbols for linux-image-4.19.0-9-loongson-3 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-loongson-3. + modules in linux-image-4.19.0-9-loongson-3. Build-Profiles: -Package: linux-headers-4.19.0-8-all-mips64r6 +Package: linux-headers-4.19.0-9-all-mips64r6 Architecture: mips64r6 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-mips64r6 (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-mips64r6 (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-mips64r6-di +Package: kernel-image-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: standard @@ -9020,231 +9020,231 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-mips64r6-di +Package: nic-shared-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: loop-modules-4.19.0-8-mips64r6-di +Package: loop-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-mips64r6-di +Package: btrfs-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, crc-modules-4.19.0-8-mips64r6-di, zlib-modules-4.19.0-8-mips64r6-di, compress-modules-4.19.0-8-mips64r6-di, md-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, crc-modules-4.19.0-9-mips64r6-di, zlib-modules-4.19.0-9-mips64r6-di, compress-modules-4.19.0-9-mips64r6-di, md-modules-4.19.0-9-mips64r6-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: ext4-modules-4.19.0-8-mips64r6-di +Package: ext4-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, crc-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, crc-modules-4.19.0-9-mips64r6-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: isofs-modules-4.19.0-8-mips64r6-di +Package: isofs-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: jfs-modules-4.19.0-8-mips64r6-di +Package: jfs-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: xfs-modules-4.19.0-8-mips64r6-di +Package: xfs-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, crc-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, crc-modules-4.19.0-9-mips64r6-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: md-modules-4.19.0-8-mips64r6-di +Package: md-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, crc-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, crc-modules-4.19.0-9-mips64r6-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: multipath-modules-4.19.0-8-mips64r6-di +Package: multipath-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, md-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, md-modules-4.19.0-9-mips64r6-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: crc-modules-4.19.0-8-mips64r6-di +Package: crc-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: crypto-modules-4.19.0-8-mips64r6-di +Package: crypto-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-mips64r6-di +Package: crypto-dm-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, md-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, md-modules-4.19.0-9-mips64r6-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: nbd-modules-4.19.0-8-mips64r6-di +Package: nbd-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-mips64r6-di +Package: squashfs-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, compress-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, compress-modules-4.19.0-9-mips64r6-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: zlib-modules-4.19.0-8-mips64r6-di +Package: zlib-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: compress-modules-4.19.0-8-mips64r6-di +Package: compress-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: udf-modules-4.19.0-8-mips64r6-di +Package: udf-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-mips64r6-di, crc-modules-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di, crc-modules-4.19.0-9-mips64r6-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: fuse-modules-4.19.0-8-mips64r6-di +Package: fuse-modules-4.19.0-9-mips64r6-di Architecture: mips64r6 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-mips64r6-di +Depends: kernel-image-4.19.0-9-mips64r6-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6 +Kernel-Version: 4.19.0-9-mips64r6 Package-Type: udeb -Package: linux-image-4.19.0-8-mips64r6 +Package: linux-image-4.19.0-9-mips64r6 Architecture: mips64r6 mipsr6 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips64r6 mipsr6] | linux-initramfs-tool [mips64r6 mipsr6] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips64r6 mipsr6] | linux-initramfs-tool [mips64r6 mipsr6] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mips64r6 mipsr6] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -9252,38 +9252,38 @@ The Linux kernel 4.19 and modules for use on MIPS R6 (64 bit, big endian). Build-Profiles: -Package: linux-headers-4.19.0-8-mips64r6 +Package: linux-headers-4.19.0-9-mips64r6 Architecture: mips64r6 mipsr6 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-mips64r6 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-mips64r6 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-mips64r6, generally used for building out-of-tree + Linux kernel 4.19.0-9-mips64r6, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-mips64r6, and can be used for building + /usr/src/linux-headers-4.19.0-9-mips64r6, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-mips64r6 package. + linux-image-4.19.0-9-mips64r6 package. Build-Profiles: -Package: linux-image-4.19.0-8-mips64r6-dbg +Package: linux-image-4.19.0-9-mips64r6-dbg Architecture: mips64r6 mipsr6 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-mips64r6 +Description: Debug symbols for linux-image-4.19.0-9-mips64r6 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-mips64r6. + modules in linux-image-4.19.0-9-mips64r6. Build-Profiles: -Package: linux-headers-4.19.0-8-all-mips64r6el +Package: linux-headers-4.19.0-9-all-mips64r6el Architecture: mips64r6el -Depends: ${misc:Depends}, linux-headers-4.19.0-8-mips64r6el (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-mips64r6el (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-mips64r6el-di +Package: kernel-image-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: standard @@ -9293,231 +9293,231 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-mips64r6el-di +Package: nic-shared-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: loop-modules-4.19.0-8-mips64r6el-di +Package: loop-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: btrfs-modules-4.19.0-8-mips64r6el-di +Package: btrfs-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, crc-modules-4.19.0-8-mips64r6el-di, zlib-modules-4.19.0-8-mips64r6el-di, compress-modules-4.19.0-8-mips64r6el-di, md-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, crc-modules-4.19.0-9-mips64r6el-di, zlib-modules-4.19.0-9-mips64r6el-di, compress-modules-4.19.0-9-mips64r6el-di, md-modules-4.19.0-9-mips64r6el-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: ext4-modules-4.19.0-8-mips64r6el-di +Package: ext4-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, crc-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, crc-modules-4.19.0-9-mips64r6el-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: isofs-modules-4.19.0-8-mips64r6el-di +Package: isofs-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: jfs-modules-4.19.0-8-mips64r6el-di +Package: jfs-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: xfs-modules-4.19.0-8-mips64r6el-di +Package: xfs-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, crc-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, crc-modules-4.19.0-9-mips64r6el-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: md-modules-4.19.0-8-mips64r6el-di +Package: md-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, crc-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, crc-modules-4.19.0-9-mips64r6el-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: multipath-modules-4.19.0-8-mips64r6el-di +Package: multipath-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, md-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, md-modules-4.19.0-9-mips64r6el-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: crc-modules-4.19.0-8-mips64r6el-di +Package: crc-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: crypto-modules-4.19.0-8-mips64r6el-di +Package: crypto-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-mips64r6el-di +Package: crypto-dm-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, md-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, md-modules-4.19.0-9-mips64r6el-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: nbd-modules-4.19.0-8-mips64r6el-di +Package: nbd-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: squashfs-modules-4.19.0-8-mips64r6el-di +Package: squashfs-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, compress-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, compress-modules-4.19.0-9-mips64r6el-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: zlib-modules-4.19.0-8-mips64r6el-di +Package: zlib-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: compress-modules-4.19.0-8-mips64r6el-di +Package: compress-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: udf-modules-4.19.0-8-mips64r6el-di +Package: udf-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di, crc-modules-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di, crc-modules-4.19.0-9-mips64r6el-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: fuse-modules-4.19.0-8-mips64r6el-di +Package: fuse-modules-4.19.0-9-mips64r6el-di Architecture: mips64r6el Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-mips64r6el-di +Depends: kernel-image-4.19.0-9-mips64r6el-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips64r6el +Kernel-Version: 4.19.0-9-mips64r6el Package-Type: udeb -Package: linux-image-4.19.0-8-mips64r6el +Package: linux-image-4.19.0-9-mips64r6el Architecture: mips64r6el mipsr6el -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips64r6el mipsr6el] | linux-initramfs-tool [mips64r6el mipsr6el] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mips64r6el mipsr6el] | linux-initramfs-tool [mips64r6el mipsr6el] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mips64r6el mipsr6el] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -9526,47 +9526,47 @@ endian). Build-Profiles: -Package: linux-headers-4.19.0-8-mips64r6el +Package: linux-headers-4.19.0-9-mips64r6el Architecture: mips64r6el mipsr6el -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-mips64r6el +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-mips64r6el This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-mips64r6el, generally used for building out-of-tree + Linux kernel 4.19.0-9-mips64r6el, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-mips64r6el, and can be used for building + /usr/src/linux-headers-4.19.0-9-mips64r6el, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-mips64r6el package. + linux-image-4.19.0-9-mips64r6el package. Build-Profiles: -Package: linux-image-4.19.0-8-mips64r6el-dbg +Package: linux-image-4.19.0-9-mips64r6el-dbg Architecture: mips64r6el mipsr6el Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-mips64r6el +Description: Debug symbols for linux-image-4.19.0-9-mips64r6el This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-mips64r6el. + modules in linux-image-4.19.0-9-mips64r6el. Build-Profiles: -Package: linux-headers-4.19.0-8-all-mipsel +Package: linux-headers-4.19.0-9-all-mipsel Architecture: mipsel -Depends: ${misc:Depends}, linux-headers-4.19.0-8-4kc-malta (= ${binary:Version}), linux-headers-4.19.0-8-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-8-loongson-3 (= ${binary:Version}), linux-headers-4.19.0-8-octeon (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-4kc-malta (= ${binary:Version}), linux-headers-4.19.0-9-5kc-malta (= ${binary:Version}), linux-headers-4.19.0-9-loongson-3 (= ${binary:Version}), linux-headers-4.19.0-9-octeon (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: linux-headers-4.19.0-8-all-mipsr6 +Package: linux-headers-4.19.0-9-all-mipsr6 Architecture: mipsr6 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-mips32r6 (= ${binary:Version}), linux-headers-4.19.0-8-mips64r6 (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-mips32r6 (= ${binary:Version}), linux-headers-4.19.0-9-mips64r6 (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-mips32r6-di +Package: kernel-image-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: standard @@ -9576,231 +9576,231 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-mips32r6-di +Package: nic-shared-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: loop-modules-4.19.0-8-mips32r6-di +Package: loop-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-mips32r6-di +Package: btrfs-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, crc-modules-4.19.0-8-mips32r6-di, zlib-modules-4.19.0-8-mips32r6-di, compress-modules-4.19.0-8-mips32r6-di, md-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, crc-modules-4.19.0-9-mips32r6-di, zlib-modules-4.19.0-9-mips32r6-di, compress-modules-4.19.0-9-mips32r6-di, md-modules-4.19.0-9-mips32r6-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: ext4-modules-4.19.0-8-mips32r6-di +Package: ext4-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, crc-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, crc-modules-4.19.0-9-mips32r6-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: isofs-modules-4.19.0-8-mips32r6-di +Package: isofs-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: jfs-modules-4.19.0-8-mips32r6-di +Package: jfs-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: xfs-modules-4.19.0-8-mips32r6-di +Package: xfs-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, crc-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, crc-modules-4.19.0-9-mips32r6-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: md-modules-4.19.0-8-mips32r6-di +Package: md-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, crc-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, crc-modules-4.19.0-9-mips32r6-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: multipath-modules-4.19.0-8-mips32r6-di +Package: multipath-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, md-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, md-modules-4.19.0-9-mips32r6-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: crc-modules-4.19.0-8-mips32r6-di +Package: crc-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: crypto-modules-4.19.0-8-mips32r6-di +Package: crypto-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-mips32r6-di +Package: crypto-dm-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, md-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, md-modules-4.19.0-9-mips32r6-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: nbd-modules-4.19.0-8-mips32r6-di +Package: nbd-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-mips32r6-di +Package: squashfs-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, compress-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, compress-modules-4.19.0-9-mips32r6-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: zlib-modules-4.19.0-8-mips32r6-di +Package: zlib-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: compress-modules-4.19.0-8-mips32r6-di +Package: compress-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: udf-modules-4.19.0-8-mips32r6-di +Package: udf-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-mips32r6-di, crc-modules-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di, crc-modules-4.19.0-9-mips32r6-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: fuse-modules-4.19.0-8-mips32r6-di +Package: fuse-modules-4.19.0-9-mips32r6-di Architecture: mipsr6 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-mips32r6-di +Depends: kernel-image-4.19.0-9-mips32r6-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6 +Kernel-Version: 4.19.0-9-mips32r6 Package-Type: udeb -Package: linux-image-4.19.0-8-mips32r6 +Package: linux-image-4.19.0-9-mips32r6 Architecture: mipsr6 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mipsr6] | linux-initramfs-tool [mipsr6] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mipsr6] | linux-initramfs-tool [mipsr6] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mipsr6] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -9808,38 +9808,38 @@ The Linux kernel 4.19 and modules for use on MIPS R6 (32 bit, big endian). Build-Profiles: -Package: linux-headers-4.19.0-8-mips32r6 +Package: linux-headers-4.19.0-9-mips32r6 Architecture: mipsr6 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-mips32r6 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-mips32r6 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-mips32r6, generally used for building out-of-tree + Linux kernel 4.19.0-9-mips32r6, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-mips32r6, and can be used for building + /usr/src/linux-headers-4.19.0-9-mips32r6, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-mips32r6 package. + linux-image-4.19.0-9-mips32r6 package. Build-Profiles: -Package: linux-image-4.19.0-8-mips32r6-dbg +Package: linux-image-4.19.0-9-mips32r6-dbg Architecture: mipsr6 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-mips32r6 +Description: Debug symbols for linux-image-4.19.0-9-mips32r6 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-mips32r6. + modules in linux-image-4.19.0-9-mips32r6. Build-Profiles: -Package: linux-headers-4.19.0-8-all-mipsr6el +Package: linux-headers-4.19.0-9-all-mipsr6el Architecture: mipsr6el -Depends: ${misc:Depends}, linux-headers-4.19.0-8-mips32r6el (= ${binary:Version}), linux-headers-4.19.0-8-mips64r6el (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-mips32r6el (= ${binary:Version}), linux-headers-4.19.0-9-mips64r6el (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-mips32r6el-di +Package: kernel-image-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: standard @@ -9849,231 +9849,231 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-mips32r6el-di +Package: nic-shared-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: loop-modules-4.19.0-8-mips32r6el-di +Package: loop-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: btrfs-modules-4.19.0-8-mips32r6el-di +Package: btrfs-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, crc-modules-4.19.0-8-mips32r6el-di, zlib-modules-4.19.0-8-mips32r6el-di, compress-modules-4.19.0-8-mips32r6el-di, md-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, crc-modules-4.19.0-9-mips32r6el-di, zlib-modules-4.19.0-9-mips32r6el-di, compress-modules-4.19.0-9-mips32r6el-di, md-modules-4.19.0-9-mips32r6el-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: ext4-modules-4.19.0-8-mips32r6el-di +Package: ext4-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, crc-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, crc-modules-4.19.0-9-mips32r6el-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: isofs-modules-4.19.0-8-mips32r6el-di +Package: isofs-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: jfs-modules-4.19.0-8-mips32r6el-di +Package: jfs-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: xfs-modules-4.19.0-8-mips32r6el-di +Package: xfs-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, crc-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, crc-modules-4.19.0-9-mips32r6el-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: md-modules-4.19.0-8-mips32r6el-di +Package: md-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, crc-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, crc-modules-4.19.0-9-mips32r6el-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: multipath-modules-4.19.0-8-mips32r6el-di +Package: multipath-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, md-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, md-modules-4.19.0-9-mips32r6el-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: crc-modules-4.19.0-8-mips32r6el-di +Package: crc-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: crypto-modules-4.19.0-8-mips32r6el-di +Package: crypto-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-mips32r6el-di +Package: crypto-dm-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, md-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, md-modules-4.19.0-9-mips32r6el-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: nbd-modules-4.19.0-8-mips32r6el-di +Package: nbd-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: squashfs-modules-4.19.0-8-mips32r6el-di +Package: squashfs-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, compress-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, compress-modules-4.19.0-9-mips32r6el-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: zlib-modules-4.19.0-8-mips32r6el-di +Package: zlib-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: compress-modules-4.19.0-8-mips32r6el-di +Package: compress-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: udf-modules-4.19.0-8-mips32r6el-di +Package: udf-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di, crc-modules-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di, crc-modules-4.19.0-9-mips32r6el-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: fuse-modules-4.19.0-8-mips32r6el-di +Package: fuse-modules-4.19.0-9-mips32r6el-di Architecture: mipsr6el Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-mips32r6el-di +Depends: kernel-image-4.19.0-9-mips32r6el-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-mips32r6el +Kernel-Version: 4.19.0-9-mips32r6el Package-Type: udeb -Package: linux-image-4.19.0-8-mips32r6el +Package: linux-image-4.19.0-9-mips32r6el Architecture: mipsr6el -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mipsr6el] | linux-initramfs-tool [mipsr6el] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [mipsr6el] | linux-initramfs-tool [mipsr6el] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [mipsr6el] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -10082,38 +10082,38 @@ endian). Build-Profiles: -Package: linux-headers-4.19.0-8-mips32r6el +Package: linux-headers-4.19.0-9-mips32r6el Architecture: mipsr6el -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-mips32r6el +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-mips32r6el This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-mips32r6el, generally used for building out-of-tree + Linux kernel 4.19.0-9-mips32r6el, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-mips32r6el, and can be used for building + /usr/src/linux-headers-4.19.0-9-mips32r6el, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-mips32r6el package. + linux-image-4.19.0-9-mips32r6el package. Build-Profiles: -Package: linux-image-4.19.0-8-mips32r6el-dbg +Package: linux-image-4.19.0-9-mips32r6el-dbg Architecture: mipsr6el Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-mips32r6el +Description: Debug symbols for linux-image-4.19.0-9-mips32r6el This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-mips32r6el. + modules in linux-image-4.19.0-9-mips32r6el. Build-Profiles: -Package: linux-headers-4.19.0-8-all-powerpc +Package: linux-headers-4.19.0-9-all-powerpc Architecture: powerpc -Depends: ${misc:Depends}, linux-headers-4.19.0-8-powerpc (= ${binary:Version}), linux-headers-4.19.0-8-powerpc-smp (= ${binary:Version}), linux-headers-4.19.0-8-powerpc64 (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-powerpc (= ${binary:Version}), linux-headers-4.19.0-9-powerpc-smp (= ${binary:Version}), linux-headers-4.19.0-9-powerpc64 (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-powerpc-di +Package: kernel-image-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard @@ -10123,568 +10123,568 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: nic-modules-4.19.0-8-powerpc-di +Package: nic-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-powerpc-di, nic-shared-modules-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di, zlib-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, nic-shared-modules-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di, zlib-modules-4.19.0-9-powerpc-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-powerpc-di +Package: nic-wireless-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-powerpc-di, nic-shared-modules-4.19.0-8-powerpc-di, usb-modules-4.19.0-8-powerpc-di, mmc-core-modules-4.19.0-8-powerpc-di, pcmcia-modules-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, nic-shared-modules-4.19.0-9-powerpc-di, usb-modules-4.19.0-9-powerpc-di, mmc-core-modules-4.19.0-9-powerpc-di, pcmcia-modules-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-powerpc-di +Package: nic-shared-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: serial-modules-4.19.0-8-powerpc-di +Package: serial-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-powerpc-di, pcmcia-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, pcmcia-modules-4.19.0-9-powerpc-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-powerpc-di +Package: usb-serial-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-powerpc-di, usb-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, usb-modules-4.19.0-9-powerpc-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: ppp-modules-4.19.0-8-powerpc-di +Package: ppp-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-powerpc-di, serial-modules-4.19.0-8-powerpc-di, zlib-modules-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, serial-modules-4.19.0-9-powerpc-di, zlib-modules-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: pata-modules-4.19.0-8-powerpc-di +Package: pata-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-powerpc-di, ata-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, ata-modules-4.19.0-9-powerpc-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-powerpc-di +Package: cdrom-core-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-powerpc-di, scsi-core-modules-4.19.0-8-powerpc-di, isofs-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, scsi-core-modules-4.19.0-9-powerpc-di, isofs-modules-4.19.0-9-powerpc-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-powerpc-di +Package: firewire-core-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-powerpc-di, scsi-core-modules-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, scsi-core-modules-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-powerpc-di +Package: scsi-core-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: scsi-modules-4.19.0-8-powerpc-di +Package: scsi-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-powerpc-di, scsi-core-modules-4.19.0-8-powerpc-di, cdrom-core-modules-4.19.0-8-powerpc-di, ata-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, scsi-core-modules-4.19.0-9-powerpc-di, cdrom-core-modules-4.19.0-9-powerpc-di, ata-modules-4.19.0-9-powerpc-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-powerpc-di +Package: scsi-nic-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-powerpc-di, nic-modules-4.19.0-8-powerpc-di +Depends: scsi-modules-4.19.0-9-powerpc-di, nic-modules-4.19.0-9-powerpc-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: loop-modules-4.19.0-8-powerpc-di +Package: loop-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: btrfs-modules-4.19.0-8-powerpc-di +Package: btrfs-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di, zlib-modules-4.19.0-8-powerpc-di, compress-modules-4.19.0-8-powerpc-di, md-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di, zlib-modules-4.19.0-9-powerpc-di, compress-modules-4.19.0-9-powerpc-di, md-modules-4.19.0-9-powerpc-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: ext4-modules-4.19.0-8-powerpc-di +Package: ext4-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: isofs-modules-4.19.0-8-powerpc-di +Package: isofs-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: jfs-modules-4.19.0-8-powerpc-di +Package: jfs-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: xfs-modules-4.19.0-8-powerpc-di +Package: xfs-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: fat-modules-4.19.0-8-powerpc-di +Package: fat-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: hfs-modules-4.19.0-8-powerpc-di +Package: hfs-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: hfs-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: HFS filesystem support This package contains the HFS and HFS+ filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: affs-modules-4.19.0-8-powerpc-di +Package: affs-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: affs-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Amiga filesystem support This package contains the Amiga filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: md-modules-4.19.0-8-powerpc-di +Package: md-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: multipath-modules-4.19.0-8-powerpc-di +Package: multipath-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-powerpc-di, md-modules-4.19.0-8-powerpc-di, scsi-core-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, md-modules-4.19.0-9-powerpc-di, scsi-core-modules-4.19.0-9-powerpc-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: usb-modules-4.19.0-8-powerpc-di +Package: usb-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-powerpc-di +Package: usb-storage-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-powerpc-di, scsi-core-modules-4.19.0-8-powerpc-di, usb-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, scsi-core-modules-4.19.0-9-powerpc-di, usb-modules-4.19.0-9-powerpc-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: pcmcia-storage-modules-4.19.0-8-powerpc-di +Package: pcmcia-storage-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: pcmcia-storage-modules -Depends: kernel-image-4.19.0-8-powerpc-di, cdrom-core-modules-4.19.0-8-powerpc-di, pcmcia-modules-4.19.0-8-powerpc-di, ata-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, cdrom-core-modules-4.19.0-9-powerpc-di, pcmcia-modules-4.19.0-9-powerpc-di, ata-modules-4.19.0-9-powerpc-di Description: PCMCIA storage drivers This package contains PCMCIA storage drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: fb-modules-4.19.0-8-powerpc-di +Package: fb-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: input-modules-4.19.0-8-powerpc-di +Package: input-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-powerpc-di, usb-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, usb-modules-4.19.0-9-powerpc-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: event-modules-4.19.0-8-powerpc-di +Package: event-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: mouse-modules-4.19.0-8-powerpc-di +Package: mouse-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-powerpc-di, event-modules-4.19.0-8-powerpc-di, input-modules-4.19.0-8-powerpc-di, usb-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, event-modules-4.19.0-9-powerpc-di, input-modules-4.19.0-9-powerpc-di, usb-modules-4.19.0-9-powerpc-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: nic-pcmcia-modules-4.19.0-8-powerpc-di +Package: nic-pcmcia-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: nic-pcmcia-modules -Depends: kernel-image-4.19.0-8-powerpc-di, nic-shared-modules-4.19.0-8-powerpc-di, nic-wireless-modules-4.19.0-8-powerpc-di, pcmcia-modules-4.19.0-8-powerpc-di, mmc-core-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, nic-shared-modules-4.19.0-9-powerpc-di, nic-wireless-modules-4.19.0-9-powerpc-di, pcmcia-modules-4.19.0-9-powerpc-di, mmc-core-modules-4.19.0-9-powerpc-di Description: Common PCMCIA NIC drivers This package contains common PCMCIA NIC drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: pcmcia-modules-4.19.0-8-powerpc-di +Package: pcmcia-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: pcmcia-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Common PCMCIA drivers This package contains common PCMCIA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-powerpc-di +Package: nic-usb-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-powerpc-di, nic-shared-modules-4.19.0-8-powerpc-di, nic-wireless-modules-4.19.0-8-powerpc-di, usb-modules-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, nic-shared-modules-4.19.0-9-powerpc-di, nic-wireless-modules-4.19.0-9-powerpc-di, usb-modules-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: sata-modules-4.19.0-8-powerpc-di +Package: sata-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-powerpc-di, scsi-core-modules-4.19.0-8-powerpc-di, ata-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, scsi-core-modules-4.19.0-9-powerpc-di, ata-modules-4.19.0-9-powerpc-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: crc-modules-4.19.0-8-powerpc-di +Package: crc-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: crypto-modules-4.19.0-8-powerpc-di +Package: crypto-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-powerpc-di +Package: crypto-dm-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-powerpc-di, md-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, md-modules-4.19.0-9-powerpc-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: ata-modules-4.19.0-8-powerpc-di +Package: ata-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-powerpc-di, scsi-core-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, scsi-core-modules-4.19.0-9-powerpc-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-powerpc-di +Package: mmc-core-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: nbd-modules-4.19.0-8-powerpc-di +Package: nbd-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: squashfs-modules-4.19.0-8-powerpc-di +Package: squashfs-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-powerpc-di, compress-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, compress-modules-4.19.0-9-powerpc-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: uinput-modules-4.19.0-8-powerpc-di +Package: uinput-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: zlib-modules-4.19.0-8-powerpc-di +Package: zlib-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: compress-modules-4.19.0-8-powerpc-di +Package: compress-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: udf-modules-4.19.0-8-powerpc-di +Package: udf-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-powerpc-di, crc-modules-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di, crc-modules-4.19.0-9-powerpc-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: fuse-modules-4.19.0-8-powerpc-di +Package: fuse-modules-4.19.0-9-powerpc-di Architecture: powerpc Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-powerpc-di +Depends: kernel-image-4.19.0-9-powerpc-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc +Kernel-Version: 4.19.0-9-powerpc Package-Type: udeb -Package: kernel-image-4.19.0-8-powerpc64-di +Package: kernel-image-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard @@ -10694,609 +10694,609 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: nic-modules-4.19.0-8-powerpc64-di +Package: nic-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, nic-shared-modules-4.19.0-8-powerpc64-di, i2c-modules-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di, mtd-core-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, nic-shared-modules-4.19.0-9-powerpc64-di, i2c-modules-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di, mtd-core-modules-4.19.0-9-powerpc64-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-powerpc64-di +Package: nic-wireless-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, nic-shared-modules-4.19.0-8-powerpc64-di, usb-modules-4.19.0-8-powerpc64-di, mmc-core-modules-4.19.0-8-powerpc64-di, pcmcia-modules-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, nic-shared-modules-4.19.0-9-powerpc64-di, usb-modules-4.19.0-9-powerpc64-di, mmc-core-modules-4.19.0-9-powerpc64-di, pcmcia-modules-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-powerpc64-di +Package: nic-shared-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: serial-modules-4.19.0-8-powerpc64-di +Package: serial-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, pcmcia-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, pcmcia-modules-4.19.0-9-powerpc64-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-powerpc64-di +Package: usb-serial-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, usb-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, usb-modules-4.19.0-9-powerpc64-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: ppp-modules-4.19.0-8-powerpc64-di +Package: ppp-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, serial-modules-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, serial-modules-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: pata-modules-4.19.0-8-powerpc64-di +Package: pata-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, ata-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, ata-modules-4.19.0-9-powerpc64-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-powerpc64-di +Package: cdrom-core-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, scsi-core-modules-4.19.0-8-powerpc64-di, isofs-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, scsi-core-modules-4.19.0-9-powerpc64-di, isofs-modules-4.19.0-9-powerpc64-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-powerpc64-di +Package: firewire-core-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, scsi-core-modules-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, scsi-core-modules-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-powerpc64-di +Package: scsi-core-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: scsi-modules-4.19.0-8-powerpc64-di +Package: scsi-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, scsi-core-modules-4.19.0-8-powerpc64-di, cdrom-core-modules-4.19.0-8-powerpc64-di, ata-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, scsi-core-modules-4.19.0-9-powerpc64-di, cdrom-core-modules-4.19.0-9-powerpc64-di, ata-modules-4.19.0-9-powerpc64-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-powerpc64-di +Package: scsi-nic-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-powerpc64-di, nic-modules-4.19.0-8-powerpc64-di +Depends: scsi-modules-4.19.0-9-powerpc64-di, nic-modules-4.19.0-9-powerpc64-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: loop-modules-4.19.0-8-powerpc64-di +Package: loop-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-powerpc64-di +Package: btrfs-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di, compress-modules-4.19.0-8-powerpc64-di, md-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di, compress-modules-4.19.0-9-powerpc64-di, md-modules-4.19.0-9-powerpc64-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: ext4-modules-4.19.0-8-powerpc64-di +Package: ext4-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: isofs-modules-4.19.0-8-powerpc64-di +Package: isofs-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: jfs-modules-4.19.0-8-powerpc64-di +Package: jfs-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: xfs-modules-4.19.0-8-powerpc64-di +Package: xfs-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: fat-modules-4.19.0-8-powerpc64-di +Package: fat-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: hfs-modules-4.19.0-8-powerpc64-di +Package: hfs-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: hfs-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: HFS filesystem support This package contains the HFS and HFS+ filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: affs-modules-4.19.0-8-powerpc64-di +Package: affs-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: affs-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Amiga filesystem support This package contains the Amiga filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: md-modules-4.19.0-8-powerpc64-di +Package: md-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: multipath-modules-4.19.0-8-powerpc64-di +Package: multipath-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, md-modules-4.19.0-8-powerpc64-di, scsi-core-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, md-modules-4.19.0-9-powerpc64-di, scsi-core-modules-4.19.0-9-powerpc64-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: usb-modules-4.19.0-8-powerpc64-di +Package: usb-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-powerpc64-di +Package: usb-storage-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, scsi-core-modules-4.19.0-8-powerpc64-di, usb-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, scsi-core-modules-4.19.0-9-powerpc64-di, usb-modules-4.19.0-9-powerpc64-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: pcmcia-storage-modules-4.19.0-8-powerpc64-di +Package: pcmcia-storage-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: pcmcia-storage-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, cdrom-core-modules-4.19.0-8-powerpc64-di, pcmcia-modules-4.19.0-8-powerpc64-di, ata-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, cdrom-core-modules-4.19.0-9-powerpc64-di, pcmcia-modules-4.19.0-9-powerpc64-di, ata-modules-4.19.0-9-powerpc64-di Description: PCMCIA storage drivers This package contains PCMCIA storage drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: fb-modules-4.19.0-8-powerpc64-di +Package: fb-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, i2c-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, i2c-modules-4.19.0-9-powerpc64-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: input-modules-4.19.0-8-powerpc64-di +Package: input-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, usb-modules-4.19.0-8-powerpc64-di, i2c-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, usb-modules-4.19.0-9-powerpc64-di, i2c-modules-4.19.0-9-powerpc64-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: event-modules-4.19.0-8-powerpc64-di +Package: event-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: mouse-modules-4.19.0-8-powerpc64-di +Package: mouse-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, event-modules-4.19.0-8-powerpc64-di, input-modules-4.19.0-8-powerpc64-di, usb-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, event-modules-4.19.0-9-powerpc64-di, input-modules-4.19.0-9-powerpc64-di, usb-modules-4.19.0-9-powerpc64-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: nic-pcmcia-modules-4.19.0-8-powerpc64-di +Package: nic-pcmcia-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: nic-pcmcia-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, nic-shared-modules-4.19.0-8-powerpc64-di, nic-wireless-modules-4.19.0-8-powerpc64-di, pcmcia-modules-4.19.0-8-powerpc64-di, mmc-core-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, nic-shared-modules-4.19.0-9-powerpc64-di, nic-wireless-modules-4.19.0-9-powerpc64-di, pcmcia-modules-4.19.0-9-powerpc64-di, mmc-core-modules-4.19.0-9-powerpc64-di Description: Common PCMCIA NIC drivers This package contains common PCMCIA NIC drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: pcmcia-modules-4.19.0-8-powerpc64-di +Package: pcmcia-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: pcmcia-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Common PCMCIA drivers This package contains common PCMCIA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-powerpc64-di +Package: nic-usb-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, nic-shared-modules-4.19.0-8-powerpc64-di, nic-wireless-modules-4.19.0-8-powerpc64-di, usb-modules-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, nic-shared-modules-4.19.0-9-powerpc64-di, nic-wireless-modules-4.19.0-9-powerpc64-di, usb-modules-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: sata-modules-4.19.0-8-powerpc64-di +Package: sata-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, scsi-core-modules-4.19.0-8-powerpc64-di, ata-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, scsi-core-modules-4.19.0-9-powerpc64-di, ata-modules-4.19.0-9-powerpc64-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: i2c-modules-4.19.0-8-powerpc64-di +Package: i2c-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: crc-modules-4.19.0-8-powerpc64-di +Package: crc-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: crypto-modules-4.19.0-8-powerpc64-di +Package: crypto-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-powerpc64-di +Package: crypto-dm-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, md-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, md-modules-4.19.0-9-powerpc64-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: ata-modules-4.19.0-8-powerpc64-di +Package: ata-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, scsi-core-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, scsi-core-modules-4.19.0-9-powerpc64-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: mmc-core-modules-4.19.0-8-powerpc64-di +Package: mmc-core-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: mmc-core-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: MMC/SD/SDIO core modules This package contains core modules for MMC/SD/SDIO support. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: nbd-modules-4.19.0-8-powerpc64-di +Package: nbd-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-powerpc64-di +Package: squashfs-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, compress-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, compress-modules-4.19.0-9-powerpc64-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: uinput-modules-4.19.0-8-powerpc64-di +Package: uinput-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: compress-modules-4.19.0-8-powerpc64-di +Package: compress-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: udf-modules-4.19.0-8-powerpc64-di +Package: udf-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-powerpc64-di, crc-modules-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di, crc-modules-4.19.0-9-powerpc64-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: fuse-modules-4.19.0-8-powerpc64-di +Package: fuse-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-powerpc64-di +Package: mtd-core-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: hypervisor-modules-4.19.0-8-powerpc64-di +Package: hypervisor-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: hypervisor-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: IBM 64bit hypervisor console modules Contains drivers for the hypervisor console, used as console for linux running in logical partitions of IBM hardware supporting it. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: fancontrol-modules-4.19.0-8-powerpc64-di +Package: fancontrol-modules-4.19.0-9-powerpc64-di Architecture: powerpc ppc64 Section: debian-installer Priority: standard Provides: fancontrol-modules -Depends: kernel-image-4.19.0-8-powerpc64-di +Depends: kernel-image-4.19.0-9-powerpc64-di Description: Apple powermac fancontrol modules Contains drivers for macintosh i2c bus as well as for the monitoring devices connected to it. This allows to control the fans during installation. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64 +Kernel-Version: 4.19.0-9-powerpc64 Package-Type: udeb -Package: linux-image-4.19.0-8-powerpc +Package: linux-image-4.19.0-9-powerpc Architecture: powerpc -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpc] | linux-initramfs-tool [powerpc] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpc] | linux-initramfs-tool [powerpc] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [powerpc] Suggests: linux-doc-4.19, debian-kernel-handbook, mkvmlinuz [powerpc], grub-ieee1275 [powerpc] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -11304,31 +11304,31 @@ The Linux kernel 4.19 and modules for use on uniprocessor 32-bit PowerPC. Build-Profiles: -Package: linux-headers-4.19.0-8-powerpc +Package: linux-headers-4.19.0-9-powerpc Architecture: powerpc -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-powerpc +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-powerpc This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-powerpc, generally used for building out-of-tree + Linux kernel 4.19.0-9-powerpc, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-powerpc, and can be used for building + /usr/src/linux-headers-4.19.0-9-powerpc, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-powerpc package. + linux-image-4.19.0-9-powerpc package. Build-Profiles: -Package: linux-image-4.19.0-8-powerpc-dbg +Package: linux-image-4.19.0-9-powerpc-dbg Architecture: powerpc Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-powerpc +Description: Debug symbols for linux-image-4.19.0-9-powerpc This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-powerpc. + modules in linux-image-4.19.0-9-powerpc. Build-Profiles: -Package: linux-image-4.19.0-8-powerpc-smp +Package: linux-image-4.19.0-9-powerpc-smp Architecture: powerpc -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpc] | linux-initramfs-tool [powerpc] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpc] | linux-initramfs-tool [powerpc] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [powerpc] Suggests: linux-doc-4.19, debian-kernel-handbook, mkvmlinuz [powerpc], grub-ieee1275 [powerpc] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -11337,31 +11337,31 @@ PowerPC. Build-Profiles: -Package: linux-headers-4.19.0-8-powerpc-smp +Package: linux-headers-4.19.0-9-powerpc-smp Architecture: powerpc -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-powerpc-smp +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-powerpc-smp This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-powerpc-smp, generally used for building out-of-tree + Linux kernel 4.19.0-9-powerpc-smp, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-powerpc-smp, and can be used for building + /usr/src/linux-headers-4.19.0-9-powerpc-smp, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-powerpc-smp package. + linux-image-4.19.0-9-powerpc-smp package. Build-Profiles: -Package: linux-image-4.19.0-8-powerpc-smp-dbg +Package: linux-image-4.19.0-9-powerpc-smp-dbg Architecture: powerpc Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-powerpc-smp +Description: Debug symbols for linux-image-4.19.0-9-powerpc-smp This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-powerpc-smp. + modules in linux-image-4.19.0-9-powerpc-smp. Build-Profiles: -Package: linux-image-4.19.0-8-powerpc64 +Package: linux-image-4.19.0-9-powerpc64 Architecture: powerpc ppc64 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpc ppc64] | linux-initramfs-tool [powerpc ppc64] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpc ppc64] | linux-initramfs-tool [powerpc ppc64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [powerpc ppc64] Suggests: linux-doc-4.19, debian-kernel-handbook, mkvmlinuz [powerpc ppc64], grub-ieee1275 [powerpc ppc64] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -11369,40 +11369,40 @@ The Linux kernel 4.19 and modules for use on 64-bit PowerPC. Build-Profiles: -Package: linux-headers-4.19.0-8-powerpc64 +Package: linux-headers-4.19.0-9-powerpc64 Architecture: powerpc ppc64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-powerpc64 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-powerpc64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-powerpc64, generally used for building out-of-tree + Linux kernel 4.19.0-9-powerpc64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-powerpc64, and can be used for building + /usr/src/linux-headers-4.19.0-9-powerpc64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-powerpc64 package. + linux-image-4.19.0-9-powerpc64 package. Build-Profiles: -Package: linux-image-4.19.0-8-powerpc64-dbg +Package: linux-image-4.19.0-9-powerpc64-dbg Architecture: powerpc ppc64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-powerpc64 +Description: Debug symbols for linux-image-4.19.0-9-powerpc64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-powerpc64. + modules in linux-image-4.19.0-9-powerpc64. Build-Profiles: -Package: linux-headers-4.19.0-8-all-powerpcspe +Package: linux-headers-4.19.0-9-all-powerpcspe Architecture: powerpcspe -Depends: ${misc:Depends}, linux-headers-4.19.0-8-powerpcspe (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-powerpcspe (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: linux-image-4.19.0-8-powerpcspe +Package: linux-image-4.19.0-9-powerpcspe Architecture: powerpcspe -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpcspe] | linux-initramfs-tool [powerpcspe] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [powerpcspe] | linux-initramfs-tool [powerpcspe] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [powerpcspe] Suggests: linux-doc-4.19, debian-kernel-handbook, mkvmlinuz [powerpcspe] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -11411,47 +11411,47 @@ (instead of AltiVec) with SMP support. Build-Profiles: -Package: linux-headers-4.19.0-8-powerpcspe +Package: linux-headers-4.19.0-9-powerpcspe Architecture: powerpcspe -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-powerpcspe +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-powerpcspe This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-powerpcspe, generally used for building out-of-tree + Linux kernel 4.19.0-9-powerpcspe, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-powerpcspe, and can be used for building + /usr/src/linux-headers-4.19.0-9-powerpcspe, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-powerpcspe package. + linux-image-4.19.0-9-powerpcspe package. Build-Profiles: -Package: linux-image-4.19.0-8-powerpcspe-dbg +Package: linux-image-4.19.0-9-powerpcspe-dbg Architecture: powerpcspe Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-powerpcspe +Description: Debug symbols for linux-image-4.19.0-9-powerpcspe This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-powerpcspe. + modules in linux-image-4.19.0-9-powerpcspe. Build-Profiles: -Package: linux-headers-4.19.0-8-all-ppc64 +Package: linux-headers-4.19.0-9-all-ppc64 Architecture: ppc64 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-powerpc64 (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-powerpc64 (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: linux-headers-4.19.0-8-all-ppc64el +Package: linux-headers-4.19.0-9-all-ppc64el Architecture: ppc64el -Depends: ${misc:Depends}, linux-headers-4.19.0-8-powerpc64le (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-powerpc64le (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-powerpc64le-di +Package: kernel-image-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard @@ -11461,525 +11461,525 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: nic-modules-4.19.0-8-powerpc64le-di +Package: nic-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, nic-shared-modules-4.19.0-8-powerpc64le-di, i2c-modules-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di, mtd-core-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, nic-shared-modules-4.19.0-9-powerpc64le-di, i2c-modules-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di, mtd-core-modules-4.19.0-9-powerpc64le-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-powerpc64le-di +Package: nic-wireless-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, nic-shared-modules-4.19.0-8-powerpc64le-di, usb-modules-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, nic-shared-modules-4.19.0-9-powerpc64le-di, usb-modules-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-powerpc64le-di +Package: nic-shared-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: serial-modules-4.19.0-8-powerpc64le-di +Package: serial-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: serial-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: Serial drivers This package contains serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-powerpc64le-di +Package: usb-serial-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, usb-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, usb-modules-4.19.0-9-powerpc64le-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: ppp-modules-4.19.0-8-powerpc64le-di +Package: ppp-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, serial-modules-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, serial-modules-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-powerpc64le-di +Package: cdrom-core-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, scsi-core-modules-4.19.0-8-powerpc64le-di, isofs-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, scsi-core-modules-4.19.0-9-powerpc64le-di, isofs-modules-4.19.0-9-powerpc64le-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-powerpc64le-di +Package: firewire-core-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, scsi-core-modules-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, scsi-core-modules-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-powerpc64le-di +Package: scsi-core-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: scsi-modules-4.19.0-8-powerpc64le-di +Package: scsi-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, scsi-core-modules-4.19.0-8-powerpc64le-di, cdrom-core-modules-4.19.0-8-powerpc64le-di, ata-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, scsi-core-modules-4.19.0-9-powerpc64le-di, cdrom-core-modules-4.19.0-9-powerpc64le-di, ata-modules-4.19.0-9-powerpc64le-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-powerpc64le-di +Package: scsi-nic-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-powerpc64le-di, nic-modules-4.19.0-8-powerpc64le-di +Depends: scsi-modules-4.19.0-9-powerpc64le-di, nic-modules-4.19.0-9-powerpc64le-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: loop-modules-4.19.0-8-powerpc64le-di +Package: loop-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: btrfs-modules-4.19.0-8-powerpc64le-di +Package: btrfs-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di, compress-modules-4.19.0-8-powerpc64le-di, md-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di, compress-modules-4.19.0-9-powerpc64le-di, md-modules-4.19.0-9-powerpc64le-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: ext4-modules-4.19.0-8-powerpc64le-di +Package: ext4-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: isofs-modules-4.19.0-8-powerpc64le-di +Package: isofs-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: jfs-modules-4.19.0-8-powerpc64le-di +Package: jfs-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: xfs-modules-4.19.0-8-powerpc64le-di +Package: xfs-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: fat-modules-4.19.0-8-powerpc64le-di +Package: fat-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: md-modules-4.19.0-8-powerpc64le-di +Package: md-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: multipath-modules-4.19.0-8-powerpc64le-di +Package: multipath-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, md-modules-4.19.0-8-powerpc64le-di, scsi-core-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, md-modules-4.19.0-9-powerpc64le-di, scsi-core-modules-4.19.0-9-powerpc64le-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: usb-modules-4.19.0-8-powerpc64le-di +Package: usb-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-powerpc64le-di +Package: usb-storage-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, scsi-core-modules-4.19.0-8-powerpc64le-di, usb-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, scsi-core-modules-4.19.0-9-powerpc64le-di, usb-modules-4.19.0-9-powerpc64le-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: fb-modules-4.19.0-8-powerpc64le-di +Package: fb-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, i2c-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, i2c-modules-4.19.0-9-powerpc64le-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: input-modules-4.19.0-8-powerpc64le-di +Package: input-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, usb-modules-4.19.0-8-powerpc64le-di, i2c-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, usb-modules-4.19.0-9-powerpc64le-di, i2c-modules-4.19.0-9-powerpc64le-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: event-modules-4.19.0-8-powerpc64le-di +Package: event-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: mouse-modules-4.19.0-8-powerpc64le-di +Package: mouse-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: mouse-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, event-modules-4.19.0-8-powerpc64le-di, input-modules-4.19.0-8-powerpc64le-di, usb-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, event-modules-4.19.0-9-powerpc64le-di, input-modules-4.19.0-9-powerpc64le-di, usb-modules-4.19.0-9-powerpc64le-di Description: Mouse support This package contains mouse drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-powerpc64le-di +Package: nic-usb-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, nic-shared-modules-4.19.0-8-powerpc64le-di, nic-wireless-modules-4.19.0-8-powerpc64le-di, usb-modules-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, nic-shared-modules-4.19.0-9-powerpc64le-di, nic-wireless-modules-4.19.0-9-powerpc64le-di, usb-modules-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: sata-modules-4.19.0-8-powerpc64le-di +Package: sata-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, scsi-core-modules-4.19.0-8-powerpc64le-di, ata-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, scsi-core-modules-4.19.0-9-powerpc64le-di, ata-modules-4.19.0-9-powerpc64le-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: i2c-modules-4.19.0-8-powerpc64le-di +Package: i2c-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: crc-modules-4.19.0-8-powerpc64le-di +Package: crc-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: crypto-modules-4.19.0-8-powerpc64le-di +Package: crypto-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-powerpc64le-di +Package: crypto-dm-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, md-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, md-modules-4.19.0-9-powerpc64le-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: ata-modules-4.19.0-8-powerpc64le-di +Package: ata-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, scsi-core-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, scsi-core-modules-4.19.0-9-powerpc64le-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: nbd-modules-4.19.0-8-powerpc64le-di +Package: nbd-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: squashfs-modules-4.19.0-8-powerpc64le-di +Package: squashfs-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, compress-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, compress-modules-4.19.0-9-powerpc64le-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: uinput-modules-4.19.0-8-powerpc64le-di +Package: uinput-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: uinput-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: uinput support This package contains the uinput module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: compress-modules-4.19.0-8-powerpc64le-di +Package: compress-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: udf-modules-4.19.0-8-powerpc64le-di +Package: udf-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di, crc-modules-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di, crc-modules-4.19.0-9-powerpc64le-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: fuse-modules-4.19.0-8-powerpc64le-di +Package: fuse-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-powerpc64le-di +Package: mtd-core-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: hypervisor-modules-4.19.0-8-powerpc64le-di +Package: hypervisor-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: hypervisor-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: IBM 64bit hypervisor console modules Contains drivers for the hypervisor console, used as console for linux running in logical partitions of IBM hardware supporting it. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: fancontrol-modules-4.19.0-8-powerpc64le-di +Package: fancontrol-modules-4.19.0-9-powerpc64le-di Architecture: ppc64el Section: debian-installer Priority: standard Provides: fancontrol-modules -Depends: kernel-image-4.19.0-8-powerpc64le-di +Depends: kernel-image-4.19.0-9-powerpc64le-di Description: Apple powermac fancontrol modules Contains drivers for macintosh i2c bus as well as for the monitoring devices connected to it. This allows to control the fans during installation. Build-Profiles: -Kernel-Version: 4.19.0-8-powerpc64le +Kernel-Version: 4.19.0-9-powerpc64le Package-Type: udeb -Package: linux-image-4.19.0-8-powerpc64le +Package: linux-image-4.19.0-9-powerpc64le Architecture: ppc64el -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [ppc64el] | linux-initramfs-tool [ppc64el] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [ppc64el] | linux-initramfs-tool [ppc64el] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [ppc64el] Suggests: linux-doc-4.19, debian-kernel-handbook, mkvmlinuz [ppc64el], grub-ieee1275 [ppc64el] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -11987,38 +11987,38 @@ The Linux kernel 4.19 and modules for use on Little-endian 64-bit PowerPC. Build-Profiles: -Package: linux-headers-4.19.0-8-powerpc64le +Package: linux-headers-4.19.0-9-powerpc64le Architecture: ppc64el -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-powerpc64le +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-powerpc64le This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-powerpc64le, generally used for building out-of-tree + Linux kernel 4.19.0-9-powerpc64le, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-powerpc64le, and can be used for building + /usr/src/linux-headers-4.19.0-9-powerpc64le, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-powerpc64le package. + linux-image-4.19.0-9-powerpc64le package. Build-Profiles: -Package: linux-image-4.19.0-8-powerpc64le-dbg +Package: linux-image-4.19.0-9-powerpc64le-dbg Architecture: ppc64el Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-powerpc64le +Description: Debug symbols for linux-image-4.19.0-9-powerpc64le This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-powerpc64le. + modules in linux-image-4.19.0-9-powerpc64le. Build-Profiles: -Package: linux-headers-4.19.0-8-all-riscv64 +Package: linux-headers-4.19.0-9-all-riscv64 Architecture: riscv64 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-riscv64 (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-riscv64 (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-riscv64-di +Package: kernel-image-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard @@ -12028,474 +12028,474 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: nic-modules-4.19.0-8-riscv64-di +Package: nic-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-riscv64-di, nic-shared-modules-4.19.0-8-riscv64-di, i2c-modules-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di, zlib-modules-4.19.0-8-riscv64-di, mtd-core-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, nic-shared-modules-4.19.0-9-riscv64-di, i2c-modules-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di, zlib-modules-4.19.0-9-riscv64-di, mtd-core-modules-4.19.0-9-riscv64-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: nic-wireless-modules-4.19.0-8-riscv64-di +Package: nic-wireless-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: nic-wireless-modules -Depends: kernel-image-4.19.0-8-riscv64-di, nic-shared-modules-4.19.0-8-riscv64-di, usb-modules-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, nic-shared-modules-4.19.0-9-riscv64-di, usb-modules-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di Description: Wireless NIC drivers This package contains wireless NIC drivers for the kernel. Includes crypto modules only needed for wireless (WEP, WPA). Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-riscv64-di +Package: nic-shared-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-riscv64-di +Package: usb-serial-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-riscv64-di, usb-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, usb-modules-4.19.0-9-riscv64-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: ppp-modules-4.19.0-8-riscv64-di +Package: ppp-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-riscv64-di, zlib-modules-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, zlib-modules-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: pata-modules-4.19.0-8-riscv64-di +Package: pata-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-riscv64-di, ata-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, ata-modules-4.19.0-9-riscv64-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-riscv64-di +Package: cdrom-core-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-riscv64-di, scsi-core-modules-4.19.0-8-riscv64-di, isofs-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, scsi-core-modules-4.19.0-9-riscv64-di, isofs-modules-4.19.0-9-riscv64-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-riscv64-di +Package: scsi-core-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: scsi-modules-4.19.0-8-riscv64-di +Package: scsi-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-riscv64-di, scsi-core-modules-4.19.0-8-riscv64-di, cdrom-core-modules-4.19.0-8-riscv64-di, ata-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, scsi-core-modules-4.19.0-9-riscv64-di, cdrom-core-modules-4.19.0-9-riscv64-di, ata-modules-4.19.0-9-riscv64-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: scsi-nic-modules-4.19.0-8-riscv64-di +Package: scsi-nic-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: scsi-nic-modules -Depends: scsi-modules-4.19.0-8-riscv64-di, nic-modules-4.19.0-8-riscv64-di +Depends: scsi-modules-4.19.0-9-riscv64-di, nic-modules-4.19.0-9-riscv64-di Description: SCSI drivers for converged NICs This package contains SCSI drivers that depend on net drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: loop-modules-4.19.0-8-riscv64-di +Package: loop-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-riscv64-di +Package: btrfs-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di, zlib-modules-4.19.0-8-riscv64-di, compress-modules-4.19.0-8-riscv64-di, md-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di, zlib-modules-4.19.0-9-riscv64-di, compress-modules-4.19.0-9-riscv64-di, md-modules-4.19.0-9-riscv64-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: ext4-modules-4.19.0-8-riscv64-di +Package: ext4-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: isofs-modules-4.19.0-8-riscv64-di +Package: isofs-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: jfs-modules-4.19.0-8-riscv64-di +Package: jfs-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: fat-modules-4.19.0-8-riscv64-di +Package: fat-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: md-modules-4.19.0-8-riscv64-di +Package: md-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: multipath-modules-4.19.0-8-riscv64-di +Package: multipath-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-riscv64-di, md-modules-4.19.0-8-riscv64-di, scsi-core-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, md-modules-4.19.0-9-riscv64-di, scsi-core-modules-4.19.0-9-riscv64-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: usb-modules-4.19.0-8-riscv64-di +Package: usb-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-riscv64-di +Package: usb-storage-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-riscv64-di, scsi-core-modules-4.19.0-8-riscv64-di, usb-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, scsi-core-modules-4.19.0-9-riscv64-di, usb-modules-4.19.0-9-riscv64-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: fb-modules-4.19.0-8-riscv64-di +Package: fb-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-riscv64-di, i2c-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, i2c-modules-4.19.0-9-riscv64-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: input-modules-4.19.0-8-riscv64-di +Package: input-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-riscv64-di, usb-modules-4.19.0-8-riscv64-di, i2c-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, usb-modules-4.19.0-9-riscv64-di, i2c-modules-4.19.0-9-riscv64-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: event-modules-4.19.0-8-riscv64-di +Package: event-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: event-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: Event support This package contains event drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-riscv64-di +Package: nic-usb-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-riscv64-di, nic-shared-modules-4.19.0-8-riscv64-di, nic-wireless-modules-4.19.0-8-riscv64-di, usb-modules-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, nic-shared-modules-4.19.0-9-riscv64-di, nic-wireless-modules-4.19.0-9-riscv64-di, usb-modules-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: sata-modules-4.19.0-8-riscv64-di +Package: sata-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-riscv64-di, scsi-core-modules-4.19.0-8-riscv64-di, ata-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, scsi-core-modules-4.19.0-9-riscv64-di, ata-modules-4.19.0-9-riscv64-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: i2c-modules-4.19.0-8-riscv64-di +Package: i2c-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: crc-modules-4.19.0-8-riscv64-di +Package: crc-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: crypto-modules-4.19.0-8-riscv64-di +Package: crypto-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-riscv64-di +Package: crypto-dm-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-riscv64-di, md-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, md-modules-4.19.0-9-riscv64-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: ata-modules-4.19.0-8-riscv64-di +Package: ata-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-riscv64-di, scsi-core-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, scsi-core-modules-4.19.0-9-riscv64-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: nbd-modules-4.19.0-8-riscv64-di +Package: nbd-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-riscv64-di +Package: squashfs-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-riscv64-di, compress-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, compress-modules-4.19.0-9-riscv64-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: zlib-modules-4.19.0-8-riscv64-di +Package: zlib-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: compress-modules-4.19.0-8-riscv64-di +Package: compress-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: udf-modules-4.19.0-8-riscv64-di +Package: udf-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-riscv64-di, crc-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, crc-modules-4.19.0-9-riscv64-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: fuse-modules-4.19.0-8-riscv64-di +Package: fuse-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: mtd-modules-4.19.0-8-riscv64-di +Package: mtd-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: mtd-modules -Depends: kernel-image-4.19.0-8-riscv64-di, mtd-core-modules-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di, mtd-core-modules-4.19.0-9-riscv64-di Description: MTD driver modules This package contains MTD driver modules. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-riscv64-di +Package: mtd-core-modules-4.19.0-9-riscv64-di Architecture: riscv64 Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-riscv64-di +Depends: kernel-image-4.19.0-9-riscv64-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-riscv64 +Kernel-Version: 4.19.0-9-riscv64 Package-Type: udeb -Package: linux-image-4.19.0-8-riscv64 +Package: linux-image-4.19.0-9-riscv64 Architecture: riscv64 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [riscv64] | linux-initramfs-tool [riscv64] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [riscv64] | linux-initramfs-tool [riscv64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [riscv64] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -12503,38 +12503,38 @@ The Linux kernel 4.19 and modules for use on 64-bit RISC-V platforms. Build-Profiles: -Package: linux-headers-4.19.0-8-riscv64 +Package: linux-headers-4.19.0-9-riscv64 Architecture: riscv64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-riscv64 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-riscv64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-riscv64, generally used for building out-of-tree + Linux kernel 4.19.0-9-riscv64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-riscv64, and can be used for building + /usr/src/linux-headers-4.19.0-9-riscv64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-riscv64 package. + linux-image-4.19.0-9-riscv64 package. Build-Profiles: -Package: linux-image-4.19.0-8-riscv64-dbg +Package: linux-image-4.19.0-9-riscv64-dbg Architecture: riscv64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-riscv64 +Description: Debug symbols for linux-image-4.19.0-9-riscv64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-riscv64. + modules in linux-image-4.19.0-9-riscv64. Build-Profiles: -Package: linux-headers-4.19.0-8-all-s390x +Package: linux-headers-4.19.0-9-all-s390x Architecture: s390x -Depends: ${misc:Depends}, linux-headers-4.19.0-8-s390x (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-s390x (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-s390x-di +Package: kernel-image-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard @@ -12544,293 +12544,293 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: nic-modules-4.19.0-8-s390x-di +Package: nic-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-s390x-di, crc-modules-4.19.0-8-s390x-di, zlib-modules-4.19.0-8-s390x-di, mtd-core-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, crc-modules-4.19.0-9-s390x-di, zlib-modules-4.19.0-9-s390x-di, mtd-core-modules-4.19.0-9-s390x-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-s390x-di +Package: cdrom-core-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-s390x-di, scsi-core-modules-4.19.0-8-s390x-di, isofs-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, scsi-core-modules-4.19.0-9-s390x-di, isofs-modules-4.19.0-9-s390x-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-s390x-di +Package: scsi-core-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: scsi-modules-4.19.0-8-s390x-di +Package: scsi-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-s390x-di, scsi-core-modules-4.19.0-8-s390x-di, cdrom-core-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, scsi-core-modules-4.19.0-9-s390x-di, cdrom-core-modules-4.19.0-9-s390x-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: loop-modules-4.19.0-8-s390x-di +Package: loop-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: btrfs-modules-4.19.0-8-s390x-di +Package: btrfs-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-s390x-di, crc-modules-4.19.0-8-s390x-di, zlib-modules-4.19.0-8-s390x-di, compress-modules-4.19.0-8-s390x-di, md-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, crc-modules-4.19.0-9-s390x-di, zlib-modules-4.19.0-9-s390x-di, compress-modules-4.19.0-9-s390x-di, md-modules-4.19.0-9-s390x-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: ext4-modules-4.19.0-8-s390x-di +Package: ext4-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-s390x-di, crc-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, crc-modules-4.19.0-9-s390x-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: isofs-modules-4.19.0-8-s390x-di +Package: isofs-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: xfs-modules-4.19.0-8-s390x-di +Package: xfs-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-s390x-di, crc-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, crc-modules-4.19.0-9-s390x-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: fat-modules-4.19.0-8-s390x-di +Package: fat-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: md-modules-4.19.0-8-s390x-di +Package: md-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-s390x-di, crc-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, crc-modules-4.19.0-9-s390x-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: multipath-modules-4.19.0-8-s390x-di +Package: multipath-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-s390x-di, md-modules-4.19.0-8-s390x-di, scsi-core-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, md-modules-4.19.0-9-s390x-di, scsi-core-modules-4.19.0-9-s390x-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: crc-modules-4.19.0-8-s390x-di +Package: crc-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: crypto-modules-4.19.0-8-s390x-di +Package: crypto-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-s390x-di +Package: crypto-dm-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-s390x-di, md-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, md-modules-4.19.0-9-s390x-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: nbd-modules-4.19.0-8-s390x-di +Package: nbd-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: zlib-modules-4.19.0-8-s390x-di +Package: zlib-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: compress-modules-4.19.0-8-s390x-di +Package: compress-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: udf-modules-4.19.0-8-s390x-di +Package: udf-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-s390x-di, crc-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, crc-modules-4.19.0-9-s390x-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: fuse-modules-4.19.0-8-s390x-di +Package: fuse-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: mtd-core-modules-4.19.0-8-s390x-di +Package: mtd-core-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: mtd-core-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: MTD core This package contains the MTD core. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: dasd-modules-4.19.0-8-s390x-di +Package: dasd-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: standard Provides: dasd-modules -Depends: kernel-image-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di Description: dasd modules This package contains dasd modules. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: dasd-extra-modules-4.19.0-8-s390x-di +Package: dasd-extra-modules-4.19.0-9-s390x-di Architecture: s390x Section: debian-installer Priority: optional Provides: dasd-extra-modules -Depends: kernel-image-4.19.0-8-s390x-di, dasd-modules-4.19.0-8-s390x-di +Depends: kernel-image-4.19.0-9-s390x-di, dasd-modules-4.19.0-9-s390x-di Description: optional dasd DIAG support This package contains the module for dasd DIAG support. The udeb is not loaded by default as the installer does not actually support this. It can however be useful to have available in rescue situations. Build-Profiles: -Kernel-Version: 4.19.0-8-s390x +Kernel-Version: 4.19.0-9-s390x Package-Type: udeb -Package: linux-image-4.19.0-8-s390x +Package: linux-image-4.19.0-9-s390x Architecture: s390x -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [s390x] | linux-initramfs-tool [s390x] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [s390x] | linux-initramfs-tool [s390x] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [s390x] Suggests: linux-doc-4.19, debian-kernel-handbook, s390-tools [s390x] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -12838,38 +12838,38 @@ The Linux kernel 4.19 and modules for use on IBM zSeries. Build-Profiles: -Package: linux-headers-4.19.0-8-s390x +Package: linux-headers-4.19.0-9-s390x Architecture: s390x -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-s390 -Description: Header files for Linux 4.19.0-8-s390x +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, linux-compiler-gcc-8-s390 +Description: Header files for Linux 4.19.0-9-s390x This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-s390x, generally used for building out-of-tree + Linux kernel 4.19.0-9-s390x, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-s390x, and can be used for building + /usr/src/linux-headers-4.19.0-9-s390x, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-s390x package. + linux-image-4.19.0-9-s390x package. Build-Profiles: -Package: linux-image-4.19.0-8-s390x-dbg +Package: linux-image-4.19.0-9-s390x-dbg Architecture: s390x Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-s390x +Description: Debug symbols for linux-image-4.19.0-9-s390x This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-s390x. + modules in linux-image-4.19.0-9-s390x. Build-Profiles: -Package: linux-headers-4.19.0-8-all-sh4 +Package: linux-headers-4.19.0-9-all-sh4 Architecture: sh4 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-sh7751r (= ${binary:Version}), linux-headers-4.19.0-8-sh7785lcr (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-sh7751r (= ${binary:Version}), linux-headers-4.19.0-9-sh7785lcr (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-sh7751r-di +Package: kernel-image-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard @@ -12879,398 +12879,398 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: nic-modules-4.19.0-8-sh7751r-di +Package: nic-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, nic-shared-modules-4.19.0-8-sh7751r-di, i2c-modules-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di, zlib-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, nic-shared-modules-4.19.0-9-sh7751r-di, i2c-modules-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di, zlib-modules-4.19.0-9-sh7751r-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-sh7751r-di +Package: nic-shared-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-sh7751r-di +Package: usb-serial-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: ppp-modules-4.19.0-8-sh7751r-di +Package: ppp-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, zlib-modules-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, zlib-modules-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: pata-modules-4.19.0-8-sh7751r-di +Package: pata-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-sh7751r-di +Package: cdrom-core-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, isofs-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, isofs-modules-4.19.0-9-sh7751r-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-sh7751r-di +Package: firewire-core-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: loop-modules-4.19.0-8-sh7751r-di +Package: loop-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: btrfs-modules-4.19.0-8-sh7751r-di +Package: btrfs-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di, zlib-modules-4.19.0-8-sh7751r-di, compress-modules-4.19.0-8-sh7751r-di, md-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di, zlib-modules-4.19.0-9-sh7751r-di, compress-modules-4.19.0-9-sh7751r-di, md-modules-4.19.0-9-sh7751r-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: ext4-modules-4.19.0-8-sh7751r-di +Package: ext4-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: isofs-modules-4.19.0-8-sh7751r-di +Package: isofs-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: jfs-modules-4.19.0-8-sh7751r-di +Package: jfs-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: xfs-modules-4.19.0-8-sh7751r-di +Package: xfs-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: fat-modules-4.19.0-8-sh7751r-di +Package: fat-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: minix-modules-4.19.0-8-sh7751r-di +Package: minix-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: minix-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: Minix filesystem support This package contains the Minix filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: md-modules-4.19.0-8-sh7751r-di +Package: md-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: multipath-modules-4.19.0-8-sh7751r-di +Package: multipath-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, md-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, md-modules-4.19.0-9-sh7751r-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-sh7751r-di +Package: usb-storage-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-sh7751r-di +Package: nic-usb-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, nic-shared-modules-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, nic-shared-modules-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: sata-modules-4.19.0-8-sh7751r-di +Package: sata-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: i2c-modules-4.19.0-8-sh7751r-di +Package: i2c-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: crc-modules-4.19.0-8-sh7751r-di +Package: crc-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: crypto-modules-4.19.0-8-sh7751r-di +Package: crypto-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-sh7751r-di +Package: crypto-dm-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, md-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, md-modules-4.19.0-9-sh7751r-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: nbd-modules-4.19.0-8-sh7751r-di +Package: nbd-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: squashfs-modules-4.19.0-8-sh7751r-di +Package: squashfs-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, compress-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, compress-modules-4.19.0-9-sh7751r-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: speakup-modules-4.19.0-8-sh7751r-di +Package: speakup-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: speakup-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: speakup modules This package contains speakup modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: sound-modules-4.19.0-8-sh7751r-di +Package: sound-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, i2c-modules-4.19.0-8-sh7751r-di, firewire-core-modules-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, i2c-modules-4.19.0-9-sh7751r-di, firewire-core-modules-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: zlib-modules-4.19.0-8-sh7751r-di +Package: zlib-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: compress-modules-4.19.0-8-sh7751r-di +Package: compress-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: udf-modules-4.19.0-8-sh7751r-di +Package: udf-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-sh7751r-di, crc-modules-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di, crc-modules-4.19.0-9-sh7751r-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: fuse-modules-4.19.0-8-sh7751r-di +Package: fuse-modules-4.19.0-9-sh7751r-di Architecture: sh4 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-sh7751r-di +Depends: kernel-image-4.19.0-9-sh7751r-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7751r +Kernel-Version: 4.19.0-9-sh7751r Package-Type: udeb -Package: kernel-image-4.19.0-8-sh7785lcr-di +Package: kernel-image-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard @@ -13280,376 +13280,376 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: nic-modules-4.19.0-8-sh7785lcr-di +Package: nic-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, nic-shared-modules-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di, zlib-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, nic-shared-modules-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di, zlib-modules-4.19.0-9-sh7785lcr-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-sh7785lcr-di +Package: nic-shared-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-sh7785lcr-di +Package: usb-serial-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: ppp-modules-4.19.0-8-sh7785lcr-di +Package: ppp-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, zlib-modules-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, zlib-modules-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: pata-modules-4.19.0-8-sh7785lcr-di +Package: pata-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-sh7785lcr-di +Package: cdrom-core-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, isofs-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, isofs-modules-4.19.0-9-sh7785lcr-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: firewire-core-modules-4.19.0-8-sh7785lcr-di +Package: firewire-core-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: firewire-core-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: Core FireWire drivers This package contains core FireWire drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: loop-modules-4.19.0-8-sh7785lcr-di +Package: loop-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: loop-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: Loopback filesystem support This package contains loopback filesystem support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: btrfs-modules-4.19.0-8-sh7785lcr-di +Package: btrfs-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di, zlib-modules-4.19.0-8-sh7785lcr-di, compress-modules-4.19.0-8-sh7785lcr-di, md-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di, zlib-modules-4.19.0-9-sh7785lcr-di, compress-modules-4.19.0-9-sh7785lcr-di, md-modules-4.19.0-9-sh7785lcr-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: ext4-modules-4.19.0-8-sh7785lcr-di +Package: ext4-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: isofs-modules-4.19.0-8-sh7785lcr-di +Package: isofs-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: jfs-modules-4.19.0-8-sh7785lcr-di +Package: jfs-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: xfs-modules-4.19.0-8-sh7785lcr-di +Package: xfs-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: fat-modules-4.19.0-8-sh7785lcr-di +Package: fat-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: minix-modules-4.19.0-8-sh7785lcr-di +Package: minix-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: minix-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: Minix filesystem support This package contains the Minix filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: md-modules-4.19.0-8-sh7785lcr-di +Package: md-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: multipath-modules-4.19.0-8-sh7785lcr-di +Package: multipath-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, md-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, md-modules-4.19.0-9-sh7785lcr-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-sh7785lcr-di +Package: nic-usb-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, nic-shared-modules-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, nic-shared-modules-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: sata-modules-4.19.0-8-sh7785lcr-di +Package: sata-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: crc-modules-4.19.0-8-sh7785lcr-di +Package: crc-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: crypto-modules-4.19.0-8-sh7785lcr-di +Package: crypto-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-sh7785lcr-di +Package: crypto-dm-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, md-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, md-modules-4.19.0-9-sh7785lcr-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: nbd-modules-4.19.0-8-sh7785lcr-di +Package: nbd-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: squashfs-modules-4.19.0-8-sh7785lcr-di +Package: squashfs-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, compress-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, compress-modules-4.19.0-9-sh7785lcr-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: speakup-modules-4.19.0-8-sh7785lcr-di +Package: speakup-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: speakup-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: speakup modules This package contains speakup modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: sound-modules-4.19.0-8-sh7785lcr-di +Package: sound-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: sound-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, firewire-core-modules-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, firewire-core-modules-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: sound support This package contains sound modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: zlib-modules-4.19.0-8-sh7785lcr-di +Package: zlib-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: compress-modules-4.19.0-8-sh7785lcr-di +Package: compress-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: udf-modules-4.19.0-8-sh7785lcr-di +Package: udf-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di, crc-modules-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di, crc-modules-4.19.0-9-sh7785lcr-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: fuse-modules-4.19.0-8-sh7785lcr-di +Package: fuse-modules-4.19.0-9-sh7785lcr-di Architecture: sh4 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-sh7785lcr-di +Depends: kernel-image-4.19.0-9-sh7785lcr-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-sh7785lcr +Kernel-Version: 4.19.0-9-sh7785lcr Package-Type: udeb -Package: linux-image-4.19.0-8-sh7751r +Package: linux-image-4.19.0-9-sh7751r Architecture: sh4 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sh4] | linux-initramfs-tool [sh4] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sh4] | linux-initramfs-tool [sh4] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [sh4] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -13658,31 +13658,31 @@ board. Build-Profiles: -Package: linux-headers-4.19.0-8-sh7751r +Package: linux-headers-4.19.0-9-sh7751r Architecture: sh4 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-sh7751r +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-sh7751r This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-sh7751r, generally used for building out-of-tree + Linux kernel 4.19.0-9-sh7751r, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-sh7751r, and can be used for building + /usr/src/linux-headers-4.19.0-9-sh7751r, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-sh7751r package. + linux-image-4.19.0-9-sh7751r package. Build-Profiles: -Package: linux-image-4.19.0-8-sh7751r-dbg +Package: linux-image-4.19.0-9-sh7751r-dbg Architecture: sh4 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-sh7751r +Description: Debug symbols for linux-image-4.19.0-9-sh7751r This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-sh7751r. + modules in linux-image-4.19.0-9-sh7751r. Build-Profiles: -Package: linux-image-4.19.0-8-sh7785lcr +Package: linux-image-4.19.0-9-sh7785lcr Architecture: sh4 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sh4] | linux-initramfs-tool [sh4] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sh4] | linux-initramfs-tool [sh4] Recommends: firmware-linux-free, ${kernel:Recommends}, u-boot-tools [sh4], apparmor [sh4] Suggests: linux-doc-4.19, debian-kernel-handbook Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -13691,38 +13691,38 @@ board. Build-Profiles: -Package: linux-headers-4.19.0-8-sh7785lcr +Package: linux-headers-4.19.0-9-sh7785lcr Architecture: sh4 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-sh7785lcr +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-sh7785lcr This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-sh7785lcr, generally used for building out-of-tree + Linux kernel 4.19.0-9-sh7785lcr, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-sh7785lcr, and can be used for building + /usr/src/linux-headers-4.19.0-9-sh7785lcr, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-sh7785lcr package. + linux-image-4.19.0-9-sh7785lcr package. Build-Profiles: -Package: linux-image-4.19.0-8-sh7785lcr-dbg +Package: linux-image-4.19.0-9-sh7785lcr-dbg Architecture: sh4 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-sh7785lcr +Description: Debug symbols for linux-image-4.19.0-9-sh7785lcr This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-sh7785lcr. + modules in linux-image-4.19.0-9-sh7785lcr. Build-Profiles: -Package: linux-headers-4.19.0-8-all-sparc64 +Package: linux-headers-4.19.0-9-all-sparc64 Architecture: sparc64 -Depends: ${misc:Depends}, linux-headers-4.19.0-8-sparc64 (= ${binary:Version}), linux-headers-4.19.0-8-sparc64-smp (= ${binary:Version}) +Depends: ${misc:Depends}, linux-headers-4.19.0-9-sparc64 (= ${binary:Version}), linux-headers-4.19.0-9-sparc64-smp (= ${binary:Version}) Description: All header files for Linux 4.19 (meta-package) This package depends against all architecture-specific kernel header files for Linux kernel version 4.19, generally used for building out-of-tree kernel modules. Build-Profiles: -Package: kernel-image-4.19.0-8-sparc64-di +Package: kernel-image-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard @@ -13732,425 +13732,425 @@ installer boot images. It does _not_ provide a usable kernel for your full Debian system. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: nic-modules-4.19.0-8-sparc64-di +Package: nic-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: nic-modules, nic-extra-modules -Depends: kernel-image-4.19.0-8-sparc64-di, nic-shared-modules-4.19.0-8-sparc64-di, i2c-modules-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di, zlib-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, nic-shared-modules-4.19.0-9-sparc64-di, i2c-modules-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di, zlib-modules-4.19.0-9-sparc64-di Description: NIC drivers This package contains Ethernet and some paravirtualised network drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: nic-shared-modules-4.19.0-8-sparc64-di +Package: nic-shared-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: nic-shared-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: Shared NIC drivers This package contains NIC drivers needed by combinations of nic-modules, nic-pcmcia-modules, nic-usb-modules and nic-wireless-modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: usb-serial-modules-4.19.0-8-sparc64-di +Package: usb-serial-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: usb-serial-modules -Depends: kernel-image-4.19.0-8-sparc64-di, usb-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, usb-modules-4.19.0-9-sparc64-di Description: USB serial drivers This package contains USB serial drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: ppp-modules-4.19.0-8-sparc64-di +Package: ppp-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: ppp-modules -Depends: kernel-image-4.19.0-8-sparc64-di, zlib-modules-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, zlib-modules-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di Description: PPP drivers This package contains PPP drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: pata-modules-4.19.0-8-sparc64-di +Package: pata-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: pata-modules -Depends: kernel-image-4.19.0-8-sparc64-di, ata-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, ata-modules-4.19.0-9-sparc64-di Description: PATA drivers This package contains PATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: cdrom-core-modules-4.19.0-8-sparc64-di +Package: cdrom-core-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: cdrom-core-modules -Depends: kernel-image-4.19.0-8-sparc64-di, scsi-core-modules-4.19.0-8-sparc64-di, isofs-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, scsi-core-modules-4.19.0-9-sparc64-di, isofs-modules-4.19.0-9-sparc64-di Description: CDROM support This package contains core CDROM support for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: scsi-core-modules-4.19.0-8-sparc64-di +Package: scsi-core-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: scsi-core-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: Core SCSI subsystem This package contains the core SCSI subsystem for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: scsi-modules-4.19.0-8-sparc64-di +Package: scsi-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: scsi-modules -Depends: kernel-image-4.19.0-8-sparc64-di, scsi-core-modules-4.19.0-8-sparc64-di, cdrom-core-modules-4.19.0-8-sparc64-di, ata-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, scsi-core-modules-4.19.0-9-sparc64-di, cdrom-core-modules-4.19.0-9-sparc64-di, ata-modules-4.19.0-9-sparc64-di Description: SCSI drivers This package contains SCSI drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: btrfs-modules-4.19.0-8-sparc64-di +Package: btrfs-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: btrfs-modules -Depends: kernel-image-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di, zlib-modules-4.19.0-8-sparc64-di, compress-modules-4.19.0-8-sparc64-di, md-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di, zlib-modules-4.19.0-9-sparc64-di, compress-modules-4.19.0-9-sparc64-di, md-modules-4.19.0-9-sparc64-di Description: BTRFS filesystem support This package contains the BTRFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: ext4-modules-4.19.0-8-sparc64-di +Package: ext4-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: ext4-modules, ext2-modules, ext3-modules -Depends: kernel-image-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di Description: ext2/ext3/ext4 filesystem support This package contains the ext4 filesystem module for the kernel, which also supports ext2 and ext3. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: isofs-modules-4.19.0-8-sparc64-di +Package: isofs-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: isofs-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: ISOFS filesystem support This package contains the ISOFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: jfs-modules-4.19.0-8-sparc64-di +Package: jfs-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: jfs-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: JFS filesystem support This package contains the JFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: ufs-modules-4.19.0-8-sparc64-di +Package: ufs-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: ufs-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: UFS filesystem support This package contains the UFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: xfs-modules-4.19.0-8-sparc64-di +Package: xfs-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: xfs-modules -Depends: kernel-image-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di Description: XFS filesystem support This package contains the XFS filesystem module for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: fat-modules-4.19.0-8-sparc64-di +Package: fat-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: fat-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: FAT filesystem support This package contains the FAT and VFAT filesystem modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: md-modules-4.19.0-8-sparc64-di +Package: md-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: md-modules -Depends: kernel-image-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di Description: RAID and LVM support This package contains RAID and LVM modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: multipath-modules-4.19.0-8-sparc64-di +Package: multipath-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: multipath-modules -Depends: kernel-image-4.19.0-8-sparc64-di, md-modules-4.19.0-8-sparc64-di, scsi-core-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, md-modules-4.19.0-9-sparc64-di, scsi-core-modules-4.19.0-9-sparc64-di Description: Multipath support This package contains DM-Multipath modules for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: usb-modules-4.19.0-8-sparc64-di +Package: usb-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: usb-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: USB support This package contains core USB drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: usb-storage-modules-4.19.0-8-sparc64-di +Package: usb-storage-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: usb-storage-modules -Depends: kernel-image-4.19.0-8-sparc64-di, scsi-core-modules-4.19.0-8-sparc64-di, usb-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, scsi-core-modules-4.19.0-9-sparc64-di, usb-modules-4.19.0-9-sparc64-di Description: USB storage support This package contains the USB storage driver for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: fb-modules-4.19.0-8-sparc64-di +Package: fb-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: fb-modules -Depends: kernel-image-4.19.0-8-sparc64-di, i2c-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, i2c-modules-4.19.0-9-sparc64-di Description: Frame buffer support This package contains Frame buffer drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: input-modules-4.19.0-8-sparc64-di +Package: input-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: input-modules -Depends: kernel-image-4.19.0-8-sparc64-di, usb-modules-4.19.0-8-sparc64-di, i2c-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, usb-modules-4.19.0-9-sparc64-di, i2c-modules-4.19.0-9-sparc64-di Description: Input devices support This package contains input device drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: nic-usb-modules-4.19.0-8-sparc64-di +Package: nic-usb-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: nic-usb-modules -Depends: kernel-image-4.19.0-8-sparc64-di, nic-shared-modules-4.19.0-8-sparc64-di, usb-modules-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, nic-shared-modules-4.19.0-9-sparc64-di, usb-modules-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di Description: USB NIC drivers This package contains USB network adapter drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: sata-modules-4.19.0-8-sparc64-di +Package: sata-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: standard Provides: sata-modules -Depends: kernel-image-4.19.0-8-sparc64-di, scsi-core-modules-4.19.0-8-sparc64-di, ata-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, scsi-core-modules-4.19.0-9-sparc64-di, ata-modules-4.19.0-9-sparc64-di Description: SATA drivers This package contains SATA drivers for the kernel. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: i2c-modules-4.19.0-8-sparc64-di +Package: i2c-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: i2c-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: i2c support modules This package contains basic i2c support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: crc-modules-4.19.0-8-sparc64-di +Package: crc-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: crc-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: CRC modules This package contains CRC support modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: crypto-modules-4.19.0-8-sparc64-di +Package: crypto-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: crypto-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: crypto modules This package contains crypto modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: crypto-dm-modules-4.19.0-8-sparc64-di +Package: crypto-dm-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: crypto-dm-modules -Depends: kernel-image-4.19.0-8-sparc64-di, md-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, md-modules-4.19.0-9-sparc64-di Description: devicemapper crypto module This package contains the devicemapper crypto (dm-crypt) module. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: ata-modules-4.19.0-8-sparc64-di +Package: ata-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: ata-modules -Depends: kernel-image-4.19.0-8-sparc64-di, scsi-core-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, scsi-core-modules-4.19.0-9-sparc64-di Description: ATA disk modules This package contains core ATA disk modules used by both PATA and SATA disk drivers. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: nbd-modules-4.19.0-8-sparc64-di +Package: nbd-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: nbd-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: Network Block Device modules This package contains the modules required for support of the Network Block Device Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: squashfs-modules-4.19.0-8-sparc64-di +Package: squashfs-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: squashfs-modules -Depends: kernel-image-4.19.0-8-sparc64-di, compress-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, compress-modules-4.19.0-9-sparc64-di Description: squashfs modules This package contains squashfs modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: zlib-modules-4.19.0-8-sparc64-di +Package: zlib-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: zlib-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: zlib modules This package contains zlib modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: compress-modules-4.19.0-8-sparc64-di +Package: compress-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: compress-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: lzo modules This package contains lzo modules. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: udf-modules-4.19.0-8-sparc64-di +Package: udf-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: udf-modules -Depends: kernel-image-4.19.0-8-sparc64-di, crc-modules-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di, crc-modules-4.19.0-9-sparc64-di Description: UDF modules This package contains the UDF filesystem module. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: fuse-modules-4.19.0-8-sparc64-di +Package: fuse-modules-4.19.0-9-sparc64-di Architecture: sparc64 Section: debian-installer Priority: optional Provides: fuse-modules -Depends: kernel-image-4.19.0-8-sparc64-di +Depends: kernel-image-4.19.0-9-sparc64-di Description: FUSE modules This package contains the Filesystem in Userspace (FUSE) module. Build-Profiles: -Kernel-Version: 4.19.0-8-sparc64 +Kernel-Version: 4.19.0-9-sparc64 Package-Type: udeb -Package: linux-image-4.19.0-8-sparc64 +Package: linux-image-4.19.0-9-sparc64 Architecture: sparc64 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sparc64] | linux-initramfs-tool [sparc64] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sparc64] | linux-initramfs-tool [sparc64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [sparc64] Suggests: linux-doc-4.19, debian-kernel-handbook, fdutils [sparc64], grub-ieee1275 [sparc64] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -14159,31 +14159,31 @@ UltraSPARC. Build-Profiles: -Package: linux-headers-4.19.0-8-sparc64 +Package: linux-headers-4.19.0-9-sparc64 Architecture: sparc64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-sparc64 +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-sparc64 This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-sparc64, generally used for building out-of-tree + Linux kernel 4.19.0-9-sparc64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-sparc64, and can be used for building + /usr/src/linux-headers-4.19.0-9-sparc64, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-sparc64 package. + linux-image-4.19.0-9-sparc64 package. Build-Profiles: -Package: linux-image-4.19.0-8-sparc64-dbg +Package: linux-image-4.19.0-9-sparc64-dbg Architecture: sparc64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-sparc64 +Description: Debug symbols for linux-image-4.19.0-9-sparc64 This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-sparc64. + modules in linux-image-4.19.0-9-sparc64. Build-Profiles: -Package: linux-image-4.19.0-8-sparc64-smp +Package: linux-image-4.19.0-9-sparc64-smp Architecture: sparc64 -Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-8 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sparc64] | linux-initramfs-tool [sparc64] +Depends: kmod, linux-base (>= 4.3~), linux-bootwrapper-4.19.0-9 [powerpc powerpcspe ppc64], ${misc:Depends}, initramfs-tools (>= 0.120+deb8u2) [sparc64] | linux-initramfs-tool [sparc64] Recommends: firmware-linux-free, ${kernel:Recommends}, apparmor [sparc64] Suggests: linux-doc-4.19, debian-kernel-handbook, fdutils [sparc64], grub-ieee1275 [sparc64] Breaks: initramfs-tools (<< 0.120+deb8u2) @@ -14192,26 +14192,26 @@ UltraSPARC. Build-Profiles: -Package: linux-headers-4.19.0-8-sparc64-smp +Package: linux-headers-4.19.0-9-sparc64-smp Architecture: sparc64 -Depends: linux-headers-4.19.0-8-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 -Description: Header files for Linux 4.19.0-8-sparc64-smp +Depends: linux-headers-4.19.0-9-common (= ${source:Version}), linux-kbuild-4.19 (>= ${source:Version}), ${misc:Depends}, gcc-8 +Description: Header files for Linux 4.19.0-9-sparc64-smp This package provides the architecture-specific kernel header files for - Linux kernel 4.19.0-8-sparc64-smp, generally used for building out-of-tree + Linux kernel 4.19.0-9-sparc64-smp, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-4.19.0-8-sparc64-smp, and can be used for building + /usr/src/linux-headers-4.19.0-9-sparc64-smp, and can be used for building modules that load into the kernel provided by the - linux-image-4.19.0-8-sparc64-smp package. + linux-image-4.19.0-9-sparc64-smp package. Build-Profiles: -Package: linux-image-4.19.0-8-sparc64-smp-dbg +Package: linux-image-4.19.0-9-sparc64-smp-dbg Architecture: sparc64 Section: debug Priority: optional Depends: ${misc:Depends} -Description: Debug symbols for linux-image-4.19.0-8-sparc64-smp +Description: Debug symbols for linux-image-4.19.0-9-sparc64-smp This package provides the detached debug symbols for the Linux kernel and - modules in linux-image-4.19.0-8-sparc64-smp. + modules in linux-image-4.19.0-9-sparc64-smp. Build-Profiles: Package: linux-compiler-gcc-8-arm diff -Nru linux-4.19.98/debian/control.md5sum linux-4.19.118/debian/control.md5sum --- linux-4.19.98/debian/control.md5sum 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/control.md5sum 2020-04-26 13:04:11.000000000 +0000 @@ -1,22 +1,22 @@ ee4a1d15d41bf60863ffc0d86d4b4891 debian/bin/gencontrol.py -a7c77bcc1330e01ec3038f252e05a86b debian/build/version-info -eda4623fb10d5ba1cefa8502ebaeb0fd debian/templates/control.image-dbg.in +8271331654256a16c089aa9624369139 debian/build/version-info 74b180a87aa1f6377d9bf8a10368c657 debian/templates/control.main.in +1cfc49a285f1f37ce6415e811e5c737f debian/templates/control.image-unsigned.in 38004750aa03cea41d5d3aeafff16fcc debian/templates/image.preinst.in 3d6ea66d97556f7eb398e41faebf3be6 debian/templates/control.tools-unversioned.in +63c0d01ea032d0acfa5e069d31daa938 debian/templates/control.libc-dev.in afb508873a44a1f196c2a525fec4b415 debian/templates/image.prerm.in 1a0473417ce134da9b488c503d66f9b1 debian/templates/control.tools-versioned.in -a4a60fc48b3240e46bbac6a1ddcaad30 debian/templates/image.postrm.in -63c0d01ea032d0acfa5e069d31daa938 debian/templates/control.libc-dev.in -befa899554918fd2a5264e5dca3c4eef debian/templates/tests-control.main.in -54426b6625c1bbf41ff6e05eebc06f89 debian/templates/image-dbg.lintian-overrides.in 0d7f6ea42f52d0a6013535a80111ee3e debian/templates/headers.postinst.in +814dda166c7e3ef02e6e259e805ac66a debian/templates/tests-control.image.in +befa899554918fd2a5264e5dca3c4eef debian/templates/tests-control.main.in +a4a60fc48b3240e46bbac6a1ddcaad30 debian/templates/image.postrm.in 51797b6c275eb14e99009e78553904cc debian/templates/perf.lintian-overrides.in b5b99078d7e73c15ac6055496e33d1ec debian/templates/control.sourcebin.in 57685436e079bbef4f8bb6e8a2dfbf1b debian/templates/control.signed-template.in -1cfc49a285f1f37ce6415e811e5c737f debian/templates/control.image-unsigned.in +54426b6625c1bbf41ff6e05eebc06f89 debian/templates/image-dbg.lintian-overrides.in 6acf93bb834dbe7609078d723a8cc13c debian/templates/control.image.in -814dda166c7e3ef02e6e259e805ac66a debian/templates/tests-control.image.in +eda4623fb10d5ba1cefa8502ebaeb0fd debian/templates/control.image-dbg.in 0e337736e8bfdb338bb59db2379488f8 debian/templates/control.source.in 6fea4e452a7a77e7063bb17051fff3a7 debian/templates/control.docs.in 578bb70eb1ed930f2cf8a774666b747f debian/templates/control.headers.featureset.in @@ -25,7 +25,7 @@ 0c86e2579f89e94a6cd144eb98593a5b debian/templates/control.extra.in fe4456d48e3218fb8980c8577d03a7ae debian/templates/control.config.in 103ea5fb237e376b511ba638afc41837 debian/templates/control.headers.arch.in -fe6480aadd1dd54f8a6be98596fc9a55 debian/config/defines +334fdefa84d0804cb0ec672010528eeb debian/config/defines 151f2a989308056668d9a162a321c32a debian/config/i386/defines d08ab699e6a25ec0da4cb70efc0f2288 debian/config/ppc64el/defines 32e264f468daa991fa1bafce9e1eee3c debian/config/mips64el/defines @@ -35,27 +35,27 @@ 6a030dc96bbeb2340082dc7c5c67a640 debian/config/amd64/defines 1f1ed4a31b20a1ab483dd1357b30ed76 debian/config/mipsr6el/defines b1750f23dea19ed03c8382341c924b53 debian/config/mips/defines -e0810ddd6e4add2a26c5668773b69d25 debian/config/sh4/defines 3f9e6c98b1abe4a32b12add5d1ada119 debian/config/arm64/defines e411d2dfe0018a7c40b6bf7efd45cd29 debian/config/mipsn32/defines +3b09058af262b2c63d9cfcf45f0089e4 debian/config/powerpcspe/defines 174058e52aced932bf02606d6cb5649c debian/config/mipsn32el/defines 366b94d652a66b437eabcd165bcc9610 debian/config/featureset-rt/defines +7291bfe9ad6a3a16664230d185552d82 debian/config/riscv64/defines 8d317c1872f3bd8da4feae25a7c61df3 debian/config/sparc/defines -45a4ad93313c2066248987dfa59dd6da debian/config/powerpc/defines +d26ac56948a79e6d37f7673073132de5 debian/config/s390x/defines 02b96ff7eaa79ca2716eedf529222c58 debian/config/ppc64/defines f4b2921156e7b1a038862f848fdfe48f debian/config/x32/defines f425752f612c3c6693bc47c205dbf737 debian/config/mips64/defines b3ef14a93ef9602bf951f55f806e2f6c debian/config/sparc64/defines f53e736263ada56088198fd8598fe31a debian/config/mipsel/defines -7291bfe9ad6a3a16664230d185552d82 debian/config/riscv64/defines -51fa9bda1954320723c7c7daf42471a5 debian/config/hppa/defines -3b09058af262b2c63d9cfcf45f0089e4 debian/config/powerpcspe/defines +e0810ddd6e4add2a26c5668773b69d25 debian/config/sh4/defines 47420e11eaad5f5ffd20b01b549696a8 debian/config/m68k/defines -d26ac56948a79e6d37f7673073132de5 debian/config/s390x/defines 35e886ad30d213e86b340eb759d25e0d debian/config/ia64/defines 882fb0fec3cbd0239817994223fa71e5 debian/config/mipsn32r6/defines da871dd4234a8d1ed82d76fa536fa411 debian/config/alpha/defines 73e2f095b2485f95bc164bf685684a47 debian/config/mipsn32r6el/defines +51fa9bda1954320723c7c7daf42471a5 debian/config/hppa/defines +45a4ad93313c2066248987dfa59dd6da debian/config/powerpc/defines 193b542830508cb812da06dfa0feddd2 debian/config/armel/defines 2f649099bc889fdbccc9b2f72305681c debian/config/mips64r6/defines 3e673c1434c6132c73c0cfb4bfe38763 debian/config/arm64ilp32/defines diff -Nru linux-4.19.98/debian/installer/modules/arm64/fb-modules linux-4.19.118/debian/installer/modules/arm64/fb-modules --- linux-4.19.98/debian/installer/modules/arm64/fb-modules 2020-01-23 23:02:54.000000000 +0000 +++ linux-4.19.118/debian/installer/modules/arm64/fb-modules 2020-04-17 00:32:09.000000000 +0000 @@ -3,6 +3,7 @@ ast tegra-drm rockchipdrm +hibmc-drm # For panel/backlight on some chromeos devices panel-simple diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-4kc-malta.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-4kc-malta.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-4kc-malta.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-4kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-4kc-malta"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-5kc-malta.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-5kc-malta.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-5kc-malta.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-5kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-5kc-malta"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-686-pae.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-686-pae.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-686-pae.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-686-pae.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-686-pae"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-686.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-686.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-686.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-686.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-686"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-alpha-generic.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-alpha-generic.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-alpha-generic.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-alpha-generic.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-alpha-generic"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-alpha-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-alpha-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-alpha-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-alpha-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-alpha-smp"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-amd64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-amd64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-amd64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-amd64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-arm64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-arm64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-arm64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-arm64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-arm64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-armmp-lpae.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-armmp-lpae.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-armmp-lpae.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-armmp-lpae.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-armmp-lpae"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-armmp.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-armmp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-armmp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-armmp"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-cloud-amd64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-cloud-amd64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-cloud-amd64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-cloud-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-cloud-amd64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-itanium.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-itanium.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-itanium.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-itanium.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-itanium"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-loongson-3.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-loongson-3.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-loongson-3.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-loongson-3.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-loongson-3"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-m68k.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-m68k.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-m68k.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-m68k.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-m68k"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-marvell.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-marvell.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-marvell.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-marvell.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-marvell"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-mckinley.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-mckinley.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-mckinley.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-mckinley.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-mckinley"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-mips32r6.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-mips32r6.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-mips32r6.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-mips32r6.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-mips32r6"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-mips32r6el.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-mips32r6el.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-mips32r6el.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-mips32r6el.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-mips32r6el"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-mips64r6.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-mips64r6.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-mips64r6.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-mips64r6.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-mips64r6"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-mips64r6el.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-mips64r6el.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-mips64r6el.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-mips64r6el.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-mips64r6el"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-octeon.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-octeon.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-octeon.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-octeon.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-octeon"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-parisc-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-parisc-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-parisc-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-parisc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-parisc-smp"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-parisc.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-parisc.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-parisc.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-parisc.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-parisc"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-parisc64-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-parisc64-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-parisc64-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-parisc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-parisc64-smp"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-powerpc-smp"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-powerpc"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-powerpc64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc64le.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc64le.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-powerpc64le.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-powerpc64le.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-powerpc64le"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-powerpcspe.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-powerpcspe.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-powerpcspe.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-powerpcspe.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-powerpcspe"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-riscv64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-riscv64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-riscv64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-riscv64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-riscv64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-rpi.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-rpi.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-rpi.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-rpi.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-rpi"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-rt-686-pae.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-rt-686-pae.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-rt-686-pae.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-rt-686-pae.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-rt-686-pae"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-rt-amd64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-rt-amd64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-rt-amd64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-rt-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-rt-amd64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-rt-arm64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-rt-arm64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-rt-arm64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-rt-arm64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-rt-arm64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-rt-armmp.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-rt-armmp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-rt-armmp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-rt-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-rt-armmp"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-s390x.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-s390x.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-s390x.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-s390x.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-s390x"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-sh7751r.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-sh7751r.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-sh7751r.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-sh7751r.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-sh7751r"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-sh7785lcr.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-sh7785lcr.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-sh7785lcr.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-sh7785lcr.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-sh7785lcr"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-sparc64-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-sparc64-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-sparc64-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-sparc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-sparc64-smp"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-8-sparc64.postinst linux-4.19.118/debian/linux-headers-4.19.0-8-sparc64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-8-sparc64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-8-sparc64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "4.19.0-8-sparc64"; - -if (-d "/etc/kernel/header_postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -exit 0; - -__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-4kc-malta.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-4kc-malta.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-4kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-4kc-malta.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-4kc-malta"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-5kc-malta.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-5kc-malta.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-5kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-5kc-malta.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-5kc-malta"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-686-pae.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-686-pae.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-686-pae.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-686-pae.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-686-pae"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-686.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-686.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-686.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-686.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-686"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-alpha-generic.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-alpha-generic.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-alpha-generic.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-alpha-generic.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-alpha-generic"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-alpha-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-alpha-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-alpha-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-alpha-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-alpha-smp"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-amd64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-amd64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-amd64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-amd64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-arm64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-arm64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-arm64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-arm64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-arm64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-armmp-lpae.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-armmp-lpae.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-armmp-lpae.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-armmp-lpae.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-armmp-lpae"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-armmp.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-armmp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-armmp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-armmp"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-cloud-amd64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-cloud-amd64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-cloud-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-cloud-amd64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-cloud-amd64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-itanium.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-itanium.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-itanium.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-itanium.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-itanium"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-loongson-3.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-loongson-3.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-loongson-3.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-loongson-3.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-loongson-3"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-m68k.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-m68k.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-m68k.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-m68k.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-m68k"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-marvell.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-marvell.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-marvell.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-marvell.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-marvell"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-mckinley.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-mckinley.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-mckinley.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-mckinley.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-mckinley"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-mips32r6.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-mips32r6.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-mips32r6.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-mips32r6.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-mips32r6"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-mips32r6el.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-mips32r6el.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-mips32r6el.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-mips32r6el.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-mips32r6el"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-mips64r6.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-mips64r6.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-mips64r6.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-mips64r6.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-mips64r6"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-mips64r6el.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-mips64r6el.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-mips64r6el.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-mips64r6el.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-mips64r6el"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-octeon.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-octeon.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-octeon.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-octeon.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-octeon"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-parisc-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-parisc-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-parisc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-parisc-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-parisc-smp"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-parisc.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-parisc.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-parisc.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-parisc.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-parisc"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-parisc64-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-parisc64-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-parisc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-parisc64-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-parisc64-smp"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-powerpc-smp"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-powerpc"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-powerpc64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc64le.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc64le.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-powerpc64le.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-powerpc64le.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-powerpc64le"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-powerpcspe.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-powerpcspe.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-powerpcspe.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-powerpcspe.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-powerpcspe"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-riscv64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-riscv64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-riscv64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-riscv64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-riscv64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-rpi.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-rpi.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-rpi.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-rpi.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-rpi"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-rt-686-pae.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-rt-686-pae.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-rt-686-pae.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-rt-686-pae.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-rt-686-pae"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-rt-amd64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-rt-amd64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-rt-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-rt-amd64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-rt-amd64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-rt-arm64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-rt-arm64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-rt-arm64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-rt-arm64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-rt-arm64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-rt-armmp.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-rt-armmp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-rt-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-rt-armmp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-rt-armmp"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-s390x.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-s390x.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-s390x.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-s390x.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-s390x"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-sh7751r.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-sh7751r.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-sh7751r.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-sh7751r.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-sh7751r"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-sh7785lcr.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-sh7785lcr.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-sh7785lcr.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-sh7785lcr.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-sh7785lcr"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-sparc64-smp.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-sparc64-smp.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-sparc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-sparc64-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-sparc64-smp"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-headers-4.19.0-9-sparc64.postinst linux-4.19.118/debian/linux-headers-4.19.0-9-sparc64.postinst --- linux-4.19.98/debian/linux-headers-4.19.0-9-sparc64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-headers-4.19.0-9-sparc64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "4.19.0-9-sparc64"; + +if (-d "/etc/kernel/header_postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +exit 0; + +__END__ diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-4kc-malta-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-4kc-malta/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-4kc-malta/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-4kc-malta/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-4kc-malta/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-4kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-4kc-malta/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-4kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-4kc-malta/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.postinst linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-4kc-malta -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.postrm linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-4kc-malta -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.preinst linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-4kc-malta -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.prerm linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-4kc-malta.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-4kc-malta.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-4kc-malta -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-5kc-malta-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-5kc-malta/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-5kc-malta/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-5kc-malta/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-5kc-malta/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-5kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-5kc-malta/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-5kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-5kc-malta/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.postinst linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-5kc-malta -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.postrm linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-5kc-malta -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.preinst linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-5kc-malta -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.prerm linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-5kc-malta.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-5kc-malta.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-5kc-malta -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-686-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-686-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-686-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-686-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-686/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-686-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-686/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-686-pae-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686-pae/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686-pae/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686-pae/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-686-pae/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-686-pae/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-686-pae/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686-pae -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686-pae -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686-pae -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-686-pae-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-pae-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686-pae -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686 -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686 -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686 -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-686-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-686-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-686 -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-alpha-generic-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-generic/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-generic/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-generic/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-generic/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-alpha-generic-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-alpha-generic/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-alpha-generic-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-alpha-generic/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.postinst linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-generic -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.postrm linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-generic -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.preinst linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-generic -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.prerm linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-generic.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-generic.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-generic -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-alpha-smp-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-smp/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-smp/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-smp/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-alpha-smp/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-alpha-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-alpha-smp/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-alpha-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-alpha-smp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-smp -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-alpha-smp.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-alpha-smp.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-alpha-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-amd64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-amd64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-amd64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-amd64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-amd64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-amd64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-amd64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-amd64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-amd64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-amd64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-amd64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-amd64 -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-amd64-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-amd64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-arm64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-arm64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-arm64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-arm64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-arm64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-arm64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-arm64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-arm64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-arm64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-arm64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-arm64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-arm64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-arm64 -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-arm64 -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-arm64-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-arm64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-arm64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-armmp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-armmp-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-armmp/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-armmp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-armmp-lpae-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp-lpae/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp-lpae/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp-lpae/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-armmp-lpae/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-armmp-lpae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-armmp-lpae/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-armmp-lpae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-armmp-lpae/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.postinst linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp-lpae -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.postrm linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp-lpae -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.preinst linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp-lpae -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.prerm linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp-lpae.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp-lpae.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp-lpae -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp.postinst linux-4.19.118/debian/linux-image-4.19.0-8-armmp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp.postrm linux-4.19.118/debian/linux-image-4.19.0-8-armmp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp.preinst linux-4.19.118/debian/linux-image-4.19.0-8-armmp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-armmp.prerm linux-4.19.118/debian/linux-image-4.19.0-8-armmp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-armmp.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-armmp.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-armmp -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-cloud-amd64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-cloud-amd64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-cloud-amd64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-cloud-amd64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-cloud-amd64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-cloud-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-cloud-amd64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-cloud-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-cloud-amd64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-cloud-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-cloud-amd64 -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-cloud-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-cloud-amd64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-cloud-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-itanium-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-itanium-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-itanium-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-itanium-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-itanium-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-itanium/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-itanium/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-itanium/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-itanium/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-itanium-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-itanium/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-itanium-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-itanium/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-itanium.postinst linux-4.19.118/debian/linux-image-4.19.0-8-itanium.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-itanium.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-itanium.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-itanium -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-itanium.postrm linux-4.19.118/debian/linux-image-4.19.0-8-itanium.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-itanium.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-itanium.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-itanium -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-itanium.preinst linux-4.19.118/debian/linux-image-4.19.0-8-itanium.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-itanium.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-itanium.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-itanium -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-itanium.prerm linux-4.19.118/debian/linux-image-4.19.0-8-itanium.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-itanium.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-itanium.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-itanium -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-loongson-3-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-loongson-3/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-loongson-3/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-loongson-3/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-loongson-3/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-loongson-3-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-loongson-3/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-loongson-3-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-loongson-3/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.postinst linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-loongson-3 -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.postrm linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-loongson-3 -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.preinst linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-loongson-3 -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.prerm linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-loongson-3.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-loongson-3.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-loongson-3 -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-m68k-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-m68k-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-m68k-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-m68k-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-m68k-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-m68k/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-m68k/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-m68k/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-m68k/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-m68k-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-m68k/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-m68k-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-m68k/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-m68k.postinst linux-4.19.118/debian/linux-image-4.19.0-8-m68k.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-m68k.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-m68k.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-m68k -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-m68k.postrm linux-4.19.118/debian/linux-image-4.19.0-8-m68k.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-m68k.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-m68k.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-m68k -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-m68k.preinst linux-4.19.118/debian/linux-image-4.19.0-8-m68k.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-m68k.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-m68k.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-m68k -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-m68k.prerm linux-4.19.118/debian/linux-image-4.19.0-8-m68k.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-m68k.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-m68k.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-m68k -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-marvell-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-marvell-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-marvell-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-marvell-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-marvell-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-marvell/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-marvell/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-marvell/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-marvell/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-marvell-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-marvell/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-marvell-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-marvell/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-marvell.postinst linux-4.19.118/debian/linux-image-4.19.0-8-marvell.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-marvell.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-marvell.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-marvell -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-marvell.postrm linux-4.19.118/debian/linux-image-4.19.0-8-marvell.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-marvell.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-marvell.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-marvell -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-marvell.preinst linux-4.19.118/debian/linux-image-4.19.0-8-marvell.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-marvell.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-marvell.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-marvell -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-marvell.prerm linux-4.19.118/debian/linux-image-4.19.0-8-marvell.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-marvell.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-marvell.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-marvell -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mckinley-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-mckinley-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-mckinley-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mckinley-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-mckinley-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mckinley/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mckinley/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mckinley/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mckinley/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-mckinley-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mckinley/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-mckinley-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mckinley/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.postinst linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mckinley -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.postrm linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mckinley -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.preinst linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mckinley -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.prerm linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-mckinley.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mckinley.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mckinley -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-mips32r6-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips32r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips32r6/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-mips32r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips32r6/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.postinst linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6 -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.postrm linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6 -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.preinst linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6 -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.prerm linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6 -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-mips32r6el-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6el/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6el/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6el/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips32r6el/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips32r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips32r6el/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-mips32r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips32r6el/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.postinst linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6el -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.postrm linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6el -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.preinst linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6el -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.prerm linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips32r6el.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips32r6el.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips32r6el -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-mips64r6-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips64r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips64r6/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-mips64r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips64r6/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.postinst linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6 -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.postrm linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6 -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.preinst linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6 -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.prerm linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6 -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-mips64r6el-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6el/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6el/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6el/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-mips64r6el/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-mips64r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips64r6el/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-mips64r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-mips64r6el/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.postinst linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6el -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.postrm linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6el -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.preinst linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6el -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.prerm linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-mips64r6el.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-mips64r6el.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-mips64r6el -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-octeon-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-octeon-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-octeon-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-octeon-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-octeon-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-octeon/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-octeon/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-octeon/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-octeon/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-octeon-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-octeon/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-octeon-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-octeon/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-octeon.postinst linux-4.19.118/debian/linux-image-4.19.0-8-octeon.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-octeon.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-octeon.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-octeon -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-octeon.postrm linux-4.19.118/debian/linux-image-4.19.0-8-octeon.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-octeon.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-octeon.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-octeon -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-octeon.preinst linux-4.19.118/debian/linux-image-4.19.0-8-octeon.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-octeon.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-octeon.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-octeon -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-octeon.prerm linux-4.19.118/debian/linux-image-4.19.0-8-octeon.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-octeon.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-octeon.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-octeon -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc-smp -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc-smp.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc-smp.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc.postinst linux-4.19.118/debian/linux-image-4.19.0-8-parisc.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc.postrm linux-4.19.118/debian/linux-image-4.19.0-8-parisc.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc.preinst linux-4.19.118/debian/linux-image-4.19.0-8-parisc.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc.prerm linux-4.19.118/debian/linux-image-4.19.0-8-parisc.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc64-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc64-smp -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc64-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-parisc64-smp.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-parisc64-smp.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-parisc64-smp -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-powerpc-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-powerpc-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-powerpc-smp-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc-smp/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc-smp/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc-smp/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc-smp/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc-smp/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-powerpc-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc-smp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc-smp -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc-smp -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc-smp -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc-smp.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc-smp.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc-smp -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.postinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.postrm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.preinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.prerm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-powerpc64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-powerpc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.postinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64 -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.postrm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64 -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.preinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64 -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.prerm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64 -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-powerpc64le-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64le/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64le/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64le/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpc64le/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpc64le-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc64le/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-powerpc64le-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpc64le/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.postinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64le -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.postrm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64le -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.preinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64le -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.prerm linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpc64le.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpc64le.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpc64le -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-powerpcspe-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpcspe/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpcspe/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpcspe/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-powerpcspe/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-powerpcspe-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpcspe/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-powerpcspe-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-powerpcspe/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.postinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpcspe -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.postrm linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpcspe -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.preinst linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpcspe -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.prerm linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-powerpcspe.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-powerpcspe.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-powerpcspe -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-riscv64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-riscv64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-riscv64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-riscv64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-riscv64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-riscv64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-riscv64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-riscv64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-riscv64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-riscv64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-riscv64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-riscv64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-riscv64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.postinst linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-riscv64 -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.postrm linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-riscv64 -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.preinst linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-riscv64 -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.prerm linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-riscv64.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-riscv64.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-riscv64 -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rpi-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-rpi-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-rpi-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rpi-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-rpi-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rpi/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rpi/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rpi/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rpi/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-rpi-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rpi/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-rpi-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rpi/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rpi.postinst linux-4.19.118/debian/linux-image-4.19.0-8-rpi.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rpi.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rpi.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rpi -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rpi.postrm linux-4.19.118/debian/linux-image-4.19.0-8-rpi.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-rpi.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rpi.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rpi -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rpi.preinst linux-4.19.118/debian/linux-image-4.19.0-8-rpi.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rpi.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rpi.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rpi -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rpi.prerm linux-4.19.118/debian/linux-image-4.19.0-8-rpi.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-rpi.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rpi.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rpi -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-rt-686-pae-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-686-pae/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-686-pae/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-686-pae/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-686-pae/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-686-pae/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-rt-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-686-pae/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-686-pae -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-686-pae -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-686-pae -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-686-pae-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-686-pae -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-rt-amd64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-amd64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-amd64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-amd64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-amd64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-amd64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-rt-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-amd64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-amd64 -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-amd64-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-amd64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-amd64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-rt-arm64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-arm64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-arm64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-arm64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-arm64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-arm64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-rt-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-arm64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-arm64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-arm64 -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-arm64 -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-arm64-unsigned.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-arm64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-arm64 -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-rt-armmp-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-armmp/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-armmp/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-armmp/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-rt-armmp/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-rt-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-armmp/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-rt-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-rt-armmp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.postinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-armmp -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.postrm linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-armmp -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.preinst linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-armmp -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.prerm linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-rt-armmp.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-rt-armmp.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-rt-armmp -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-s390x-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-s390x-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-s390x-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-s390x-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-s390x-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-s390x/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-s390x/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-s390x/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-s390x/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-s390x-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-s390x/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-s390x-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-s390x/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-s390x.postinst linux-4.19.118/debian/linux-image-4.19.0-8-s390x.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-s390x.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-s390x.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-s390x -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-s390x.postrm linux-4.19.118/debian/linux-image-4.19.0-8-s390x.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-s390x.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-s390x.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-s390x -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-s390x.preinst linux-4.19.118/debian/linux-image-4.19.0-8-s390x.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-s390x.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-s390x.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-s390x -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-s390x.prerm linux-4.19.118/debian/linux-image-4.19.0-8-s390x.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-s390x.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-s390x.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-s390x -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-sh7751r-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7751r/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7751r/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7751r/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7751r/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-sh7751r-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sh7751r/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-sh7751r-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sh7751r/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.postinst linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7751r -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.postrm linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7751r -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.preinst linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7751r -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.prerm linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7751r.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7751r.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7751r -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-sh7785lcr-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7785lcr/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7785lcr/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7785lcr/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sh7785lcr/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-sh7785lcr-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sh7785lcr/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-sh7785lcr-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sh7785lcr/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.postinst linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7785lcr -image_path=/boot/vmlinuz-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.postrm linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7785lcr -image_path=/boot/vmlinuz-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.preinst linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7785lcr -image_path=/boot/vmlinuz-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.prerm linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-sh7785lcr.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sh7785lcr.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sh7785lcr -image_path=/boot/vmlinuz-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-sparc64-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-sparc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sparc64/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-sparc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sparc64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp-dbg.lintian-overrides 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -#!/usr/bin/dh-exec - -# Kernel dbg packages contain a full image with debug data -linux-image-4.19.0-8-sparc64-smp-dbg: dbg-package-missing-depends - -# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so -# it's OK that they don't have it -[arm64 armhf] linux-image-4.19.0-8-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64-smp/vdso/vdso.so -[amd64 i386 ppc64el s390x] linux-image-4.19.0-8-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64-smp/vdso/vdso32.so -[amd64 ppc64el s390x] linux-image-4.19.0-8-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64-smp/vdso/vdso64.so -[amd64] linux-image-4.19.0-8-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-8-sparc64-smp/vdso/vdsox32.so - -# It is intended that 64-bit kernels provide vDSOs for 32-bit executables -[amd64 ppc64el s390x] linux-image-4.19.0-8-sparc64-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sparc64-smp/vdso/vdso32.so -[amd64] linux-image-4.19.0-8-sparc64-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-8-sparc64-smp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64-smp -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64-smp -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64-smp -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64-smp.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64-smp.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64-smp -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.postinst linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.postinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.postinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64 -image_path=/boot/vmlinux-$version - -if [ "$1" != configure ]; then - exit 0 -fi - -depmod $version - -if [ -f /lib/modules/$version/.fresh-install ]; then - change=install -else - change=upgrade -fi -linux-update-symlinks $change $version $image_path -rm -f /lib/modules/$version/.fresh-install - -if [ -d /etc/kernel/postinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.postrm linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.postrm --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.postrm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64 -image_path=/boot/vmlinux-$version - -rm -f /lib/modules/$version/.fresh-install - -if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then - linux-update-symlinks remove $version $image_path -fi - -if [ -d /etc/kernel/postrm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/postrm.d -fi - -if [ "$1" = purge ]; then - for extra_file in modules.dep modules.isapnpmap modules.pcimap \ - modules.usbmap modules.parportmap \ - modules.generic_string modules.ieee1394map \ - modules.ieee1394map modules.pnpbiosmap \ - modules.alias modules.ccwmap modules.inputmap \ - modules.symbols modules.ofmap \ - modules.seriomap modules.\*.bin \ - modules.softdep modules.devname; do - eval rm -f /lib/modules/$version/$extra_file - done - rmdir /lib/modules/$version || true -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.preinst linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.preinst --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.preinst 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64 -image_path=/boot/vmlinux-$version - -if [ "$1" = abort-upgrade ]; then - exit 0 -fi - -if [ "$1" = install ]; then - # Create a flag file for postinst - mkdir -p /lib/modules/$version - touch /lib/modules/$version/.fresh-install -fi - -if [ -d /etc/kernel/preinst.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/preinst.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.prerm linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.prerm --- linux-4.19.98/debian/linux-image-4.19.0-8-sparc64.prerm 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-8-sparc64.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/sh -e - -version=4.19.0-8-sparc64 -image_path=/boot/vmlinux-$version - -if [ "$1" != remove ]; then - exit 0 -fi - -linux-check-removal $version - -if [ -d /etc/kernel/prerm.d ]; then - DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ - --arg=$image_path /etc/kernel/prerm.d -fi - -exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-4kc-malta-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-4kc-malta/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-4kc-malta/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-4kc-malta/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-4kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-4kc-malta/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-4kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-4kc-malta/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-4kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-4kc-malta/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.postinst linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-4kc-malta +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.postrm linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-4kc-malta +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.preinst linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-4kc-malta +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.prerm linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-4kc-malta.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-4kc-malta.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-4kc-malta +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-5kc-malta-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-5kc-malta/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-5kc-malta/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-5kc-malta/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-5kc-malta-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-5kc-malta/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-5kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-5kc-malta/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-5kc-malta-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-5kc-malta/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.postinst linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-5kc-malta +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.postrm linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-5kc-malta +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.preinst linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-5kc-malta +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.prerm linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-5kc-malta.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-5kc-malta.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-5kc-malta +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-686-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-686-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-686-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-686-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-686-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-686/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-686-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-686/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-686-pae-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686-pae/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686-pae/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686-pae/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-686-pae/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-686-pae/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-686-pae/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-686-pae +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-686-pae +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-686-pae +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-686-pae-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-pae-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-686-pae +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-686 +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-686 +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-686 +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-686-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-686-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-686 +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-alpha-generic-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-generic/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-generic/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-generic/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-alpha-generic-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-generic/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-alpha-generic-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-alpha-generic/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-alpha-generic-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-alpha-generic/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.postinst linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-generic +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.postrm linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-generic +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.preinst linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-generic +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.prerm linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-generic.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-generic.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-generic +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-alpha-smp-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-smp/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-smp/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-smp/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-alpha-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-alpha-smp/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-alpha-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-alpha-smp/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-alpha-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-alpha-smp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-smp +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-alpha-smp.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-alpha-smp.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-alpha-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-amd64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-amd64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-amd64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-amd64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-amd64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-amd64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-amd64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-amd64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-amd64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-amd64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-amd64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-amd64 +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-amd64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-amd64-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-arm64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-arm64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-arm64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-arm64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-arm64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-arm64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-arm64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-arm64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-arm64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-arm64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-arm64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-arm64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-arm64 +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-arm64 +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-arm64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-arm64-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-arm64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-armmp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-armmp-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-armmp/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-armmp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-armmp-lpae-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp-lpae/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp-lpae/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp-lpae/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-armmp-lpae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-armmp-lpae/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-armmp-lpae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-armmp-lpae/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-armmp-lpae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-armmp-lpae/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.postinst linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp-lpae +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.postrm linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp-lpae +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.preinst linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp-lpae +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.prerm linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp-lpae.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp-lpae.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp-lpae +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp.postinst linux-4.19.118/debian/linux-image-4.19.0-9-armmp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp.postrm linux-4.19.118/debian/linux-image-4.19.0-9-armmp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp.preinst linux-4.19.118/debian/linux-image-4.19.0-9-armmp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-armmp.prerm linux-4.19.118/debian/linux-image-4.19.0-9-armmp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-armmp.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-armmp.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-armmp +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-cloud-amd64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-cloud-amd64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-cloud-amd64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-cloud-amd64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-cloud-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-cloud-amd64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-cloud-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-cloud-amd64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-cloud-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-cloud-amd64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-cloud-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-cloud-amd64 +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-cloud-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-cloud-amd64-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-cloud-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-itanium-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-itanium-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-itanium-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-itanium-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-itanium-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-itanium/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-itanium/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-itanium/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-itanium-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-itanium/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-itanium-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-itanium/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-itanium-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-itanium/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-itanium.postinst linux-4.19.118/debian/linux-image-4.19.0-9-itanium.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-itanium.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-itanium.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-itanium +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-itanium.postrm linux-4.19.118/debian/linux-image-4.19.0-9-itanium.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-itanium.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-itanium.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-itanium +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-itanium.preinst linux-4.19.118/debian/linux-image-4.19.0-9-itanium.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-itanium.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-itanium.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-itanium +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-itanium.prerm linux-4.19.118/debian/linux-image-4.19.0-9-itanium.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-itanium.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-itanium.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-itanium +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-loongson-3-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-loongson-3/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-loongson-3/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-loongson-3/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-loongson-3-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-loongson-3/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-loongson-3-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-loongson-3/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-loongson-3-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-loongson-3/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.postinst linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-loongson-3 +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.postrm linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-loongson-3 +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.preinst linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-loongson-3 +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.prerm linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-loongson-3.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-loongson-3.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-loongson-3 +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-m68k-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-m68k-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-m68k-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-m68k-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-m68k-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-m68k/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-m68k/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-m68k/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-m68k-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-m68k/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-m68k-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-m68k/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-m68k-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-m68k/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-m68k.postinst linux-4.19.118/debian/linux-image-4.19.0-9-m68k.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-m68k.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-m68k.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-m68k +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-m68k.postrm linux-4.19.118/debian/linux-image-4.19.0-9-m68k.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-m68k.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-m68k.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-m68k +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-m68k.preinst linux-4.19.118/debian/linux-image-4.19.0-9-m68k.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-m68k.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-m68k.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-m68k +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-m68k.prerm linux-4.19.118/debian/linux-image-4.19.0-9-m68k.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-m68k.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-m68k.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-m68k +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-marvell-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-marvell-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-marvell-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-marvell-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-marvell-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-marvell/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-marvell/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-marvell/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-marvell-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-marvell/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-marvell-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-marvell/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-marvell-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-marvell/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-marvell.postinst linux-4.19.118/debian/linux-image-4.19.0-9-marvell.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-marvell.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-marvell.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-marvell +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-marvell.postrm linux-4.19.118/debian/linux-image-4.19.0-9-marvell.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-marvell.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-marvell.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-marvell +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-marvell.preinst linux-4.19.118/debian/linux-image-4.19.0-9-marvell.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-marvell.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-marvell.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-marvell +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-marvell.prerm linux-4.19.118/debian/linux-image-4.19.0-9-marvell.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-marvell.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-marvell.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-marvell +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mckinley-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-mckinley-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-mckinley-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mckinley-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-mckinley-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mckinley/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mckinley/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mckinley/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-mckinley-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mckinley/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-mckinley-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mckinley/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-mckinley-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mckinley/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.postinst linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-mckinley +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.postrm linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-mckinley +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.preinst linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-mckinley +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.prerm linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-mckinley.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mckinley.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-mckinley +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-mips32r6-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-mips32r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips32r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips32r6/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-mips32r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips32r6/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.postinst linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6 +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.postrm linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6 +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.preinst linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6 +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.prerm linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6 +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-mips32r6el-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6el/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6el/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6el/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-mips32r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips32r6el/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips32r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips32r6el/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-mips32r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips32r6el/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.postinst linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6el +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.postrm linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6el +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.preinst linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6el +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.prerm linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips32r6el.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips32r6el.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-mips32r6el +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-mips64r6-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-mips64r6-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips64r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips64r6/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-mips64r6-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips64r6/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.postinst linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6 +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.postrm linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6 +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.preinst linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6 +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.prerm linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6 +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-mips64r6el-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6el/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6el/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6el/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-mips64r6el-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-mips64r6el/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-mips64r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips64r6el/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-mips64r6el-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-mips64r6el/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.postinst linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6el +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.postrm linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6el +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.preinst linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6el +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.prerm linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-mips64r6el.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-mips64r6el.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-mips64r6el +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-octeon-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-octeon-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-octeon-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-octeon-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-octeon-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-octeon/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-octeon/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-octeon/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-octeon-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-octeon/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-octeon-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-octeon/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-octeon-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-octeon/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-octeon.postinst linux-4.19.118/debian/linux-image-4.19.0-9-octeon.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-octeon.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-octeon.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-octeon +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-octeon.postrm linux-4.19.118/debian/linux-image-4.19.0-9-octeon.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-octeon.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-octeon.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-octeon +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-octeon.preinst linux-4.19.118/debian/linux-image-4.19.0-9-octeon.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-octeon.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-octeon.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-octeon +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-octeon.prerm linux-4.19.118/debian/linux-image-4.19.0-9-octeon.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-octeon.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-octeon.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-octeon +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc-smp +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc-smp.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc-smp.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc.postinst linux-4.19.118/debian/linux-image-4.19.0-9-parisc.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc.postrm linux-4.19.118/debian/linux-image-4.19.0-9-parisc.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc.preinst linux-4.19.118/debian/linux-image-4.19.0-9-parisc.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc.prerm linux-4.19.118/debian/linux-image-4.19.0-9-parisc.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc64-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc64-smp +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc64-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-parisc64-smp.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-parisc64-smp.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-parisc64-smp +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-powerpc-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-powerpc-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-powerpc-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-powerpc-smp-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc-smp/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc-smp/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc-smp/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-powerpc-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc-smp/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc-smp/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-powerpc-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc-smp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc-smp +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc-smp +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc-smp +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc-smp.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc-smp.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc-smp +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.postinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.postrm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.preinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.prerm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-powerpc64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-powerpc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-powerpc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.postinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64 +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.postrm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64 +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.preinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64 +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.prerm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64 +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-powerpc64le-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64le/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64le/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64le/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-powerpc64le-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpc64le/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpc64le-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc64le/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-powerpc64le-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpc64le/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.postinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64le +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.postrm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64le +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.preinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64le +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.prerm linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpc64le.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpc64le.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpc64le +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-powerpcspe-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpcspe/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpcspe/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpcspe/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-powerpcspe-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-powerpcspe/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-powerpcspe-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpcspe/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-powerpcspe-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-powerpcspe/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.postinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpcspe +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.postrm linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpcspe +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.preinst linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpcspe +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.prerm linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-powerpcspe.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-powerpcspe.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-powerpcspe +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-riscv64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-riscv64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-riscv64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-riscv64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-riscv64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-riscv64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-riscv64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-riscv64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-riscv64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-riscv64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-riscv64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-riscv64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-riscv64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-riscv64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.postinst linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-riscv64 +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.postrm linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-riscv64 +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.preinst linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-riscv64 +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.prerm linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-riscv64.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-riscv64.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-riscv64 +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rpi-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-rpi-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-rpi-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rpi-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-rpi-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rpi/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rpi/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rpi/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-rpi-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rpi/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-rpi-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rpi/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-rpi-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rpi/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rpi.postinst linux-4.19.118/debian/linux-image-4.19.0-9-rpi.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rpi.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rpi.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-rpi +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rpi.postrm linux-4.19.118/debian/linux-image-4.19.0-9-rpi.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-rpi.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rpi.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-rpi +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rpi.preinst linux-4.19.118/debian/linux-image-4.19.0-9-rpi.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rpi.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rpi.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-rpi +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rpi.prerm linux-4.19.118/debian/linux-image-4.19.0-9-rpi.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-rpi.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rpi.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-rpi +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-rt-686-pae-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-686-pae/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-686-pae/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-686-pae/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-rt-686-pae-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-686-pae/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-686-pae/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-rt-686-pae-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-686-pae/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-686-pae +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-686-pae +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-686-pae +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-686-pae-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-686-pae +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-rt-amd64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-amd64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-amd64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-amd64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-rt-amd64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-amd64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-amd64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-rt-amd64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-amd64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-amd64 +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-amd64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-amd64-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-amd64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-rt-arm64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-arm64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-arm64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-arm64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-rt-arm64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-arm64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-arm64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-rt-arm64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-arm64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-arm64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postrm linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-arm64 +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.preinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-arm64 +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.prerm linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-arm64-unsigned.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-arm64-unsigned.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-arm64 +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-rt-armmp-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-armmp/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-armmp/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-armmp/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-rt-armmp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-rt-armmp/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-rt-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-armmp/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-rt-armmp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-rt-armmp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.postinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-armmp +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.postrm linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-armmp +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.preinst linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-armmp +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.prerm linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-rt-armmp.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-rt-armmp.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-rt-armmp +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-s390x-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-s390x-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-s390x-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-s390x-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-s390x-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-s390x/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-s390x/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-s390x/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-s390x-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-s390x/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-s390x-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-s390x/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-s390x-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-s390x/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-s390x.postinst linux-4.19.118/debian/linux-image-4.19.0-9-s390x.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-s390x.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-s390x.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-s390x +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-s390x.postrm linux-4.19.118/debian/linux-image-4.19.0-9-s390x.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-s390x.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-s390x.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-s390x +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-s390x.preinst linux-4.19.118/debian/linux-image-4.19.0-9-s390x.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-s390x.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-s390x.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-s390x +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-s390x.prerm linux-4.19.118/debian/linux-image-4.19.0-9-s390x.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-s390x.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-s390x.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-s390x +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-sh7751r-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7751r/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7751r/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7751r/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-sh7751r-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7751r/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-sh7751r-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sh7751r/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-sh7751r-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sh7751r/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.postinst linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7751r +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.postrm linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7751r +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.preinst linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7751r +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.prerm linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7751r.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7751r.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7751r +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-sh7785lcr-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7785lcr/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7785lcr/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7785lcr/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-sh7785lcr-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sh7785lcr/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-sh7785lcr-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sh7785lcr/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-sh7785lcr-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sh7785lcr/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.postinst linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7785lcr +image_path=/boot/vmlinuz-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.postrm linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7785lcr +image_path=/boot/vmlinuz-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.preinst linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7785lcr +image_path=/boot/vmlinuz-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.prerm linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-sh7785lcr.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sh7785lcr.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-sh7785lcr +image_path=/boot/vmlinuz-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-sparc64-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-sparc64-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-sparc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sparc64/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-sparc64-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sparc64/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp-dbg.lintian-overrides linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp-dbg.lintian-overrides --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp-dbg.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp-dbg.lintian-overrides 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,15 @@ +#!/usr/bin/dh-exec + +# Kernel dbg packages contain a full image with debug data +linux-image-4.19.0-9-sparc64-smp-dbg: dbg-package-missing-depends + +# glibc doesn't seem to check for a PT_GNU_STACK section in vDSOs, so +# it's OK that they don't have it +[arm64 armhf] linux-image-4.19.0-9-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64-smp/vdso/vdso.so +[amd64 i386 ppc64el s390x] linux-image-4.19.0-9-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64-smp/vdso/vdso32.so +[amd64 ppc64el s390x] linux-image-4.19.0-9-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64-smp/vdso/vdso64.so +[amd64] linux-image-4.19.0-9-sparc64-smp-dbg: shlib-without-PT_GNU_STACK-section usr/lib/debug/lib/modules/4.19.0-9-sparc64-smp/vdso/vdsox32.so + +# It is intended that 64-bit kernels provide vDSOs for 32-bit executables +[amd64 ppc64el s390x] linux-image-4.19.0-9-sparc64-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sparc64-smp/vdso/vdso32.so +[amd64] linux-image-4.19.0-9-sparc64-smp-dbg: binary-from-other-architecture usr/lib/debug/lib/modules/4.19.0-9-sparc64-smp/vdso/vdsox32.so diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.postinst linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64-smp +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.postrm linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64-smp +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.preinst linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64-smp +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.prerm linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64-smp.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64-smp.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64-smp +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.postinst linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.postinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.postinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64 +image_path=/boot/vmlinux-$version + +if [ "$1" != configure ]; then + exit 0 +fi + +depmod $version + +if [ -f /lib/modules/$version/.fresh-install ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path +rm -f /lib/modules/$version/.fresh-install + +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.postrm linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.postrm --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.postrm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,31 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64 +image_path=/boot/vmlinux-$version + +rm -f /lib/modules/$version/.fresh-install + +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi + +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi + +if [ "$1" = purge ]; then + for extra_file in modules.dep modules.isapnpmap modules.pcimap \ + modules.usbmap modules.parportmap \ + modules.generic_string modules.ieee1394map \ + modules.ieee1394map modules.pnpbiosmap \ + modules.alias modules.ccwmap modules.inputmap \ + modules.symbols modules.ofmap \ + modules.seriomap modules.\*.bin \ + modules.softdep modules.devname; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version || true +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.preinst linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.preinst --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.preinst 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,21 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64 +image_path=/boot/vmlinux-$version + +if [ "$1" = abort-upgrade ]; then + exit 0 +fi + +if [ "$1" = install ]; then + # Create a flag file for postinst + mkdir -p /lib/modules/$version + touch /lib/modules/$version/.fresh-install +fi + +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.prerm linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.prerm --- linux-4.19.98/debian/linux-image-4.19.0-9-sparc64.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/linux-image-4.19.0-9-sparc64.prerm 2020-04-26 13:04:11.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/sh -e + +version=4.19.0-9-sparc64 +image_path=/boot/vmlinux-$version + +if [ "$1" != remove ]; then + exit 0 +fi + +linux-check-removal $version + +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi + +exit 0 diff -Nru linux-4.19.98/debian/patches/bugfix/all/blktrace-fix-dereference-after-null-check.patch linux-4.19.118/debian/patches/bugfix/all/blktrace-fix-dereference-after-null-check.patch --- linux-4.19.98/debian/patches/bugfix/all/blktrace-fix-dereference-after-null-check.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/blktrace-fix-dereference-after-null-check.patch 2020-04-26 13:04:09.000000000 +0000 @@ -0,0 +1,66 @@ +From: Cengiz Can +Date: Wed, 4 Mar 2020 13:58:19 +0300 +Subject: blktrace: fix dereference after null check +Origin: https://git.kernel.org/linus/153031a301bb07194e9c37466cfce8eacb977621 + +There was a recent change in blktrace.c that added a RCU protection to +`q->blk_trace` in order to fix a use-after-free issue during access. + +However the change missed an edge case that can lead to dereferencing of +`bt` pointer even when it's NULL: + +Coverity static analyzer marked this as a FORWARD_NULL issue with CID +1460458. + +``` +/kernel/trace/blktrace.c: 1904 in sysfs_blk_trace_attr_store() +1898 ret = 0; +1899 if (bt == NULL) +1900 ret = blk_trace_setup_queue(q, bdev); +1901 +1902 if (ret == 0) { +1903 if (attr == &dev_attr_act_mask) +>>> CID 1460458: Null pointer dereferences (FORWARD_NULL) +>>> Dereferencing null pointer "bt". +1904 bt->act_mask = value; +1905 else if (attr == &dev_attr_pid) +1906 bt->pid = value; +1907 else if (attr == &dev_attr_start_lba) +1908 bt->start_lba = value; +1909 else if (attr == &dev_attr_end_lba) +``` + +Added a reassignment with RCU annotation to fix the issue. + +Fixes: c780e86dd48 ("blktrace: Protect q->blk_trace with RCU") +Reviewed-by: Ming Lei +Reviewed-by: Bob Liu +Reviewed-by: Steven Rostedt (VMware) +Signed-off-by: Cengiz Can +Signed-off-by: Jens Axboe +Signed-off-by: Ben Hutchings +Signed-off-by: Sasha Levin +--- + kernel/trace/blktrace.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c +index 99f6cdbf2f540..6cea8bbca03cb 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -1893,8 +1893,11 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, + } + + ret = 0; +- if (bt == NULL) ++ if (bt == NULL) { + ret = blk_trace_setup_queue(q, bdev); ++ bt = rcu_dereference_protected(q->blk_trace, ++ lockdep_is_held(&q->blk_trace_mutex)); ++ } + + if (ret == 0) { + if (attr == &dev_attr_act_mask) +-- +2.20.1 + diff -Nru linux-4.19.98/debian/patches/bugfix/all/blktrace-protect-q-blk_trace-with-rcu.patch linux-4.19.118/debian/patches/bugfix/all/blktrace-protect-q-blk_trace-with-rcu.patch --- linux-4.19.98/debian/patches/bugfix/all/blktrace-protect-q-blk_trace-with-rcu.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/blktrace-protect-q-blk_trace-with-rcu.patch 2020-04-26 13:04:09.000000000 +0000 @@ -0,0 +1,431 @@ +From: Jan Kara +Date: Thu, 6 Feb 2020 15:28:12 +0100 +Subject: blktrace: Protect q->blk_trace with RCU +Origin: https://git.kernel.org/linus/c780e86dd48ef6467a1146cf7d0fe1e05a635039 +Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2019-19768 + +KASAN is reporting that __blk_add_trace() has a use-after-free issue +when accessing q->blk_trace. Indeed the switching of block tracing (and +thus eventual freeing of q->blk_trace) is completely unsynchronized with +the currently running tracing and thus it can happen that the blk_trace +structure is being freed just while __blk_add_trace() works on it. +Protect accesses to q->blk_trace by RCU during tracing and make sure we +wait for the end of RCU grace period when shutting down tracing. Luckily +that is rare enough event that we can afford that. Note that postponing +the freeing of blk_trace to an RCU callback should better be avoided as +it could have unexpected user visible side-effects as debugfs files +would be still existing for a short while block tracing has been shut +down. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=205711 +CC: stable@vger.kernel.org +Reviewed-by: Chaitanya Kulkarni +Reviewed-by: Ming Lei +Tested-by: Ming Lei +Reviewed-by: Bart Van Assche +Reported-by: Tristan Madani +Signed-off-by: Jan Kara +Signed-off-by: Jens Axboe +[bwh: Backported to 4.19: adjust context] +Signed-off-by: Ben Hutchings +Signed-off-by: Sasha Levin +--- + include/linux/blkdev.h | 2 +- + include/linux/blktrace_api.h | 18 ++++-- + kernel/trace/blktrace.c | 114 +++++++++++++++++++++++++---------- + 3 files changed, 97 insertions(+), 37 deletions(-) + +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 6e67aeb56928b..745b2d0dcf78c 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -624,7 +624,7 @@ struct request_queue { + unsigned int sg_reserved_size; + int node; + #ifdef CONFIG_BLK_DEV_IO_TRACE +- struct blk_trace *blk_trace; ++ struct blk_trace __rcu *blk_trace; + struct mutex blk_trace_mutex; + #endif + /* +diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h +index 7bb2d8de9f308..3b6ff5902edce 100644 +--- a/include/linux/blktrace_api.h ++++ b/include/linux/blktrace_api.h +@@ -51,9 +51,13 @@ void __trace_note_message(struct blk_trace *, struct blkcg *blkcg, const char *f + **/ + #define blk_add_cgroup_trace_msg(q, cg, fmt, ...) \ + do { \ +- struct blk_trace *bt = (q)->blk_trace; \ ++ struct blk_trace *bt; \ ++ \ ++ rcu_read_lock(); \ ++ bt = rcu_dereference((q)->blk_trace); \ + if (unlikely(bt)) \ + __trace_note_message(bt, cg, fmt, ##__VA_ARGS__);\ ++ rcu_read_unlock(); \ + } while (0) + #define blk_add_trace_msg(q, fmt, ...) \ + blk_add_cgroup_trace_msg(q, NULL, fmt, ##__VA_ARGS__) +@@ -61,10 +65,14 @@ void __trace_note_message(struct blk_trace *, struct blkcg *blkcg, const char *f + + static inline bool blk_trace_note_message_enabled(struct request_queue *q) + { +- struct blk_trace *bt = q->blk_trace; +- if (likely(!bt)) +- return false; +- return bt->act_mask & BLK_TC_NOTIFY; ++ struct blk_trace *bt; ++ bool ret; ++ ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); ++ ret = bt && (bt->act_mask & BLK_TC_NOTIFY); ++ rcu_read_unlock(); ++ return ret; + } + + extern void blk_add_driver_data(struct request_queue *q, struct request *rq, +diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c +index 2868d85f1fb1d..99f6cdbf2f540 100644 +--- a/kernel/trace/blktrace.c ++++ b/kernel/trace/blktrace.c +@@ -336,6 +336,7 @@ static void put_probe_ref(void) + + static void blk_trace_cleanup(struct blk_trace *bt) + { ++ synchronize_rcu(); + blk_trace_free(bt); + put_probe_ref(); + } +@@ -636,8 +637,10 @@ static int compat_blk_trace_setup(struct request_queue *q, char *name, + static int __blk_trace_startstop(struct request_queue *q, int start) + { + int ret; +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + ++ bt = rcu_dereference_protected(q->blk_trace, ++ lockdep_is_held(&q->blk_trace_mutex)); + if (bt == NULL) + return -EINVAL; + +@@ -746,8 +749,8 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) + void blk_trace_shutdown(struct request_queue *q) + { + mutex_lock(&q->blk_trace_mutex); +- +- if (q->blk_trace) { ++ if (rcu_dereference_protected(q->blk_trace, ++ lockdep_is_held(&q->blk_trace_mutex))) { + __blk_trace_startstop(q, 0); + __blk_trace_remove(q); + } +@@ -759,8 +762,10 @@ void blk_trace_shutdown(struct request_queue *q) + static union kernfs_node_id * + blk_trace_bio_get_cgid(struct request_queue *q, struct bio *bio) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + ++ /* We don't use the 'bt' value here except as an optimization... */ ++ bt = rcu_dereference_protected(q->blk_trace, 1); + if (!bt || !(blk_tracer_flags.val & TRACE_BLK_OPT_CGROUP)) + return NULL; + +@@ -805,10 +810,14 @@ static void blk_add_trace_rq(struct request *rq, int error, + unsigned int nr_bytes, u32 what, + union kernfs_node_id *cgid) + { +- struct blk_trace *bt = rq->q->blk_trace; ++ struct blk_trace *bt; + +- if (likely(!bt)) ++ rcu_read_lock(); ++ bt = rcu_dereference(rq->q->blk_trace); ++ if (likely(!bt)) { ++ rcu_read_unlock(); + return; ++ } + + if (blk_rq_is_passthrough(rq)) + what |= BLK_TC_ACT(BLK_TC_PC); +@@ -817,6 +826,7 @@ static void blk_add_trace_rq(struct request *rq, int error, + + __blk_add_trace(bt, blk_rq_trace_sector(rq), nr_bytes, req_op(rq), + rq->cmd_flags, what, error, 0, NULL, cgid); ++ rcu_read_unlock(); + } + + static void blk_add_trace_rq_insert(void *ignore, +@@ -862,14 +872,19 @@ static void blk_add_trace_rq_complete(void *ignore, struct request *rq, + static void blk_add_trace_bio(struct request_queue *q, struct bio *bio, + u32 what, int error) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + +- if (likely(!bt)) ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); ++ if (likely(!bt)) { ++ rcu_read_unlock(); + return; ++ } + + __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, + bio_op(bio), bio->bi_opf, what, error, 0, NULL, + blk_trace_bio_get_cgid(q, bio)); ++ rcu_read_unlock(); + } + + static void blk_add_trace_bio_bounce(void *ignore, +@@ -914,11 +929,14 @@ static void blk_add_trace_getrq(void *ignore, + if (bio) + blk_add_trace_bio(q, bio, BLK_TA_GETRQ, 0); + else { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); + if (bt) + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_GETRQ, 0, 0, + NULL, NULL); ++ rcu_read_unlock(); + } + } + +@@ -930,27 +948,35 @@ static void blk_add_trace_sleeprq(void *ignore, + if (bio) + blk_add_trace_bio(q, bio, BLK_TA_SLEEPRQ, 0); + else { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); + if (bt) + __blk_add_trace(bt, 0, 0, rw, 0, BLK_TA_SLEEPRQ, + 0, 0, NULL, NULL); ++ rcu_read_unlock(); + } + } + + static void blk_add_trace_plug(void *ignore, struct request_queue *q) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); + if (bt) + __blk_add_trace(bt, 0, 0, 0, 0, BLK_TA_PLUG, 0, 0, NULL, NULL); ++ rcu_read_unlock(); + } + + static void blk_add_trace_unplug(void *ignore, struct request_queue *q, + unsigned int depth, bool explicit) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); + if (bt) { + __be64 rpdu = cpu_to_be64(depth); + u32 what; +@@ -962,14 +988,17 @@ static void blk_add_trace_unplug(void *ignore, struct request_queue *q, + + __blk_add_trace(bt, 0, 0, 0, 0, what, 0, sizeof(rpdu), &rpdu, NULL); + } ++ rcu_read_unlock(); + } + + static void blk_add_trace_split(void *ignore, + struct request_queue *q, struct bio *bio, + unsigned int pdu) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); + if (bt) { + __be64 rpdu = cpu_to_be64(pdu); + +@@ -978,6 +1007,7 @@ static void blk_add_trace_split(void *ignore, + BLK_TA_SPLIT, bio->bi_status, sizeof(rpdu), + &rpdu, blk_trace_bio_get_cgid(q, bio)); + } ++ rcu_read_unlock(); + } + + /** +@@ -997,11 +1027,15 @@ static void blk_add_trace_bio_remap(void *ignore, + struct request_queue *q, struct bio *bio, + dev_t dev, sector_t from) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + struct blk_io_trace_remap r; + +- if (likely(!bt)) ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); ++ if (likely(!bt)) { ++ rcu_read_unlock(); + return; ++ } + + r.device_from = cpu_to_be32(dev); + r.device_to = cpu_to_be32(bio_dev(bio)); +@@ -1010,6 +1044,7 @@ static void blk_add_trace_bio_remap(void *ignore, + __blk_add_trace(bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, + bio_op(bio), bio->bi_opf, BLK_TA_REMAP, bio->bi_status, + sizeof(r), &r, blk_trace_bio_get_cgid(q, bio)); ++ rcu_read_unlock(); + } + + /** +@@ -1030,11 +1065,15 @@ static void blk_add_trace_rq_remap(void *ignore, + struct request *rq, dev_t dev, + sector_t from) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + struct blk_io_trace_remap r; + +- if (likely(!bt)) ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); ++ if (likely(!bt)) { ++ rcu_read_unlock(); + return; ++ } + + r.device_from = cpu_to_be32(dev); + r.device_to = cpu_to_be32(disk_devt(rq->rq_disk)); +@@ -1043,6 +1082,7 @@ static void blk_add_trace_rq_remap(void *ignore, + __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), + rq_data_dir(rq), 0, BLK_TA_REMAP, 0, + sizeof(r), &r, blk_trace_request_get_cgid(q, rq)); ++ rcu_read_unlock(); + } + + /** +@@ -1060,14 +1100,19 @@ void blk_add_driver_data(struct request_queue *q, + struct request *rq, + void *data, size_t len) + { +- struct blk_trace *bt = q->blk_trace; ++ struct blk_trace *bt; + +- if (likely(!bt)) ++ rcu_read_lock(); ++ bt = rcu_dereference(q->blk_trace); ++ if (likely(!bt)) { ++ rcu_read_unlock(); + return; ++ } + + __blk_add_trace(bt, blk_rq_trace_sector(rq), blk_rq_bytes(rq), 0, 0, + BLK_TA_DRV_DATA, 0, len, data, + blk_trace_request_get_cgid(q, rq)); ++ rcu_read_unlock(); + } + EXPORT_SYMBOL_GPL(blk_add_driver_data); + +@@ -1594,6 +1639,7 @@ static int blk_trace_remove_queue(struct request_queue *q) + return -EINVAL; + + put_probe_ref(); ++ synchronize_rcu(); + blk_trace_free(bt); + return 0; + } +@@ -1755,6 +1801,7 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, + struct hd_struct *p = dev_to_part(dev); + struct request_queue *q; + struct block_device *bdev; ++ struct blk_trace *bt; + ssize_t ret = -ENXIO; + + bdev = bdget(part_devt(p)); +@@ -1767,21 +1814,23 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, + + mutex_lock(&q->blk_trace_mutex); + ++ bt = rcu_dereference_protected(q->blk_trace, ++ lockdep_is_held(&q->blk_trace_mutex)); + if (attr == &dev_attr_enable) { +- ret = sprintf(buf, "%u\n", !!q->blk_trace); ++ ret = sprintf(buf, "%u\n", !!bt); + goto out_unlock_bdev; + } + +- if (q->blk_trace == NULL) ++ if (bt == NULL) + ret = sprintf(buf, "disabled\n"); + else if (attr == &dev_attr_act_mask) +- ret = blk_trace_mask2str(buf, q->blk_trace->act_mask); ++ ret = blk_trace_mask2str(buf, bt->act_mask); + else if (attr == &dev_attr_pid) +- ret = sprintf(buf, "%u\n", q->blk_trace->pid); ++ ret = sprintf(buf, "%u\n", bt->pid); + else if (attr == &dev_attr_start_lba) +- ret = sprintf(buf, "%llu\n", q->blk_trace->start_lba); ++ ret = sprintf(buf, "%llu\n", bt->start_lba); + else if (attr == &dev_attr_end_lba) +- ret = sprintf(buf, "%llu\n", q->blk_trace->end_lba); ++ ret = sprintf(buf, "%llu\n", bt->end_lba); + + out_unlock_bdev: + mutex_unlock(&q->blk_trace_mutex); +@@ -1798,6 +1847,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, + struct block_device *bdev; + struct request_queue *q; + struct hd_struct *p; ++ struct blk_trace *bt; + u64 value; + ssize_t ret = -EINVAL; + +@@ -1828,8 +1878,10 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, + + mutex_lock(&q->blk_trace_mutex); + ++ bt = rcu_dereference_protected(q->blk_trace, ++ lockdep_is_held(&q->blk_trace_mutex)); + if (attr == &dev_attr_enable) { +- if (!!value == !!q->blk_trace) { ++ if (!!value == !!bt) { + ret = 0; + goto out_unlock_bdev; + } +@@ -1841,18 +1893,18 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, + } + + ret = 0; +- if (q->blk_trace == NULL) ++ if (bt == NULL) + ret = blk_trace_setup_queue(q, bdev); + + if (ret == 0) { + if (attr == &dev_attr_act_mask) +- q->blk_trace->act_mask = value; ++ bt->act_mask = value; + else if (attr == &dev_attr_pid) +- q->blk_trace->pid = value; ++ bt->pid = value; + else if (attr == &dev_attr_start_lba) +- q->blk_trace->start_lba = value; ++ bt->start_lba = value; + else if (attr == &dev_attr_end_lba) +- q->blk_trace->end_lba = value; ++ bt->end_lba = value; + } + + out_unlock_bdev: +-- +2.20.1 + diff -Nru linux-4.19.98/debian/patches/bugfix/all/f2fs-fix-to-avoid-memory-leakage-in-f2fs_listxattr.patch linux-4.19.118/debian/patches/bugfix/all/f2fs-fix-to-avoid-memory-leakage-in-f2fs_listxattr.patch --- linux-4.19.98/debian/patches/bugfix/all/f2fs-fix-to-avoid-memory-leakage-in-f2fs_listxattr.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/f2fs-fix-to-avoid-memory-leakage-in-f2fs_listxattr.patch 2020-04-26 13:04:09.000000000 +0000 @@ -0,0 +1,65 @@ +From: Randall Huang +Date: Fri, 18 Oct 2019 14:56:22 +0800 +Subject: f2fs: fix to avoid memory leakage in f2fs_listxattr +Origin: https://git.kernel.org/linus/688078e7f36c293dae25b338ddc9e0a2790f6e06 +Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2020-0067 + +In f2fs_listxattr, there is no boundary check before +memcpy e_name to buffer. +If the e_name_len is corrupted, +unexpected memory contents may be returned to the buffer. + +Signed-off-by: Randall Huang +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +[bwh: Backported to 4.19: Use f2fs_msg() instead of f2fs_err()] +Signed-off-by: Ben Hutchings +Signed-off-by: Sasha Levin +--- + fs/f2fs/xattr.c | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c +index 1dae74f7cccac..201e9da1692a4 100644 +--- a/fs/f2fs/xattr.c ++++ b/fs/f2fs/xattr.c +@@ -538,8 +538,9 @@ out: + ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size) + { + struct inode *inode = d_inode(dentry); ++ nid_t xnid = F2FS_I(inode)->i_xattr_nid; + struct f2fs_xattr_entry *entry; +- void *base_addr; ++ void *base_addr, *last_base_addr; + int error = 0; + size_t rest = buffer_size; + +@@ -549,6 +550,8 @@ ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size) + if (error) + return error; + ++ last_base_addr = (void *)base_addr + XATTR_SIZE(xnid, inode); ++ + list_for_each_xattr(entry, base_addr) { + const struct xattr_handler *handler = + f2fs_xattr_handler(entry->e_name_index); +@@ -556,6 +559,16 @@ ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size) + size_t prefix_len; + size_t size; + ++ if ((void *)(entry) + sizeof(__u32) > last_base_addr || ++ (void *)XATTR_NEXT_ENTRY(entry) > last_base_addr) { ++ f2fs_msg(dentry->d_sb, KERN_ERR, ++ "inode (%lu) has corrupted xattr", ++ inode->i_ino); ++ set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK); ++ error = -EFSCORRUPTED; ++ goto cleanup; ++ } ++ + if (!handler || (handler->list && !handler->list(dentry))) + continue; + +-- +2.20.1 + diff -Nru linux-4.19.98/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch linux-4.19.118/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch --- linux-4.19.98/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch 2020-04-25 22:11:32.000000000 +0000 @@ -2748,18 +2748,15 @@ =================================================================== --- linux.orig/sound/pci/hda/hda_intel.c +++ linux/sound/pci/hda/hda_intel.c -@@ -2075,10 +2075,8 @@ static void azx_firmware_cb(const struct - struct azx *chip = card->private_data; - struct pci_dev *pci = chip->pci; +@@ -2079,8 +2079,6 @@ static void azx_firmware_cb(const struct -- if (!fw) { -- dev_err(card->dev, "Cannot load firmware, aborting\n"); -+ if (!fw) - goto error; -- } - - chip->fw = fw; + if (fw) + chip->fw = fw; +- else +- dev_err(card->dev, "Cannot load firmware, continue without patching\n"); if (!chip->disabled) { + /* continue probing */ + azx_probe_continue(chip); Index: linux/sound/pci/korg1212/korg1212.c =================================================================== --- linux.orig/sound/pci/korg1212/korg1212.c diff -Nru linux-4.19.98/debian/patches/bugfix/all/libertas-fix-two-buffer-overflows-at-parsing-bss-descriptor.patch linux-4.19.118/debian/patches/bugfix/all/libertas-fix-two-buffer-overflows-at-parsing-bss-descriptor.patch --- linux-4.19.98/debian/patches/bugfix/all/libertas-fix-two-buffer-overflows-at-parsing-bss-descriptor.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/libertas-fix-two-buffer-overflows-at-parsing-bss-descriptor.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -From: Wen Huang -Date: Thu, 28 Nov 2019 18:51:04 +0800 -Subject: libertas: Fix two buffer overflows at parsing bss descriptor -Origin: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers.git/commit/?id=e5e884b42639c74b5b57dc277909915c0aefc8bb -Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2019-14896 -Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2019-14897 - -add_ie_rates() copys rates without checking the length -in bss descriptor from remote AP.when victim connects to -remote attacker, this may trigger buffer overflow. -lbs_ibss_join_existing() copys rates without checking the length -in bss descriptor from remote IBSS node.when victim connects to -remote attacker, this may trigger buffer overflow. -Fix them by putting the length check before performing copy. - -This fix addresses CVE-2019-14896 and CVE-2019-14897. -This also fix build warning of mixed declarations and code. - -Reported-by: kbuild test robot -Signed-off-by: Wen Huang -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/marvell/libertas/cfg.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - ---- a/drivers/net/wireless/marvell/libertas/cfg.c -+++ b/drivers/net/wireless/marvell/libertas/cfg.c -@@ -273,6 +273,10 @@ add_ie_rates(u8 *tlv, const u8 *ie, int - int hw, ap, ap_max = ie[1]; - u8 hw_rate; - -+ if (ap_max > MAX_RATES) { -+ lbs_deb_assoc("invalid rates\n"); -+ return tlv; -+ } - /* Advance past IE header */ - ie += 2; - -@@ -1717,6 +1721,9 @@ static int lbs_ibss_join_existing(struct - struct cmd_ds_802_11_ad_hoc_join cmd; - u8 preamble = RADIO_PREAMBLE_SHORT; - int ret = 0; -+ int hw, i; -+ u8 rates_max; -+ u8 *rates; - - /* TODO: set preamble based on scan result */ - ret = lbs_set_radio(priv, preamble, 1); -@@ -1775,9 +1782,12 @@ static int lbs_ibss_join_existing(struct - if (!rates_eid) { - lbs_add_rates(cmd.bss.rates); - } else { -- int hw, i; -- u8 rates_max = rates_eid[1]; -- u8 *rates = cmd.bss.rates; -+ rates_max = rates_eid[1]; -+ if (rates_max > MAX_RATES) { -+ lbs_deb_join("invalid rates"); -+ goto out; -+ } -+ rates = cmd.bss.rates; - for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) { - u8 hw_rate = lbs_rates[hw].bitrate / 5; - for (i = 0; i < rates_max; i++) { diff -Nru linux-4.19.98/debian/patches/bugfix/all/net-ipv6-add-net-argument-to-ip6_dst_lookup_flow.patch linux-4.19.118/debian/patches/bugfix/all/net-ipv6-add-net-argument-to-ip6_dst_lookup_flow.patch --- linux-4.19.98/debian/patches/bugfix/all/net-ipv6-add-net-argument-to-ip6_dst_lookup_flow.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/net-ipv6-add-net-argument-to-ip6_dst_lookup_flow.patch 2020-04-26 13:04:09.000000000 +0000 @@ -0,0 +1,243 @@ +From: Sabrina Dubroca +Date: Wed, 4 Dec 2019 15:35:52 +0100 +Subject: net: ipv6: add net argument to ip6_dst_lookup_flow +Origin: https://git.kernel.org/linus/c4e85f73afb6384123e5ef1bba3315b2e3ad031e + +This will be used in the conversion of ipv6_stub to ip6_dst_lookup_flow, +as some modules currently pass a net argument without a socket to +ip6_dst_lookup. This is equivalent to commit 343d60aada5a ("ipv6: change +ipv6_stub_impl.ipv6_dst_lookup to take net argument"). + +Signed-off-by: Sabrina Dubroca +Signed-off-by: David S. Miller +[bwh: Backported to 4.19: adjust context] +Signed-off-by: Ben Hutchings +Signed-off-by: Sasha Levin +--- + include/net/ipv6.h | 2 +- + net/dccp/ipv6.c | 6 +++--- + net/ipv6/af_inet6.c | 2 +- + net/ipv6/datagram.c | 2 +- + net/ipv6/inet6_connection_sock.c | 4 ++-- + net/ipv6/ip6_output.c | 8 ++++---- + net/ipv6/raw.c | 2 +- + net/ipv6/syncookies.c | 2 +- + net/ipv6/tcp_ipv6.c | 4 ++-- + net/l2tp/l2tp_ip6.c | 2 +- + net/sctp/ipv6.c | 4 ++-- + 11 files changed, 19 insertions(+), 19 deletions(-) + +diff --git a/include/net/ipv6.h b/include/net/ipv6.h +index ff33f498c1373..4c2e40882e884 100644 +--- a/include/net/ipv6.h ++++ b/include/net/ipv6.h +@@ -959,7 +959,7 @@ static inline struct sk_buff *ip6_finish_skb(struct sock *sk) + + int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst, + struct flowi6 *fl6); +-struct dst_entry *ip6_dst_lookup_flow(const struct sock *sk, struct flowi6 *fl6, ++struct dst_entry *ip6_dst_lookup_flow(struct net *net, const struct sock *sk, struct flowi6 *fl6, + const struct in6_addr *final_dst); + struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, + const struct in6_addr *final_dst, +diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c +index 58a401e9cf09d..b438bed6749d4 100644 +--- a/net/dccp/ipv6.c ++++ b/net/dccp/ipv6.c +@@ -211,7 +211,7 @@ static int dccp_v6_send_response(const struct sock *sk, struct request_sock *req + final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), &final); + rcu_read_unlock(); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { + err = PTR_ERR(dst); + dst = NULL; +@@ -282,7 +282,7 @@ static void dccp_v6_ctl_send_reset(const struct sock *sk, struct sk_buff *rxskb) + security_skb_classify_flow(rxskb, flowi6_to_flowi(&fl6)); + + /* sk = NULL, but it is safe for now. RST socket required. */ +- dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL); ++ dst = ip6_dst_lookup_flow(sock_net(ctl_sk), ctl_sk, &fl6, NULL); + if (!IS_ERR(dst)) { + skb_dst_set(skb, dst); + ip6_xmit(ctl_sk, skb, &fl6, 0, NULL, 0); +@@ -912,7 +912,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr, + opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk)); + final_p = fl6_update_dst(&fl6, opt, &final); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { + err = PTR_ERR(dst); + goto failure; +diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c +index 79fcd9550fd2e..5db88be8b6ecb 100644 +--- a/net/ipv6/af_inet6.c ++++ b/net/ipv6/af_inet6.c +@@ -740,7 +740,7 @@ int inet6_sk_rebuild_header(struct sock *sk) + &final); + rcu_read_unlock(); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { + sk->sk_route_caps = 0; + sk->sk_err_soft = -PTR_ERR(dst); +diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c +index 971a0fdf1fbc3..727f958dd8695 100644 +--- a/net/ipv6/datagram.c ++++ b/net/ipv6/datagram.c +@@ -89,7 +89,7 @@ int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr) + final_p = fl6_update_dst(&fl6, opt, &final); + rcu_read_unlock(); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { + err = PTR_ERR(dst); + goto out; +diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c +index 890adadcda16a..92fe9e565da0b 100644 +--- a/net/ipv6/inet6_connection_sock.c ++++ b/net/ipv6/inet6_connection_sock.c +@@ -52,7 +52,7 @@ struct dst_entry *inet6_csk_route_req(const struct sock *sk, + fl6->flowi6_uid = sk->sk_uid; + security_req_classify_flow(req, flowi6_to_flowi(fl6)); + +- dst = ip6_dst_lookup_flow(sk, fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_p); + if (IS_ERR(dst)) + return NULL; + +@@ -107,7 +107,7 @@ static struct dst_entry *inet6_csk_route_socket(struct sock *sk, + + dst = __inet6_csk_dst_check(sk, np->dst_cookie); + if (!dst) { +- dst = ip6_dst_lookup_flow(sk, fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_p); + + if (!IS_ERR(dst)) + ip6_dst_store(sk, dst, NULL, NULL); +diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c +index 9886a84c25117..22665e3638ac4 100644 +--- a/net/ipv6/ip6_output.c ++++ b/net/ipv6/ip6_output.c +@@ -1071,19 +1071,19 @@ EXPORT_SYMBOL_GPL(ip6_dst_lookup); + * It returns a valid dst pointer on success, or a pointer encoded + * error code. + */ +-struct dst_entry *ip6_dst_lookup_flow(const struct sock *sk, struct flowi6 *fl6, ++struct dst_entry *ip6_dst_lookup_flow(struct net *net, const struct sock *sk, struct flowi6 *fl6, + const struct in6_addr *final_dst) + { + struct dst_entry *dst = NULL; + int err; + +- err = ip6_dst_lookup_tail(sock_net(sk), sk, &dst, fl6); ++ err = ip6_dst_lookup_tail(net, sk, &dst, fl6); + if (err) + return ERR_PTR(err); + if (final_dst) + fl6->daddr = *final_dst; + +- return xfrm_lookup_route(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0); ++ return xfrm_lookup_route(net, dst, flowi6_to_flowi(fl6), sk, 0); + } + EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow); + +@@ -1115,7 +1115,7 @@ struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6, + if (dst) + return dst; + +- dst = ip6_dst_lookup_flow(sk, fl6, final_dst); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_dst); + if (connected && !IS_ERR(dst)) + ip6_sk_dst_store_flow(sk, dst_clone(dst), fl6); + +diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c +index a41156a00dd44..8d19729f85162 100644 +--- a/net/ipv6/raw.c ++++ b/net/ipv6/raw.c +@@ -928,7 +928,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + + fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { + err = PTR_ERR(dst); + goto out; +diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c +index e997141aed8c0..a377be8a9fb44 100644 +--- a/net/ipv6/syncookies.c ++++ b/net/ipv6/syncookies.c +@@ -240,7 +240,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) + fl6.flowi6_uid = sk->sk_uid; + security_req_classify_flow(req, flowi6_to_flowi(&fl6)); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) + goto out_free; + } +diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c +index 7b0c2498f461b..2e76ebfdc907d 100644 +--- a/net/ipv6/tcp_ipv6.c ++++ b/net/ipv6/tcp_ipv6.c +@@ -268,7 +268,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, + + security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { + err = PTR_ERR(dst); + goto failure; +@@ -885,7 +885,7 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32 + * Underlying function will use this to retrieve the network + * namespace + */ +- dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL); ++ dst = ip6_dst_lookup_flow(sock_net(ctl_sk), ctl_sk, &fl6, NULL); + if (!IS_ERR(dst)) { + skb_dst_set(buff, dst); + ip6_xmit(ctl_sk, buff, &fl6, fl6.flowi6_mark, NULL, tclass); +diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c +index 37a69df17cab9..2f28f9910b92e 100644 +--- a/net/l2tp/l2tp_ip6.c ++++ b/net/l2tp/l2tp_ip6.c +@@ -619,7 +619,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) + + fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel); + +- dst = ip6_dst_lookup_flow(sk, &fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p); + if (IS_ERR(dst)) { + err = PTR_ERR(dst); + goto out; +diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c +index 7657194f396e1..736d8ca9821bc 100644 +--- a/net/sctp/ipv6.c ++++ b/net/sctp/ipv6.c +@@ -288,7 +288,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, + final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final); + rcu_read_unlock(); + +- dst = ip6_dst_lookup_flow(sk, fl6, final_p); ++ dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_p); + if (!asoc || saddr) { + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); +@@ -346,7 +346,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, + fl6->saddr = laddr->a.v6.sin6_addr; + fl6->fl6_sport = laddr->a.v6.sin6_port; + final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final); +- bdst = ip6_dst_lookup_flow(sk, fl6, final_p); ++ bdst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_p); + + if (IS_ERR(bdst)) + continue; +-- +2.20.1 + diff -Nru linux-4.19.98/debian/patches/bugfix/all/net-ipv6_stub-use-ip6_dst_lookup_flow-instead-of-ip6.patch linux-4.19.118/debian/patches/bugfix/all/net-ipv6_stub-use-ip6_dst_lookup_flow-instead-of-ip6.patch --- linux-4.19.98/debian/patches/bugfix/all/net-ipv6_stub-use-ip6_dst_lookup_flow-instead-of-ip6.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/net-ipv6_stub-use-ip6_dst_lookup_flow-instead-of-ip6.patch 2020-04-26 13:04:09.000000000 +0000 @@ -0,0 +1,267 @@ +From: Sabrina Dubroca +Date: Wed, 4 Dec 2019 15:35:53 +0100 +Subject: net: ipv6_stub: use ip6_dst_lookup_flow instead of ip6_dst_lookup +Origin: https://git.kernel.org/linus/6c8991f41546c3c472503dff1ea9daaddf9331c2 +Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2020-1749 + +ipv6_stub uses the ip6_dst_lookup function to allow other modules to +perform IPv6 lookups. However, this function skips the XFRM layer +entirely. + +All users of ipv6_stub->ip6_dst_lookup use ip_route_output_flow (via the +ip_route_output_key and ip_route_output helpers) for their IPv4 lookups, +which calls xfrm_lookup_route(). This patch fixes this inconsistent +behavior by switching the stub to ip6_dst_lookup_flow, which also calls +xfrm_lookup_route(). + +This requires some changes in all the callers, as these two functions +take different arguments and have different return types. + +Fixes: 5f81bd2e5d80 ("ipv6: export a stub for IPv6 symbols used by vxlan") +Reported-by: Xiumei Mu +Signed-off-by: Sabrina Dubroca +Signed-off-by: David S. Miller +[bwh: Backported to 4.19: + - Drop change in lwt_bpf.c + - Delete now-unused "ret" in mlx5e_route_lookup_ipv6() + - Initialise "out_dev" in mlx5e_create_encap_header_ipv6() to avoid + introducing a spurious "may be used uninitialised" warning + - Adjust filenames, context, indentation] +Signed-off-by: Ben Hutchings +Signed-off-by: Sasha Levin +--- + drivers/infiniband/core/addr.c | 7 +++---- + drivers/infiniband/sw/rxe/rxe_net.c | 8 +++++--- + drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 11 +++++------ + drivers/net/geneve.c | 4 +++- + drivers/net/vxlan.c | 8 +++----- + include/net/addrconf.h | 6 ++++-- + net/ipv6/addrconf_core.c | 11 ++++++----- + net/ipv6/af_inet6.c | 2 +- + net/mpls/af_mpls.c | 7 +++---- + net/tipc/udp_media.c | 9 ++++++--- + 10 files changed, 39 insertions(+), 34 deletions(-) + +diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c +index 6e96a2fb97dc4..df8f5ceea2dd4 100644 +--- a/drivers/infiniband/core/addr.c ++++ b/drivers/infiniband/core/addr.c +@@ -408,16 +408,15 @@ static int addr6_resolve(struct sockaddr_in6 *src_in, + struct flowi6 fl6; + struct dst_entry *dst; + struct rt6_info *rt; +- int ret; + + memset(&fl6, 0, sizeof fl6); + fl6.daddr = dst_in->sin6_addr; + fl6.saddr = src_in->sin6_addr; + fl6.flowi6_oif = addr->bound_dev_if; + +- ret = ipv6_stub->ipv6_dst_lookup(addr->net, NULL, &dst, &fl6); +- if (ret < 0) +- return ret; ++ dst = ipv6_stub->ipv6_dst_lookup_flow(addr->net, NULL, &fl6, NULL); ++ if (IS_ERR(dst)) ++ return PTR_ERR(dst); + + rt = (struct rt6_info *)dst; + if (ipv6_addr_any(&src_in->sin6_addr)) { +diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c +index 54add70c22b5c..7903bd5c639ea 100644 +--- a/drivers/infiniband/sw/rxe/rxe_net.c ++++ b/drivers/infiniband/sw/rxe/rxe_net.c +@@ -154,10 +154,12 @@ static struct dst_entry *rxe_find_route6(struct net_device *ndev, + memcpy(&fl6.daddr, daddr, sizeof(*daddr)); + fl6.flowi6_proto = IPPROTO_UDP; + +- if (unlikely(ipv6_stub->ipv6_dst_lookup(sock_net(recv_sockets.sk6->sk), +- recv_sockets.sk6->sk, &ndst, &fl6))) { ++ ndst = ipv6_stub->ipv6_dst_lookup_flow(sock_net(recv_sockets.sk6->sk), ++ recv_sockets.sk6->sk, &fl6, ++ NULL); ++ if (unlikely(IS_ERR(ndst))) { + pr_err_ratelimited("no route to %pI6\n", daddr); +- goto put; ++ return NULL; + } + + if (unlikely(ndst->error)) { +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +index c8928ce69185f..3050853774ee0 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +@@ -2217,12 +2217,11 @@ static int mlx5e_route_lookup_ipv6(struct mlx5e_priv *priv, + #if IS_ENABLED(CONFIG_INET) && IS_ENABLED(CONFIG_IPV6) + struct mlx5e_rep_priv *uplink_rpriv; + struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; +- int ret; + +- ret = ipv6_stub->ipv6_dst_lookup(dev_net(mirred_dev), NULL, &dst, +- fl6); +- if (ret < 0) +- return ret; ++ dst = ipv6_stub->ipv6_dst_lookup_flow(dev_net(mirred_dev), NULL, fl6, ++ NULL); ++ if (IS_ERR(dst)) ++ return PTR_ERR(dst); + + if (!(*out_ttl)) + *out_ttl = ip6_dst_hoplimit(dst); +@@ -2428,7 +2427,7 @@ static int mlx5e_create_encap_header_ipv6(struct mlx5e_priv *priv, + int max_encap_size = MLX5_CAP_ESW(priv->mdev, max_encap_header_size); + int ipv6_encap_size = ETH_HLEN + sizeof(struct ipv6hdr) + VXLAN_HLEN; + struct ip_tunnel_key *tun_key = &e->tun_info.key; +- struct net_device *out_dev; ++ struct net_device *out_dev = NULL; + struct neighbour *n = NULL; + struct flowi6 fl6 = {}; + u8 nud_state, tos, ttl; +diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c +index ff83408733d45..36444de701cd9 100644 +--- a/drivers/net/geneve.c ++++ b/drivers/net/geneve.c +@@ -801,7 +801,9 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb, + if (dst) + return dst; + } +- if (ipv6_stub->ipv6_dst_lookup(geneve->net, gs6->sock->sk, &dst, fl6)) { ++ dst = ipv6_stub->ipv6_dst_lookup_flow(geneve->net, gs6->sock->sk, fl6, ++ NULL); ++ if (IS_ERR(dst)) { + netdev_dbg(dev, "no route to %pI6\n", &fl6->daddr); + return ERR_PTR(-ENETUNREACH); + } +diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c +index 64751b089482b..7ee0bad184662 100644 +--- a/drivers/net/vxlan.c ++++ b/drivers/net/vxlan.c +@@ -1963,7 +1963,6 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan, + bool use_cache = ip_tunnel_dst_cache_usable(skb, info); + struct dst_entry *ndst; + struct flowi6 fl6; +- int err; + + if (!sock6) + return ERR_PTR(-EIO); +@@ -1986,10 +1985,9 @@ static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan, + fl6.fl6_dport = dport; + fl6.fl6_sport = sport; + +- err = ipv6_stub->ipv6_dst_lookup(vxlan->net, +- sock6->sock->sk, +- &ndst, &fl6); +- if (unlikely(err < 0)) { ++ ndst = ipv6_stub->ipv6_dst_lookup_flow(vxlan->net, sock6->sock->sk, ++ &fl6, NULL); ++ if (unlikely(IS_ERR(ndst))) { + netdev_dbg(dev, "no route to %pI6\n", daddr); + return ERR_PTR(-ENETUNREACH); + } +diff --git a/include/net/addrconf.h b/include/net/addrconf.h +index 6def0351bcc33..c8d5bb8b36169 100644 +--- a/include/net/addrconf.h ++++ b/include/net/addrconf.h +@@ -235,8 +235,10 @@ struct ipv6_stub { + const struct in6_addr *addr); + int (*ipv6_sock_mc_drop)(struct sock *sk, int ifindex, + const struct in6_addr *addr); +- int (*ipv6_dst_lookup)(struct net *net, struct sock *sk, +- struct dst_entry **dst, struct flowi6 *fl6); ++ struct dst_entry *(*ipv6_dst_lookup_flow)(struct net *net, ++ const struct sock *sk, ++ struct flowi6 *fl6, ++ const struct in6_addr *final_dst); + + struct fib6_table *(*fib6_get_table)(struct net *net, u32 id); + struct fib6_info *(*fib6_lookup)(struct net *net, int oif, +diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c +index 5cd0029d930e2..66a1a0eb2ed05 100644 +--- a/net/ipv6/addrconf_core.c ++++ b/net/ipv6/addrconf_core.c +@@ -127,11 +127,12 @@ int inet6addr_validator_notifier_call_chain(unsigned long val, void *v) + } + EXPORT_SYMBOL(inet6addr_validator_notifier_call_chain); + +-static int eafnosupport_ipv6_dst_lookup(struct net *net, struct sock *u1, +- struct dst_entry **u2, +- struct flowi6 *u3) ++static struct dst_entry *eafnosupport_ipv6_dst_lookup_flow(struct net *net, ++ const struct sock *sk, ++ struct flowi6 *fl6, ++ const struct in6_addr *final_dst) + { +- return -EAFNOSUPPORT; ++ return ERR_PTR(-EAFNOSUPPORT); + } + + static struct fib6_table *eafnosupport_fib6_get_table(struct net *net, u32 id) +@@ -169,7 +170,7 @@ eafnosupport_ip6_mtu_from_fib6(struct fib6_info *f6i, struct in6_addr *daddr, + } + + const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) { +- .ipv6_dst_lookup = eafnosupport_ipv6_dst_lookup, ++ .ipv6_dst_lookup_flow = eafnosupport_ipv6_dst_lookup_flow, + .fib6_get_table = eafnosupport_fib6_get_table, + .fib6_table_lookup = eafnosupport_fib6_table_lookup, + .fib6_lookup = eafnosupport_fib6_lookup, +diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c +index 5db88be8b6ecb..5c2351deedc8f 100644 +--- a/net/ipv6/af_inet6.c ++++ b/net/ipv6/af_inet6.c +@@ -904,7 +904,7 @@ static struct pernet_operations inet6_net_ops = { + static const struct ipv6_stub ipv6_stub_impl = { + .ipv6_sock_mc_join = ipv6_sock_mc_join, + .ipv6_sock_mc_drop = ipv6_sock_mc_drop, +- .ipv6_dst_lookup = ip6_dst_lookup, ++ .ipv6_dst_lookup_flow = ip6_dst_lookup_flow, + .fib6_get_table = fib6_get_table, + .fib6_table_lookup = fib6_table_lookup, + .fib6_lookup = fib6_lookup, +diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c +index d5a4db5b3fe7b..7623d9aec6364 100644 +--- a/net/mpls/af_mpls.c ++++ b/net/mpls/af_mpls.c +@@ -618,16 +618,15 @@ static struct net_device *inet6_fib_lookup_dev(struct net *net, + struct net_device *dev; + struct dst_entry *dst; + struct flowi6 fl6; +- int err; + + if (!ipv6_stub) + return ERR_PTR(-EAFNOSUPPORT); + + memset(&fl6, 0, sizeof(fl6)); + memcpy(&fl6.daddr, addr, sizeof(struct in6_addr)); +- err = ipv6_stub->ipv6_dst_lookup(net, NULL, &dst, &fl6); +- if (err) +- return ERR_PTR(err); ++ dst = ipv6_stub->ipv6_dst_lookup_flow(net, NULL, &fl6, NULL); ++ if (IS_ERR(dst)) ++ return ERR_CAST(dst); + + dev = dst->dev; + dev_hold(dev); +diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c +index 382c84d9339d6..1d62354797061 100644 +--- a/net/tipc/udp_media.c ++++ b/net/tipc/udp_media.c +@@ -189,10 +189,13 @@ static int tipc_udp_xmit(struct net *net, struct sk_buff *skb, + .saddr = src->ipv6, + .flowi6_proto = IPPROTO_UDP + }; +- err = ipv6_stub->ipv6_dst_lookup(net, ub->ubsock->sk, &ndst, +- &fl6); +- if (err) ++ ndst = ipv6_stub->ipv6_dst_lookup_flow(net, ++ ub->ubsock->sk, ++ &fl6, NULL); ++ if (IS_ERR(ndst)) { ++ err = PTR_ERR(ndst); + goto tx_error; ++ } + ttl = ip6_dst_hoplimit(ndst); + err = udp_tunnel6_xmit_skb(ndst, ub->ubsock->sk, skb, NULL, + &src->ipv6, &dst->ipv6, 0, ttl, 0, +-- +2.20.1 + diff -Nru linux-4.19.98/debian/patches/bugfix/all/random-try-to-actively-add-entropy-rather-than-passi.patch linux-4.19.118/debian/patches/bugfix/all/random-try-to-actively-add-entropy-rather-than-passi.patch --- linux-4.19.98/debian/patches/bugfix/all/random-try-to-actively-add-entropy-rather-than-passi.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/random-try-to-actively-add-entropy-rather-than-passi.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,143 +0,0 @@ -From: Linus Torvalds -Date: Sat, 28 Sep 2019 16:53:52 -0700 -Subject: [PATCH] random: try to actively add entropy rather than passively - wait for it -Origin: https://git.kernel.org/linus/50ee7529ec4500c88f8664560770a7a1b65db72b -Bug-Debian: https://bugs.debian.org/948519 - -For 5.3 we had to revert a nice ext4 IO pattern improvement, because it -caused a bootup regression due to lack of entropy at bootup together -with arguably broken user space that was asking for secure random -numbers when it really didn't need to. - -See commit 72dbcf721566 (Revert "ext4: make __ext4_get_inode_loc plug"). - -This aims to solve the issue by actively generating entropy noise using -the CPU cycle counter when waiting for the random number generator to -initialize. This only works when you have a high-frequency time stamp -counter available, but that's the case on all modern x86 CPU's, and on -most other modern CPU's too. - -What we do is to generate jitter entropy from the CPU cycle counter -under a somewhat complex load: calling the scheduler while also -guaranteeing a certain amount of timing noise by also triggering a -timer. - -I'm sure we can tweak this, and that people will want to look at other -alternatives, but there's been a number of papers written on jitter -entropy, and this should really be fairly conservative by crediting one -bit of entropy for every timer-induced jump in the cycle counter. Not -because the timer itself would be all that unpredictable, but because -the interaction between the timer and the loop is going to be. - -Even if (and perhaps particularly if) the timer actually happens on -another CPU, the cacheline interaction between the loop that reads the -cycle counter and the timer itself firing is going to add perturbations -to the cycle counter values that get mixed into the entropy pool. - -As Thomas pointed out, with a modern out-of-order CPU, even quite simple -loops show a fair amount of hard-to-predict timing variability even in -the absense of external interrupts. But this tries to take that further -by actually having a fairly complex interaction. - -This is not going to solve the entropy issue for architectures that have -no CPU cycle counter, but it's not clear how (and if) that is solvable, -and the hardware in question is largely starting to be irrelevant. And -by doing this we can at least avoid some of the even more contentious -approaches (like making the entropy waiting time out in order to avoid -the possibly unbounded waiting). - -Cc: Ahmed Darwish -Cc: Thomas Gleixner -Cc: Theodore Ts'o -Cc: Nicholas Mc Guire -Cc: Andy Lutomirski -Cc: Kees Cook -Cc: Willy Tarreau -Cc: Alexander E. Patrakov -Cc: Lennart Poettering -Signed-off-by: Linus Torvalds ---- - drivers/char/random.c | 62 ++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 61 insertions(+), 1 deletion(-) - -Index: linux/drivers/char/random.c -=================================================================== ---- linux.orig/drivers/char/random.c -+++ linux/drivers/char/random.c -@@ -1653,6 +1653,56 @@ void get_random_bytes(void *buf, int nby - } - EXPORT_SYMBOL(get_random_bytes); - -+ -+/* -+ * Each time the timer fires, we expect that we got an unpredictable -+ * jump in the cycle counter. Even if the timer is running on another -+ * CPU, the timer activity will be touching the stack of the CPU that is -+ * generating entropy.. -+ * -+ * Note that we don't re-arm the timer in the timer itself - we are -+ * happy to be scheduled away, since that just makes the load more -+ * complex, but we do not want the timer to keep ticking unless the -+ * entropy loop is running. -+ * -+ * So the re-arming always happens in the entropy loop itself. -+ */ -+static void entropy_timer(struct timer_list *t) -+{ -+ credit_entropy_bits(&input_pool, 1); -+} -+ -+/* -+ * If we have an actual cycle counter, see if we can -+ * generate enough entropy with timing noise -+ */ -+static void try_to_generate_entropy(void) -+{ -+ struct { -+ unsigned long now; -+ struct timer_list timer; -+ } stack; -+ -+ stack.now = random_get_entropy(); -+ -+ /* Slow counter - or none. Don't even bother */ -+ if (stack.now == random_get_entropy()) -+ return; -+ -+ timer_setup_on_stack(&stack.timer, entropy_timer, 0); -+ while (!crng_ready()) { -+ if (!timer_pending(&stack.timer)) -+ mod_timer(&stack.timer, jiffies+1); -+ mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now)); -+ schedule(); -+ stack.now = random_get_entropy(); -+ } -+ -+ del_timer_sync(&stack.timer); -+ destroy_timer_on_stack(&stack.timer); -+ mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now)); -+} -+ - /* - * Wait for the urandom pool to be seeded and thus guaranteed to supply - * cryptographically secure random numbers. This applies to: the /dev/urandom -@@ -1667,7 +1717,17 @@ int wait_for_random_bytes(void) - { - if (likely(crng_ready())) - return 0; -- return wait_event_interruptible(crng_init_wait, crng_ready()); -+ -+ do { -+ int ret; -+ ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ); -+ if (ret) -+ return ret > 0 ? 0 : ret; -+ -+ try_to_generate_entropy(); -+ } while (!crng_ready()); -+ -+ return 0; - } - EXPORT_SYMBOL(wait_for_random_bytes); - diff -Nru linux-4.19.98/debian/patches/bugfix/all/tools-lib-api-fs-fs.c-fix-misuse-of-strncpy.patch linux-4.19.118/debian/patches/bugfix/all/tools-lib-api-fs-fs.c-fix-misuse-of-strncpy.patch --- linux-4.19.98/debian/patches/bugfix/all/tools-lib-api-fs-fs.c-fix-misuse-of-strncpy.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/tools-lib-api-fs-fs.c-fix-misuse-of-strncpy.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -From: Ben Hutchings -Date: Thu, 19 Jul 2018 23:36:52 +0100 -Subject: tools/lib/api/fs/fs.c: Fix misuse of strncpy() -Bug-Debian: https://bugs.debian.org/897802 -Forwarded: https://lore.kernel.org/lkml/20180721021026.GQ14131@decadent.org.uk/T/ - -gcc 8 reports: - -In function 'fs__env_override', - inlined from 'fs__get_mountpoint' at fs/fs.c:228:6: -fs/fs.c:222:2: error: 'strncpy' specified bound 4096 equals destination size [-Werror=stringop-truncation] - strncpy(fs->path, override_path, sizeof(fs->path)); - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -I'm not convinced it makes sense to truncate the copied string here, -but since we're already doing so let's ensure it's still null- -terminated. Use strlcpy() instead. - -Signed-off-by: Ben Hutchings ---- -Index: linux/tools/lib/api/fs/fs.c -=================================================================== ---- linux.orig/tools/lib/api/fs/fs.c -+++ linux/tools/lib/api/fs/fs.c -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - - #include "fs.h" - #include "debug-internal.h" -@@ -219,7 +220,7 @@ static bool fs__env_override(struct fs * - return false; - - fs->found = true; -- strncpy(fs->path, override_path, sizeof(fs->path)); -+ strlcpy(fs->path, override_path, sizeof(fs->path)); - return true; - } - diff -Nru linux-4.19.98/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak-in-i2400m_op_rfkill_sw_toggle.patch linux-4.19.118/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak-in-i2400m_op_rfkill_sw_toggle.patch --- linux-4.19.98/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak-in-i2400m_op_rfkill_sw_toggle.patch 2020-01-26 19:59:32.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak-in-i2400m_op_rfkill_sw_toggle.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -From: Navid Emamdoost -Date: Fri, 25 Oct 2019 23:53:30 -0500 -Subject: wimax: i2400: Fix memory leak in i2400m_op_rfkill_sw_toggle -Origin: https://git.kernel.org/linus/6f3ef5c25cc762687a7341c18cbea5af54461407 -Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2019-19051 - -In the implementation of i2400m_op_rfkill_sw_toggle() the allocated -buffer for cmd should be released before returning. The -documentation for i2400m_msg_to_dev() says when it returns the buffer -can be reused. Meaning cmd should be released in either case. Move -kfree(cmd) before return to be reached by all execution paths. - -Fixes: 2507e6ab7a9a ("wimax: i2400: fix memory leak") -Signed-off-by: Navid Emamdoost -Signed-off-by: David S. Miller -Signed-off-by: Ben Hutchings -Signed-off-by: Greg Kroah-Hartman ---- - drivers/net/wimax/i2400m/op-rfkill.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wimax/i2400m/op-rfkill.c -+++ b/drivers/net/wimax/i2400m/op-rfkill.c -@@ -142,12 +142,12 @@ int i2400m_op_rfkill_sw_toggle(struct wi - "%d\n", result); - result = 0; - error_cmd: -- kfree(cmd); - kfree_skb(ack_skb); - error_msg_to_dev: - error_alloc: - d_fnend(4, dev, "(wimax_dev %p state %d) = %d\n", - wimax_dev, state, result); -+ kfree(cmd); - return result; - } - diff -Nru linux-4.19.98/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak.patch linux-4.19.118/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak.patch --- linux-4.19.98/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/all/wimax-i2400-fix-memory-leak.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -From: Navid Emamdoost -Date: Tue, 10 Sep 2019 18:01:40 -0500 -Subject: wimax: i2400: fix memory leak -Origin: https://git.kernel.org/linus/2507e6ab7a9a440773be476141a255934468c5ef -Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2019-19051 - -In i2400m_op_rfkill_sw_toggle cmd buffer should be released along with -skb response. - -Signed-off-by: Navid Emamdoost -Signed-off-by: David S. Miller -Signed-off-by: Ben Hutchings -Signed-off-by: Greg Kroah-Hartman ---- - drivers/net/wimax/i2400m/op-rfkill.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/wimax/i2400m/op-rfkill.c -+++ b/drivers/net/wimax/i2400m/op-rfkill.c -@@ -142,6 +142,7 @@ int i2400m_op_rfkill_sw_toggle(struct wi - "%d\n", result); - result = 0; - error_cmd: -+ kfree(cmd); - kfree_skb(ack_skb); - error_msg_to_dev: - error_alloc: diff -Nru linux-4.19.98/debian/patches/bugfix/powerpc/powerpc-vdso-make-vdso32-installation-conditional-in.patch linux-4.19.118/debian/patches/bugfix/powerpc/powerpc-vdso-make-vdso32-installation-conditional-in.patch --- linux-4.19.98/debian/patches/bugfix/powerpc/powerpc-vdso-make-vdso32-installation-conditional-in.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/bugfix/powerpc/powerpc-vdso-make-vdso32-installation-conditional-in.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -From: Ben Hutchings -Date: Fri, 22 Mar 2019 03:30:10 +0000 -Subject: powerpc: vdso: Make vdso32 installation conditional in vdso_install -Bug-Debian: https://bugs.debian.org/785065 -Forwarded: https://lore.kernel.org/linuxppc-dev/20190322042436.nttfgsdpdshco27y@decadent.org.uk/ - -The 32-bit vDSO is not needed and not normally built for 64-bit -little-endian configurations. However, the vdso_install target still -builds and installs it. Add the same config condition as is normally -used for the build. - -Fixes: e0d005916994 ("powerpc/vdso: Disable building the 32-bit VDSO ...") -Signed-off-by: Ben Hutchings ---- - arch/powerpc/Makefile | 2 ++ - 1 file changed, 2 insertions(+) - -Index: linux/arch/powerpc/Makefile -=================================================================== ---- linux.orig/arch/powerpc/Makefile -+++ linux/arch/powerpc/Makefile -@@ -403,7 +403,9 @@ vdso_install: - ifdef CONFIG_PPC64 - $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@ - endif -+ifdef CONFIG_VDSO32 - $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@ -+endif - - archclean: - $(Q)$(MAKE) $(clean)=$(boot) diff -Nru linux-4.19.98/debian/patches/debian/revert-objtool-fix-config_stack_validation-y-warning.patch linux-4.19.118/debian/patches/debian/revert-objtool-fix-config_stack_validation-y-warning.patch --- linux-4.19.98/debian/patches/debian/revert-objtool-fix-config_stack_validation-y-warning.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/debian/revert-objtool-fix-config_stack_validation-y-warning.patch 2020-04-22 13:32:13.000000000 +0000 @@ -10,11 +10,9 @@ Makefile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) -Index: linux/Makefile -=================================================================== ---- linux.orig/Makefile -+++ linux/Makefile -@@ -948,17 +948,6 @@ export mod_sign_cmd +--- a/Makefile ++++ b/Makefile +@@ -954,17 +954,6 @@ export mod_sign_cmd HOST_LIBELF_LIBS = $(shell pkg-config libelf --libs 2>/dev/null || echo -lelf) @@ -29,10 +27,10 @@ - endif -endif - + PHONY += prepare0 ifeq ($(KBUILD_EXTMOD),) - core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ -@@ -1109,6 +1098,17 @@ uapi-asm-generic: +@@ -1115,6 +1104,17 @@ uapi-asm-generic: $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \ src=uapi/asm obj=arch/$(SRCARCH)/include/generated/uapi/asm diff -Nru linux-4.19.98/debian/patches/features/all/ena/net-ena-add-MAX_QUEUES_EXT-get-feature-admin-command.patch linux-4.19.118/debian/patches/features/all/ena/net-ena-add-MAX_QUEUES_EXT-get-feature-admin-command.patch --- linux-4.19.98/debian/patches/features/all/ena/net-ena-add-MAX_QUEUES_EXT-get-feature-admin-command.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/all/ena/net-ena-add-MAX_QUEUES_EXT-get-feature-admin-command.patch 2020-04-22 13:32:13.000000000 +0000 @@ -16,10 +16,8 @@ drivers/net/ethernet/amazon/ena/ena_com.h | 3 + 3 files changed, 105 insertions(+), 30 deletions(-) -Index: linux/drivers/net/ethernet/amazon/ena/ena_admin_defs.h -=================================================================== ---- linux.orig/drivers/net/ethernet/amazon/ena/ena_admin_defs.h -+++ linux/drivers/net/ethernet/amazon/ena/ena_admin_defs.h +--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h ++++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h @@ -60,6 +60,7 @@ enum ena_admin_aq_feature_id { ENA_ADMIN_MAX_QUEUES_NUM = 2, ENA_ADMIN_HW_HINTS = 3, @@ -118,11 +116,9 @@ u8 flags; u8 reserved1[3]; -Index: linux/drivers/net/ethernet/amazon/ena/ena_com.c -=================================================================== ---- linux.orig/drivers/net/ethernet/amazon/ena/ena_com.c -+++ linux/drivers/net/ethernet/amazon/ena/ena_com.c -@@ -978,7 +978,8 @@ static int ena_com_get_feature_ex(struct +--- a/drivers/net/ethernet/amazon/ena/ena_com.c ++++ b/drivers/net/ethernet/amazon/ena/ena_com.c +@@ -983,7 +983,8 @@ static int ena_com_get_feature_ex(struct struct ena_admin_get_feat_resp *get_resp, enum ena_admin_aq_feature_id feature_id, dma_addr_t control_buf_dma_addr, @@ -132,7 +128,7 @@ { struct ena_com_admin_queue *admin_queue; struct ena_admin_get_feat_cmd get_cmd; -@@ -1009,7 +1010,7 @@ static int ena_com_get_feature_ex(struct +@@ -1014,7 +1015,7 @@ static int ena_com_get_feature_ex(struct } get_cmd.control_buffer.length = control_buff_size; @@ -141,7 +137,7 @@ get_cmd.feat_common.feature_id = feature_id; ret = ena_com_execute_admin_command(admin_queue, -@@ -1029,13 +1030,15 @@ static int ena_com_get_feature_ex(struct +@@ -1034,13 +1035,15 @@ static int ena_com_get_feature_ex(struct static int ena_com_get_feature(struct ena_com_dev *ena_dev, struct ena_admin_get_feat_resp *get_resp, @@ -158,8 +154,8 @@ + feature_ver); } - static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev) -@@ -1095,7 +1098,7 @@ static int ena_com_indirect_table_alloca + static void ena_com_hash_key_fill_default_key(struct ena_com_dev *ena_dev) +@@ -1118,7 +1121,7 @@ static int ena_com_indirect_table_alloca int ret; ret = ena_com_get_feature(ena_dev, &get_resp, @@ -168,7 +164,7 @@ if (unlikely(ret)) return ret; -@@ -1515,7 +1518,7 @@ int ena_com_set_aenq_config(struct ena_c +@@ -1538,7 +1541,7 @@ int ena_com_set_aenq_config(struct ena_c struct ena_admin_get_feat_resp get_resp; int ret; @@ -177,7 +173,7 @@ if (ret) { pr_info("Can't get aenq configuration\n"); return ret; -@@ -1890,7 +1893,7 @@ void ena_com_destroy_io_queue(struct ena +@@ -1913,7 +1916,7 @@ void ena_com_destroy_io_queue(struct ena int ena_com_get_link_params(struct ena_com_dev *ena_dev, struct ena_admin_get_feat_resp *resp) { @@ -186,7 +182,7 @@ } int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev, -@@ -1900,7 +1903,7 @@ int ena_com_get_dev_attr_feat(struct ena +@@ -1923,7 +1926,7 @@ int ena_com_get_dev_attr_feat(struct ena int rc; rc = ena_com_get_feature(ena_dev, &get_resp, @@ -195,7 +191,7 @@ if (rc) return rc; -@@ -1908,17 +1911,34 @@ int ena_com_get_dev_attr_feat(struct ena +@@ -1931,17 +1934,34 @@ int ena_com_get_dev_attr_feat(struct ena sizeof(get_resp.u.dev_attr)); ena_dev->supported_features = get_resp.u.dev_attr.supported_features; @@ -238,7 +234,7 @@ if (rc) return rc; -@@ -1926,7 +1946,7 @@ int ena_com_get_dev_attr_feat(struct ena +@@ -1949,7 +1969,7 @@ int ena_com_get_dev_attr_feat(struct ena sizeof(get_resp.u.aenq)); rc = ena_com_get_feature(ena_dev, &get_resp, @@ -247,7 +243,7 @@ if (rc) return rc; -@@ -1936,7 +1956,7 @@ int ena_com_get_dev_attr_feat(struct ena +@@ -1959,7 +1979,7 @@ int ena_com_get_dev_attr_feat(struct ena /* Driver hints isn't mandatory admin command. So in case the * command isn't supported set driver hints to 0 */ @@ -256,7 +252,7 @@ if (!rc) memcpy(&get_feat_ctx->hw_hints, &get_resp.u.hw_hints, -@@ -1947,7 +1967,7 @@ int ena_com_get_dev_attr_feat(struct ena +@@ -1970,7 +1990,7 @@ int ena_com_get_dev_attr_feat(struct ena else return rc; @@ -265,7 +261,7 @@ if (!rc) memcpy(&get_feat_ctx->llq, &get_resp.u.llq, sizeof(get_resp.u.llq)); -@@ -2185,7 +2205,7 @@ int ena_com_get_offload_settings(struct +@@ -2208,7 +2228,7 @@ int ena_com_get_offload_settings(struct struct ena_admin_get_feat_resp resp; ret = ena_com_get_feature(ena_dev, &resp, @@ -274,7 +270,7 @@ if (unlikely(ret)) { pr_err("Failed to get offload capabilities %d\n", ret); return ret; -@@ -2214,7 +2234,7 @@ int ena_com_set_hash_function(struct ena +@@ -2237,7 +2257,7 @@ int ena_com_set_hash_function(struct ena /* Validate hash function is supported */ ret = ena_com_get_feature(ena_dev, &get_resp, @@ -283,7 +279,7 @@ if (unlikely(ret)) return ret; -@@ -2274,7 +2294,7 @@ int ena_com_fill_hash_function(struct en +@@ -2297,7 +2317,7 @@ int ena_com_fill_hash_function(struct en rc = ena_com_get_feature_ex(ena_dev, &get_resp, ENA_ADMIN_RSS_HASH_FUNCTION, rss->hash_key_dma_addr, @@ -292,7 +288,7 @@ if (unlikely(rc)) return rc; -@@ -2326,7 +2346,7 @@ int ena_com_get_hash_function(struct ena +@@ -2350,7 +2370,7 @@ int ena_com_get_hash_function(struct ena rc = ena_com_get_feature_ex(ena_dev, &get_resp, ENA_ADMIN_RSS_HASH_FUNCTION, rss->hash_key_dma_addr, @@ -301,7 +297,7 @@ if (unlikely(rc)) return rc; -@@ -2351,7 +2371,7 @@ int ena_com_get_hash_ctrl(struct ena_com +@@ -2379,7 +2399,7 @@ int ena_com_get_hash_ctrl(struct ena_com rc = ena_com_get_feature_ex(ena_dev, &get_resp, ENA_ADMIN_RSS_HASH_INPUT, rss->hash_ctrl_dma_addr, @@ -310,7 +306,7 @@ if (unlikely(rc)) return rc; -@@ -2587,7 +2607,7 @@ int ena_com_indirect_table_get(struct en +@@ -2615,7 +2635,7 @@ int ena_com_indirect_table_get(struct en rc = ena_com_get_feature_ex(ena_dev, &get_resp, ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG, rss->rss_ind_tbl_dma_addr, @@ -319,7 +315,7 @@ if (unlikely(rc)) return rc; -@@ -2801,7 +2821,7 @@ int ena_com_init_interrupt_moderation(st +@@ -2831,7 +2851,7 @@ int ena_com_init_interrupt_moderation(st int rc; rc = ena_com_get_feature(ena_dev, &get_resp, @@ -328,11 +324,9 @@ if (rc) { if (rc == -EOPNOTSUPP) { -Index: linux/drivers/net/ethernet/amazon/ena/ena_com.h -=================================================================== ---- linux.orig/drivers/net/ethernet/amazon/ena/ena_com.h -+++ linux/drivers/net/ethernet/amazon/ena/ena_com.h -@@ -101,6 +101,8 @@ +--- a/drivers/net/ethernet/amazon/ena/ena_com.h ++++ b/drivers/net/ethernet/amazon/ena/ena_com.h +@@ -102,6 +102,8 @@ #define ENA_HW_HINTS_NO_TIMEOUT 0xFFFF @@ -341,7 +335,7 @@ enum ena_intr_moder_level { ENA_INTR_MODER_LOWEST = 0, ENA_INTR_MODER_LOW, -@@ -382,6 +384,7 @@ struct ena_com_dev { +@@ -383,6 +385,7 @@ struct ena_com_dev { struct ena_com_dev_get_features_ctx { struct ena_admin_queue_feature_desc max_queues; diff -Nru linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-Free-napi-resources-when-ena_up-fails.patch linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-Free-napi-resources-when-ena_up-fails.patch --- linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-Free-napi-resources-when-ena_up-fails.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-Free-napi-resources-when-ena_up-fails.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -From: Sameeh Jubran -Date: Wed, 1 May 2019 16:47:05 +0300 -Subject: [PATCH] net: ena: fix: Free napi resources when ena_up() fails -Origin: https://git.kernel.org/linus/b287cdbd1cedfc9606682c6e02b58d00ff3a33ae -Bug-Debian: https://bugs.debian.org/941291 - -ena_up() calls ena_init_napi() but does not call ena_del_napi() in -case of failure. This causes a segmentation fault upon rmmod when -netif_napi_del() is called. Fix this bug by calling ena_del_napi() -before returning error from ena_up(). - -Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") -Signed-off-by: Arthur Kiyanovski -Signed-off-by: Sameeh Jubran -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/amazon/ena/ena_netdev.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c -index dbcd58ebd0a9..03244155f74c 100644 ---- a/drivers/net/ethernet/amazon/ena/ena_netdev.c -+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c -@@ -1825,6 +1825,7 @@ static int ena_up(struct ena_adapter *adapter) - err_setup_tx: - ena_free_io_irq(adapter); - err_req_irq: -+ ena_del_napi(adapter); - - return rc; - } --- -2.17.1 - diff -Nru linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-ena_com_fill_hash_function-implementatio.patch linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-ena_com_fill_hash_function-implementatio.patch --- linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-ena_com_fill_hash_function-implementatio.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-ena_com_fill_hash_function-implementatio.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -From: Sameeh Jubran -Date: Wed, 1 May 2019 16:47:09 +0300 -Subject: [PATCH] net: ena: fix ena_com_fill_hash_function() implementation -Origin: https://git.kernel.org/linus/11bd7a00c0d8ffe33d1e926f8e789b4aea787186 -Bug-Debian: https://bugs.debian.org/941291 - -ena_com_fill_hash_function() didn't configure the rss->hash_func. - -Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") -Signed-off-by: Netanel Belgazal -Signed-off-by: Sameeh Jubran -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/amazon/ena/ena_com.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c b/drivers/net/ethernet/amazon/ena/ena_com.c -index 677d31abf214..4cdd8459c37e 100644 ---- a/drivers/net/ethernet/amazon/ena/ena_com.c -+++ b/drivers/net/ethernet/amazon/ena/ena_com.c -@@ -2280,6 +2280,7 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev, - return -EINVAL; - } - -+ rss->hash_func = func; - rc = ena_com_set_hash_function(ena_dev); - - /* Restore the old function */ --- -2.17.1 - diff -Nru linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-incorrect-test-of-supported-hash-functio.patch linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-incorrect-test-of-supported-hash-functio.patch --- linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-incorrect-test-of-supported-hash-functio.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-incorrect-test-of-supported-hash-functio.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -From: Sameeh Jubran -Date: Wed, 1 May 2019 16:47:06 +0300 -Subject: [PATCH] net: ena: fix incorrect test of supported hash function -Origin: https://git.kernel.org/linus/d3cfe7ddbc3dfbb9b201615b7fef8fd66d1b5fe8 -Bug-Debian: https://bugs.debian.org/941291 - -ena_com_set_hash_function() tests if a hash function is supported -by the device before setting it. -The test returns the opposite result than needed. -Reverse the condition to return the correct value. -Also use the BIT macro instead of inline shift. - -Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") -Signed-off-by: Arthur Kiyanovski -Signed-off-by: Sameeh Jubran -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/amazon/ena/ena_com.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/net/ethernet/amazon/ena/ena_com.c b/drivers/net/ethernet/amazon/ena/ena_com.c -index b17d435de09f..f9bc0b831a1a 100644 ---- a/drivers/net/ethernet/amazon/ena/ena_com.c -+++ b/drivers/net/ethernet/amazon/ena/ena_com.c -@@ -2195,7 +2195,7 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev) - if (unlikely(ret)) - return ret; - -- if (get_resp.u.flow_hash_func.supported_func & (1 << rss->hash_func)) { -+ if (!(get_resp.u.flow_hash_func.supported_func & BIT(rss->hash_func))) { - pr_err("Func hash %d isn't supported by device, abort\n", - rss->hash_func); - return -EOPNOTSUPP; --- -2.17.1 - diff -Nru linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-swapped-parameters-when-calling-ena_com_.patch linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-swapped-parameters-when-calling-ena_com_.patch --- linux-4.19.98/debian/patches/features/all/ena/net-ena-fix-swapped-parameters-when-calling-ena_com_.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/all/ena/net-ena-fix-swapped-parameters-when-calling-ena_com_.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -From: Sameeh Jubran -Date: Wed, 1 May 2019 16:47:03 +0300 -Subject: [PATCH] net: ena: fix swapped parameters when calling - ena_com_indirect_table_fill_entry -Origin: https://git.kernel.org/linus/3c6eeff295f01bdf1c6c3addcb0a04c0c6c029e9 -Bug-Debian: https://bugs.debian.org/941291 - -second parameter should be the index of the table rather than the value. - -Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") -Signed-off-by: Saeed Bshara -Signed-off-by: Sameeh Jubran -Signed-off-by: David S. Miller ---- - drivers/net/ethernet/amazon/ena/ena_ethtool.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -Index: linux/drivers/net/ethernet/amazon/ena/ena_ethtool.c -=================================================================== ---- linux.orig/drivers/net/ethernet/amazon/ena/ena_ethtool.c -+++ linux/drivers/net/ethernet/amazon/ena/ena_ethtool.c -@@ -717,8 +717,8 @@ static int ena_set_rxfh(struct net_devic - if (indir) { - for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) { - rc = ena_com_indirect_table_fill_entry(ena_dev, -- ENA_IO_RXQ_IDX(indir[i]), -- i); -+ i, -+ ENA_IO_RXQ_IDX(indir[i])); - if (unlikely(rc)) { - netif_err(adapter, drv, netdev, - "Cannot fill indirect table (index is too large)\n"); diff -Nru linux-4.19.98/debian/patches/features/all/lockdown/0002-Add-a-SysRq-option-to-lift-kernel-lockdown.patch linux-4.19.118/debian/patches/features/all/lockdown/0002-Add-a-SysRq-option-to-lift-kernel-lockdown.patch --- linux-4.19.98/debian/patches/features/all/lockdown/0002-Add-a-SysRq-option-to-lift-kernel-lockdown.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/all/lockdown/0002-Add-a-SysRq-option-to-lift-kernel-lockdown.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,285 +0,0 @@ -From: Kyle McMartin -Date: Wed, 8 Nov 2017 15:11:31 +0000 -Subject: [02/29] Add a SysRq option to lift kernel lockdown -Origin: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/commit?id=47a04d29e952d4dd896f2ec4c2ecee6971ab364d - -Make an option to provide a sysrq key that will lift the kernel lockdown, -thereby allowing the running kernel image to be accessed and modified. - -On x86 this is triggered with SysRq+x, but this key may not be available on -all arches, so it is set by setting LOCKDOWN_LIFT_KEY in asm/setup.h. -Since this macro must be defined in an arch to be able to use this facility -for that arch, the Kconfig option is restricted to arches that support it. - -Signed-off-by: Kyle McMartin -Signed-off-by: David Howells -cc: x86@kernel.org -[bwh: Forward-ported to 4.15] ---- - arch/x86/include/asm/setup.h | 2 ++ - drivers/input/misc/uinput.c | 1 + - drivers/tty/sysrq.c | 19 ++++++++++++------ - include/linux/input.h | 5 +++++ - include/linux/sysrq.h | 8 +++++++- - kernel/debug/kdb/kdb_main.c | 2 +- - security/Kconfig | 10 ++++++++++ - security/lock_down.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ - 8 files changed, 86 insertions(+), 8 deletions(-) - -Index: linux/arch/x86/include/asm/setup.h -=================================================================== ---- linux.orig/arch/x86/include/asm/setup.h -+++ linux/arch/x86/include/asm/setup.h -@@ -9,6 +9,8 @@ - #include - #include - -+#define LOCKDOWN_LIFT_KEY 'x' -+ - #ifdef __i386__ - - #include -Index: linux/drivers/input/misc/uinput.c -=================================================================== ---- linux.orig/drivers/input/misc/uinput.c -+++ linux/drivers/input/misc/uinput.c -@@ -366,6 +366,7 @@ static int uinput_create_device(struct u - dev->flush = uinput_dev_flush; - } - -+ dev->flags |= INPUTDEV_FLAGS_SYNTHETIC; - dev->event = uinput_dev_event; - - input_set_drvdata(udev->dev, udev); -Index: linux/drivers/tty/sysrq.c -=================================================================== ---- linux.orig/drivers/tty/sysrq.c -+++ linux/drivers/tty/sysrq.c -@@ -487,6 +487,7 @@ static struct sysrq_key_op *sysrq_key_ta - /* x: May be registered on mips for TLB dump */ - /* x: May be registered on ppc/powerpc for xmon */ - /* x: May be registered on sparc64 for global PMU dump */ -+ /* x: May be registered on x86_64 for disabling secure boot */ - NULL, /* x */ - /* y: May be registered on sparc64 for global register dump */ - NULL, /* y */ -@@ -530,7 +531,7 @@ static void __sysrq_put_key_op(int key, - sysrq_key_table[i] = op_p; - } - --void __handle_sysrq(int key, bool check_mask) -+void __handle_sysrq(int key, unsigned int from) - { - struct sysrq_key_op *op_p; - int orig_log_level; -@@ -550,11 +551,15 @@ void __handle_sysrq(int key, bool check_ - - op_p = __sysrq_get_key_op(key); - if (op_p) { -+ /* Ban synthetic events from some sysrq functionality */ -+ if ((from == SYSRQ_FROM_PROC || from == SYSRQ_FROM_SYNTHETIC) && -+ op_p->enable_mask & SYSRQ_DISABLE_USERSPACE) -+ printk("This sysrq operation is disabled from userspace.\n"); - /* - * Should we check for enabled operations (/proc/sysrq-trigger - * should not) and is the invoked operation enabled? - */ -- if (!check_mask || sysrq_on_mask(op_p->enable_mask)) { -+ if (from == SYSRQ_FROM_KERNEL || sysrq_on_mask(op_p->enable_mask)) { - pr_cont("%s\n", op_p->action_msg); - console_loglevel = orig_log_level; - op_p->handler(key); -@@ -586,7 +591,7 @@ void __handle_sysrq(int key, bool check_ - void handle_sysrq(int key) - { - if (sysrq_on()) -- __handle_sysrq(key, true); -+ __handle_sysrq(key, SYSRQ_FROM_KERNEL); - } - EXPORT_SYMBOL(handle_sysrq); - -@@ -667,7 +672,7 @@ static void sysrq_do_reset(struct timer_ - static void sysrq_handle_reset_request(struct sysrq_state *state) - { - if (state->reset_requested) -- __handle_sysrq(sysrq_xlate[KEY_B], false); -+ __handle_sysrq(sysrq_xlate[KEY_B], SYSRQ_FROM_KERNEL); - - if (sysrq_reset_downtime_ms) - mod_timer(&state->keyreset_timer, -@@ -818,8 +823,10 @@ static bool sysrq_handle_keypress(struct - - default: - if (sysrq->active && value && value != 2) { -+ int from = sysrq->handle.dev->flags & INPUTDEV_FLAGS_SYNTHETIC ? -+ SYSRQ_FROM_SYNTHETIC : 0; - sysrq->need_reinject = false; -- __handle_sysrq(sysrq_xlate[code], true); -+ __handle_sysrq(sysrq_xlate[code], from); - } - break; - } -@@ -1102,7 +1109,7 @@ static ssize_t write_sysrq_trigger(struc - - if (get_user(c, buf)) - return -EFAULT; -- __handle_sysrq(c, false); -+ __handle_sysrq(c, SYSRQ_FROM_PROC); - } - - return count; -Index: linux/include/linux/input.h -=================================================================== ---- linux.orig/include/linux/input.h -+++ linux/include/linux/input.h -@@ -42,6 +42,7 @@ struct input_value { - * @phys: physical path to the device in the system hierarchy - * @uniq: unique identification code for the device (if device has it) - * @id: id of the device (struct input_id) -+ * @flags: input device flags (SYNTHETIC, etc.) - * @propbit: bitmap of device properties and quirks - * @evbit: bitmap of types of events supported by the device (EV_KEY, - * EV_REL, etc.) -@@ -124,6 +125,8 @@ struct input_dev { - const char *uniq; - struct input_id id; - -+ unsigned int flags; -+ - unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)]; - - unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; -@@ -190,6 +193,8 @@ struct input_dev { - }; - #define to_input_dev(d) container_of(d, struct input_dev, dev) - -+#define INPUTDEV_FLAGS_SYNTHETIC 0x000000001 -+ - /* - * Verify that we are in sync with input_device_id mod_devicetable.h #defines - */ -Index: linux/include/linux/sysrq.h -=================================================================== ---- linux.orig/include/linux/sysrq.h -+++ linux/include/linux/sysrq.h -@@ -29,6 +29,8 @@ - #define SYSRQ_ENABLE_BOOT 0x0080 - #define SYSRQ_ENABLE_RTNICE 0x0100 - -+#define SYSRQ_DISABLE_USERSPACE 0x00010000 -+ - struct sysrq_key_op { - void (*handler)(int); - char *help_msg; -@@ -43,8 +45,12 @@ struct sysrq_key_op { - * are available -- else NULL's). - */ - -+#define SYSRQ_FROM_KERNEL 0x0001 -+#define SYSRQ_FROM_PROC 0x0002 -+#define SYSRQ_FROM_SYNTHETIC 0x0004 -+ - void handle_sysrq(int key); --void __handle_sysrq(int key, bool check_mask); -+void __handle_sysrq(int key, unsigned int from); - int register_sysrq_key(int key, struct sysrq_key_op *op); - int unregister_sysrq_key(int key, struct sysrq_key_op *op); - struct sysrq_key_op *__sysrq_get_key_op(int key); -Index: linux/kernel/debug/kdb/kdb_main.c -=================================================================== ---- linux.orig/kernel/debug/kdb/kdb_main.c -+++ linux/kernel/debug/kdb/kdb_main.c -@@ -1996,7 +1996,7 @@ static int kdb_sr(int argc, const char * - return KDB_ARGCOUNT; - - kdb_trap_printk++; -- __handle_sysrq(*argv[1], check_mask); -+ __handle_sysrq(*argv[1], check_mask ? SYSRQ_FROM_KERNEL : 0); - kdb_trap_printk--; - - return 0; -Index: linux/security/Kconfig -=================================================================== ---- linux.orig/security/Kconfig -+++ linux/security/Kconfig -@@ -247,6 +247,16 @@ config LOCK_DOWN_KERNEL - turns off various features that might otherwise allow access to the - kernel image (eg. setting MSR registers). - -+config ALLOW_LOCKDOWN_LIFT_BY_SYSRQ -+ bool "Allow the kernel lockdown to be lifted by SysRq" -+ depends on LOCK_DOWN_KERNEL -+ depends on MAGIC_SYSRQ -+ depends on X86 -+ help -+ Allow the lockdown on a kernel to be lifted, by pressing a SysRq key -+ combination on a wired keyboard. -+ -+ - source security/selinux/Kconfig - source security/smack/Kconfig - source security/tomoyo/Kconfig -Index: linux/security/lock_down.c -=================================================================== ---- linux.orig/security/lock_down.c -+++ linux/security/lock_down.c -@@ -11,8 +11,14 @@ - - #include - #include -+#include -+#include - -+#ifdef CONFIG_ALLOW_LOCKDOWN_LIFT_BY_SYSRQ -+static __read_mostly bool kernel_locked_down; -+#else - static __ro_after_init bool kernel_locked_down; -+#endif - - /* - * Put the kernel into lock-down mode. -@@ -58,3 +64,44 @@ bool __kernel_is_locked_down(const char - return kernel_locked_down; - } - EXPORT_SYMBOL(__kernel_is_locked_down); -+ -+#ifdef CONFIG_ALLOW_LOCKDOWN_LIFT_BY_SYSRQ -+ -+/* -+ * Take the kernel out of lockdown mode. -+ */ -+static void lift_kernel_lockdown(void) -+{ -+ pr_notice("Lifting lockdown\n"); -+ kernel_locked_down = false; -+} -+ -+/* -+ * Allow lockdown to be lifted by pressing something like SysRq+x (and not by -+ * echoing the appropriate letter into the sysrq-trigger file). -+ */ -+static void sysrq_handle_lockdown_lift(int key) -+{ -+ if (kernel_locked_down) -+ lift_kernel_lockdown(); -+} -+ -+static struct sysrq_key_op lockdown_lift_sysrq_op = { -+ .handler = sysrq_handle_lockdown_lift, -+ .help_msg = "unSB(x)", -+ .action_msg = "Disabling Secure Boot restrictions", -+ .enable_mask = SYSRQ_DISABLE_USERSPACE, -+}; -+ -+static int __init lockdown_lift_sysrq(void) -+{ -+ if (kernel_locked_down) { -+ lockdown_lift_sysrq_op.help_msg[5] = LOCKDOWN_LIFT_KEY; -+ register_sysrq_key(LOCKDOWN_LIFT_KEY, &lockdown_lift_sysrq_op); -+ } -+ return 0; -+} -+ -+late_initcall(lockdown_lift_sysrq); -+ -+#endif /* CONFIG_ALLOW_LOCKDOWN_LIFT_BY_SYSRQ */ diff -Nru linux-4.19.98/debian/patches/features/all/lockdown/0029-efi-Lock-down-the-kernel-if-booted-in-secure-boot-mo.patch linux-4.19.118/debian/patches/features/all/lockdown/0029-efi-Lock-down-the-kernel-if-booted-in-secure-boot-mo.patch --- linux-4.19.98/debian/patches/features/all/lockdown/0029-efi-Lock-down-the-kernel-if-booted-in-secure-boot-mo.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/all/lockdown/0029-efi-Lock-down-the-kernel-if-booted-in-secure-boot-mo.patch 2020-04-17 00:32:15.000000000 +0000 @@ -18,10 +18,8 @@ security/lock_down.c | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) -Index: linux/arch/x86/kernel/setup.c -=================================================================== ---- linux.orig/arch/x86/kernel/setup.c -+++ linux/arch/x86/kernel/setup.c +--- a/arch/x86/kernel/setup.c ++++ b/arch/x86/kernel/setup.c @@ -65,6 +65,7 @@ #include #include @@ -49,13 +47,11 @@ reserve_initrd(); acpi_table_upgrade(); -Index: linux/security/Kconfig -=================================================================== ---- linux.orig/security/Kconfig -+++ linux/security/Kconfig -@@ -256,6 +256,20 @@ config ALLOW_LOCKDOWN_LIFT_BY_SYSRQ - Allow the lockdown on a kernel to be lifted, by pressing a SysRq key - combination on a wired keyboard. +--- a/security/Kconfig ++++ b/security/Kconfig +@@ -247,6 +247,21 @@ config LOCK_DOWN_KERNEL + turns off various features that might otherwise allow access to the + kernel image (eg. setting MSR registers). +config LOCK_DOWN_IN_EFI_SECURE_BOOT + bool "Lock down the kernel in EFI Secure Boot mode" @@ -71,18 +67,17 @@ + Enabling this option turns on results in kernel lockdown being + triggered if EFI Secure Boot is set. + - ++ source security/selinux/Kconfig source security/smack/Kconfig -Index: linux/security/lock_down.c -=================================================================== ---- linux.orig/security/lock_down.c -+++ linux/security/lock_down.c -@@ -12,6 +12,7 @@ + source security/tomoyo/Kconfig +--- a/security/lock_down.c ++++ b/security/lock_down.c +@@ -11,6 +11,7 @@ + #include #include - #include +#include - #include - #ifdef CONFIG_ALLOW_LOCKDOWN_LIFT_BY_SYSRQ + static __ro_after_init bool kernel_locked_down; + diff -Nru linux-4.19.98/debian/patches/features/arm/ARM-dts-bcm283x-Correct-vchiq-compatible-string.patch linux-4.19.118/debian/patches/features/arm/ARM-dts-bcm283x-Correct-vchiq-compatible-string.patch --- linux-4.19.98/debian/patches/features/arm/ARM-dts-bcm283x-Correct-vchiq-compatible-string.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/features/arm/ARM-dts-bcm283x-Correct-vchiq-compatible-string.patch 2020-04-22 13:32:13.000000000 +0000 @@ -13,8 +13,6 @@ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 arch/arm/boot/dts/bcm2836-rpi.dtsi -diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi -index cb2d6d78a7fb..b3da141bb793 100644 --- a/arch/arm/boot/dts/bcm2835-rpi.dtsi +++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi @@ -30,7 +30,7 @@ @@ -24,11 +22,8 @@ - mailbox@7e00b840 { + vchiq: mmailbox@7e00b840 { compatible = "brcm,bcm2835-vchiq"; - reg = <0x7e00b840 0xf>; + reg = <0x7e00b840 0x3c>; interrupts = <0 2>; -diff --git a/arch/arm/boot/dts/bcm2836-rpi.dtsi b/arch/arm/boot/dts/bcm2836-rpi.dtsi -new file mode 100644 -index 000000000000..c4c858b984c6 --- /dev/null +++ b/arch/arm/boot/dts/bcm2836-rpi.dtsi @@ -0,0 +1,6 @@ @@ -38,6 +33,3 @@ +&vchiq { + compatible = "brcm,bcm2836-vchiq", "brcm,bcm2835-vchiq"; +}; --- -2.23.0 - diff -Nru linux-4.19.98/debian/patches/series linux-4.19.118/debian/patches/series --- linux-4.19.98/debian/patches/series 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches/series 2020-04-26 13:04:09.000000000 +0000 @@ -79,7 +79,6 @@ bugfix/arm/ARM-dts-sun8i-h3-add-sy8106a-to-orange-pi-plus.patch bugfix/arm64/arm64-dts-allwinner-a64-Enable-A64-timer-workaround.patch bugfix/mips/MIPS-Loongson-Introduce-and-use-loongson_llsc_mb.patch -bugfix/powerpc/powerpc-vdso-make-vdso32-installation-conditional-in.patch # Arch features features/mips/MIPS-increase-MAX-PHYSMEM-BITS-on-Loongson-3-only.patch @@ -106,7 +105,6 @@ # Lockdown (formerly 'securelevel') patchset features/all/lockdown/0001-Add-the-ability-to-lock-down-access-to-the-running-k.patch -features/all/lockdown/0002-Add-a-SysRq-option-to-lift-kernel-lockdown.patch features/all/lockdown/0003-ima-require-secure_boot-rules-in-lockdown-mode.patch features/all/lockdown/0004-Enforce-module-signatures-if-the-kernel-is-locked-do.patch features/all/lockdown/0005-Restrict-dev-mem-kmem-port-when-the-kernel-is-locked.patch @@ -168,7 +166,6 @@ bugfix/all/cpupower-bump-soname-version.patch bugfix/all/libcpupower-hide-private-function.patch bugfix/all/cpupower-fix-checks-for-cpu-existence.patch -bugfix/all/tools-lib-api-fs-fs.c-fix-misuse-of-strncpy.patch bugfix/all/usbip-fix-misuse-of-strncpy.patch bugfix/x86/tools-turbostat-Add-checks-for-failure-of-fgets-and-.patch bugfix/all/libbpf-add-soname-to-shared-object.patch @@ -222,11 +219,8 @@ features/all/ena/net-ena-update-driver-version-from-2.0.2-to-2.0.3.patch features/all/ena/net-ena-fix-set-freed-objects-to-NULL-to-avoid-faili.patch -features/all/ena/net-ena-fix-Free-napi-resources-when-ena_up-fails.patch -features/all/ena/net-ena-fix-incorrect-test-of-supported-hash-functio.patch features/all/ena/net-ena-fix-return-value-of-ena_com_config_llq_info.patch features/all/ena/net-ena-improve-latency-by-disabling-adaptive-interr.patch -features/all/ena/net-ena-fix-ena_com_fill_hash_function-implementatio.patch features/all/ena/net-ena-add-handling-of-llq-max-tx-burst-size.patch features/all/ena/net-ena-replace-free_tx-rx_ids-union-with-single-fre.patch features/all/ena/net-ena-arrange-ena_probe-function-variables-in-reve.patch @@ -244,7 +238,6 @@ features/all/ena/net-ena-Fix-bug-where-ring-allocation-backoff-stoppe.patch features/all/ena/net-ena-don-t-wake-up-tx-queue-when-down.patch features/all/ena/net-ena-add-good-checksum-counter.patch -features/all/ena/net-ena-fix-swapped-parameters-when-calling-ena_com_.patch features/all/ena/net-ena-add-intr_moder_rx_interval-to-struct-ena_com.patch features/all/ena/net-ena-remove-inline-keyword-from-functions-in-.c.patch features/all/ena/net-ena-switch-to-dim-algorithm-for-rx-adaptive-inte.patch @@ -301,11 +294,10 @@ # Security fixes debian/i386-686-pae-pci-set-pci-nobios-by-default.patch debian/ntfs-mark-it-as-broken.patch -bugfix/all/libertas-fix-two-buffer-overflows-at-parsing-bss-descriptor.patch -bugfix/all/wimax-i2400-fix-memory-leak.patch -bugfix/all/wimax-i2400-fix-memory-leak-in-i2400m_op_rfkill_sw_toggle.patch - -# Backported change to provide boot-time entropy -bugfix/all/random-try-to-actively-add-entropy-rather-than-passi.patch +bugfix/all/f2fs-fix-to-avoid-memory-leakage-in-f2fs_listxattr.patch +bugfix/all/net-ipv6-add-net-argument-to-ip6_dst_lookup_flow.patch +bugfix/all/net-ipv6_stub-use-ip6_dst_lookup_flow-instead-of-ip6.patch +bugfix/all/blktrace-protect-q-blk_trace-with-rcu.patch +bugfix/all/blktrace-fix-dereference-after-null-check.patch # ABI maintenance diff -Nru linux-4.19.98/debian/patches-rt/0001-ARM-at91-add-TCB-registers-definitions.patch linux-4.19.118/debian/patches-rt/0001-ARM-at91-add-TCB-registers-definitions.patch --- linux-4.19.98/debian/patches-rt/0001-ARM-at91-add-TCB-registers-definitions.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0001-ARM-at91-add-TCB-registers-definitions.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From b08620f77bc1fbffba40e033f492a241bc2c62d6 Mon Sep 17 00:00:00 2001 +From 119971df8e4c3a8550b9b7479e5e409dc03f07b6 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 13 Sep 2018 13:30:18 +0200 -Subject: [PATCH 001/290] ARM: at91: add TCB registers definitions -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 001/325] ARM: at91: add TCB registers definitions +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Add registers and bits definitions for the timer counter blocks found on Atmel ARM SoCs. @@ -206,5 +206,5 @@ + +#endif /* __SOC_ATMEL_TCB_H */ -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0002-clocksource-drivers-Add-a-new-driver-for-the-Atmel-A.patch linux-4.19.118/debian/patches-rt/0002-clocksource-drivers-Add-a-new-driver-for-the-Atmel-A.patch --- linux-4.19.98/debian/patches-rt/0002-clocksource-drivers-Add-a-new-driver-for-the-Atmel-A.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0002-clocksource-drivers-Add-a-new-driver-for-the-Atmel-A.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From bc9f46c6ecb0be8a5a14b31b032740f3a1d74761 Mon Sep 17 00:00:00 2001 +From aba8ef8111b7a69621be5dd2358f8163dc4a2263 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 13 Sep 2018 13:30:19 +0200 -Subject: [PATCH 002/290] clocksource/drivers: Add a new driver for the Atmel +Subject: [PATCH 002/325] clocksource/drivers: Add a new driver for the Atmel ARM TC blocks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Add a driver for the Atmel Timer Counter Blocks. This driver provides a clocksource and two clockevent devices. @@ -481,5 +481,5 @@ +} +TIMER_OF_DECLARE(atmel_tcb_clksrc, "atmel,tcb-timer", tcb_clksrc_init); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0003-clocksource-drivers-timer-atmel-tcb-add-clockevent-d.patch linux-4.19.118/debian/patches-rt/0003-clocksource-drivers-timer-atmel-tcb-add-clockevent-d.patch --- linux-4.19.98/debian/patches-rt/0003-clocksource-drivers-timer-atmel-tcb-add-clockevent-d.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0003-clocksource-drivers-timer-atmel-tcb-add-clockevent-d.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From bfee0cb2aad9baa607add364cd5a6c05d6782641 Mon Sep 17 00:00:00 2001 +From 8cbcac5c2b1a35f8c81134219ef264b8c9f9e9d7 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 13 Sep 2018 13:30:20 +0200 -Subject: [PATCH 003/290] clocksource/drivers: timer-atmel-tcb: add clockevent +Subject: [PATCH 003/325] clocksource/drivers: timer-atmel-tcb: add clockevent device on separate channel -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Add an other clockevent device that uses a separate TCB channel when available. @@ -267,5 +267,5 @@ } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0004-clocksource-drivers-atmel-pit-make-option-silent.patch linux-4.19.118/debian/patches-rt/0004-clocksource-drivers-atmel-pit-make-option-silent.patch --- linux-4.19.98/debian/patches-rt/0004-clocksource-drivers-atmel-pit-make-option-silent.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0004-clocksource-drivers-atmel-pit-make-option-silent.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 00029cfcfece0c114d6428fcb7e52545a88cf2c1 Mon Sep 17 00:00:00 2001 +From 5e34b2461c24c7ec974e6c5f33e4431a3260b2c1 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 13 Sep 2018 13:30:21 +0200 -Subject: [PATCH 004/290] clocksource/drivers: atmel-pit: make option silent -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 004/325] clocksource/drivers: atmel-pit: make option silent +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz To conform with the other option, make the ATMEL_PIT option silent so it can be selected from the platform @@ -32,5 +32,5 @@ config ATMEL_ST bool "Atmel ST timer support" if COMPILE_TEST -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0005-ARM-at91-Implement-clocksource-selection.patch linux-4.19.118/debian/patches-rt/0005-ARM-at91-Implement-clocksource-selection.patch --- linux-4.19.98/debian/patches-rt/0005-ARM-at91-Implement-clocksource-selection.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0005-ARM-at91-Implement-clocksource-selection.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From d6f57849d568f7bad4a562fc3466f773384c5af7 Mon Sep 17 00:00:00 2001 +From 7c8bbf08ffe494d923710239c313474054189139 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 13 Sep 2018 13:30:22 +0200 -Subject: [PATCH 005/290] ARM: at91: Implement clocksource selection -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 005/325] ARM: at91: Implement clocksource selection +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Allow selecting and unselecting the PIT clocksource driver so it doesn't have to be compile when unused. @@ -51,5 +51,5 @@ bool -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0006-ARM-configs-at91-use-new-TCB-timer-driver.patch linux-4.19.118/debian/patches-rt/0006-ARM-configs-at91-use-new-TCB-timer-driver.patch --- linux-4.19.98/debian/patches-rt/0006-ARM-configs-at91-use-new-TCB-timer-driver.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0006-ARM-configs-at91-use-new-TCB-timer-driver.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 218e2c7678889a89128237d82a61bf1f23d9cc77 Mon Sep 17 00:00:00 2001 +From 546eacc7d54dbf5c6b35cea154d82a1aa2611af1 Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 13 Sep 2018 13:30:23 +0200 -Subject: [PATCH 006/290] ARM: configs: at91: use new TCB timer driver -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 006/325] ARM: configs: at91: use new TCB timer driver +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Unselecting ATMEL_TCLIB switches the TCB timer driver from tcb_clksrc to timer-atmel-tcb. @@ -39,5 +39,5 @@ CONFIG_EEPROM_AT24=y CONFIG_SCSI=y -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0007-ARM-configs-at91-unselect-PIT.patch linux-4.19.118/debian/patches-rt/0007-ARM-configs-at91-unselect-PIT.patch --- linux-4.19.98/debian/patches-rt/0007-ARM-configs-at91-unselect-PIT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0007-ARM-configs-at91-unselect-PIT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 4773aa4fa5a18ca0b25a456fc06be41464775211 Mon Sep 17 00:00:00 2001 +From 44a288d26c969a743059392f799ee270bd87e9bb Mon Sep 17 00:00:00 2001 From: Alexandre Belloni Date: Thu, 13 Sep 2018 13:30:24 +0200 -Subject: [PATCH 007/290] ARM: configs: at91: unselect PIT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 007/325] ARM: configs: at91: unselect PIT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The PIT is not required anymore to successfully boot and may actually harm in case preempt-rt is used because the PIT interrupt is shared. @@ -40,5 +40,5 @@ CONFIG_UACCESS_WITH_MEMCPY=y CONFIG_ZBOOT_ROM_TEXT=0x0 -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0008-irqchip-gic-v3-its-Move-pending-table-allocation-to-.patch linux-4.19.118/debian/patches-rt/0008-irqchip-gic-v3-its-Move-pending-table-allocation-to-.patch --- linux-4.19.98/debian/patches-rt/0008-irqchip-gic-v3-its-Move-pending-table-allocation-to-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0008-irqchip-gic-v3-its-Move-pending-table-allocation-to-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 5322b48ab45dcd7e238e7a92c17746b904092021 Mon Sep 17 00:00:00 2001 +From d70eac98c1314f780bfe229544f829b50453ae2b Mon Sep 17 00:00:00 2001 From: Marc Zyngier Date: Fri, 27 Jul 2018 13:38:54 +0100 -Subject: [PATCH 008/290] irqchip/gic-v3-its: Move pending table allocation to +Subject: [PATCH 008/325] irqchip/gic-v3-its: Move pending table allocation to init time -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Signed-off-by: Marc Zyngier Signed-off-by: Sebastian Andrzej Siewior @@ -13,7 +13,7 @@ 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c -index 050d6e040128..fc4c319ee1d7 100644 +index f9b73336a39e..0387399054b7 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -179,6 +179,7 @@ static DEFINE_RAW_SPINLOCK(vmovp_lock); @@ -155,7 +155,7 @@ return err; diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h -index 3188c0bef3e7..5b57501fd2e7 100644 +index 1d21e98d6854..fdddead7e307 100644 --- a/include/linux/irqchip/arm-gic-v3.h +++ b/include/linux/irqchip/arm-gic-v3.h @@ -585,6 +585,7 @@ struct rdists { @@ -167,5 +167,5 @@ struct page *prop_page; u64 flags; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0009-kthread-convert-worker-lock-to-raw-spinlock.patch linux-4.19.118/debian/patches-rt/0009-kthread-convert-worker-lock-to-raw-spinlock.patch --- linux-4.19.98/debian/patches-rt/0009-kthread-convert-worker-lock-to-raw-spinlock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0009-kthread-convert-worker-lock-to-raw-spinlock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From e2fc3df409c6764dc2c394061aae000a86437a7c Mon Sep 17 00:00:00 2001 +From 3cf0fcd0004434877a5db97439d4b56e78837a4f Mon Sep 17 00:00:00 2001 From: Julia Cartwright Date: Fri, 28 Sep 2018 21:03:51 +0000 -Subject: [PATCH 009/290] kthread: convert worker lock to raw spinlock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 009/325] kthread: convert worker lock to raw spinlock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz In order to enable the queuing of kthread work items from hardirq context even when PREEMPT_RT_FULL is enabled, convert the worker @@ -199,5 +199,5 @@ return ret; } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0010-crypto-caam-qi-simplify-CGR-allocation-freeing.patch linux-4.19.118/debian/patches-rt/0010-crypto-caam-qi-simplify-CGR-allocation-freeing.patch --- linux-4.19.98/debian/patches-rt/0010-crypto-caam-qi-simplify-CGR-allocation-freeing.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0010-crypto-caam-qi-simplify-CGR-allocation-freeing.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From ba865f26206ec12d7d6a140c2a9f6871c7be3d5f Mon Sep 17 00:00:00 2001 +From 222023498c02fbc8c0143bb3237a0e0a674175e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horia=20Geant=C4=83?= Date: Mon, 8 Oct 2018 14:09:37 +0300 -Subject: [PATCH 010/290] crypto: caam/qi - simplify CGR allocation, freeing +Subject: [PATCH 010/325] crypto: caam/qi - simplify CGR allocation, freeing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz [Upstream commit 29e83c757006fd751966bdc53392bb22d74179c6] @@ -136,5 +136,5 @@ /** * qi_cache_alloc - Allocate buffers from CAAM-QI cache -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0011-sched-fair-Robustify-CFS-bandwidth-timer-locking.patch linux-4.19.118/debian/patches-rt/0011-sched-fair-Robustify-CFS-bandwidth-timer-locking.patch --- linux-4.19.98/debian/patches-rt/0011-sched-fair-Robustify-CFS-bandwidth-timer-locking.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0011-sched-fair-Robustify-CFS-bandwidth-timer-locking.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 147b5bb1f8cd2975bdfa1368ba792f28df1ab8a6 Mon Sep 17 00:00:00 2001 +From 698e9d4aa2337745a67cdb0d0130df1851dd9a25 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Mon, 7 Jan 2019 13:52:31 +0100 -Subject: [PATCH 011/290] sched/fair: Robustify CFS-bandwidth timer locking -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 011/325] sched/fair: Robustify CFS-bandwidth timer locking +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Traditionally hrtimer callbacks were run with IRQs disabled, but with the introduction of HRTIMER_MODE_SOFT it is possible they run from @@ -30,10 +30,10 @@ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c -index f0abb8fe0ae9..b5e03fc56d65 100644 +index 86ccaaf0c1bf..ded41daf0d73 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c -@@ -4560,7 +4560,7 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, u64 remaining) +@@ -4597,7 +4597,7 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, u64 remaining) struct rq *rq = rq_of(cfs_rq); struct rq_flags rf; @@ -42,7 +42,7 @@ if (!cfs_rq_throttled(cfs_rq)) goto next; -@@ -4579,7 +4579,7 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, u64 remaining) +@@ -4616,7 +4616,7 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, u64 remaining) unthrottle_cfs_rq(cfs_rq); next: @@ -51,7 +51,7 @@ if (!remaining) break; -@@ -4595,7 +4595,7 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, u64 remaining) +@@ -4632,7 +4632,7 @@ static u64 distribute_cfs_runtime(struct cfs_bandwidth *cfs_b, u64 remaining) * period the timer is deactivated until scheduling resumes; cfs_b->idle is * used to track this state. */ @@ -60,7 +60,7 @@ { u64 runtime; int throttled; -@@ -4635,10 +4635,10 @@ static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun) +@@ -4672,10 +4672,10 @@ static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun) while (throttled && cfs_b->runtime > 0 && !cfs_b->distribute_running) { runtime = cfs_b->runtime; cfs_b->distribute_running = 1; @@ -73,7 +73,7 @@ cfs_b->distribute_running = 0; throttled = !list_empty(&cfs_b->throttled_cfs_rq); -@@ -4746,16 +4746,17 @@ static __always_inline void return_cfs_rq_runtime(struct cfs_rq *cfs_rq) +@@ -4783,16 +4783,17 @@ static __always_inline void return_cfs_rq_runtime(struct cfs_rq *cfs_rq) static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) { u64 runtime = 0, slice = sched_cfs_bandwidth_slice(); @@ -94,7 +94,7 @@ return; } -@@ -4765,17 +4766,17 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) +@@ -4802,17 +4803,17 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) if (runtime) cfs_b->distribute_running = 1; @@ -115,7 +115,7 @@ } /* -@@ -4855,11 +4856,12 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) +@@ -4892,11 +4893,12 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) { struct cfs_bandwidth *cfs_b = container_of(timer, struct cfs_bandwidth, period_timer); @@ -129,7 +129,7 @@ for (;;) { overrun = hrtimer_forward_now(timer, cfs_b->period); if (!overrun) -@@ -4895,11 +4897,11 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) +@@ -4932,11 +4934,11 @@ static enum hrtimer_restart sched_cfs_period_timer(struct hrtimer *timer) count = 0; } @@ -144,5 +144,5 @@ return idle ? HRTIMER_NORESTART : HRTIMER_RESTART; } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0012-arm-Convert-arm-boot_lock-to-raw.patch linux-4.19.118/debian/patches-rt/0012-arm-Convert-arm-boot_lock-to-raw.patch --- linux-4.19.98/debian/patches-rt/0012-arm-Convert-arm-boot_lock-to-raw.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0012-arm-Convert-arm-boot_lock-to-raw.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From fd46cb23c2b2f9fe3514d2e773f289e0e2f46d73 Mon Sep 17 00:00:00 2001 +From a5adb64cd4a86c6fa8bc3b35141ade2fa82d3d27 Mon Sep 17 00:00:00 2001 From: Frank Rowand Date: Mon, 19 Sep 2011 14:51:14 -0700 -Subject: [PATCH 012/290] arm: Convert arm boot_lock to raw -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 012/325] arm: Convert arm boot_lock to raw +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The arm boot_lock is used by the secondary processor startup code. The locking task is the idle thread, which has idle->sched_class == &idle_sched_class. @@ -428,5 +428,5 @@ return pen_release != -1 ? -ENOSYS : 0; } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0013-x86-ioapic-Don-t-let-setaffinity-unmask-threaded-EOI.patch linux-4.19.118/debian/patches-rt/0013-x86-ioapic-Don-t-let-setaffinity-unmask-threaded-EOI.patch --- linux-4.19.98/debian/patches-rt/0013-x86-ioapic-Don-t-let-setaffinity-unmask-threaded-EOI.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0013-x86-ioapic-Don-t-let-setaffinity-unmask-threaded-EOI.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 2ab61b3cb2b66bd2515c8531da37be20f5cc14a9 Mon Sep 17 00:00:00 2001 +From 21f4cc8e461111c6918c67c907cb4a8ae8afa936 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 17 Jul 2018 18:25:31 +0200 -Subject: [PATCH 013/290] x86/ioapic: Don't let setaffinity unmask threaded EOI +Subject: [PATCH 013/325] x86/ioapic: Don't let setaffinity unmask threaded EOI interrupt too early -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz There is an issue with threaded interrupts which are marked ONESHOT and using the fasteoi handler. @@ -97,5 +97,5 @@ static void ioapic_ir_ack_level(struct irq_data *irq_data) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0014-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch linux-4.19.118/debian/patches-rt/0014-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch --- linux-4.19.98/debian/patches-rt/0014-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0014-cgroup-use-irqsave-in-cgroup_rstat_flush_locked.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 56933f479ee6e504e58236259c2fdacd09bcdeb1 Mon Sep 17 00:00:00 2001 +From d92527bb24ae4fa57d587ae040d61e04458f59ac Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 3 Jul 2018 18:19:48 +0200 -Subject: [PATCH 014/290] cgroup: use irqsave in cgroup_rstat_flush_locked() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 014/325] cgroup: use irqsave in cgroup_rstat_flush_locked() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz All callers of cgroup_rstat_flush_locked() acquire cgroup_rstat_lock either with spin_lock_irq() or spin_lock_irqsave(). @@ -46,5 +46,5 @@ /* if @may_sleep, play nice and yield if necessary */ if (may_sleep && (need_resched() || -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0015-fscache-initialize-cookie-hash-table-raw-spinlocks.patch linux-4.19.118/debian/patches-rt/0015-fscache-initialize-cookie-hash-table-raw-spinlocks.patch --- linux-4.19.98/debian/patches-rt/0015-fscache-initialize-cookie-hash-table-raw-spinlocks.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0015-fscache-initialize-cookie-hash-table-raw-spinlocks.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 11a5fe1b2f98fc37eac8919e99282c1b91f5bb05 Mon Sep 17 00:00:00 2001 +From 79bc9b1cb45fe96b437ac97ffbbb28c1f02523a9 Mon Sep 17 00:00:00 2001 From: Clark Williams Date: Tue, 3 Jul 2018 13:34:30 -0500 -Subject: [PATCH 015/290] fscache: initialize cookie hash table raw spinlocks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 015/325] fscache: initialize cookie hash table raw spinlocks +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The fscache cookie mechanism uses a hash table of hlist_bl_head structures. The PREEMPT_RT patcheset adds a raw spinlock to this structure and so on PREEMPT_RT @@ -60,5 +60,5 @@ /** * fscache_register_netfs - Register a filesystem as desiring caching services -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0016-Drivers-hv-vmbus-include-header-for-get_irq_regs.patch linux-4.19.118/debian/patches-rt/0016-Drivers-hv-vmbus-include-header-for-get_irq_regs.patch --- linux-4.19.98/debian/patches-rt/0016-Drivers-hv-vmbus-include-header-for-get_irq_regs.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0016-Drivers-hv-vmbus-include-header-for-get_irq_regs.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From 42e5ab6924b31025c97846b749ebe188ee4b5fdd Mon Sep 17 00:00:00 2001 +From 19172d30b8e9f6e2c70d3170a75da4aac327cb9b Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Wed, 29 Aug 2018 21:59:04 +0200 -Subject: [PATCH 016/290] Drivers: hv: vmbus: include header for get_irq_regs() +Subject: [PATCH 016/325] Drivers: hv: vmbus: include header for get_irq_regs() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz On !RT the header file get_irq_regs() gets pulled in via other header files. On RT it does not and the build fails: @@ -36,5 +36,5 @@ #include "hv_trace.h" -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0017-percpu-include-irqflags.h-for-raw_local_irq_save.patch linux-4.19.118/debian/patches-rt/0017-percpu-include-irqflags.h-for-raw_local_irq_save.patch --- linux-4.19.98/debian/patches-rt/0017-percpu-include-irqflags.h-for-raw_local_irq_save.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0017-percpu-include-irqflags.h-for-raw_local_irq_save.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From bc0b4a3ef268cec82163752ddaa730d8ec193d7c Mon Sep 17 00:00:00 2001 +From ea486c7cc32c9056a03180db47f3710c7fc2052f Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Thu, 11 Oct 2018 16:39:59 +0200 -Subject: [PATCH 017/290] percpu: include irqflags.h for raw_local_irq_save() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 017/325] percpu: include irqflags.h for raw_local_irq_save() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The header percpu.h header file is using raw_local_irq_save() but does not include irqflags.h for its definition. It compiles because the @@ -29,5 +29,5 @@ #ifdef CONFIG_SMP -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0018-efi-Allow-efi-runtime.patch linux-4.19.118/debian/patches-rt/0018-efi-Allow-efi-runtime.patch --- linux-4.19.98/debian/patches-rt/0018-efi-Allow-efi-runtime.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0018-efi-Allow-efi-runtime.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From da834999f8c566ac722fd157de36dd3f9335c2ad Mon Sep 17 00:00:00 2001 +From 2d27283a8f76ac017050287c1a62c14cddaf11d4 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Thu, 26 Jul 2018 15:06:10 +0200 -Subject: [PATCH 018/290] efi: Allow efi=runtime -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 018/325] efi: Allow efi=runtime +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz In case the option "efi=noruntime" is default at built-time, the user could overwrite its sate by `efi=runtime' and allow it again. @@ -28,5 +28,5 @@ } early_param("efi", parse_efi_cmdline); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0019-x86-efi-drop-task_lock-from-efi_switch_mm.patch linux-4.19.118/debian/patches-rt/0019-x86-efi-drop-task_lock-from-efi_switch_mm.patch --- linux-4.19.98/debian/patches-rt/0019-x86-efi-drop-task_lock-from-efi_switch_mm.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0019-x86-efi-drop-task_lock-from-efi_switch_mm.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From d24d03df7b0c0b6a0975a373a815487a220ee93b Mon Sep 17 00:00:00 2001 +From 91fec13b5fdf4dce19d23cd229ecfdafcc6f6d22 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 24 Jul 2018 14:48:55 +0200 -Subject: [PATCH 019/290] x86/efi: drop task_lock() from efi_switch_mm() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 019/325] x86/efi: drop task_lock() from efi_switch_mm() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz efi_switch_mm() is a wrapper around switch_mm() which saves current's ->active_mm, sets the requests mm as ->active_mm and invokes @@ -24,10 +24,10 @@ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c -index ee5d08f25ce4..e8da7f492970 100644 +index 2a9a703ef4a0..f104c9f2998d 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c -@@ -619,18 +619,16 @@ void __init efi_dump_pagetable(void) +@@ -617,18 +617,16 @@ void __init efi_dump_pagetable(void) /* * Makes the calling thread switch to/from efi_mm context. Can be used @@ -51,5 +51,5 @@ #ifdef CONFIG_EFI_MIXED -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0020-arm64-KVM-compute_layout-before-altenates-are-applie.patch linux-4.19.118/debian/patches-rt/0020-arm64-KVM-compute_layout-before-altenates-are-applie.patch --- linux-4.19.98/debian/patches-rt/0020-arm64-KVM-compute_layout-before-altenates-are-applie.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0020-arm64-KVM-compute_layout-before-altenates-are-applie.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 057073be1e10190ea715360a6fde5478df36b563 Mon Sep 17 00:00:00 2001 +From 83b8acc7de0d3e2798ec54ba770e14b691202d69 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Thu, 26 Jul 2018 09:13:42 +0200 -Subject: [PATCH 020/290] arm64: KVM: compute_layout before altenates are +Subject: [PATCH 020/325] arm64: KVM: compute_layout before altenates are applied -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz compute_layout() is invoked as part of an alternative fixup under stop_machine() and needs a sleeping lock as part of get_random_long(). @@ -18,7 +18,7 @@ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/arm64/include/asm/alternative.h b/arch/arm64/include/asm/alternative.h -index 4b650ec1d7dd..f561ea0ac645 100644 +index 1a7ba3de7079..d011309e7ad0 100644 --- a/arch/arm64/include/asm/alternative.h +++ b/arch/arm64/include/asm/alternative.h @@ -35,6 +35,12 @@ void apply_alternatives_module(void *start, size_t length); @@ -31,9 +31,9 @@ +static inline void kvm_compute_layout(void) { } +#endif + - #define ALTINSTR_ENTRY(feature,cb) \ + #define ALTINSTR_ENTRY(feature) \ " .word 661b - .\n" /* label */ \ - " .if " __stringify(cb) " == 0\n" \ + " .word 663f - .\n" /* new instruction */ \ diff --git a/arch/arm64/kernel/alternative.c b/arch/arm64/kernel/alternative.c index b5d603992d40..f92815d56d17 100644 --- a/arch/arm64/kernel/alternative.c @@ -79,5 +79,5 @@ * Compute HYP VA by using the same computation as kern_hyp_va() */ -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0021-of-allocate-free-phandle-cache-outside-of-the-devtre.patch linux-4.19.118/debian/patches-rt/0021-of-allocate-free-phandle-cache-outside-of-the-devtre.patch --- linux-4.19.98/debian/patches-rt/0021-of-allocate-free-phandle-cache-outside-of-the-devtre.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0021-of-allocate-free-phandle-cache-outside-of-the-devtre.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From af2b5f6fa1369ed12974a97865df6125bbede492 Mon Sep 17 00:00:00 2001 +From 63891871ac6a67c1bae2aa15b3a3aef0f4060b58 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Fri, 31 Aug 2018 14:16:30 +0200 -Subject: [PATCH 021/290] of: allocate / free phandle cache outside of the +Subject: [PATCH 021/325] of: allocate / free phandle cache outside of the devtree_lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The phandle cache code allocates memory while holding devtree_lock which is a raw_spinlock_t. Memory allocation (and free()) is not possible on @@ -99,5 +99,5 @@ void __init of_core_init(void) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0022-mm-kasan-make-quarantine_lock-a-raw_spinlock_t.patch linux-4.19.118/debian/patches-rt/0022-mm-kasan-make-quarantine_lock-a-raw_spinlock_t.patch --- linux-4.19.98/debian/patches-rt/0022-mm-kasan-make-quarantine_lock-a-raw_spinlock_t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0022-mm-kasan-make-quarantine_lock-a-raw_spinlock_t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 90ac218590a6d692a0dafeeef4bfafea30811be3 Mon Sep 17 00:00:00 2001 +From 2cc8c4e626119389ae39665998b3dede468665e6 Mon Sep 17 00:00:00 2001 From: Clark Williams Date: Tue, 18 Sep 2018 10:29:31 -0500 -Subject: [PATCH 022/290] mm/kasan: make quarantine_lock a raw_spinlock_t -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 022/325] mm/kasan: make quarantine_lock a raw_spinlock_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The static lock quarantine_lock is used in quarantine.c to protect the quarantine queue datastructures. It is taken inside quarantine queue @@ -94,5 +94,5 @@ qlist_free_all(&to_free, cache); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0023-EXP-rcu-Revert-expedited-GP-parallelization-cleverne.patch linux-4.19.118/debian/patches-rt/0023-EXP-rcu-Revert-expedited-GP-parallelization-cleverne.patch --- linux-4.19.98/debian/patches-rt/0023-EXP-rcu-Revert-expedited-GP-parallelization-cleverne.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0023-EXP-rcu-Revert-expedited-GP-parallelization-cleverne.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 37d23bb703b59574c9eeebba86f8c8b9cf382d15 Mon Sep 17 00:00:00 2001 +From ef814d6ef67f5228fd470d84ad33515c6a1efa57 Mon Sep 17 00:00:00 2001 From: "Paul E. McKenney" Date: Mon, 29 Oct 2018 11:53:01 +0100 -Subject: [PATCH 023/290] EXP rcu: Revert expedited GP parallelization +Subject: [PATCH 023/325] EXP rcu: Revert expedited GP parallelization cleverness -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz (Commit 258ba8e089db23f760139266c232f01bad73f85c from linux-rcu) @@ -47,5 +47,5 @@ } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0024-kmemleak-Turn-kmemleak_lock-to-raw-spinlock-on-RT.patch linux-4.19.118/debian/patches-rt/0024-kmemleak-Turn-kmemleak_lock-to-raw-spinlock-on-RT.patch --- linux-4.19.98/debian/patches-rt/0024-kmemleak-Turn-kmemleak_lock-to-raw-spinlock-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0024-kmemleak-Turn-kmemleak_lock-to-raw-spinlock-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From 5a62bb92ae6df828a0b6cf14c0e1d55558f0002e Mon Sep 17 00:00:00 2001 +From 28341f3661c5c3dac734d973251ad13a637fb0bd Mon Sep 17 00:00:00 2001 From: He Zhe Date: Wed, 19 Dec 2018 16:30:57 +0100 -Subject: [PATCH 024/290] kmemleak: Turn kmemleak_lock to raw spinlock on RT +Subject: [PATCH 024/325] kmemleak: Turn kmemleak_lock to raw spinlock on RT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz kmemleak_lock, as a rwlock on RT, can possibly be held in atomic context and causes the follow BUG. @@ -165,5 +165,5 @@ /* -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0025-NFSv4-replace-seqcount_t-with-a-seqlock_t.patch linux-4.19.118/debian/patches-rt/0025-NFSv4-replace-seqcount_t-with-a-seqlock_t.patch --- linux-4.19.98/debian/patches-rt/0025-NFSv4-replace-seqcount_t-with-a-seqlock_t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0025-NFSv4-replace-seqcount_t-with-a-seqlock_t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 78cfba1f8655c35ecd538b02a09000d4d7d18af9 Mon Sep 17 00:00:00 2001 +From 89760c7945fc386046ef15f564d7e91990f88ed8 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Fri, 28 Oct 2016 23:05:11 +0200 -Subject: [PATCH 025/290] NFSv4: replace seqcount_t with a seqlock_t -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 025/325] NFSv4: replace seqcount_t with a seqlock_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The raw_write_seqcount_begin() in nfs4_reclaim_open_state() bugs me because it maps to preempt_disable() in -RT which I can't have at this @@ -27,7 +27,7 @@ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c -index 74ff459b75ef..6b422d1b5ae1 100644 +index b0c0c2fc2fba..26565ba05dc1 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c @@ -162,11 +162,11 @@ static int nfs_delegation_claim_opens(struct inode *inode, @@ -58,7 +58,7 @@ }; diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c -index 792f8821b5d6..041d235cf5ef 100644 +index 668b648064b7..187d411668ed 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2870,7 +2870,7 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, @@ -132,5 +132,5 @@ } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0026-kernel-sched-Provide-a-pointer-to-the-valid-CPU-mask.patch linux-4.19.118/debian/patches-rt/0026-kernel-sched-Provide-a-pointer-to-the-valid-CPU-mask.patch --- linux-4.19.98/debian/patches-rt/0026-kernel-sched-Provide-a-pointer-to-the-valid-CPU-mask.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0026-kernel-sched-Provide-a-pointer-to-the-valid-CPU-mask.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,12 +1,12 @@ -From f8da0dd0f5a6dd0097a13f5f59567b9d7a91d0f4 Mon Sep 17 00:00:00 2001 +From afc9cd313faee6faecfc1ab87693f143c9206536 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 4 Apr 2017 12:50:16 +0200 -Subject: [PATCH 026/290] kernel: sched: Provide a pointer to the valid CPU +Subject: [PATCH 026/325] kernel: sched: Provide a pointer to the valid CPU mask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz In commit 4b53a3412d66 ("sched/core: Remove the tsk_nr_cpus_allowed() wrapper") the tsk_nr_cpus_allowed() wrapper was removed. There was not @@ -179,10 +179,10 @@ return -EINVAL; } diff --git a/drivers/infiniband/hw/hfi1/affinity.c b/drivers/infiniband/hw/hfi1/affinity.c -index bedd5fba33b0..3f4259f11a35 100644 +index 01ed0a667928..2c62de6b5bf1 100644 --- a/drivers/infiniband/hw/hfi1/affinity.c +++ b/drivers/infiniband/hw/hfi1/affinity.c -@@ -1037,7 +1037,7 @@ int hfi1_get_proc_affinity(int node) +@@ -1039,7 +1039,7 @@ int hfi1_get_proc_affinity(int node) struct hfi1_affinity_node *entry; cpumask_var_t diff, hw_thread_mask, available_mask, intrs_mask; const struct cpumask *node_mask, @@ -191,7 +191,7 @@ struct hfi1_affinity_node_list *affinity = &node_affinity; struct cpu_mask_set *set = &affinity->proc; -@@ -1045,7 +1045,7 @@ int hfi1_get_proc_affinity(int node) +@@ -1047,7 +1047,7 @@ int hfi1_get_proc_affinity(int node) * check whether process/context affinity has already * been set */ @@ -200,7 +200,7 @@ hfi1_cdbg(PROC, "PID %u %s affinity set to CPU %*pbl", current->pid, current->comm, cpumask_pr_args(proc_mask)); -@@ -1056,7 +1056,7 @@ int hfi1_get_proc_affinity(int node) +@@ -1058,7 +1058,7 @@ int hfi1_get_proc_affinity(int node) cpu = cpumask_first(proc_mask); cpumask_set_cpu(cpu, &set->used); goto done; @@ -271,7 +271,7 @@ static inline void task_core_dumping(struct seq_file *m, struct mm_struct *mm) diff --git a/include/linux/sched.h b/include/linux/sched.h -index 20f5ba262cc0..68e673278301 100644 +index 0530de9a4efc..4298a87b9de6 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -660,7 +660,8 @@ struct task_struct { @@ -321,10 +321,10 @@ } diff --git a/kernel/fork.c b/kernel/fork.c -index 8cb5cd7c97e1..8c285876eb52 100644 +index 1a2d18e98bf9..bc182d6fa2a9 100644 --- a/kernel/fork.c +++ b/kernel/fork.c -@@ -840,6 +840,8 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) +@@ -850,6 +850,8 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) #ifdef CONFIG_STACKPROTECTOR tsk->stack_canary = get_random_canary(); #endif @@ -573,10 +573,10 @@ !dl_task(task) || !task_on_rq_queued(task))) { diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c -index b5e03fc56d65..6e6d9e999814 100644 +index ded41daf0d73..fe58e95484cf 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c -@@ -1662,7 +1662,7 @@ static void task_numa_compare(struct task_numa_env *env, +@@ -1691,7 +1691,7 @@ static void task_numa_compare(struct task_numa_env *env, * be incurred if the tasks were swapped. */ /* Skip this swap candidate if cannot move to the source cpu */ @@ -585,7 +585,7 @@ goto unlock; /* -@@ -1760,7 +1760,7 @@ static void task_numa_find_cpu(struct task_numa_env *env, +@@ -1789,7 +1789,7 @@ static void task_numa_find_cpu(struct task_numa_env *env, for_each_cpu(cpu, cpumask_of_node(env->dst_nid)) { /* Skip this CPU if the source task cannot migrate */ @@ -594,7 +594,7 @@ continue; env->dst_cpu = cpu; -@@ -5743,7 +5743,7 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, +@@ -5803,7 +5803,7 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, /* Skip over this group if it has no CPUs allowed */ if (!cpumask_intersects(sched_group_span(group), @@ -603,7 +603,7 @@ continue; local_group = cpumask_test_cpu(this_cpu, -@@ -5875,7 +5875,7 @@ find_idlest_group_cpu(struct sched_group *group, struct task_struct *p, int this +@@ -5935,7 +5935,7 @@ find_idlest_group_cpu(struct sched_group *group, struct task_struct *p, int this return cpumask_first(sched_group_span(group)); /* Traverse only the allowed CPUs */ @@ -612,7 +612,7 @@ if (available_idle_cpu(i)) { struct rq *rq = cpu_rq(i); struct cpuidle_state *idle = idle_get_state(rq); -@@ -5915,7 +5915,7 @@ static inline int find_idlest_cpu(struct sched_domain *sd, struct task_struct *p +@@ -5975,7 +5975,7 @@ static inline int find_idlest_cpu(struct sched_domain *sd, struct task_struct *p { int new_cpu = cpu; @@ -621,7 +621,7 @@ return prev_cpu; /* -@@ -6032,7 +6032,7 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int +@@ -6092,7 +6092,7 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int if (!test_idle_cores(target, false)) return -1; @@ -630,7 +630,7 @@ for_each_cpu_wrap(core, cpus, target) { bool idle = true; -@@ -6066,7 +6066,7 @@ static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int t +@@ -6126,7 +6126,7 @@ static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int t return -1; for_each_cpu(cpu, cpu_smt_mask(target)) { @@ -639,7 +639,7 @@ continue; if (available_idle_cpu(cpu)) return cpu; -@@ -6129,7 +6129,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t +@@ -6189,7 +6189,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, int t for_each_cpu_wrap(cpu, sched_domain_span(sd), target) { if (!--nr) return -1; @@ -648,7 +648,7 @@ continue; if (available_idle_cpu(cpu)) break; -@@ -6166,7 +6166,7 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target) +@@ -6226,7 +6226,7 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target) recent_used_cpu != target && cpus_share_cache(recent_used_cpu, target) && available_idle_cpu(recent_used_cpu) && @@ -657,7 +657,7 @@ /* * Replace recent_used_cpu with prev as it is a potential * candidate for the next wake: -@@ -6384,7 +6384,7 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_f +@@ -6444,7 +6444,7 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int sd_flag, int wake_f if (sd_flag & SD_BALANCE_WAKE) { record_wakee(p); want_affine = !wake_wide(p) && !wake_cap(p, cpu, prev_cpu) @@ -666,7 +666,7 @@ } rcu_read_lock(); -@@ -7123,14 +7123,14 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) +@@ -7183,14 +7183,14 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) /* * We do not migrate tasks that are: * 1) throttled_lb_pair, or @@ -683,7 +683,7 @@ int cpu; schedstat_inc(p->se.statistics.nr_failed_migrations_affine); -@@ -7150,7 +7150,7 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) +@@ -7210,7 +7210,7 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) /* Prevent to re-select dst_cpu via env's CPUs: */ for_each_cpu_and(cpu, env->dst_grpmask, env->cpus) { @@ -692,7 +692,7 @@ env->flags |= LBF_DST_PINNED; env->new_dst_cpu = cpu; break; -@@ -7747,7 +7747,7 @@ check_cpu_capacity(struct rq *rq, struct sched_domain *sd) +@@ -7827,7 +7827,7 @@ check_cpu_capacity(struct rq *rq, struct sched_domain *sd) /* * Group imbalance indicates (and tries to solve) the problem where balancing @@ -701,7 +701,7 @@ * * Imagine a situation of two groups of 4 CPUs each and 4 tasks each with a * cpumask covering 1 CPU of the first group and 3 CPUs of the second group. -@@ -8362,7 +8362,7 @@ static struct sched_group *find_busiest_group(struct lb_env *env) +@@ -8442,7 +8442,7 @@ static struct sched_group *find_busiest_group(struct lb_env *env) /* * If the busiest group is imbalanced the below checks don't * work because they assume all things are equal, which typically @@ -710,7 +710,7 @@ */ if (busiest->group_type == group_imbalanced) goto force_balance; -@@ -8758,7 +8758,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, +@@ -8838,7 +8838,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, * if the curr task on busiest CPU can't be * moved to this_cpu: */ @@ -781,5 +781,5 @@ trace_foo_with_template_simple("HELLO", cnt); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0027-kernel-sched-core-add-migrate_disable.patch linux-4.19.118/debian/patches-rt/0027-kernel-sched-core-add-migrate_disable.patch --- linux-4.19.98/debian/patches-rt/0027-kernel-sched-core-add-migrate_disable.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0027-kernel-sched-core-add-migrate_disable.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From a73bbe4b98f56b8c69e3932df7e083d1d94f5109 Mon Sep 17 00:00:00 2001 +From 8ad94df28becac218184cd246b017a0141a46247 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Sat, 27 May 2017 19:02:06 +0200 -Subject: [PATCH 027/290] kernel/sched/core: add migrate_disable() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 027/325] kernel/sched/core: add migrate_disable() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz --- include/linux/preempt.h | 23 +++++++ @@ -54,7 +54,7 @@ #ifdef MODULE diff --git a/include/linux/sched.h b/include/linux/sched.h -index 68e673278301..038d0faaa1d5 100644 +index 4298a87b9de6..0489d3e0e78c 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -662,6 +662,13 @@ struct task_struct { @@ -262,5 +262,5 @@ #undef PN #undef __PN -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0028-sched-migrate_disable-Add-export_symbol_gpl-for-__mi.patch linux-4.19.118/debian/patches-rt/0028-sched-migrate_disable-Add-export_symbol_gpl-for-__mi.patch --- linux-4.19.98/debian/patches-rt/0028-sched-migrate_disable-Add-export_symbol_gpl-for-__mi.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0028-sched-migrate_disable-Add-export_symbol_gpl-for-__mi.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From ac059eda6d9782325d4d8432b5bee7638eafd90a Mon Sep 17 00:00:00 2001 +From 8a5a5668c864f35ac4028c8c775918b8bd4fca1c Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 9 Oct 2018 17:34:50 +0200 -Subject: [PATCH 028/290] sched/migrate_disable: Add export_symbol_gpl for +Subject: [PATCH 028/325] sched/migrate_disable: Add export_symbol_gpl for __migrate_disabled -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Jonathan reported that lttng/modules can't use __migrate_disabled(). This function is only used by sched/core itself and the tracing @@ -34,5 +34,5 @@ static void __do_set_cpus_allowed_tail(struct task_struct *p, -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0029-arm-at91-do-not-disable-enable-clocks-in-a-row.patch linux-4.19.118/debian/patches-rt/0029-arm-at91-do-not-disable-enable-clocks-in-a-row.patch --- linux-4.19.98/debian/patches-rt/0029-arm-at91-do-not-disable-enable-clocks-in-a-row.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0029-arm-at91-do-not-disable-enable-clocks-in-a-row.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From b4f795e23aa449ae7116c445646a5ee51f90c022 Mon Sep 17 00:00:00 2001 +From 097c224348ebf8f796c6f6cd0c2eacf0b63a347b Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Wed, 9 Mar 2016 10:51:06 +0100 -Subject: [PATCH 029/290] arm: at91: do not disable/enable clocks in a row -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 029/325] arm: at91: do not disable/enable clocks in a row +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Currently the driver will disable the clock and enable it one line later if it is switching from periodic mode into one shot. @@ -94,5 +94,5 @@ .set_state_oneshot = tc_set_oneshot, }, -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0030-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch linux-4.19.118/debian/patches-rt/0030-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch --- linux-4.19.98/debian/patches-rt/0030-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0030-clocksource-TCLIB-Allow-higher-clock-rates-for-clock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,12 +1,12 @@ -From 45b7375a7348d45d17515da0b294d479805fd855 Mon Sep 17 00:00:00 2001 +From b5661f6c782e92843b5e1d081ab704dd3fb79a61 Mon Sep 17 00:00:00 2001 From: Benedikt Spranger Date: Mon, 8 Mar 2010 18:57:04 +0100 -Subject: [PATCH 030/290] clocksource: TCLIB: Allow higher clock rates for +Subject: [PATCH 030/325] clocksource: TCLIB: Allow higher clock rates for clock events MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz As default the TCLIB uses the 32KiHz base clock rate for clock events. Add a compile time selection to allow higher clock resulution. @@ -166,5 +166,5 @@ tristate "Dummy IRQ handler" default n -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0031-timekeeping-Split-jiffies-seqlock.patch linux-4.19.118/debian/patches-rt/0031-timekeeping-Split-jiffies-seqlock.patch --- linux-4.19.98/debian/patches-rt/0031-timekeeping-Split-jiffies-seqlock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0031-timekeeping-Split-jiffies-seqlock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From fe98a4f2036225a3ccb28c230f5245fa0eddec4c Mon Sep 17 00:00:00 2001 +From 22522352d905d453f9bdc5271ca567d5fafdad16 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 14 Feb 2013 22:36:59 +0100 -Subject: [PATCH 031/290] timekeeping: Split jiffies seqlock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 031/325] timekeeping: Split jiffies seqlock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Replace jiffies_lock seqlock with a simple seqcounter and a rawlock so it can be taken in atomic context on RT. @@ -77,10 +77,10 @@ clockevents_switch_state(dev, CLOCK_EVT_STATE_ONESHOT); diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 5b33e2f5c0ed..54fd344ef973 100644 +index 48403fb653c2..e774a49176cc 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c -@@ -67,7 +67,8 @@ static void tick_do_update_jiffies64(ktime_t now) +@@ -68,7 +68,8 @@ static void tick_do_update_jiffies64(ktime_t now) return; /* Reevaluate with jiffies_lock held */ @@ -90,7 +90,7 @@ delta = ktime_sub(now, last_jiffies_update); if (delta >= tick_period) { -@@ -90,10 +91,12 @@ static void tick_do_update_jiffies64(ktime_t now) +@@ -94,10 +95,12 @@ static void tick_do_update_jiffies64(ktime_t now) /* Keep the tick_next_period variable up to date */ tick_next_period = ktime_add(last_jiffies_update, tick_period); } else { @@ -105,7 +105,7 @@ update_wall_time(); } -@@ -104,12 +107,14 @@ static ktime_t tick_init_jiffy_update(void) +@@ -108,12 +111,14 @@ static ktime_t tick_init_jiffy_update(void) { ktime_t period; @@ -122,7 +122,7 @@ return period; } -@@ -652,10 +657,10 @@ static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu) +@@ -656,10 +661,10 @@ static ktime_t tick_nohz_next_event(struct tick_sched *ts, int cpu) /* Read jiffies and the time when jiffies were updated last */ do { @@ -167,5 +167,5 @@ #define CS_NAME_LEN 32 -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0032-signal-Revert-ptrace-preempt-magic.patch linux-4.19.118/debian/patches-rt/0032-signal-Revert-ptrace-preempt-magic.patch --- linux-4.19.98/debian/patches-rt/0032-signal-Revert-ptrace-preempt-magic.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0032-signal-Revert-ptrace-preempt-magic.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From fc38cdec8c7fa26cc2b0520c1cd0eb9ff96c969a Mon Sep 17 00:00:00 2001 +From 4e6ea3956be0848c8a5771c159c7fe513e2dd745 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 21 Sep 2011 19:57:12 +0200 -Subject: [PATCH 032/290] signal: Revert ptrace preempt magic -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 032/325] signal: Revert ptrace preempt magic +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Upstream commit '53da1d9456fe7f8 fix ptrace slowness' is nothing more than a bandaid around the ptrace design trainwreck. It's not a @@ -14,10 +14,10 @@ 1 file changed, 8 deletions(-) diff --git a/kernel/signal.c b/kernel/signal.c -index 7278302e3485..6b9d4bbfa9df 100644 +index c42eaf39b572..feeae7177ee1 100644 --- a/kernel/signal.c +++ b/kernel/signal.c -@@ -2098,15 +2098,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info) +@@ -2108,15 +2108,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info) if (gstop_done && ptrace_reparented(current)) do_notify_parent_cldstop(current, false, why); @@ -34,5 +34,5 @@ } else { /* -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0033-net-sched-Use-msleep-instead-of-yield.patch linux-4.19.118/debian/patches-rt/0033-net-sched-Use-msleep-instead-of-yield.patch --- linux-4.19.98/debian/patches-rt/0033-net-sched-Use-msleep-instead-of-yield.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0033-net-sched-Use-msleep-instead-of-yield.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 280627bfccdc36087f174418d56e57d027552a14 Mon Sep 17 00:00:00 2001 +From 8eed50e0a7fd1ea99c11d47421ca4ea0266c829f Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Wed, 5 Mar 2014 00:49:47 +0100 -Subject: [PATCH 033/290] net: sched: Use msleep() instead of yield() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 033/325] net: sched: Use msleep() instead of yield() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz On PREEMPT_RT enabled systems the interrupt handler run as threads at prio 50 (by default). If a high priority userspace process tries to shut down a busy @@ -60,5 +60,5 @@ * unwind stale skb lists and qdisc statistics */ -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0034-dm-rq-remove-BUG_ON-irqs_disabled-check.patch linux-4.19.118/debian/patches-rt/0034-dm-rq-remove-BUG_ON-irqs_disabled-check.patch --- linux-4.19.98/debian/patches-rt/0034-dm-rq-remove-BUG_ON-irqs_disabled-check.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0034-dm-rq-remove-BUG_ON-irqs_disabled-check.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From ec6350958b69d6c98248ee0871b3a7c00c5949c5 Mon Sep 17 00:00:00 2001 +From fada05aa298813af2111a2118e1c1af72332e628 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 27 Mar 2018 16:24:15 +0200 -Subject: [PATCH 034/290] dm rq: remove BUG_ON(!irqs_disabled) check -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 034/325] dm rq: remove BUG_ON(!irqs_disabled) check +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz In commit 052189a2ec95 ("dm: remove superfluous irq disablement in dm_request_fn") the spin_lock_irq() was replaced with spin_lock() + a @@ -33,5 +33,5 @@ } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch linux-4.19.118/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch --- linux-4.19.98/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0035-usb-do-no-disable-interrupts-in-giveback.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From c5248048f310926cc88f9d625126ebb980024a51 Mon Sep 17 00:00:00 2001 +From 1e7b0ed8d23d5a93afc426a2701805787cb7459a Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Fri, 8 Nov 2013 17:34:54 +0100 -Subject: [PATCH 035/290] usb: do no disable interrupts in giveback -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 035/325] usb: do no disable interrupts in giveback +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Since commit 94dfd7ed ("USB: HCD: support giveback of URB in tasklet context") the USB code disables interrupts before invoking the complete @@ -42,5 +42,5 @@ usb_anchor_resume_wakeups(anchor); atomic_dec(&urb->use_count); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0036-rt-Provide-PREEMPT_RT_BASE-config-switch.patch linux-4.19.118/debian/patches-rt/0036-rt-Provide-PREEMPT_RT_BASE-config-switch.patch --- linux-4.19.98/debian/patches-rt/0036-rt-Provide-PREEMPT_RT_BASE-config-switch.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0036-rt-Provide-PREEMPT_RT_BASE-config-switch.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 4bfca780bcff671d348be592531816808005330c Mon Sep 17 00:00:00 2001 +From ac2295358559dac261e20522d82cc3896bd63e97 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 17 Jun 2011 12:39:57 +0200 -Subject: [PATCH 036/290] rt: Provide PREEMPT_RT_BASE config switch -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 036/325] rt: Provide PREEMPT_RT_BASE config switch +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Introduce PREEMPT_RT_BASE which enables parts of PREEMPT_RT_FULL. Forces interrupt threading and enables some of the RT @@ -60,5 +60,5 @@ \ No newline at end of file + bool -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0037-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch linux-4.19.118/debian/patches-rt/0037-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch --- linux-4.19.98/debian/patches-rt/0037-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0037-cpumask-Disable-CONFIG_CPUMASK_OFFSTACK-for-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 6ea70c3ef4fff78246212f51f67a6e48b159bc50 Mon Sep 17 00:00:00 2001 +From 267b99f0dfc2274075fc4d4652995fe24311f05b Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 14 Dec 2011 01:03:49 +0100 -Subject: [PATCH 037/290] cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 037/325] cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz There are "valid" GFP_ATOMIC allocations such as @@ -72,5 +72,5 @@ Use dynamic allocation for cpumask_var_t, instead of putting them on the stack. This is a bit more expensive, but avoids -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0038-jump-label-disable-if-stop_machine-is-used.patch linux-4.19.118/debian/patches-rt/0038-jump-label-disable-if-stop_machine-is-used.patch --- linux-4.19.98/debian/patches-rt/0038-jump-label-disable-if-stop_machine-is-used.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0038-jump-label-disable-if-stop_machine-is-used.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From cded0d9563b5948a2aa3bddb86f632ea0ec38f0e Mon Sep 17 00:00:00 2001 +From d6d2f824df497fe197e5d2bc268eb4e086935778 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 8 Jul 2015 17:14:48 +0200 -Subject: [PATCH 038/290] jump-label: disable if stop_machine() is used -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 038/325] jump-label: disable if stop_machine() is used +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Some architectures are using stop_machine() while switching the opcode which leads to latency spikes. @@ -25,7 +25,7 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig -index 185e552f1461..84f36e47e3ab 100644 +index e2f7c50dbace..91ba9fe945ff 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -51,7 +51,7 @@ config ARM @@ -38,5 +38,5 @@ select HAVE_ARCH_MMAP_RND_BITS if MMU select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0039-kconfig-Disable-config-options-which-are-not-RT-comp.patch linux-4.19.118/debian/patches-rt/0039-kconfig-Disable-config-options-which-are-not-RT-comp.patch --- linux-4.19.98/debian/patches-rt/0039-kconfig-Disable-config-options-which-are-not-RT-comp.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0039-kconfig-Disable-config-options-which-are-not-RT-comp.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From dce06dcc7c4046de51f2d0b0aa53995461a65b82 Mon Sep 17 00:00:00 2001 +From b922a824955d554c93823ba2547095def5b87842 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 24 Jul 2011 12:11:43 +0200 -Subject: [PATCH 039/290] kconfig: Disable config options which are not RT +Subject: [PATCH 039/325] kconfig: Disable config options which are not RT compatible -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Disable stuff which is known to have issues on RT @@ -39,5 +39,5 @@ select RADIX_TREE_MULTIORDER help -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0040-lockdep-disable-self-test.patch linux-4.19.118/debian/patches-rt/0040-lockdep-disable-self-test.patch --- linux-4.19.98/debian/patches-rt/0040-lockdep-disable-self-test.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0040-lockdep-disable-self-test.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From 895584437f1a9e0847ff7ca40873fb3b8bd4be0c Mon Sep 17 00:00:00 2001 +From d503eb089b47efb99b62cfd52744ae0e8522ba67 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 17 Oct 2017 16:36:18 +0200 -Subject: [PATCH 040/290] lockdep: disable self-test +Subject: [PATCH 040/325] lockdep: disable self-test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The self-test wasn't always 100% accurate for RT. We disabled a few tests which failed because they had a different semantic for RT. Some @@ -31,5 +31,5 @@ Say Y here if you want the kernel to run a short self-test during bootup. The self-test checks whether common types of locking bugs -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0041-mm-Allow-only-slub-on-RT.patch linux-4.19.118/debian/patches-rt/0041-mm-Allow-only-slub-on-RT.patch --- linux-4.19.98/debian/patches-rt/0041-mm-Allow-only-slub-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0041-mm-Allow-only-slub-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From dcf8f258f572870f67b12f9d9082eebd0561d085 Mon Sep 17 00:00:00 2001 +From bf1579f9280b4c92ce6b02c3f014d40eff596b86 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:44:03 -0500 -Subject: [PATCH 041/290] mm: Allow only slub on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 041/325] mm: Allow only slub on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Disable SLAB and SLOB on -RT. Only SLUB is adopted to -RT needs. @@ -33,5 +33,5 @@ SLOB replaces the stock allocator with a drastically simpler allocator. SLOB is generally more space efficient but -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0042-locking-Disable-spin-on-owner-for-RT.patch linux-4.19.118/debian/patches-rt/0042-locking-Disable-spin-on-owner-for-RT.patch --- linux-4.19.98/debian/patches-rt/0042-locking-Disable-spin-on-owner-for-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0042-locking-Disable-spin-on-owner-for-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From 4aaf38cf9c2cd085bbee6aec83c66b52b33c9a32 Mon Sep 17 00:00:00 2001 +From f90c261f0738ea136c59392132ba130bad2c03b4 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 17 Jul 2011 21:51:45 +0200 -Subject: [PATCH 042/290] locking: Disable spin on owner for RT +Subject: [PATCH 042/325] locking: Disable spin on owner for RT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Drop spin on owner for mutex / rwsem. We are most likely not using it but… @@ -34,5 +34,5 @@ config LOCK_SPIN_ON_OWNER def_bool y -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0043-rcu-Disable-RCU_FAST_NO_HZ-on-RT.patch linux-4.19.118/debian/patches-rt/0043-rcu-Disable-RCU_FAST_NO_HZ-on-RT.patch --- linux-4.19.98/debian/patches-rt/0043-rcu-Disable-RCU_FAST_NO_HZ-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0043-rcu-Disable-RCU_FAST_NO_HZ-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 5f1bd47909aca86dfc97df6f5ceecd67c755b2e8 Mon Sep 17 00:00:00 2001 +From df00a54df3c3cf8857d0f2836e313a11d3c38180 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 28 Oct 2012 13:26:09 +0000 -Subject: [PATCH 043/290] rcu: Disable RCU_FAST_NO_HZ on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 043/325] rcu: Disable RCU_FAST_NO_HZ on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz This uses a timer_list timer from the irq disabled guts of the idle code. Disable it for now to prevent wreckage. @@ -26,5 +26,5 @@ help This option permits CPUs to enter dynticks-idle state even if -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0044-rcu-make-RCU_BOOST-default-on-RT.patch linux-4.19.118/debian/patches-rt/0044-rcu-make-RCU_BOOST-default-on-RT.patch --- linux-4.19.98/debian/patches-rt/0044-rcu-make-RCU_BOOST-default-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0044-rcu-make-RCU_BOOST-default-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 980f69b6bec3356146f6c2d4e28405b3c4de4a87 Mon Sep 17 00:00:00 2001 +From 1b6c39d11d3f8f75251ccbaa4dbbf2db13892023 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Fri, 21 Mar 2014 20:19:05 +0100 -Subject: [PATCH 044/290] rcu: make RCU_BOOST default on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 044/325] rcu: make RCU_BOOST default on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Since it is no longer invoked from the softirq people run into OOM more often if the priority of the RCU thread is too low. Making boosting @@ -30,5 +30,5 @@ This option boosts the priority of preempted RCU readers that block the current preemptible RCU grace period for too long. -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0045-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch linux-4.19.118/debian/patches-rt/0045-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch --- linux-4.19.98/debian/patches-rt/0045-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0045-sched-Disable-CONFIG_RT_GROUP_SCHED-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 6c16852b3700b4b98d7ea4b6dffbfbb5e1118c01 Mon Sep 17 00:00:00 2001 +From f9726e45c479872aa7380cd7f5190cebcac02c70 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Mon, 18 Jul 2011 17:03:52 +0200 -Subject: [PATCH 045/290] sched: Disable CONFIG_RT_GROUP_SCHED on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 045/325] sched: Disable CONFIG_RT_GROUP_SCHED on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Carsten reported problems when running: @@ -31,5 +31,5 @@ help This feature lets you explicitly allocate real CPU bandwidth -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0046-net-core-disable-NET_RX_BUSY_POLL.patch linux-4.19.118/debian/patches-rt/0046-net-core-disable-NET_RX_BUSY_POLL.patch --- linux-4.19.98/debian/patches-rt/0046-net-core-disable-NET_RX_BUSY_POLL.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0046-net-core-disable-NET_RX_BUSY_POLL.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From 9822fde0d385af32e0b8550600e3961cc9bb96aa Mon Sep 17 00:00:00 2001 +From 996a1b580a6cc76c1463f9f69662448d34ebb398 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Sat, 27 May 2017 19:02:06 +0200 -Subject: [PATCH 046/290] net/core: disable NET_RX_BUSY_POLL +Subject: [PATCH 046/325] net/core: disable NET_RX_BUSY_POLL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz sk_busy_loop() does preempt_disable() followed by a few operations which can take sleeping locks and may get long. @@ -34,5 +34,5 @@ config BQL bool -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0047-arm-disable-NEON-in-kernel-mode.patch linux-4.19.118/debian/patches-rt/0047-arm-disable-NEON-in-kernel-mode.patch --- linux-4.19.98/debian/patches-rt/0047-arm-disable-NEON-in-kernel-mode.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0047-arm-disable-NEON-in-kernel-mode.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From c628460359a533e7547887b5212d2291117eeacb Mon Sep 17 00:00:00 2001 +From fe0a55f724947832043b3e9dce548b136de75da7 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Fri, 1 Dec 2017 10:42:03 +0100 -Subject: [PATCH 047/290] arm*: disable NEON in kernel mode -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 047/325] arm*: disable NEON in kernel mode +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz NEON in kernel mode is used by the crypto algorithms and raid6 code. While the raid6 code looks okay, the crypto algorithms do not: NEON @@ -21,7 +21,7 @@ 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig -index 84f36e47e3ab..c1cc28f0841f 100644 +index 91ba9fe945ff..bd9d180db5c7 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -2163,7 +2163,7 @@ config NEON @@ -162,5 +162,5 @@ crc32_pmull_algs[1].update = crc32c_pmull_update; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0048-powerpc-Use-generic-rwsem-on-RT.patch linux-4.19.118/debian/patches-rt/0048-powerpc-Use-generic-rwsem-on-RT.patch --- linux-4.19.98/debian/patches-rt/0048-powerpc-Use-generic-rwsem-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0048-powerpc-Use-generic-rwsem-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 2b0792d20032fb077f028c433ce0575e0b2af952 Mon Sep 17 00:00:00 2001 +From f66e42e47b6d784455711d775e0e896078112788 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: [PATCH 048/290] powerpc: Use generic rwsem on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 048/325] powerpc: Use generic rwsem on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Use generic code which uses rtmutex @@ -12,7 +12,7 @@ 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig -index a80669209155..9952764db9c5 100644 +index 6f475dc5829b..3d5c86336072 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -105,10 +105,11 @@ config LOCKDEP_SUPPORT @@ -29,5 +29,5 @@ config GENERIC_LOCKBREAK bool -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0049-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch linux-4.19.118/debian/patches-rt/0049-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch --- linux-4.19.98/debian/patches-rt/0049-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0049-powerpc-kvm-Disable-in-kernel-MPIC-emulation-for-PRE.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 59e8b4257278a94fecf207ad131920b7e1364aa7 Mon Sep 17 00:00:00 2001 +From a0922c5ef203ce1bf241a3189fd9bf2475f7871e Mon Sep 17 00:00:00 2001 From: Bogdan Purcareata Date: Fri, 24 Apr 2015 15:53:13 +0000 -Subject: [PATCH 049/290] powerpc/kvm: Disable in-kernel MPIC emulation for +Subject: [PATCH 049/325] powerpc/kvm: Disable in-kernel MPIC emulation for PREEMPT_RT_FULL -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz While converting the openpic emulation code to use a raw_spinlock_t enables guests to run on RT, there's still a performance issue. For interrupts sent in @@ -41,5 +41,5 @@ select HAVE_KVM_IRQFD select HAVE_KVM_IRQ_ROUTING -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0050-powerpc-Disable-highmem-on-RT.patch linux-4.19.118/debian/patches-rt/0050-powerpc-Disable-highmem-on-RT.patch --- linux-4.19.98/debian/patches-rt/0050-powerpc-Disable-highmem-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0050-powerpc-Disable-highmem-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From da3f221553e2c41925af06392f6ed660d68543a7 Mon Sep 17 00:00:00 2001 +From 05259869f3f330c74c6647e1bcceda4f6a17996d Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Mon, 18 Jul 2011 17:08:34 +0200 -Subject: [PATCH 050/290] powerpc: Disable highmem on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 050/325] powerpc: Disable highmem on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The current highmem handling on -RT is not compatible and needs fixups. @@ -12,10 +12,10 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig -index 9952764db9c5..1563820a37e8 100644 +index 3d5c86336072..1b332f69dd36 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig -@@ -398,7 +398,7 @@ menu "Kernel options" +@@ -399,7 +399,7 @@ menu "Kernel options" config HIGHMEM bool "High memory support" @@ -25,5 +25,5 @@ source kernel/Kconfig.hz -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0051-mips-Disable-highmem-on-RT.patch linux-4.19.118/debian/patches-rt/0051-mips-Disable-highmem-on-RT.patch --- linux-4.19.98/debian/patches-rt/0051-mips-Disable-highmem-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0051-mips-Disable-highmem-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 33a7e9d57de8e82532d8cdec33795907685b22e7 Mon Sep 17 00:00:00 2001 +From 2724f222d99a9ed81df4fa565d6cf82d34259d69 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Mon, 18 Jul 2011 17:10:12 +0200 -Subject: [PATCH 051/290] mips: Disable highmem on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 051/325] mips: Disable highmem on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The current highmem handling on -RT is not compatible and needs fixups. @@ -25,5 +25,5 @@ config CPU_SUPPORTS_HIGHMEM bool -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0052-x86-Use-generic-rwsem_spinlocks-on-rt.patch linux-4.19.118/debian/patches-rt/0052-x86-Use-generic-rwsem_spinlocks-on-rt.patch --- linux-4.19.98/debian/patches-rt/0052-x86-Use-generic-rwsem_spinlocks-on-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0052-x86-Use-generic-rwsem_spinlocks-on-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 2aeeb18ed2650e5c8d35e52ed37e51f4f112e87e Mon Sep 17 00:00:00 2001 +From 78bb51d4c679626974498c8ae3af2866d451c48b Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 26 Jul 2009 02:21:32 +0200 -Subject: [PATCH 052/290] x86: Use generic rwsem_spinlocks on -rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 052/325] x86: Use generic rwsem_spinlocks on -rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Simplifies the separation of anon_rw_semaphores and rw_semaphores for -rt. @@ -30,5 +30,5 @@ config GENERIC_CALIBRATE_DELAY def_bool y -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0053-leds-trigger-disable-CPU-trigger-on-RT.patch linux-4.19.118/debian/patches-rt/0053-leds-trigger-disable-CPU-trigger-on-RT.patch --- linux-4.19.98/debian/patches-rt/0053-leds-trigger-disable-CPU-trigger-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0053-leds-trigger-disable-CPU-trigger-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From d438ee6c55b0969d2490f97a6fc897f462f017b0 Mon Sep 17 00:00:00 2001 +From 88db50cf7dd13e56c63f264a6bb3763f59ed0795 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Thu, 23 Jan 2014 14:45:59 +0100 -Subject: [PATCH 053/290] leds: trigger: disable CPU trigger on -RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 053/325] leds: trigger: disable CPU trigger on -RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz as it triggers: |CPU: 0 PID: 0 Comm: swapper Not tainted 3.12.8-rt10 #141 @@ -37,5 +37,5 @@ This allows LEDs to be controlled by active CPUs. This shows the active CPUs across an array of LEDs so you can see which -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0054-cpufreq-drop-K8-s-driver-from-beeing-selected.patch linux-4.19.118/debian/patches-rt/0054-cpufreq-drop-K8-s-driver-from-beeing-selected.patch --- linux-4.19.98/debian/patches-rt/0054-cpufreq-drop-K8-s-driver-from-beeing-selected.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0054-cpufreq-drop-K8-s-driver-from-beeing-selected.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 24a05d9b26a5e6f52e0e35f401fd16a50bc3cc2d Mon Sep 17 00:00:00 2001 +From d8c10b642fecafbf8fdcc70eb887ac2b1b2010de Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Thu, 9 Apr 2015 15:23:01 +0200 -Subject: [PATCH 054/290] cpufreq: drop K8's driver from beeing selected -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 054/325] cpufreq: drop K8's driver from beeing selected +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Ralf posted a picture of a backtrace from @@ -35,5 +35,5 @@ This adds the CPUFreq driver for K8/early Opteron/Athlon64 processors. Support for K10 and newer processors is now in acpi-cpufreq. -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0055-md-disable-bcache.patch linux-4.19.118/debian/patches-rt/0055-md-disable-bcache.patch --- linux-4.19.98/debian/patches-rt/0055-md-disable-bcache.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0055-md-disable-bcache.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From 00fd6babe97f1ea784554baabb1bc74d7f11be16 Mon Sep 17 00:00:00 2001 +From 248d9794b36b5701308e7a624204d116f681240f Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Thu, 29 Aug 2013 11:48:57 +0200 -Subject: [PATCH 055/290] md: disable bcache +Subject: [PATCH 055/325] md: disable bcache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz It uses anon semaphores |drivers/md/bcache/request.c: In function ‘cached_dev_write_complete’: @@ -37,5 +37,5 @@ help Allows a block device to be used as cache for other devices; uses -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0056-efi-Disable-runtime-services-on-RT.patch linux-4.19.118/debian/patches-rt/0056-efi-Disable-runtime-services-on-RT.patch --- linux-4.19.98/debian/patches-rt/0056-efi-Disable-runtime-services-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0056-efi-Disable-runtime-services-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From e2d68290b3efe18e50ef23302fda76bb471d7493 Mon Sep 17 00:00:00 2001 +From 1bfed58b8d4d1812c80dbd9d096d5e1e011ca0fc Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Thu, 26 Jul 2018 15:03:16 +0200 -Subject: [PATCH 056/290] efi: Disable runtime services on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 056/325] efi: Disable runtime services on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Based on meassurements the EFI functions get_variable / get_next_variable take up to 2us which looks okay. @@ -42,5 +42,5 @@ { disable_runtime = true; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0057-printk-Add-a-printk-kill-switch.patch linux-4.19.118/debian/patches-rt/0057-printk-Add-a-printk-kill-switch.patch --- linux-4.19.98/debian/patches-rt/0057-printk-Add-a-printk-kill-switch.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0057-printk-Add-a-printk-kill-switch.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 3d59550d2bce945d0885bb16ee747edc40521c95 Mon Sep 17 00:00:00 2001 +From b19916a6a05bf459669c0666d128f744d601c728 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 22 Jul 2011 17:58:40 +0200 -Subject: [PATCH 057/290] printk: Add a printk kill switch -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 057/325] printk: Add a printk kill switch +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Add a prinkt-kill-switch. This is used from (NMI) watchdog to ensure that it does not dead-lock with the early printk code. @@ -31,7 +31,7 @@ #ifdef CONFIG_PRINTK_NMI diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c -index 845efadaf7ec..0214d876c22d 100644 +index 7a2fdc097c8c..29838e532f46 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -405,6 +405,58 @@ DEFINE_RAW_SPINLOCK(logbuf_lock); @@ -170,5 +170,5 @@ nmi_panic(regs, "Hard LOCKUP"); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0058-printk-Add-force_early_printk-boot-param-to-help-wit.patch linux-4.19.118/debian/patches-rt/0058-printk-Add-force_early_printk-boot-param-to-help-wit.patch --- linux-4.19.98/debian/patches-rt/0058-printk-Add-force_early_printk-boot-param-to-help-wit.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0058-printk-Add-force_early_printk-boot-param-to-help-wit.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From ec95016b0067d4801b743959345d1d2b4897b4c7 Mon Sep 17 00:00:00 2001 +From 435cedf56c779ff8b0aff154014fac752d0cfc53 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Fri, 2 Sep 2011 14:41:29 +0200 -Subject: [PATCH 058/290] printk: Add "force_early_printk" boot param to help +Subject: [PATCH 058/325] printk: Add "force_early_printk" boot param to help with debugging -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Gives me an option to screw printk and actually see what the machine says. @@ -17,7 +17,7 @@ 1 file changed, 7 insertions(+) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c -index 0214d876c22d..9a7f259dbb20 100644 +index 29838e532f46..f934baed564d 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -435,6 +435,13 @@ asmlinkage void early_printk(const char *fmt, ...) @@ -35,5 +35,5 @@ { printk_killswitch = true; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0059-preempt-Provide-preempt_-_-no-rt-variants.patch linux-4.19.118/debian/patches-rt/0059-preempt-Provide-preempt_-_-no-rt-variants.patch --- linux-4.19.98/debian/patches-rt/0059-preempt-Provide-preempt_-_-no-rt-variants.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0059-preempt-Provide-preempt_-_-no-rt-variants.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 8cdff06e21bab2bdf3a7f633a9e22b890bc43f39 Mon Sep 17 00:00:00 2001 +From 0f4ab1168734c622efbc4fd6b4def90ab992be6b Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 24 Jul 2009 12:38:56 +0200 -Subject: [PATCH 059/290] preempt: Provide preempt_*_(no)rt variants -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 059/325] preempt: Provide preempt_*_(no)rt variants +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz RT needs a few preempt_disable/enable points which are not necessary otherwise. Implement variants to avoid #ifdeffery. @@ -49,5 +49,5 @@ struct preempt_notifier; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0060-futex-workaround-migrate_disable-enable-in-different.patch linux-4.19.118/debian/patches-rt/0060-futex-workaround-migrate_disable-enable-in-different.patch --- linux-4.19.98/debian/patches-rt/0060-futex-workaround-migrate_disable-enable-in-different.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0060-futex-workaround-migrate_disable-enable-in-different.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 4c36c4326b5f829aaabd0e2bd105c12797f16449 Mon Sep 17 00:00:00 2001 +From f9c934a2065deec2a867e69c90d82e5f01a0031a Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 8 Mar 2017 14:23:35 +0100 -Subject: [PATCH 060/290] futex: workaround migrate_disable/enable in different +Subject: [PATCH 060/325] futex: workaround migrate_disable/enable in different context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz migrate_disable()/migrate_enable() takes a different path in atomic() vs !atomic() context. These little hacks ensure that we don't underflow / overflow @@ -17,10 +17,10 @@ 1 file changed, 19 insertions(+) diff --git a/kernel/futex.c b/kernel/futex.c -index e75ad30aa7bc..5c8053098fc8 100644 +index 920d853a8e9e..32f9e3fa8c46 100644 --- a/kernel/futex.c +++ b/kernel/futex.c -@@ -2879,6 +2879,14 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, +@@ -2896,6 +2896,14 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, * before __rt_mutex_start_proxy_lock() is done. */ raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock); @@ -35,7 +35,7 @@ spin_unlock(q.lock_ptr); /* * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter -@@ -2887,6 +2895,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, +@@ -2904,6 +2912,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, */ ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current); raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock); @@ -43,7 +43,7 @@ if (ret) { if (ret == 1) -@@ -3035,11 +3044,21 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) +@@ -3052,11 +3061,21 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) * rt_waiter. Also see the WARN in wake_futex_pi(). */ raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); @@ -66,5 +66,5 @@ /* -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0061-rt-Add-local-irq-locks.patch linux-4.19.118/debian/patches-rt/0061-rt-Add-local-irq-locks.patch --- linux-4.19.98/debian/patches-rt/0061-rt-Add-local-irq-locks.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0061-rt-Add-local-irq-locks.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 2bd99b106c35f77357bcaea4546eb89085cc5ac8 Mon Sep 17 00:00:00 2001 +From e14e89e35c111f053cf74355bdc468577cdddf32 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Mon, 20 Jun 2011 09:03:47 +0200 -Subject: [PATCH 061/290] rt: Add local irq locks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 061/325] rt: Add local irq locks +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Introduce locallock. For !RT this maps to preempt_disable()/ local_irq_disable() so there is not much that changes. For RT this will @@ -337,5 +337,5 @@ #define PCPU_MIN_UNIT_SIZE PFN_ALIGN(32 << 10) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0062-locallock-provide-get-put-_locked_ptr-variants.patch linux-4.19.118/debian/patches-rt/0062-locallock-provide-get-put-_locked_ptr-variants.patch --- linux-4.19.98/debian/patches-rt/0062-locallock-provide-get-put-_locked_ptr-variants.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0062-locallock-provide-get-put-_locked_ptr-variants.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 6b3038f8d30a5cef133ed3791a44e17377c0b052 Mon Sep 17 00:00:00 2001 +From 0dc8625af525103cb6b43e7f73288315aa9182c2 Mon Sep 17 00:00:00 2001 From: Julia Cartwright Date: Mon, 7 May 2018 08:58:56 -0500 -Subject: [PATCH 062/290] locallock: provide {get,put}_locked_ptr() variants -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 062/325] locallock: provide {get,put}_locked_ptr() variants +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Provide a set of locallocked accessors for pointers to per-CPU data; this is useful for dynamically-allocated per-CPU regions, for example. @@ -45,5 +45,5 @@ #define local_lock_cpu(lvar) get_cpu() #define local_unlock_cpu(lvar) put_cpu() -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0063-mm-scatterlist-Do-not-disable-irqs-on-RT.patch linux-4.19.118/debian/patches-rt/0063-mm-scatterlist-Do-not-disable-irqs-on-RT.patch --- linux-4.19.98/debian/patches-rt/0063-mm-scatterlist-Do-not-disable-irqs-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0063-mm-scatterlist-Do-not-disable-irqs-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From ed4646fb9f4dde9fa5e97aadbd15073babb2fdb5 Mon Sep 17 00:00:00 2001 +From 9977834321f77cd9919949417d7aff598ed71023 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 3 Jul 2009 08:44:34 -0500 -Subject: [PATCH 063/290] mm/scatterlist: Do not disable irqs on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 063/325] mm/scatterlist: Do not disable irqs on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz For -RT it is enough to keep pagefault disabled (which is currently handled by kmap_atomic()). @@ -13,7 +13,7 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/scatterlist.c b/lib/scatterlist.c -index 8c3036c37ba0..336162c2813f 100644 +index 60e7eca2f4be..aad8b9ecd496 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -777,7 +777,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter) @@ -26,5 +26,5 @@ } else kunmap(miter->page); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0064-signal-x86-Delay-calling-signals-in-atomic.patch linux-4.19.118/debian/patches-rt/0064-signal-x86-Delay-calling-signals-in-atomic.patch --- linux-4.19.98/debian/patches-rt/0064-signal-x86-Delay-calling-signals-in-atomic.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0064-signal-x86-Delay-calling-signals-in-atomic.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 61d171cababe91bd799f750f2c88eca687b65d51 Mon Sep 17 00:00:00 2001 +From f2ef7528019291f9ad8d4cf90b57d315f8accd38 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: [PATCH 064/290] signal/x86: Delay calling signals in atomic -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 064/325] signal/x86: Delay calling signals in atomic +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz On x86_64 we must disable preemption before we enable interrupts for stack faults, int3 and debugging, because the current task is using @@ -80,7 +80,7 @@ typedef sigset_t compat_sigset_t; #endif diff --git a/include/linux/sched.h b/include/linux/sched.h -index 038d0faaa1d5..c87c11bfd9d9 100644 +index 0489d3e0e78c..e4af260f81c5 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -881,6 +881,10 @@ struct task_struct { @@ -95,10 +95,10 @@ size_t sas_ss_size; unsigned int sas_ss_flags; diff --git a/kernel/signal.c b/kernel/signal.c -index 6b9d4bbfa9df..3565221b4fac 100644 +index feeae7177ee1..d1fa3c405784 100644 --- a/kernel/signal.c +++ b/kernel/signal.c -@@ -1272,8 +1272,8 @@ int do_send_sig_info(int sig, struct siginfo *info, struct task_struct *p, +@@ -1282,8 +1282,8 @@ int do_send_sig_info(int sig, struct siginfo *info, struct task_struct *p, * We don't want to have recursive SIGSEGV's etc, for example, * that is why we also clear SIGNAL_UNKILLABLE. */ @@ -109,7 +109,7 @@ { unsigned long int flags; int ret, blocked, ignored; -@@ -1302,6 +1302,39 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) +@@ -1312,6 +1312,39 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t) return ret; } @@ -150,5 +150,5 @@ * Nuke all other threads in the group. */ -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0065-x86-signal-delay-calling-signals-on-32bit.patch linux-4.19.118/debian/patches-rt/0065-x86-signal-delay-calling-signals-on-32bit.patch --- linux-4.19.98/debian/patches-rt/0065-x86-signal-delay-calling-signals-on-32bit.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0065-x86-signal-delay-calling-signals-on-32bit.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 159a99e63d62232f0de5a25fe8d92e4e31140c29 Mon Sep 17 00:00:00 2001 +From ad228035652dbf96f3ee14ca10e14e85fb4e5b3c Mon Sep 17 00:00:00 2001 From: Yang Shi Date: Thu, 10 Dec 2015 10:58:51 -0800 -Subject: [PATCH 065/290] x86/signal: delay calling signals on 32bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 065/325] x86/signal: delay calling signals on 32bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz When running some ptrace single step tests on x86-32 machine, the below problem is triggered: @@ -45,5 +45,5 @@ #endif -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0066-buffer_head-Replace-bh_uptodate_lock-for-rt.patch linux-4.19.118/debian/patches-rt/0066-buffer_head-Replace-bh_uptodate_lock-for-rt.patch --- linux-4.19.98/debian/patches-rt/0066-buffer_head-Replace-bh_uptodate_lock-for-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0066-buffer_head-Replace-bh_uptodate_lock-for-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 5c50a0cef22d58bcda53aae4df00e10ce6e04903 Mon Sep 17 00:00:00 2001 +From 9c2e7dffa272d9112c453d37bf48c92bb1b4d287 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 18 Mar 2011 09:18:52 +0100 -Subject: [PATCH 066/290] buffer_head: Replace bh_uptodate_lock for -rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 066/325] buffer_head: Replace bh_uptodate_lock for -rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Wrap the bit_spin_lock calls into a separate inline and add the RT replacements with a real spinlock. @@ -87,7 +87,7 @@ __this_cpu_inc(bh_accounting.nr); recalc_bh_state(); diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c -index db7590178dfc..d76364124443 100644 +index 9cc79b7b0df1..3f4ba2011499 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -95,8 +95,7 @@ static void ext4_finish_bio(struct bio *bio) @@ -193,5 +193,5 @@ * macro tricks to expand the set_buffer_foo(), clear_buffer_foo() * and buffer_foo() functions. -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0067-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch linux-4.19.118/debian/patches-rt/0067-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch --- linux-4.19.98/debian/patches-rt/0067-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0067-fs-jbd-jbd2-Make-state-lock-and-journal-head-lock-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From f3f66f83edae0ab6ff7569d6395c5ee3833e8fba Mon Sep 17 00:00:00 2001 +From c6247543e73c08256490bf6ccd225a3476eefd3a Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 18 Mar 2011 10:11:25 +0100 -Subject: [PATCH 067/290] fs: jbd/jbd2: Make state lock and journal head lock +Subject: [PATCH 067/325] fs: jbd/jbd2: Make state lock and journal head lock rt safe -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz bit_spin_locks break under RT. @@ -106,5 +106,5 @@ #define J_ASSERT(assert) BUG_ON(!(assert)) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0068-list_bl-Make-list-head-locking-RT-safe.patch linux-4.19.118/debian/patches-rt/0068-list_bl-Make-list-head-locking-RT-safe.patch --- linux-4.19.98/debian/patches-rt/0068-list_bl-Make-list-head-locking-RT-safe.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0068-list_bl-Make-list-head-locking-RT-safe.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 3023eb220840f37bbc9d31e9959de567cb1aaaae Mon Sep 17 00:00:00 2001 +From ffb1cb4821d5ac6ec3e2f69dc118584321113848 Mon Sep 17 00:00:00 2001 From: Paul Gortmaker Date: Fri, 21 Jun 2013 15:07:25 -0400 -Subject: [PATCH 068/290] list_bl: Make list head locking RT safe -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 068/325] list_bl: Make list head locking RT safe +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz As per changes in include/linux/jbd_common.h for avoiding the bit_spin_locks on RT ("fs: jbd/jbd2: Make state lock and journal @@ -117,5 +117,5 @@ static inline bool hlist_bl_is_locked(struct hlist_bl_head *b) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0069-list_bl-fixup-bogus-lockdep-warning.patch linux-4.19.118/debian/patches-rt/0069-list_bl-fixup-bogus-lockdep-warning.patch --- linux-4.19.98/debian/patches-rt/0069-list_bl-fixup-bogus-lockdep-warning.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0069-list_bl-fixup-bogus-lockdep-warning.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 819674251514107628d4f10edb7514ab08bb57a9 Mon Sep 17 00:00:00 2001 +From bdcdc6774f7346b9302a7cf88c2c6ad00afe3459 Mon Sep 17 00:00:00 2001 From: Josh Cartwright Date: Thu, 31 Mar 2016 00:04:25 -0500 -Subject: [PATCH 069/290] list_bl: fixup bogus lockdep warning -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 069/325] list_bl: fixup bogus lockdep warning +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz At first glance, the use of 'static inline' seems appropriate for INIT_HLIST_BL_HEAD(). @@ -100,5 +100,5 @@ static inline void INIT_HLIST_BL_NODE(struct hlist_bl_node *h) { -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0070-genirq-Disable-irqpoll-on-rt.patch linux-4.19.118/debian/patches-rt/0070-genirq-Disable-irqpoll-on-rt.patch --- linux-4.19.98/debian/patches-rt/0070-genirq-Disable-irqpoll-on-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0070-genirq-Disable-irqpoll-on-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 672f4d8462083915084e695c9ed600d32fbfcd52 Mon Sep 17 00:00:00 2001 +From 7cebafc45724ddb601b485b97c0c931378a7d60d Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:57 -0500 -Subject: [PATCH 070/290] genirq: Disable irqpoll on -rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 070/325] genirq: Disable irqpoll on -rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Creates long latencies for no value @@ -39,5 +39,5 @@ printk(KERN_WARNING "Misrouted IRQ fixup and polling support " "enabled\n"); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0071-genirq-Force-interrupt-thread-on-RT.patch linux-4.19.118/debian/patches-rt/0071-genirq-Force-interrupt-thread-on-RT.patch --- linux-4.19.98/debian/patches-rt/0071-genirq-Force-interrupt-thread-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0071-genirq-Force-interrupt-thread-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From a2049c3364eae5d13eaaa22d9212c631faf58236 Mon Sep 17 00:00:00 2001 +From 7dca342c202dd085c2ed2817d5bf9bdfb8d9fd4b Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 3 Apr 2011 11:57:29 +0200 -Subject: [PATCH 071/290] genirq: Force interrupt thread on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 071/325] genirq: Force interrupt thread on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Force threaded_irqs and optimize the code (force_irqthreads) in regard to this. @@ -30,7 +30,7 @@ #define force_irqthreads (0) #endif diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 23bcfa71077f..3c26d0708709 100644 +index efcb54ee0922..0809bf7743af 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -24,6 +24,7 @@ @@ -50,5 +50,5 @@ static void __synchronize_hardirq(struct irq_desc *desc, bool sync_chip) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0072-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch linux-4.19.118/debian/patches-rt/0072-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch --- linux-4.19.98/debian/patches-rt/0072-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0072-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From e8c4b5df495a54c8c5fdf5c34fcbb07a2780e3bd Mon Sep 17 00:00:00 2001 +From 2e4f0bf4e4b7f98603bec063dc960b95fd97fbce Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Mon, 28 May 2018 15:24:20 +0200 -Subject: [PATCH 072/290] Split IRQ-off and zone->lock while freeing pages from +Subject: [PATCH 072/325] Split IRQ-off and zone->lock while freeing pages from PCP list #1 -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Split the IRQ-off section while accessing the PCP list from zone->lock while freeing pages. @@ -18,7 +18,7 @@ 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 74fb5c338e8f..3b51ad4a6089 100644 +index e5c610d711f3..0cfcd42517a4 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1095,7 +1095,7 @@ static inline void prefetch_buddy(struct page *page) @@ -169,5 +169,5 @@ } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0073-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch linux-4.19.118/debian/patches-rt/0073-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch --- linux-4.19.98/debian/patches-rt/0073-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0073-Split-IRQ-off-and-zone-lock-while-freeing-pages-from.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From acc79cbb82bc621f748cafcab53e6038456ee194 Mon Sep 17 00:00:00 2001 +From e2fc0821dfc12bc01f49756080b4563f0fc2c45c Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Mon, 28 May 2018 15:24:21 +0200 -Subject: [PATCH 073/290] Split IRQ-off and zone->lock while freeing pages from +Subject: [PATCH 073/325] Split IRQ-off and zone->lock while freeing pages from PCP list #2 -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Split the IRQ-off section while accessing the PCP list from zone->lock while freeing pages. @@ -18,7 +18,7 @@ 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 3b51ad4a6089..49f7bb170b4d 100644 +index 0cfcd42517a4..9a4d150ea5b7 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1105,8 +1105,8 @@ static inline void prefetch_buddy(struct page *page) @@ -168,5 +168,5 @@ /* -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0074-mm-SLxB-change-list_lock-to-raw_spinlock_t.patch linux-4.19.118/debian/patches-rt/0074-mm-SLxB-change-list_lock-to-raw_spinlock_t.patch --- linux-4.19.98/debian/patches-rt/0074-mm-SLxB-change-list_lock-to-raw_spinlock_t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0074-mm-SLxB-change-list_lock-to-raw_spinlock_t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 110ed1923c52a4d9ec01080e38ec6a48b9254b32 Mon Sep 17 00:00:00 2001 +From 32c26f054fbd92f8fe27eba2443d9d7490232aa3 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Mon, 28 May 2018 15:24:22 +0200 -Subject: [PATCH 074/290] mm/SLxB: change list_lock to raw_spinlock_t -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 074/325] mm/SLxB: change list_lock to raw_spinlock_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The list_lock is used with used with IRQs off on RT. Make it a raw_spinlock_t otherwise the interrupts won't be disabled on -RT. The locking rules remain @@ -399,7 +399,7 @@ #ifdef CONFIG_SLAB struct list_head slabs_partial; /* partial list first, better asm code */ diff --git a/mm/slub.c b/mm/slub.c -index 9c3937c5ce38..ba20c68a9cfd 100644 +index 9b7b989273d4..a3b4c5c04ffe 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1167,7 +1167,7 @@ static noinline int free_debug_processing( @@ -438,7 +438,7 @@ return object; } -@@ -2073,7 +2073,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, +@@ -2071,7 +2071,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, * that acquire_slab() will see a slab page that * is frozen */ @@ -447,7 +447,7 @@ } } else { m = M_FULL; -@@ -2084,7 +2084,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, +@@ -2082,7 +2082,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, * slabs from diagnostic functions will not see * any frozen slabs. */ @@ -456,7 +456,7 @@ } } -@@ -2119,7 +2119,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, +@@ -2117,7 +2117,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, goto redo; if (lock) @@ -465,7 +465,7 @@ if (m == M_FREE) { stat(s, DEACTIVATE_EMPTY); -@@ -2154,10 +2154,10 @@ static void unfreeze_partials(struct kmem_cache *s, +@@ -2152,10 +2152,10 @@ static void unfreeze_partials(struct kmem_cache *s, n2 = get_node(s, page_to_nid(page)); if (n != n2) { if (n) @@ -478,7 +478,7 @@ } do { -@@ -2186,7 +2186,7 @@ static void unfreeze_partials(struct kmem_cache *s, +@@ -2184,7 +2184,7 @@ static void unfreeze_partials(struct kmem_cache *s, } if (n) @@ -487,7 +487,7 @@ while (discard_page) { page = discard_page; -@@ -2355,10 +2355,10 @@ static unsigned long count_partial(struct kmem_cache_node *n, +@@ -2353,10 +2353,10 @@ static unsigned long count_partial(struct kmem_cache_node *n, unsigned long x = 0; struct page *page; @@ -500,7 +500,7 @@ return x; } #endif /* CONFIG_SLUB_DEBUG || CONFIG_SYSFS */ -@@ -2793,7 +2793,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, +@@ -2801,7 +2801,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, do { if (unlikely(n)) { @@ -509,7 +509,7 @@ n = NULL; } prior = page->freelist; -@@ -2825,7 +2825,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, +@@ -2833,7 +2833,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, * Otherwise the list_lock will synchronize with * other processors updating the list of slabs. */ @@ -518,7 +518,7 @@ } } -@@ -2867,7 +2867,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, +@@ -2875,7 +2875,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, add_partial(n, page, DEACTIVATE_TO_TAIL); stat(s, FREE_ADD_PARTIAL); } @@ -527,7 +527,7 @@ return; slab_empty: -@@ -2882,7 +2882,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, +@@ -2890,7 +2890,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, remove_full(s, n, page); } @@ -536,7 +536,7 @@ stat(s, FREE_SLAB); discard_slab(s, page); } -@@ -3269,7 +3269,7 @@ static void +@@ -3288,7 +3288,7 @@ static void init_kmem_cache_node(struct kmem_cache_node *n) { n->nr_partial = 0; @@ -545,7 +545,7 @@ INIT_LIST_HEAD(&n->partial); #ifdef CONFIG_SLUB_DEBUG atomic_long_set(&n->nr_slabs, 0); -@@ -3656,7 +3656,7 @@ static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) +@@ -3675,7 +3675,7 @@ static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) struct page *page, *h; BUG_ON(irqs_disabled()); @@ -554,7 +554,7 @@ list_for_each_entry_safe(page, h, &n->partial, lru) { if (!page->inuse) { remove_partial(n, page); -@@ -3666,7 +3666,7 @@ static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) +@@ -3685,7 +3685,7 @@ static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) "Objects remaining in %s on __kmem_cache_shutdown()"); } } @@ -563,7 +563,7 @@ list_for_each_entry_safe(page, h, &discard, lru) discard_slab(s, page); -@@ -3939,7 +3939,7 @@ int __kmem_cache_shrink(struct kmem_cache *s) +@@ -3958,7 +3958,7 @@ int __kmem_cache_shrink(struct kmem_cache *s) for (i = 0; i < SHRINK_PROMOTE_MAX; i++) INIT_LIST_HEAD(promote + i); @@ -572,7 +572,7 @@ /* * Build lists of slabs to discard or promote. -@@ -3970,7 +3970,7 @@ int __kmem_cache_shrink(struct kmem_cache *s) +@@ -3989,7 +3989,7 @@ int __kmem_cache_shrink(struct kmem_cache *s) for (i = SHRINK_PROMOTE_MAX - 1; i >= 0; i--) list_splice(promote + i, &n->partial); @@ -581,7 +581,7 @@ /* Release empty slabs */ list_for_each_entry_safe(page, t, &discard, lru) -@@ -4384,7 +4384,7 @@ static int validate_slab_node(struct kmem_cache *s, +@@ -4403,7 +4403,7 @@ static int validate_slab_node(struct kmem_cache *s, struct page *page; unsigned long flags; @@ -590,7 +590,7 @@ list_for_each_entry(page, &n->partial, lru) { validate_slab_slab(s, page, map); -@@ -4406,7 +4406,7 @@ static int validate_slab_node(struct kmem_cache *s, +@@ -4425,7 +4425,7 @@ static int validate_slab_node(struct kmem_cache *s, s->name, count, atomic_long_read(&n->nr_slabs)); out: @@ -599,7 +599,7 @@ return count; } -@@ -4596,12 +4596,12 @@ static int list_locations(struct kmem_cache *s, char *buf, +@@ -4615,12 +4615,12 @@ static int list_locations(struct kmem_cache *s, char *buf, if (!atomic_long_read(&n->nr_slabs)) continue; @@ -615,5 +615,5 @@ for (i = 0; i < t.count; i++) { -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0075-mm-SLUB-delay-giving-back-empty-slubs-to-IRQ-enabled.patch linux-4.19.118/debian/patches-rt/0075-mm-SLUB-delay-giving-back-empty-slubs-to-IRQ-enabled.patch --- linux-4.19.98/debian/patches-rt/0075-mm-SLUB-delay-giving-back-empty-slubs-to-IRQ-enabled.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0075-mm-SLUB-delay-giving-back-empty-slubs-to-IRQ-enabled.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 4a3bfadbedbdbba560abbf1073deacf963fcbc6a Mon Sep 17 00:00:00 2001 +From 6e725f0366939a0d83764cd8835200cb222bb1af Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 21 Jun 2018 17:29:19 +0200 -Subject: [PATCH 075/290] mm/SLUB: delay giving back empty slubs to IRQ enabled +Subject: [PATCH 075/325] mm/SLUB: delay giving back empty slubs to IRQ enabled regions -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz __free_slab() is invoked with disabled interrupts which increases the irq-off time while __free_pages() is doing the work. @@ -18,7 +18,7 @@ 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/mm/slub.c b/mm/slub.c -index ba20c68a9cfd..224663e20772 100644 +index a3b4c5c04ffe..19bc021a2726 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1330,6 +1330,12 @@ static inline void dec_slabs_node(struct kmem_cache *s, int node, @@ -64,7 +64,7 @@ } else __free_slab(s, page); } -@@ -2223,14 +2245,21 @@ static void put_cpu_partial(struct kmem_cache *s, struct page *page, int drain) +@@ -2221,14 +2243,21 @@ static void put_cpu_partial(struct kmem_cache *s, struct page *page, int drain) pobjects = oldpage->pobjects; pages = oldpage->pages; if (drain && pobjects > s->cpu_partial) { @@ -86,7 +86,7 @@ oldpage = NULL; pobjects = 0; pages = 0; -@@ -2300,7 +2329,22 @@ static bool has_cpu_slab(int cpu, void *info) +@@ -2298,7 +2327,22 @@ static bool has_cpu_slab(int cpu, void *info) static void flush_all(struct kmem_cache *s) { @@ -109,7 +109,7 @@ } /* -@@ -2498,8 +2542,10 @@ static inline void *get_freelist(struct kmem_cache *s, struct page *page) +@@ -2496,8 +2540,10 @@ static inline void *get_freelist(struct kmem_cache *s, struct page *page) * already disabled (which is the case for bulk allocation). */ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, @@ -121,7 +121,7 @@ void *freelist; struct page *page; -@@ -2555,6 +2601,13 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, +@@ -2563,6 +2609,13 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, VM_BUG_ON(!c->page->frozen); c->freelist = get_freepointer(s, freelist); c->tid = next_tid(c->tid); @@ -135,7 +135,7 @@ return freelist; new_slab: -@@ -2570,7 +2623,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, +@@ -2578,7 +2631,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, if (unlikely(!freelist)) { slab_out_of_memory(s, gfpflags, node); @@ -144,7 +144,7 @@ } page = c->page; -@@ -2583,7 +2636,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, +@@ -2591,7 +2644,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, goto new_slab; /* Slab failed checks. Next slab needed */ deactivate_slab(s, page, get_freepointer(s, freelist), c); @@ -153,7 +153,7 @@ } /* -@@ -2595,6 +2648,7 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, +@@ -2603,6 +2656,7 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, { void *p; unsigned long flags; @@ -161,7 +161,7 @@ local_irq_save(flags); #ifdef CONFIG_PREEMPT -@@ -2606,8 +2660,9 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, +@@ -2614,8 +2668,9 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, c = this_cpu_ptr(s->cpu_slab); #endif @@ -172,7 +172,7 @@ return p; } -@@ -3085,6 +3140,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, +@@ -3095,6 +3150,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, void **p) { struct kmem_cache_cpu *c; @@ -180,7 +180,7 @@ int i; /* memcg and kmem_cache debug support */ -@@ -3108,7 +3164,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, +@@ -3127,7 +3183,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, * of re-populating per CPU c->freelist */ p[i] = ___slab_alloc(s, flags, NUMA_NO_NODE, @@ -189,7 +189,7 @@ if (unlikely(!p[i])) goto error; -@@ -3120,6 +3176,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, +@@ -3139,6 +3195,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, } c->tid = next_tid(c->tid); local_irq_enable(); @@ -197,7 +197,7 @@ /* Clear memory outside IRQ disabled fastpath loop */ if (unlikely(flags & __GFP_ZERO)) { -@@ -3134,6 +3191,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, +@@ -3153,6 +3210,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, return i; error: local_irq_enable(); @@ -205,7 +205,7 @@ slab_post_alloc_hook(s, flags, i, p); __kmem_cache_free_bulk(s, i, p); return 0; -@@ -4183,6 +4241,12 @@ void __init kmem_cache_init(void) +@@ -4202,6 +4260,12 @@ void __init kmem_cache_init(void) { static __initdata struct kmem_cache boot_kmem_cache, boot_kmem_cache_node; @@ -219,5 +219,5 @@ if (debug_guardpage_minorder()) slub_max_order = 0; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0076-mm-page_alloc-rt-friendly-per-cpu-pages.patch linux-4.19.118/debian/patches-rt/0076-mm-page_alloc-rt-friendly-per-cpu-pages.patch --- linux-4.19.98/debian/patches-rt/0076-mm-page_alloc-rt-friendly-per-cpu-pages.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0076-mm-page_alloc-rt-friendly-per-cpu-pages.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From b2dcde8f1c9f1175f30723fc2d3fe6aaabe087ea Mon Sep 17 00:00:00 2001 +From 3c705eb7ff76685a9c4b40776b6d975e64cf6df0 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:37 -0500 -Subject: [PATCH 076/290] mm: page_alloc: rt-friendly per-cpu pages -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 076/325] mm: page_alloc: rt-friendly per-cpu pages +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz rt-friendly per-cpu pages: convert the irqs-off per-cpu locking method into a preemptible, explicit-per-cpu-locks method. @@ -18,7 +18,7 @@ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 49f7bb170b4d..bff6c04eb359 100644 +index 9a4d150ea5b7..d6f9be9c6635 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -60,6 +60,7 @@ @@ -216,7 +216,7 @@ return NULL; } -@@ -8099,7 +8122,7 @@ void zone_pcp_reset(struct zone *zone) +@@ -8129,7 +8152,7 @@ void zone_pcp_reset(struct zone *zone) struct per_cpu_pageset *pset; /* avoid races with drain_pages() */ @@ -225,7 +225,7 @@ if (zone->pageset != &boot_pageset) { for_each_online_cpu(cpu) { pset = per_cpu_ptr(zone->pageset, cpu); -@@ -8108,7 +8131,7 @@ void zone_pcp_reset(struct zone *zone) +@@ -8138,7 +8161,7 @@ void zone_pcp_reset(struct zone *zone) free_percpu(zone->pageset); zone->pageset = &boot_pageset; } @@ -235,5 +235,5 @@ #ifdef CONFIG_MEMORY_HOTREMOVE -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0077-mm-swap-Convert-to-percpu-locked.patch linux-4.19.118/debian/patches-rt/0077-mm-swap-Convert-to-percpu-locked.patch --- linux-4.19.98/debian/patches-rt/0077-mm-swap-Convert-to-percpu-locked.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0077-mm-swap-Convert-to-percpu-locked.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 3350882474566687c3916a408fd9097ef4656f0b Mon Sep 17 00:00:00 2001 +From c1c0dcf5b79064717f21d1c3d294827591fea472 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:51 -0500 -Subject: [PATCH 077/290] mm/swap: Convert to percpu locked -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 077/325] mm/swap: Convert to percpu locked +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Replace global locks (get_cpu + local_irq_save) with "local_locks()". Currently there is one of for "rotate" and one for "swap". @@ -56,10 +56,10 @@ cc->last_migrated_pfn = 0; } diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index bff6c04eb359..f7d30f995bc5 100644 +index d6f9be9c6635..a1547f1be42c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -7212,8 +7212,9 @@ void __init free_area_init(unsigned long *zones_size) +@@ -7242,8 +7242,9 @@ void __init free_area_init(unsigned long *zones_size) static int page_alloc_cpu_dead(unsigned int cpu) { @@ -207,5 +207,5 @@ #ifdef CONFIG_SMP -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0078-mm-perform-lru_add_drain_all-remotely.patch linux-4.19.118/debian/patches-rt/0078-mm-perform-lru_add_drain_all-remotely.patch --- linux-4.19.98/debian/patches-rt/0078-mm-perform-lru_add_drain_all-remotely.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0078-mm-perform-lru_add_drain_all-remotely.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 86cb58e9a8ac63e967bb1b1cfce05718c20cacb8 Mon Sep 17 00:00:00 2001 +From 1025690c55aad067878962af6318286d26c87aaa Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Fri, 27 May 2016 15:03:28 +0200 -Subject: [PATCH 078/290] mm: perform lru_add_drain_all() remotely -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 078/325] mm: perform lru_add_drain_all() remotely +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz lru_add_drain_all() works by scheduling lru_add_drain_cpu() to run on all CPUs that have non-empty LRU pagevecs and then waiting for @@ -105,5 +105,5 @@ mutex_unlock(&lock); } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0079-mm-vmstat-Protect-per-cpu-variables-with-preempt-dis.patch linux-4.19.118/debian/patches-rt/0079-mm-vmstat-Protect-per-cpu-variables-with-preempt-dis.patch --- linux-4.19.98/debian/patches-rt/0079-mm-vmstat-Protect-per-cpu-variables-with-preempt-dis.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0079-mm-vmstat-Protect-per-cpu-variables-with-preempt-dis.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 23db125cbdadfa2ec3477b09b2735a77aa683c64 Mon Sep 17 00:00:00 2001 +From 92905381cb530f0b66c5d80a2877e1994e775676 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:30:13 -0500 -Subject: [PATCH 079/290] mm/vmstat: Protect per cpu variables with preempt +Subject: [PATCH 079/325] mm/vmstat: Protect per cpu variables with preempt disable on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Disable preemption on -RT for the vmstat code. On vanila the code runs in IRQ-off regions while on -RT it is not. "preempt_disable" ensures that the @@ -141,5 +141,5 @@ void __dec_zone_page_state(struct page *page, enum zone_stat_item item) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0080-ARM-Initialize-split-page-table-locks-for-vector-pag.patch linux-4.19.118/debian/patches-rt/0080-ARM-Initialize-split-page-table-locks-for-vector-pag.patch --- linux-4.19.98/debian/patches-rt/0080-ARM-Initialize-split-page-table-locks-for-vector-pag.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0080-ARM-Initialize-split-page-table-locks-for-vector-pag.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 361d54ae02b6b48ee93c86c2abdeee149a8d04be Mon Sep 17 00:00:00 2001 +From fff91e4cb5539ab6cdd32a15661e2f5354552fdb Mon Sep 17 00:00:00 2001 From: Frank Rowand Date: Sat, 1 Oct 2011 18:58:13 -0700 -Subject: [PATCH 080/290] ARM: Initialize split page table locks for vector +Subject: [PATCH 080/325] ARM: Initialize split page table locks for vector page -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Without this patch, ARM can not use SPLIT_PTLOCK_CPUS if PREEMPT_RT_FULL=y because vectors_user_mapping() creates a @@ -72,5 +72,5 @@ /* * The vectors page is always readable from user space for the -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0081-mm-Enable-SLUB-for-RT.patch linux-4.19.118/debian/patches-rt/0081-mm-Enable-SLUB-for-RT.patch --- linux-4.19.98/debian/patches-rt/0081-mm-Enable-SLUB-for-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0081-mm-Enable-SLUB-for-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 4c7a8a89b8b16cb2733dc45aae256c0fda1c34c8 Mon Sep 17 00:00:00 2001 +From 82e554da6555d60e1a8e5c390a27a12d338f1b53 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Thu, 25 Oct 2012 10:32:35 +0100 -Subject: [PATCH 081/290] mm: Enable SLUB for RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 081/325] mm: Enable SLUB for RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Avoid the memory allocation in IRQ section @@ -14,10 +14,10 @@ 1 file changed, 6 insertions(+) diff --git a/mm/slub.c b/mm/slub.c -index 224663e20772..cbe47408c6eb 100644 +index 19bc021a2726..181b2cb6ffbb 100644 --- a/mm/slub.c +++ b/mm/slub.c -@@ -3680,6 +3680,11 @@ static void list_slab_objects(struct kmem_cache *s, struct page *page, +@@ -3699,6 +3699,11 @@ static void list_slab_objects(struct kmem_cache *s, struct page *page, const char *text) { #ifdef CONFIG_SLUB_DEBUG @@ -29,7 +29,7 @@ void *addr = page_address(page); void *p; unsigned long *map = kcalloc(BITS_TO_LONGS(page->objects), -@@ -3701,6 +3706,7 @@ static void list_slab_objects(struct kmem_cache *s, struct page *page, +@@ -3720,6 +3725,7 @@ static void list_slab_objects(struct kmem_cache *s, struct page *page, slab_unlock(page); kfree(map); #endif @@ -38,5 +38,5 @@ /* -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0082-slub-Enable-irqs-for-__GFP_WAIT.patch linux-4.19.118/debian/patches-rt/0082-slub-Enable-irqs-for-__GFP_WAIT.patch --- linux-4.19.98/debian/patches-rt/0082-slub-Enable-irqs-for-__GFP_WAIT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0082-slub-Enable-irqs-for-__GFP_WAIT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 2d3739e2e7cae9db7fe6affbc747b7f06dc42613 Mon Sep 17 00:00:00 2001 +From a84add7d6794ad6184fc6c5c6fbf63c20c733dac Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 9 Jan 2013 12:08:15 +0100 -Subject: [PATCH 082/290] slub: Enable irqs for __GFP_WAIT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 082/325] slub: Enable irqs for __GFP_WAIT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz SYSTEM_RUNNING might be too late for enabling interrupts. Allocations with GFP_WAIT can happen before that. So use this as an indicator. @@ -13,7 +13,7 @@ 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mm/slub.c b/mm/slub.c -index cbe47408c6eb..81c32ceab228 100644 +index 181b2cb6ffbb..555adbd96356 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1570,10 +1570,17 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) @@ -44,5 +44,5 @@ if (!page) return NULL; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0083-slub-Disable-SLUB_CPU_PARTIAL.patch linux-4.19.118/debian/patches-rt/0083-slub-Disable-SLUB_CPU_PARTIAL.patch --- linux-4.19.98/debian/patches-rt/0083-slub-Disable-SLUB_CPU_PARTIAL.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0083-slub-Disable-SLUB_CPU_PARTIAL.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From d4993fa5aea9eed8f9fce53e94e226f2504eda18 Mon Sep 17 00:00:00 2001 +From 5bface7c2f9af3d585acc7f3ac3e0f8096ec4bf1 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Wed, 15 Apr 2015 19:00:47 +0200 -Subject: [PATCH 083/290] slub: Disable SLUB_CPU_PARTIAL -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 083/325] slub: Disable SLUB_CPU_PARTIAL +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz |BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:915 |in_atomic(): 1, irqs_disabled(): 0, pid: 87, name: rcuop/7 @@ -50,5 +50,5 @@ help Per cpu partial caches accellerate objects allocation and freeing -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0084-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch linux-4.19.118/debian/patches-rt/0084-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch --- linux-4.19.98/debian/patches-rt/0084-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0084-mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 17e8b2696494bfeee71425d3acac4608ac97b45d Mon Sep 17 00:00:00 2001 +From 6089b66d138cc77f35c9d6f7d526cc322b295f28 Mon Sep 17 00:00:00 2001 From: Yang Shi Date: Wed, 30 Oct 2013 11:48:33 -0700 -Subject: [PATCH 084/290] mm/memcontrol: Don't call schedule_work_on in +Subject: [PATCH 084/325] mm/memcontrol: Don't call schedule_work_on in preemption disabled context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The following trace is triggered when running ltp oom test cases: @@ -49,10 +49,10 @@ 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c -index 3a3d109dce21..cf9e81fb342d 100644 +index 3b78b6af353b..1323fa231eed 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c -@@ -2082,7 +2082,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) +@@ -2084,7 +2084,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) * as well as workers from this path always operate on the local * per-cpu data. CPU up doesn't touch memcg_stock at all. */ @@ -61,7 +61,7 @@ for_each_online_cpu(cpu) { struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); struct mem_cgroup *memcg; -@@ -2102,7 +2102,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) +@@ -2104,7 +2104,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) } css_put(&memcg->css); } @@ -71,5 +71,5 @@ } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0085-mm-memcontrol-Replace-local_irq_disable-with-local-l.patch linux-4.19.118/debian/patches-rt/0085-mm-memcontrol-Replace-local_irq_disable-with-local-l.patch --- linux-4.19.98/debian/patches-rt/0085-mm-memcontrol-Replace-local_irq_disable-with-local-l.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0085-mm-memcontrol-Replace-local_irq_disable-with-local-l.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 43548b6188b27097898381e2f1548ff656f4d127 Mon Sep 17 00:00:00 2001 +From 3e3a73ff713a1c57585373ecc40a3079f9baff65 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Wed, 28 Jan 2015 17:14:16 +0100 -Subject: [PATCH 085/290] mm/memcontrol: Replace local_irq_disable with local +Subject: [PATCH 085/325] mm/memcontrol: Replace local_irq_disable with local locks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz There are a few local_irq_disable() which then take sleeping locks. This patch converts them local locks. @@ -14,7 +14,7 @@ 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c -index cf9e81fb342d..421ac74450f6 100644 +index 1323fa231eed..4156a4e766fb 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -69,6 +69,7 @@ @@ -34,7 +34,7 @@ /* Whether legacy memory+swap accounting is active */ static bool do_memsw_account(void) { -@@ -4922,12 +4925,12 @@ static int mem_cgroup_move_account(struct page *page, +@@ -4930,12 +4933,12 @@ static int mem_cgroup_move_account(struct page *page, ret = 0; @@ -49,7 +49,7 @@ out_unlock: unlock_page(page); out: -@@ -6046,10 +6049,10 @@ void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg, +@@ -6054,10 +6057,10 @@ void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg, commit_charge(page, memcg, lrucare); @@ -62,7 +62,7 @@ if (do_memsw_account() && PageSwapCache(page)) { swp_entry_t entry = { .val = page_private(page) }; -@@ -6118,7 +6121,7 @@ static void uncharge_batch(const struct uncharge_gather *ug) +@@ -6126,7 +6129,7 @@ static void uncharge_batch(const struct uncharge_gather *ug) memcg_oom_recover(ug->memcg); } @@ -71,7 +71,7 @@ __mod_memcg_state(ug->memcg, MEMCG_RSS, -ug->nr_anon); __mod_memcg_state(ug->memcg, MEMCG_CACHE, -ug->nr_file); __mod_memcg_state(ug->memcg, MEMCG_RSS_HUGE, -ug->nr_huge); -@@ -6126,7 +6129,7 @@ static void uncharge_batch(const struct uncharge_gather *ug) +@@ -6134,7 +6137,7 @@ static void uncharge_batch(const struct uncharge_gather *ug) __count_memcg_events(ug->memcg, PGPGOUT, ug->pgpgout); __this_cpu_add(ug->memcg->stat_cpu->nr_page_events, nr_pages); memcg_check_events(ug->memcg, ug->dummy_page); @@ -80,7 +80,7 @@ if (!mem_cgroup_is_root(ug->memcg)) css_put_many(&ug->memcg->css, nr_pages); -@@ -6289,10 +6292,10 @@ void mem_cgroup_migrate(struct page *oldpage, struct page *newpage) +@@ -6297,10 +6300,10 @@ void mem_cgroup_migrate(struct page *oldpage, struct page *newpage) commit_charge(newpage, memcg, false); @@ -93,7 +93,7 @@ } DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key); -@@ -6484,6 +6487,7 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) +@@ -6482,6 +6485,7 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) struct mem_cgroup *memcg, *swap_memcg; unsigned int nr_entries; unsigned short oldid; @@ -101,7 +101,7 @@ VM_BUG_ON_PAGE(PageLRU(page), page); VM_BUG_ON_PAGE(page_count(page), page); -@@ -6529,13 +6533,17 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) +@@ -6527,13 +6531,17 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) * important here to have the interrupts disabled because it is the * only synchronisation we have for updating the per-CPU variables. */ @@ -120,5 +120,5 @@ /** -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0086-mm-zsmalloc-copy-with-get_cpu_var-and-locking.patch linux-4.19.118/debian/patches-rt/0086-mm-zsmalloc-copy-with-get_cpu_var-and-locking.patch --- linux-4.19.98/debian/patches-rt/0086-mm-zsmalloc-copy-with-get_cpu_var-and-locking.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0086-mm-zsmalloc-copy-with-get_cpu_var-and-locking.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 6b63a10dc279d7aa3134caeb249969ae7af3f010 Mon Sep 17 00:00:00 2001 +From 9aa358dc71da851d2af3660ac73411ad469a331f Mon Sep 17 00:00:00 2001 From: Mike Galbraith Date: Tue, 22 Mar 2016 11:16:09 +0100 -Subject: [PATCH 086/290] mm/zsmalloc: copy with get_cpu_var() and locking -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 086/325] mm/zsmalloc: copy with get_cpu_var() and locking +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz get_cpu_var() disables preemption and triggers a might_sleep() splat later. This is replaced with get_locked_var(). @@ -199,5 +199,5 @@ migrate_read_unlock(zspage); unpin_tag(handle); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0087-x86-mm-pat-disable-preemption-__split_large_page-aft.patch linux-4.19.118/debian/patches-rt/0087-x86-mm-pat-disable-preemption-__split_large_page-aft.patch --- linux-4.19.98/debian/patches-rt/0087-x86-mm-pat-disable-preemption-__split_large_page-aft.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0087-x86-mm-pat-disable-preemption-__split_large_page-aft.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From 3596d839ec05c759a409ec3c9fb058b89bc43de8 Mon Sep 17 00:00:00 2001 +From 27f3206f1c5af4a5290793529fd61d28c347c32f Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Tue, 11 Dec 2018 21:53:43 +0100 -Subject: [PATCH 087/290] x86/mm/pat: disable preemption __split_large_page() +Subject: [PATCH 087/325] x86/mm/pat: disable preemption __split_large_page() after spin_lock() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Commit "x86/mm/pat: Disable preemption around __flush_tlb_all()" added a warning if __flush_tlb_all() is invoked in preemptible context. On !RT @@ -19,7 +19,7 @@ 1 file changed, 8 insertions(+) diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c -index e2d4b25c7aa4..9626ebb9e3c8 100644 +index 101f3ad0d6ad..0b0396261ca1 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -687,12 +687,18 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address, @@ -58,5 +58,5 @@ return 0; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0088-radix-tree-use-local-locks.patch linux-4.19.118/debian/patches-rt/0088-radix-tree-use-local-locks.patch --- linux-4.19.98/debian/patches-rt/0088-radix-tree-use-local-locks.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0088-radix-tree-use-local-locks.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 2ca56bb81f83515755165c1c638655a4120b1b06 Mon Sep 17 00:00:00 2001 +From d1e6ca9dc1adeb9619ee73c22df645243a58833d Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Wed, 25 Jan 2017 16:34:27 +0100 -Subject: [PATCH 088/290] radix-tree: use local locks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 088/325] radix-tree: use local locks +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The preload functionality uses per-CPU variables and preempt-disable to ensure that it does not switch CPUs during its usage. This patch adds @@ -172,5 +172,5 @@ if (!this_cpu_read(ida_bitmap)) { struct ida_bitmap *bitmap = kzalloc(sizeof(*bitmap), gfp); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0089-timers-Prepare-for-full-preemption.patch linux-4.19.118/debian/patches-rt/0089-timers-Prepare-for-full-preemption.patch --- linux-4.19.98/debian/patches-rt/0089-timers-Prepare-for-full-preemption.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0089-timers-Prepare-for-full-preemption.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From c87cd9494b5ba0149620db6bc1655edbe04f9c9d Mon Sep 17 00:00:00 2001 +From bf7590c47e53af70146859ca60ae05df521e60e4 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Fri, 3 Jul 2009 08:29:34 -0500 -Subject: [PATCH 089/290] timers: Prepare for full preemption -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 089/325] timers: Prepare for full preemption +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz When softirqs can be preempted we need to make sure that cancelling the timer from the active thread can not deadlock vs. a running timer @@ -172,5 +172,5 @@ } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0090-x86-kvm-Require-const-tsc-for-RT.patch linux-4.19.118/debian/patches-rt/0090-x86-kvm-Require-const-tsc-for-RT.patch --- linux-4.19.98/debian/patches-rt/0090-x86-kvm-Require-const-tsc-for-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0090-x86-kvm-Require-const-tsc-for-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 70c79c38cb1e81d8cffa19dc562b629dcde98c6c Mon Sep 17 00:00:00 2001 +From 9d89b02f01f1b2e5a9eacb0f65b3794aae03a28c Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Sun, 6 Nov 2011 12:26:18 +0100 -Subject: [PATCH 090/290] x86: kvm Require const tsc for RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 090/325] x86: kvm Require const tsc for RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Non constant TSC is a nightmare on bare metal already, but with virtualization it becomes a complete disaster because the workarounds @@ -15,10 +15,10 @@ 1 file changed, 7 insertions(+) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c -index 353f63f3b262..2611898419ff 100644 +index 2cb379e261c0..a94c1a01b894 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c -@@ -6832,6 +6832,13 @@ int kvm_arch_init(void *opaque) +@@ -6873,6 +6873,13 @@ int kvm_arch_init(void *opaque) goto out; } @@ -33,5 +33,5 @@ if (r) goto out_free_percpu; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0091-pci-switchtec-Don-t-use-completion-s-wait-queue.patch linux-4.19.118/debian/patches-rt/0091-pci-switchtec-Don-t-use-completion-s-wait-queue.patch --- linux-4.19.98/debian/patches-rt/0091-pci-switchtec-Don-t-use-completion-s-wait-queue.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0091-pci-switchtec-Don-t-use-completion-s-wait-queue.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From cffa5c3f97fb6ad83cf3d770f5297f879f6efc36 Mon Sep 17 00:00:00 2001 +From 92f7c935ef1e9ebcae344a957f0f1cf36d9ca182 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Wed, 4 Oct 2017 10:24:23 +0200 -Subject: [PATCH 091/290] pci/switchtec: Don't use completion's wait queue -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 091/325] pci/switchtec: Don't use completion's wait queue +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz The poll callback is using completion's wait_queue_head_t member and puts it in poll_wait() so the poll() caller gets a wakeup after command @@ -19,12 +19,15 @@ Cc: Kurt Schwemmer Cc: Logan Gunthorpe Signed-off-by: Sebastian Andrzej Siewior +[Salvatore Bonaccorso: Refresh for context changes in 4.19.116 due to +12ce9fd7fc87 ("PCI/switchtec: Fix init_completion race condition with +poll_wait()")] --- drivers/pci/switch/switchtec.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c -index 72db2e0ebced..77d4fb86d05b 100644 +index 43431816412c..a8df847bedee 100644 --- a/drivers/pci/switch/switchtec.c +++ b/drivers/pci/switch/switchtec.c @@ -43,10 +43,11 @@ struct switchtec_user { @@ -49,16 +52,16 @@ stuser->event_cnt = atomic_read(&stdev->event_cnt); dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); -@@ -151,7 +152,7 @@ static int mrpc_queue_cmd(struct switchtec_user *stuser) +@@ -147,7 +148,7 @@ static int mrpc_queue_cmd(struct switchtec_user *stuser) kref_get(&stuser->kref); stuser->read_len = sizeof(stuser->data); stuser_set_state(stuser, MRPC_QUEUED); -- init_completion(&stuser->comp); +- reinit_completion(&stuser->comp); + stuser->cmd_done = false; list_add_tail(&stuser->list, &stdev->mrpc_queue); mrpc_cmd_submit(stdev); -@@ -188,7 +189,8 @@ static void mrpc_complete_cmd(struct switchtec_dev *stdev) +@@ -184,7 +185,8 @@ static void mrpc_complete_cmd(struct switchtec_dev *stdev) stuser->read_len); out: @@ -68,7 +71,7 @@ list_del_init(&stuser->list); stuser_put(stuser); stdev->mrpc_busy = 0; -@@ -458,10 +460,11 @@ static ssize_t switchtec_dev_read(struct file *filp, char __user *data, +@@ -454,10 +456,11 @@ static ssize_t switchtec_dev_read(struct file *filp, char __user *data, mutex_unlock(&stdev->mrpc_mutex); if (filp->f_flags & O_NONBLOCK) { @@ -82,7 +85,7 @@ if (rc < 0) return rc; } -@@ -509,7 +512,7 @@ static __poll_t switchtec_dev_poll(struct file *filp, poll_table *wait) +@@ -505,7 +508,7 @@ static __poll_t switchtec_dev_poll(struct file *filp, poll_table *wait) struct switchtec_dev *stdev = stuser->stdev; __poll_t ret = 0; @@ -91,7 +94,7 @@ poll_wait(filp, &stdev->event_wq, wait); if (lock_mutex_and_test_alive(stdev)) -@@ -517,7 +520,7 @@ static __poll_t switchtec_dev_poll(struct file *filp, poll_table *wait) +@@ -513,7 +516,7 @@ static __poll_t switchtec_dev_poll(struct file *filp, poll_table *wait) mutex_unlock(&stdev->mrpc_mutex); @@ -100,7 +103,7 @@ ret |= EPOLLIN | EPOLLRDNORM; if (stuser->event_cnt != atomic_read(&stdev->event_cnt)) -@@ -1041,7 +1044,8 @@ static void stdev_kill(struct switchtec_dev *stdev) +@@ -1037,7 +1040,8 @@ static void stdev_kill(struct switchtec_dev *stdev) /* Wake up and kill any users waiting on an MRPC request */ list_for_each_entry_safe(stuser, tmpuser, &stdev->mrpc_queue, list) { @@ -111,5 +114,5 @@ stuser_put(stuser); } -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0092-wait.h-include-atomic.h.patch linux-4.19.118/debian/patches-rt/0092-wait.h-include-atomic.h.patch --- linux-4.19.98/debian/patches-rt/0092-wait.h-include-atomic.h.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0092-wait.h-include-atomic.h.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,11 +1,11 @@ -From 0aafaa8df18cf87cf491f2592b9c378667766a62 Mon Sep 17 00:00:00 2001 +From 62300f714d10365c00ac9d0b8b35a79be8f2fd26 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Mon, 28 Oct 2013 12:19:57 +0100 -Subject: [PATCH 092/290] wait.h: include atomic.h +Subject: [PATCH 092/325] wait.h: include atomic.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz | CC init/main.o |In file included from include/linux/mmzone.h:9:0, @@ -38,5 +38,5 @@ typedef struct wait_queue_entry wait_queue_entry_t; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0093-work-simple-Simple-work-queue-implemenation.patch linux-4.19.118/debian/patches-rt/0093-work-simple-Simple-work-queue-implemenation.patch --- linux-4.19.98/debian/patches-rt/0093-work-simple-Simple-work-queue-implemenation.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0093-work-simple-Simple-work-queue-implemenation.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From eccea3070c1d002aaa2a9cbdaaee36e65f5d06cf Mon Sep 17 00:00:00 2001 +From 1af66c1b241adaee0ae77bcdfb1534a60d08264a Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 11 Jul 2014 15:26:11 +0200 -Subject: [PATCH 093/290] work-simple: Simple work queue implemenation -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 093/325] work-simple: Simple work queue implemenation +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Provides a framework for enqueuing callbacks from irq context PREEMPT_RT_FULL safe. The callbacks are executed in kthread context. @@ -242,5 +242,5 @@ +} +EXPORT_SYMBOL_GPL(swork_put); -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0094-work-simple-drop-a-shit-statement-in-SWORK_EVENT_PEN.patch linux-4.19.118/debian/patches-rt/0094-work-simple-drop-a-shit-statement-in-SWORK_EVENT_PEN.patch --- linux-4.19.98/debian/patches-rt/0094-work-simple-drop-a-shit-statement-in-SWORK_EVENT_PEN.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0094-work-simple-drop-a-shit-statement-in-SWORK_EVENT_PEN.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,9 +1,9 @@ -From cb2283a50926db7e39bf3643c28a9c8c73a3263a Mon Sep 17 00:00:00 2001 +From 0ec9d3d9509f13ebc479c2de4abd9ba1a50eeef7 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Mon, 10 Sep 2018 18:00:31 +0200 -Subject: [PATCH 094/290] work-simple: drop a shit statement in +Subject: [PATCH 094/325] work-simple: drop a shit statement in SWORK_EVENT_PENDING -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Dan Carpenter reported | smatch warnings: @@ -33,5 +33,5 @@ static DEFINE_MUTEX(worker_mutex); static struct sworker *glob_worker; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0095-completion-Use-simple-wait-queues.patch linux-4.19.118/debian/patches-rt/0095-completion-Use-simple-wait-queues.patch --- linux-4.19.98/debian/patches-rt/0095-completion-Use-simple-wait-queues.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0095-completion-Use-simple-wait-queues.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 93e59514ca04f36ad3f87b3c0da5be1e0b9d238f Mon Sep 17 00:00:00 2001 +From b44f079dc57b192c97e92355b26180aaf99b6678 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Fri, 11 Jan 2013 11:23:51 +0100 -Subject: [PATCH 095/290] completion: Use simple wait queues -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 095/325] completion: Use simple wait queues +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz Completions have no long lasting callbacks and therefor do not need the complex waitqueue variant. Use simple waitqueues which reduces the @@ -40,7 +40,7 @@ res = -EINTR; if (res) { diff --git a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c -index 94ad6fe29e69..52a49f0bbc19 100644 +index b704e4bce171..c364abaac548 100644 --- a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c +++ b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c @@ -697,8 +697,8 @@ static void ezusb_req_ctx_wait(struct ezusb_priv *upriv, @@ -55,10 +55,10 @@ break; default: diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c -index 2050993fb58b..e2ca75a6e241 100644 +index a9239455eb6d..ed56d61d888a 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c -@@ -1626,7 +1626,7 @@ static void ffs_data_put(struct ffs_data *ffs) +@@ -1627,7 +1627,7 @@ static void ffs_data_put(struct ffs_data *ffs) pr_info("%s(): freeing\n", __func__); ffs_data_clear(ffs); BUG_ON(waitqueue_active(&ffs->ev.waitq) || @@ -387,5 +387,5 @@ wait->task = current; if (list_empty(&wait->task_list)) -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0096-fs-aio-simple-simple-work.patch linux-4.19.118/debian/patches-rt/0096-fs-aio-simple-simple-work.patch --- linux-4.19.98/debian/patches-rt/0096-fs-aio-simple-simple-work.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0096-fs-aio-simple-simple-work.patch 2020-04-22 13:32:13.000000000 +0000 @@ -1,8 +1,8 @@ -From 864971842ede76748f6c198f112d6857b19196fa Mon Sep 17 00:00:00 2001 +From 0bc73d798d3c94781bed15e4ee21c8de0a616835 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Mon, 16 Feb 2015 18:49:10 +0100 -Subject: [PATCH 096/290] fs/aio: simple simple work -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz +Subject: [PATCH 096/325] fs/aio: simple simple work +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz |BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:768 |in_atomic(): 1, irqs_disabled(): 0, pid: 26, name: rcuos/2 @@ -30,7 +30,7 @@ 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/fs/aio.c b/fs/aio.c -index 911e23087dfb..16dcf8521c2c 100644 +index b5fbf2061868..93f8cf7fdeab 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -42,6 +42,7 @@ @@ -85,5 +85,5 @@ { unsigned i, new_nr; -- -2.24.1 +2.25.1 diff -Nru linux-4.19.98/debian/patches-rt/0097-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch linux-4.19.118/debian/patches-rt/0097-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch --- linux-4.19.98/debian/patches-rt/0097-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0097-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -From 06003e1c96291d4d372f2e31c988999c2ef34f31 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 21 Aug 2013 17:48:46 +0200 -Subject: [PATCH 097/290] genirq: Do not invoke the affinity callback via a - workqueue on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Joe Korty reported, that __irq_set_affinity_locked() schedules a -workqueue while holding a rawlock which results in a might_sleep() -warning. -This patch uses swork_queue() instead. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 6 +++++ - kernel/irq/manage.c | 46 ++++++++++++++++++++++++++++++++++++--- - 2 files changed, 49 insertions(+), 3 deletions(-) - -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 315f852b4981..a943c07b54ba 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -225,6 +226,7 @@ extern void resume_device_irqs(void); - * struct irq_affinity_notify - context for notification of IRQ affinity changes - * @irq: Interrupt to which notification applies - * @kref: Reference count, for internal use -+ * @swork: Swork item, for internal use - * @work: Work item, for internal use - * @notify: Function to be called on change. This will be - * called in process context. -@@ -236,7 +238,11 @@ extern void resume_device_irqs(void); - struct irq_affinity_notify { - unsigned int irq; - struct kref kref; -+#ifdef CONFIG_PREEMPT_RT_BASE -+ struct swork_event swork; -+#else - struct work_struct work; -+#endif - void (*notify)(struct irq_affinity_notify *, const cpumask_t *mask); - void (*release)(struct kref *ref); - }; -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 3c26d0708709..eadcbfbd434a 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -285,7 +285,12 @@ int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, - - if (desc->affinity_notify) { - kref_get(&desc->affinity_notify->kref); -+ -+#ifdef CONFIG_PREEMPT_RT_BASE -+ swork_queue(&desc->affinity_notify->swork); -+#else - schedule_work(&desc->affinity_notify->work); -+#endif - } - irqd_set(data, IRQD_AFFINITY_SET); - -@@ -323,10 +328,8 @@ int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m) - } - EXPORT_SYMBOL_GPL(irq_set_affinity_hint); - --static void irq_affinity_notify(struct work_struct *work) -+static void _irq_affinity_notify(struct irq_affinity_notify *notify) - { -- struct irq_affinity_notify *notify = -- container_of(work, struct irq_affinity_notify, work); - struct irq_desc *desc = irq_to_desc(notify->irq); - cpumask_var_t cpumask; - unsigned long flags; -@@ -348,6 +351,35 @@ static void irq_affinity_notify(struct work_struct *work) - kref_put(¬ify->kref, notify->release); - } - -+#ifdef CONFIG_PREEMPT_RT_BASE -+static void init_helper_thread(void) -+{ -+ static int init_sworker_once; -+ -+ if (init_sworker_once) -+ return; -+ if (WARN_ON(swork_get())) -+ return; -+ init_sworker_once = 1; -+} -+ -+static void irq_affinity_notify(struct swork_event *swork) -+{ -+ struct irq_affinity_notify *notify = -+ container_of(swork, struct irq_affinity_notify, swork); -+ _irq_affinity_notify(notify); -+} -+ -+#else -+ -+static void irq_affinity_notify(struct work_struct *work) -+{ -+ struct irq_affinity_notify *notify = -+ container_of(work, struct irq_affinity_notify, work); -+ _irq_affinity_notify(notify); -+} -+#endif -+ - /** - * irq_set_affinity_notifier - control notification of IRQ affinity changes - * @irq: Interrupt for which to enable/disable notification -@@ -376,7 +408,12 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) - if (notify) { - notify->irq = irq; - kref_init(¬ify->kref); -+#ifdef CONFIG_PREEMPT_RT_BASE -+ INIT_SWORK(¬ify->swork, irq_affinity_notify); -+ init_helper_thread(); -+#else - INIT_WORK(¬ify->work, irq_affinity_notify); -+#endif - } - - raw_spin_lock_irqsave(&desc->lock, flags); -@@ -385,7 +422,10 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) - raw_spin_unlock_irqrestore(&desc->lock, flags); - - if (old_notify) { -+#ifndef CONFIG_PREEMPT_RT_BASE -+ /* Need to address this for PREEMPT_RT */ - cancel_work_sync(&old_notify->work); -+#endif - kref_put(&old_notify->kref, old_notify->release); - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch linux-4.19.118/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch --- linux-4.19.98/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,60 @@ +From 14c8c3829b5d445e2e8d2d0faa3d5aefffd4057d Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 15 Nov 2017 17:29:51 +0100 +Subject: [PATCH 097/325] time/hrtimer: avoid schedule_work() with interrupts + disabled +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The NOHZ code tries to schedule a workqueue with interrupts disabled. +Since this does not work -RT I am switching it to swork instead. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/timer.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index 9019c9caf146..3fab1c50bf1b 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -217,8 +217,7 @@ static DEFINE_PER_CPU(struct timer_base, timer_bases[NR_BASES]); + static DEFINE_STATIC_KEY_FALSE(timers_nohz_active); + static DEFINE_MUTEX(timer_keys_mutex); + +-static void timer_update_keys(struct work_struct *work); +-static DECLARE_WORK(timer_update_work, timer_update_keys); ++static struct swork_event timer_update_swork; + + #ifdef CONFIG_SMP + unsigned int sysctl_timer_migration = 1; +@@ -236,7 +235,7 @@ static void timers_update_migration(void) + static inline void timers_update_migration(void) { } + #endif /* !CONFIG_SMP */ + +-static void timer_update_keys(struct work_struct *work) ++static void timer_update_keys(struct swork_event *event) + { + mutex_lock(&timer_keys_mutex); + timers_update_migration(); +@@ -246,9 +245,17 @@ static void timer_update_keys(struct work_struct *work) + + void timers_update_nohz(void) + { +- schedule_work(&timer_update_work); ++ swork_queue(&timer_update_swork); + } + ++static __init int hrtimer_init_thread(void) ++{ ++ WARN_ON(swork_get()); ++ INIT_SWORK(&timer_update_swork, timer_update_keys); ++ return 0; ++} ++early_initcall(hrtimer_init_thread); ++ + int timer_migration_handler(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, + loff_t *ppos) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0098-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch linux-4.19.118/debian/patches-rt/0098-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch --- linux-4.19.98/debian/patches-rt/0098-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0098-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,290 @@ +From 9a9c6744f1401c493421737e4069babc9029adb4 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 3 Jul 2018 11:25:41 +0200 +Subject: [PATCH 098/325] hrtimer: consolidate hrtimer_init() + + hrtimer_init_sleeper() calls +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +hrtimer_init_sleeper() calls require a prior initialisation of the +hrtimer object with hrtimer_init(). Lets make the initialisation of +the hrtimer object part of hrtimer_init_sleeper(). To remain +consistent consider init_on_stack as well. + +Beside adapting the hrtimer_init_sleeper[_on_stack]() functions, call +sites need to be updated as well. + +Link: http://lkml.kernel.org/r/20180703092541.2870-1-anna-maria@linutronix.de +Signed-off-by: Sebastian Andrzej Siewior +[anna-maria: Updating the commit message, add staging/android/vsoc.c] +Signed-off-by: Anna-Maria Gleixner +--- + block/blk-mq.c | 3 +-- + drivers/staging/android/vsoc.c | 6 ++--- + include/linux/hrtimer.h | 19 +++++++++++--- + include/linux/wait.h | 4 +-- + kernel/futex.c | 19 ++++++-------- + kernel/time/hrtimer.c | 46 ++++++++++++++++++++++++++-------- + net/core/pktgen.c | 4 +-- + 7 files changed, 67 insertions(+), 34 deletions(-) + +diff --git a/block/blk-mq.c b/block/blk-mq.c +index 684acaa96db7..4aa3284874f6 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -3128,10 +3128,9 @@ static bool blk_mq_poll_hybrid_sleep(struct request_queue *q, + kt = nsecs; + + mode = HRTIMER_MODE_REL; +- hrtimer_init_on_stack(&hs.timer, CLOCK_MONOTONIC, mode); ++ hrtimer_init_sleeper_on_stack(&hs, CLOCK_MONOTONIC, mode, current); + hrtimer_set_expires(&hs.timer, kt); + +- hrtimer_init_sleeper(&hs, current); + do { + if (blk_mq_rq_state(rq) == MQ_RQ_COMPLETE) + break; +diff --git a/drivers/staging/android/vsoc.c b/drivers/staging/android/vsoc.c +index 034d86869772..d089b2cb5dd7 100644 +--- a/drivers/staging/android/vsoc.c ++++ b/drivers/staging/android/vsoc.c +@@ -438,12 +438,10 @@ static int handle_vsoc_cond_wait(struct file *filp, struct vsoc_cond_wait *arg) + return -EINVAL; + wake_time = ktime_set(arg->wake_time_sec, arg->wake_time_nsec); + +- hrtimer_init_on_stack(&to->timer, CLOCK_MONOTONIC, +- HRTIMER_MODE_ABS); ++ hrtimer_init_sleeper_on_stack(to, CLOCK_MONOTONIC, ++ HRTIMER_MODE_ABS, current); + hrtimer_set_expires_range_ns(&to->timer, wake_time, + current->timer_slack_ns); +- +- hrtimer_init_sleeper(to, current); + } + + while (1) { +diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h +index 542b4fa2cda9..cbd041b22088 100644 +--- a/include/linux/hrtimer.h ++++ b/include/linux/hrtimer.h +@@ -364,10 +364,17 @@ DECLARE_PER_CPU(struct tick_device, tick_cpu_device); + /* Initialize timers: */ + extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock, + enum hrtimer_mode mode); ++extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, ++ enum hrtimer_mode mode, ++ struct task_struct *task); + + #ifdef CONFIG_DEBUG_OBJECTS_TIMERS + extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock, + enum hrtimer_mode mode); ++extern void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, ++ clockid_t clock_id, ++ enum hrtimer_mode mode, ++ struct task_struct *task); + + extern void destroy_hrtimer_on_stack(struct hrtimer *timer); + #else +@@ -377,6 +384,15 @@ static inline void hrtimer_init_on_stack(struct hrtimer *timer, + { + hrtimer_init(timer, which_clock, mode); + } ++ ++static inline void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, ++ clockid_t clock_id, ++ enum hrtimer_mode mode, ++ struct task_struct *task) ++{ ++ hrtimer_init_sleeper(sl, clock_id, mode, task); ++} ++ + static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { } + #endif + +@@ -486,9 +502,6 @@ extern long hrtimer_nanosleep(const struct timespec64 *rqtp, + const enum hrtimer_mode mode, + const clockid_t clockid); + +-extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, +- struct task_struct *tsk); +- + extern int schedule_hrtimeout_range(ktime_t *expires, u64 delta, + const enum hrtimer_mode mode); + extern int schedule_hrtimeout_range_clock(ktime_t *expires, +diff --git a/include/linux/wait.h b/include/linux/wait.h +index 2b5ef8e94d19..94bd2e841de6 100644 +--- a/include/linux/wait.h ++++ b/include/linux/wait.h +@@ -489,8 +489,8 @@ do { \ + int __ret = 0; \ + struct hrtimer_sleeper __t; \ + \ +- hrtimer_init_on_stack(&__t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); \ +- hrtimer_init_sleeper(&__t, current); \ ++ hrtimer_init_sleeper_on_stack(&__t, CLOCK_MONOTONIC, HRTIMER_MODE_REL, \ ++ current); \ + if ((timeout) != KTIME_MAX) \ + hrtimer_start_range_ns(&__t.timer, timeout, \ + current->timer_slack_ns, \ +diff --git a/kernel/futex.c b/kernel/futex.c +index 32f9e3fa8c46..a8081f82579e 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -2721,10 +2721,9 @@ static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val, + if (abs_time) { + to = &timeout; + +- hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? +- CLOCK_REALTIME : CLOCK_MONOTONIC, +- HRTIMER_MODE_ABS); +- hrtimer_init_sleeper(to, current); ++ hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? ++ CLOCK_REALTIME : CLOCK_MONOTONIC, ++ HRTIMER_MODE_ABS, current); + hrtimer_set_expires_range_ns(&to->timer, *abs_time, + current->timer_slack_ns); + } +@@ -2823,9 +2822,8 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + + if (time) { + to = &timeout; +- hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME, +- HRTIMER_MODE_ABS); +- hrtimer_init_sleeper(to, current); ++ hrtimer_init_sleeper_on_stack(to, CLOCK_REALTIME, ++ HRTIMER_MODE_ABS, current); + hrtimer_set_expires(&to->timer, *time); + } + +@@ -3262,10 +3260,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + + if (abs_time) { + to = &timeout; +- hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? +- CLOCK_REALTIME : CLOCK_MONOTONIC, +- HRTIMER_MODE_ABS); +- hrtimer_init_sleeper(to, current); ++ hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? ++ CLOCK_REALTIME : CLOCK_MONOTONIC, ++ HRTIMER_MODE_ABS, current); + hrtimer_set_expires_range_ns(&to->timer, *abs_time, + current->timer_slack_ns); + } +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 7362554416fd..c6f755495a63 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -1651,13 +1651,44 @@ static enum hrtimer_restart hrtimer_wakeup(struct hrtimer *timer) + return HRTIMER_NORESTART; + } + +-void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) ++static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, ++ clockid_t clock_id, ++ enum hrtimer_mode mode, ++ struct task_struct *task) + { ++ __hrtimer_init(&sl->timer, clock_id, mode); + sl->timer.function = hrtimer_wakeup; + sl->task = task; + } ++ ++/** ++ * hrtimer_init_sleeper - initialize sleeper to the given clock ++ * @sl: sleeper to be initialized ++ * @clock_id: the clock to be used ++ * @mode: timer mode abs/rel ++ * @task: the task to wake up ++ */ ++void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, ++ enum hrtimer_mode mode, struct task_struct *task) ++{ ++ debug_init(&sl->timer, clock_id, mode); ++ __hrtimer_init_sleeper(sl, clock_id, mode, task); ++ ++} + EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); + ++#ifdef CONFIG_DEBUG_OBJECTS_TIMERS ++void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, ++ clockid_t clock_id, ++ enum hrtimer_mode mode, ++ struct task_struct *task) ++{ ++ debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr); ++ __hrtimer_init_sleeper(sl, clock_id, mode, task); ++} ++EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack); ++#endif ++ + int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) + { + switch(restart->nanosleep.type) { +@@ -1681,8 +1712,6 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod + { + struct restart_block *restart; + +- hrtimer_init_sleeper(t, current); +- + do { + set_current_state(TASK_INTERRUPTIBLE); + hrtimer_start_expires(&t->timer, mode); +@@ -1719,10 +1748,9 @@ static long __sched hrtimer_nanosleep_restart(struct restart_block *restart) + struct hrtimer_sleeper t; + int ret; + +- hrtimer_init_on_stack(&t.timer, restart->nanosleep.clockid, +- HRTIMER_MODE_ABS); ++ hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid, ++ HRTIMER_MODE_ABS, current); + hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires); +- + ret = do_nanosleep(&t, HRTIMER_MODE_ABS); + destroy_hrtimer_on_stack(&t.timer); + return ret; +@@ -1740,7 +1768,7 @@ long hrtimer_nanosleep(const struct timespec64 *rqtp, + if (dl_task(current) || rt_task(current)) + slack = 0; + +- hrtimer_init_on_stack(&t.timer, clockid, mode); ++ hrtimer_init_sleeper_on_stack(&t, clockid, mode, current); + hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack); + ret = do_nanosleep(&t, mode); + if (ret != -ERESTART_RESTARTBLOCK) +@@ -1939,11 +1967,9 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta, + return -EINTR; + } + +- hrtimer_init_on_stack(&t.timer, clock_id, mode); ++ hrtimer_init_sleeper_on_stack(&t, clock_id, mode, current); + hrtimer_set_expires_range_ns(&t.timer, *expires, delta); + +- hrtimer_init_sleeper(&t, current); +- + hrtimer_start_expires(&t.timer, mode); + + if (likely(t.task)) +diff --git a/net/core/pktgen.c b/net/core/pktgen.c +index 092fa3d75b32..9d472d626aaa 100644 +--- a/net/core/pktgen.c ++++ b/net/core/pktgen.c +@@ -2160,7 +2160,8 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) + s64 remaining; + struct hrtimer_sleeper t; + +- hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); ++ hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS, ++ current); + hrtimer_set_expires(&t.timer, spin_until); + + remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer)); +@@ -2175,7 +2176,6 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) + } while (ktime_compare(end_time, spin_until) < 0); + } else { + /* see do_nanosleep */ +- hrtimer_init_sleeper(&t, current); + do { + set_current_state(TASK_INTERRUPTIBLE); + hrtimer_start_expires(&t.timer, HRTIMER_MODE_ABS); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0098-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch linux-4.19.118/debian/patches-rt/0098-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch --- linux-4.19.98/debian/patches-rt/0098-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0098-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -From cd74856820b82cb80ddd3b12dde3caad12642b3c Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 15 Nov 2017 17:29:51 +0100 -Subject: [PATCH 098/290] time/hrtimer: avoid schedule_work() with interrupts - disabled -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The NOHZ code tries to schedule a workqueue with interrupts disabled. -Since this does not work -RT I am switching it to swork instead. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/time/timer.c | 15 +++++++++++---- - 1 file changed, 11 insertions(+), 4 deletions(-) - -diff --git a/kernel/time/timer.c b/kernel/time/timer.c -index 9019c9caf146..3fab1c50bf1b 100644 ---- a/kernel/time/timer.c -+++ b/kernel/time/timer.c -@@ -217,8 +217,7 @@ static DEFINE_PER_CPU(struct timer_base, timer_bases[NR_BASES]); - static DEFINE_STATIC_KEY_FALSE(timers_nohz_active); - static DEFINE_MUTEX(timer_keys_mutex); - --static void timer_update_keys(struct work_struct *work); --static DECLARE_WORK(timer_update_work, timer_update_keys); -+static struct swork_event timer_update_swork; - - #ifdef CONFIG_SMP - unsigned int sysctl_timer_migration = 1; -@@ -236,7 +235,7 @@ static void timers_update_migration(void) - static inline void timers_update_migration(void) { } - #endif /* !CONFIG_SMP */ - --static void timer_update_keys(struct work_struct *work) -+static void timer_update_keys(struct swork_event *event) - { - mutex_lock(&timer_keys_mutex); - timers_update_migration(); -@@ -246,9 +245,17 @@ static void timer_update_keys(struct work_struct *work) - - void timers_update_nohz(void) - { -- schedule_work(&timer_update_work); -+ swork_queue(&timer_update_swork); - } - -+static __init int hrtimer_init_thread(void) -+{ -+ WARN_ON(swork_get()); -+ INIT_SWORK(&timer_update_swork, timer_update_keys); -+ return 0; -+} -+early_initcall(hrtimer_init_thread); -+ - int timer_migration_handler(struct ctl_table *table, int write, - void __user *buffer, size_t *lenp, - loff_t *ppos) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0099-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch linux-4.19.118/debian/patches-rt/0099-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch --- linux-4.19.98/debian/patches-rt/0099-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0099-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,290 +0,0 @@ -From 8553725681eb8c0f78dad5fb1ef542301586e9ff Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 3 Jul 2018 11:25:41 +0200 -Subject: [PATCH 099/290] hrtimer: consolidate hrtimer_init() + - hrtimer_init_sleeper() calls -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -hrtimer_init_sleeper() calls require a prior initialisation of the -hrtimer object with hrtimer_init(). Lets make the initialisation of -the hrtimer object part of hrtimer_init_sleeper(). To remain -consistent consider init_on_stack as well. - -Beside adapting the hrtimer_init_sleeper[_on_stack]() functions, call -sites need to be updated as well. - -Link: http://lkml.kernel.org/r/20180703092541.2870-1-anna-maria@linutronix.de -Signed-off-by: Sebastian Andrzej Siewior -[anna-maria: Updating the commit message, add staging/android/vsoc.c] -Signed-off-by: Anna-Maria Gleixner ---- - block/blk-mq.c | 3 +-- - drivers/staging/android/vsoc.c | 6 ++--- - include/linux/hrtimer.h | 19 +++++++++++--- - include/linux/wait.h | 4 +-- - kernel/futex.c | 19 ++++++-------- - kernel/time/hrtimer.c | 46 ++++++++++++++++++++++++++-------- - net/core/pktgen.c | 4 +-- - 7 files changed, 67 insertions(+), 34 deletions(-) - -diff --git a/block/blk-mq.c b/block/blk-mq.c -index 684acaa96db7..4aa3284874f6 100644 ---- a/block/blk-mq.c -+++ b/block/blk-mq.c -@@ -3128,10 +3128,9 @@ static bool blk_mq_poll_hybrid_sleep(struct request_queue *q, - kt = nsecs; - - mode = HRTIMER_MODE_REL; -- hrtimer_init_on_stack(&hs.timer, CLOCK_MONOTONIC, mode); -+ hrtimer_init_sleeper_on_stack(&hs, CLOCK_MONOTONIC, mode, current); - hrtimer_set_expires(&hs.timer, kt); - -- hrtimer_init_sleeper(&hs, current); - do { - if (blk_mq_rq_state(rq) == MQ_RQ_COMPLETE) - break; -diff --git a/drivers/staging/android/vsoc.c b/drivers/staging/android/vsoc.c -index 22571abcaa4e..78a529d363f3 100644 ---- a/drivers/staging/android/vsoc.c -+++ b/drivers/staging/android/vsoc.c -@@ -437,12 +437,10 @@ static int handle_vsoc_cond_wait(struct file *filp, struct vsoc_cond_wait *arg) - return -EINVAL; - wake_time = ktime_set(arg->wake_time_sec, arg->wake_time_nsec); - -- hrtimer_init_on_stack(&to->timer, CLOCK_MONOTONIC, -- HRTIMER_MODE_ABS); -+ hrtimer_init_sleeper_on_stack(to, CLOCK_MONOTONIC, -+ HRTIMER_MODE_ABS, current); - hrtimer_set_expires_range_ns(&to->timer, wake_time, - current->timer_slack_ns); -- -- hrtimer_init_sleeper(to, current); - } - - while (1) { -diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h -index 542b4fa2cda9..cbd041b22088 100644 ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -364,10 +364,17 @@ DECLARE_PER_CPU(struct tick_device, tick_cpu_device); - /* Initialize timers: */ - extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock, - enum hrtimer_mode mode); -+extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, -+ enum hrtimer_mode mode, -+ struct task_struct *task); - - #ifdef CONFIG_DEBUG_OBJECTS_TIMERS - extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock, - enum hrtimer_mode mode); -+extern void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, -+ clockid_t clock_id, -+ enum hrtimer_mode mode, -+ struct task_struct *task); - - extern void destroy_hrtimer_on_stack(struct hrtimer *timer); - #else -@@ -377,6 +384,15 @@ static inline void hrtimer_init_on_stack(struct hrtimer *timer, - { - hrtimer_init(timer, which_clock, mode); - } -+ -+static inline void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, -+ clockid_t clock_id, -+ enum hrtimer_mode mode, -+ struct task_struct *task) -+{ -+ hrtimer_init_sleeper(sl, clock_id, mode, task); -+} -+ - static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { } - #endif - -@@ -486,9 +502,6 @@ extern long hrtimer_nanosleep(const struct timespec64 *rqtp, - const enum hrtimer_mode mode, - const clockid_t clockid); - --extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, -- struct task_struct *tsk); -- - extern int schedule_hrtimeout_range(ktime_t *expires, u64 delta, - const enum hrtimer_mode mode); - extern int schedule_hrtimeout_range_clock(ktime_t *expires, -diff --git a/include/linux/wait.h b/include/linux/wait.h -index 2b5ef8e94d19..94bd2e841de6 100644 ---- a/include/linux/wait.h -+++ b/include/linux/wait.h -@@ -489,8 +489,8 @@ do { \ - int __ret = 0; \ - struct hrtimer_sleeper __t; \ - \ -- hrtimer_init_on_stack(&__t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); \ -- hrtimer_init_sleeper(&__t, current); \ -+ hrtimer_init_sleeper_on_stack(&__t, CLOCK_MONOTONIC, HRTIMER_MODE_REL, \ -+ current); \ - if ((timeout) != KTIME_MAX) \ - hrtimer_start_range_ns(&__t.timer, timeout, \ - current->timer_slack_ns, \ -diff --git a/kernel/futex.c b/kernel/futex.c -index 5c8053098fc8..23e1f8a478e8 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -2704,10 +2704,9 @@ static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val, - if (abs_time) { - to = &timeout; - -- hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? -- CLOCK_REALTIME : CLOCK_MONOTONIC, -- HRTIMER_MODE_ABS); -- hrtimer_init_sleeper(to, current); -+ hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? -+ CLOCK_REALTIME : CLOCK_MONOTONIC, -+ HRTIMER_MODE_ABS, current); - hrtimer_set_expires_range_ns(&to->timer, *abs_time, - current->timer_slack_ns); - } -@@ -2806,9 +2805,8 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, - - if (time) { - to = &timeout; -- hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME, -- HRTIMER_MODE_ABS); -- hrtimer_init_sleeper(to, current); -+ hrtimer_init_sleeper_on_stack(to, CLOCK_REALTIME, -+ HRTIMER_MODE_ABS, current); - hrtimer_set_expires(&to->timer, *time); - } - -@@ -3245,10 +3243,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - - if (abs_time) { - to = &timeout; -- hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ? -- CLOCK_REALTIME : CLOCK_MONOTONIC, -- HRTIMER_MODE_ABS); -- hrtimer_init_sleeper(to, current); -+ hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ? -+ CLOCK_REALTIME : CLOCK_MONOTONIC, -+ HRTIMER_MODE_ABS, current); - hrtimer_set_expires_range_ns(&to->timer, *abs_time, - current->timer_slack_ns); - } -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 7362554416fd..c6f755495a63 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -1651,13 +1651,44 @@ static enum hrtimer_restart hrtimer_wakeup(struct hrtimer *timer) - return HRTIMER_NORESTART; - } - --void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) -+static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, -+ clockid_t clock_id, -+ enum hrtimer_mode mode, -+ struct task_struct *task) - { -+ __hrtimer_init(&sl->timer, clock_id, mode); - sl->timer.function = hrtimer_wakeup; - sl->task = task; - } -+ -+/** -+ * hrtimer_init_sleeper - initialize sleeper to the given clock -+ * @sl: sleeper to be initialized -+ * @clock_id: the clock to be used -+ * @mode: timer mode abs/rel -+ * @task: the task to wake up -+ */ -+void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, -+ enum hrtimer_mode mode, struct task_struct *task) -+{ -+ debug_init(&sl->timer, clock_id, mode); -+ __hrtimer_init_sleeper(sl, clock_id, mode, task); -+ -+} - EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); - -+#ifdef CONFIG_DEBUG_OBJECTS_TIMERS -+void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, -+ clockid_t clock_id, -+ enum hrtimer_mode mode, -+ struct task_struct *task) -+{ -+ debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr); -+ __hrtimer_init_sleeper(sl, clock_id, mode, task); -+} -+EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack); -+#endif -+ - int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) - { - switch(restart->nanosleep.type) { -@@ -1681,8 +1712,6 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod - { - struct restart_block *restart; - -- hrtimer_init_sleeper(t, current); -- - do { - set_current_state(TASK_INTERRUPTIBLE); - hrtimer_start_expires(&t->timer, mode); -@@ -1719,10 +1748,9 @@ static long __sched hrtimer_nanosleep_restart(struct restart_block *restart) - struct hrtimer_sleeper t; - int ret; - -- hrtimer_init_on_stack(&t.timer, restart->nanosleep.clockid, -- HRTIMER_MODE_ABS); -+ hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid, -+ HRTIMER_MODE_ABS, current); - hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires); -- - ret = do_nanosleep(&t, HRTIMER_MODE_ABS); - destroy_hrtimer_on_stack(&t.timer); - return ret; -@@ -1740,7 +1768,7 @@ long hrtimer_nanosleep(const struct timespec64 *rqtp, - if (dl_task(current) || rt_task(current)) - slack = 0; - -- hrtimer_init_on_stack(&t.timer, clockid, mode); -+ hrtimer_init_sleeper_on_stack(&t, clockid, mode, current); - hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack); - ret = do_nanosleep(&t, mode); - if (ret != -ERESTART_RESTARTBLOCK) -@@ -1939,11 +1967,9 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta, - return -EINTR; - } - -- hrtimer_init_on_stack(&t.timer, clock_id, mode); -+ hrtimer_init_sleeper_on_stack(&t, clock_id, mode, current); - hrtimer_set_expires_range_ns(&t.timer, *expires, delta); - -- hrtimer_init_sleeper(&t, current); -- - hrtimer_start_expires(&t.timer, mode); - - if (likely(t.task)) -diff --git a/net/core/pktgen.c b/net/core/pktgen.c -index 092fa3d75b32..9d472d626aaa 100644 ---- a/net/core/pktgen.c -+++ b/net/core/pktgen.c -@@ -2160,7 +2160,8 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) - s64 remaining; - struct hrtimer_sleeper t; - -- hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); -+ hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS, -+ current); - hrtimer_set_expires(&t.timer, spin_until); - - remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer)); -@@ -2175,7 +2176,6 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until) - } while (ktime_compare(end_time, spin_until) < 0); - } else { - /* see do_nanosleep */ -- hrtimer_init_sleeper(&t, current); - do { - set_current_state(TASK_INTERRUPTIBLE); - hrtimer_start_expires(&t.timer, HRTIMER_MODE_ABS); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0099-hrtimers-Prepare-full-preemption.patch linux-4.19.118/debian/patches-rt/0099-hrtimers-Prepare-full-preemption.patch --- linux-4.19.98/debian/patches-rt/0099-hrtimers-Prepare-full-preemption.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0099-hrtimers-Prepare-full-preemption.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,290 @@ +From 4010d1e594f451d4c3c992238406e1eba5c749e4 Mon Sep 17 00:00:00 2001 +From: Ingo Molnar +Date: Fri, 3 Jul 2009 08:29:34 -0500 +Subject: [PATCH 099/325] hrtimers: Prepare full preemption +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Make cancellation of a running callback in softirq context safe +against preemption. + +Signed-off-by: Ingo Molnar +Signed-off-by: Thomas Gleixner +--- + fs/timerfd.c | 5 ++++- + include/linux/hrtimer.h | 13 +++++++++++- + include/linux/posix-timers.h | 2 +- + kernel/time/alarmtimer.c | 2 +- + kernel/time/hrtimer.c | 33 +++++++++++++++++++++++++++++- + kernel/time/itimer.c | 1 + + kernel/time/posix-timers.c | 39 ++++++++++++++++++++++++++++++++++-- + 7 files changed, 88 insertions(+), 7 deletions(-) + +diff --git a/fs/timerfd.c b/fs/timerfd.c +index d69ad801eb80..82d0f52414a6 100644 +--- a/fs/timerfd.c ++++ b/fs/timerfd.c +@@ -471,7 +471,10 @@ static int do_timerfd_settime(int ufd, int flags, + break; + } + spin_unlock_irq(&ctx->wqh.lock); +- cpu_relax(); ++ if (isalarm(ctx)) ++ hrtimer_wait_for_timer(&ctx->t.alarm.timer); ++ else ++ hrtimer_wait_for_timer(&ctx->t.tmr); + } + + /* +diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h +index cbd041b22088..8714f1a37d84 100644 +--- a/include/linux/hrtimer.h ++++ b/include/linux/hrtimer.h +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + struct hrtimer_clock_base; + struct hrtimer_cpu_base; +@@ -216,6 +217,9 @@ struct hrtimer_cpu_base { + ktime_t expires_next; + struct hrtimer *next_timer; + ktime_t softirq_expires_next; ++#ifdef CONFIG_PREEMPT_RT_BASE ++ wait_queue_head_t wait; ++#endif + struct hrtimer *softirq_next_timer; + struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; + } ____cacheline_aligned; +@@ -433,6 +437,13 @@ static inline void hrtimer_restart(struct hrtimer *timer) + hrtimer_start_expires(timer, HRTIMER_MODE_ABS); + } + ++/* Softirq preemption could deadlock timer removal */ ++#ifdef CONFIG_PREEMPT_RT_BASE ++ extern void hrtimer_wait_for_timer(const struct hrtimer *timer); ++#else ++# define hrtimer_wait_for_timer(timer) do { cpu_relax(); } while (0) ++#endif ++ + /* Query timers: */ + extern ktime_t __hrtimer_get_remaining(const struct hrtimer *timer, bool adjust); + +@@ -464,7 +475,7 @@ static inline bool hrtimer_is_queued(struct hrtimer *timer) + * Helper function to check, whether the timer is running the callback + * function + */ +-static inline int hrtimer_callback_running(struct hrtimer *timer) ++static inline int hrtimer_callback_running(const struct hrtimer *timer) + { + return timer->base->running == timer; + } +diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h +index ee7e987ea1b4..0571b498db73 100644 +--- a/include/linux/posix-timers.h ++++ b/include/linux/posix-timers.h +@@ -114,8 +114,8 @@ struct k_itimer { + struct { + struct alarm alarmtimer; + } alarm; +- struct rcu_head rcu; + } it; ++ struct rcu_head rcu; + }; + + void run_posix_cpu_timers(struct task_struct *task); +diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c +index 9eece67f29f3..a465564367ec 100644 +--- a/kernel/time/alarmtimer.c ++++ b/kernel/time/alarmtimer.c +@@ -438,7 +438,7 @@ int alarm_cancel(struct alarm *alarm) + int ret = alarm_try_to_cancel(alarm); + if (ret >= 0) + return ret; +- cpu_relax(); ++ hrtimer_wait_for_timer(&alarm->timer); + } + } + EXPORT_SYMBOL_GPL(alarm_cancel); +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index c6f755495a63..e135cb27db39 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -939,6 +939,33 @@ u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval) + } + EXPORT_SYMBOL_GPL(hrtimer_forward); + ++#ifdef CONFIG_PREEMPT_RT_BASE ++# define wake_up_timer_waiters(b) wake_up(&(b)->wait) ++ ++/** ++ * hrtimer_wait_for_timer - Wait for a running timer ++ * ++ * @timer: timer to wait for ++ * ++ * The function waits in case the timers callback function is ++ * currently executed on the waitqueue of the timer base. The ++ * waitqueue is woken up after the timer callback function has ++ * finished execution. ++ */ ++void hrtimer_wait_for_timer(const struct hrtimer *timer) ++{ ++ struct hrtimer_clock_base *base = timer->base; ++ ++ if (base && base->cpu_base && ++ base->index >= HRTIMER_BASE_MONOTONIC_SOFT) ++ wait_event(base->cpu_base->wait, ++ !(hrtimer_callback_running(timer))); ++} ++ ++#else ++# define wake_up_timer_waiters(b) do { } while (0) ++#endif ++ + /* + * enqueue_hrtimer - internal function to (re)start a timer + * +@@ -1174,7 +1201,7 @@ int hrtimer_cancel(struct hrtimer *timer) + + if (ret >= 0) + return ret; +- cpu_relax(); ++ hrtimer_wait_for_timer(timer); + } + } + EXPORT_SYMBOL_GPL(hrtimer_cancel); +@@ -1480,6 +1507,7 @@ static __latent_entropy void hrtimer_run_softirq(struct softirq_action *h) + hrtimer_update_softirq_timer(cpu_base, true); + + raw_spin_unlock_irqrestore(&cpu_base->lock, flags); ++ wake_up_timer_waiters(cpu_base); + } + + #ifdef CONFIG_HIGH_RES_TIMERS +@@ -1849,6 +1877,9 @@ int hrtimers_prepare_cpu(unsigned int cpu) + cpu_base->softirq_next_timer = NULL; + cpu_base->expires_next = KTIME_MAX; + cpu_base->softirq_expires_next = KTIME_MAX; ++#ifdef CONFIG_PREEMPT_RT_BASE ++ init_waitqueue_head(&cpu_base->wait); ++#endif + return 0; + } + +diff --git a/kernel/time/itimer.c b/kernel/time/itimer.c +index 9a65713c8309..55b0e58368bf 100644 +--- a/kernel/time/itimer.c ++++ b/kernel/time/itimer.c +@@ -215,6 +215,7 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) + /* We are sharing ->siglock with it_real_fn() */ + if (hrtimer_try_to_cancel(timer) < 0) { + spin_unlock_irq(&tsk->sighand->siglock); ++ hrtimer_wait_for_timer(&tsk->signal->real_timer); + goto again; + } + expires = timeval_to_ktime(value->it_value); +diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c +index 5a01c4fdbfef..a5ec421e3437 100644 +--- a/kernel/time/posix-timers.c ++++ b/kernel/time/posix-timers.c +@@ -463,7 +463,7 @@ static struct k_itimer * alloc_posix_timer(void) + + static void k_itimer_rcu_free(struct rcu_head *head) + { +- struct k_itimer *tmr = container_of(head, struct k_itimer, it.rcu); ++ struct k_itimer *tmr = container_of(head, struct k_itimer, rcu); + + kmem_cache_free(posix_timers_cache, tmr); + } +@@ -480,7 +480,7 @@ static void release_posix_timer(struct k_itimer *tmr, int it_id_set) + } + put_pid(tmr->it_pid); + sigqueue_free(tmr->sigq); +- call_rcu(&tmr->it.rcu, k_itimer_rcu_free); ++ call_rcu(&tmr->rcu, k_itimer_rcu_free); + } + + static int common_timer_create(struct k_itimer *new_timer) +@@ -821,6 +821,22 @@ static void common_hrtimer_arm(struct k_itimer *timr, ktime_t expires, + hrtimer_start_expires(timer, HRTIMER_MODE_ABS); + } + ++/* ++ * Protected by RCU! ++ */ ++static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timr) ++{ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (kc->timer_arm == common_hrtimer_arm) ++ hrtimer_wait_for_timer(&timr->it.real.timer); ++ else if (kc == &alarm_clock) ++ hrtimer_wait_for_timer(&timr->it.alarm.alarmtimer.timer); ++ else ++ /* FIXME: Whacky hack for posix-cpu-timers */ ++ schedule_timeout(1); ++#endif ++} ++ + static int common_hrtimer_try_to_cancel(struct k_itimer *timr) + { + return hrtimer_try_to_cancel(&timr->it.real.timer); +@@ -885,6 +901,7 @@ static int do_timer_settime(timer_t timer_id, int flags, + if (!timr) + return -EINVAL; + ++ rcu_read_lock(); + kc = timr->kclock; + if (WARN_ON_ONCE(!kc || !kc->timer_set)) + error = -EINVAL; +@@ -893,9 +910,12 @@ static int do_timer_settime(timer_t timer_id, int flags, + + unlock_timer(timr, flag); + if (error == TIMER_RETRY) { ++ timer_wait_for_callback(kc, timr); + old_spec64 = NULL; // We already got the old time... ++ rcu_read_unlock(); + goto retry; + } ++ rcu_read_unlock(); + + return error; + } +@@ -977,10 +997,15 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id) + if (!timer) + return -EINVAL; + ++ rcu_read_lock(); + if (timer_delete_hook(timer) == TIMER_RETRY) { + unlock_timer(timer, flags); ++ timer_wait_for_callback(clockid_to_kclock(timer->it_clock), ++ timer); ++ rcu_read_unlock(); + goto retry_delete; + } ++ rcu_read_unlock(); + + spin_lock(¤t->sighand->siglock); + list_del(&timer->list); +@@ -1006,8 +1031,18 @@ static void itimer_delete(struct k_itimer *timer) + retry_delete: + spin_lock_irqsave(&timer->it_lock, flags); + ++ /* On RT we can race with a deletion */ ++ if (!timer->it_signal) { ++ unlock_timer(timer, flags); ++ return; ++ } ++ + if (timer_delete_hook(timer) == TIMER_RETRY) { ++ rcu_read_lock(); + unlock_timer(timer, flags); ++ timer_wait_for_callback(clockid_to_kclock(timer->it_clock), ++ timer); ++ rcu_read_unlock(); + goto retry_delete; + } + list_del(&timer->list); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0100-hrtimer-by-timers-by-default-into-the-softirq-contex.patch linux-4.19.118/debian/patches-rt/0100-hrtimer-by-timers-by-default-into-the-softirq-contex.patch --- linux-4.19.98/debian/patches-rt/0100-hrtimer-by-timers-by-default-into-the-softirq-contex.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0100-hrtimer-by-timers-by-default-into-the-softirq-contex.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,237 @@ +From b09a6ad039102ca18a66df006771be4c9a4679c7 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 3 Jul 2009 08:44:31 -0500 +Subject: [PATCH 100/325] hrtimer: by timers by default into the softirq + context +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +We can't have hrtimers callbacks running in hardirq context on RT. Therefore +the timers are deferred to the softirq context by default. +There are few timers which expect to be run in hardirq context even on RT. +Those are: +- very short running where low latency is critical (kvm lapic) +- timers which take raw locks and need run in hard-irq context (perf, sched) +- wake up related timer (kernel side of clock_nanosleep() and so on) + +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/x86/kvm/lapic.c | 2 +- + include/linux/hrtimer.h | 6 ++++++ + kernel/events/core.c | 4 ++-- + kernel/sched/core.c | 2 +- + kernel/sched/deadline.c | 2 +- + kernel/sched/fair.c | 4 ++-- + kernel/sched/rt.c | 4 ++-- + kernel/time/hrtimer.c | 21 +++++++++++++++++++-- + kernel/time/tick-broadcast-hrtimer.c | 2 +- + kernel/time/tick-sched.c | 2 +- + kernel/watchdog.c | 2 +- + 11 files changed, 37 insertions(+), 14 deletions(-) + +diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c +index 8c6392534d14..d64ca45f5db6 100644 +--- a/arch/x86/kvm/lapic.c ++++ b/arch/x86/kvm/lapic.c +@@ -2261,7 +2261,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu) + apic->vcpu = vcpu; + + hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC, +- HRTIMER_MODE_ABS_PINNED); ++ HRTIMER_MODE_ABS_PINNED_HARD); + apic->lapic_timer.timer.function = apic_timer_fn; + + /* +diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h +index 8714f1a37d84..082147c07831 100644 +--- a/include/linux/hrtimer.h ++++ b/include/linux/hrtimer.h +@@ -42,6 +42,7 @@ enum hrtimer_mode { + HRTIMER_MODE_REL = 0x01, + HRTIMER_MODE_PINNED = 0x02, + HRTIMER_MODE_SOFT = 0x04, ++ HRTIMER_MODE_HARD = 0x08, + + HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED, + HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED, +@@ -52,6 +53,11 @@ enum hrtimer_mode { + HRTIMER_MODE_ABS_PINNED_SOFT = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_SOFT, + HRTIMER_MODE_REL_PINNED_SOFT = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_SOFT, + ++ HRTIMER_MODE_ABS_HARD = HRTIMER_MODE_ABS | HRTIMER_MODE_HARD, ++ HRTIMER_MODE_REL_HARD = HRTIMER_MODE_REL | HRTIMER_MODE_HARD, ++ ++ HRTIMER_MODE_ABS_PINNED_HARD = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_HARD, ++ HRTIMER_MODE_REL_PINNED_HARD = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_HARD, + }; + + /* +diff --git a/kernel/events/core.c b/kernel/events/core.c +index 8c70ee23fbe9..9804b1a8b0fa 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -1102,7 +1102,7 @@ static void __perf_mux_hrtimer_init(struct perf_cpu_context *cpuctx, int cpu) + cpuctx->hrtimer_interval = ns_to_ktime(NSEC_PER_MSEC * interval); + + raw_spin_lock_init(&cpuctx->hrtimer_lock); +- hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); ++ hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD); + timer->function = perf_mux_hrtimer_handler; + } + +@@ -9269,7 +9269,7 @@ static void perf_swevent_init_hrtimer(struct perf_event *event) + if (!is_sampling_event(event)) + return; + +- hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); + hwc->hrtimer.function = perf_swevent_hrtimer; + + /* +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 584978640512..2f6b4365d070 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -315,7 +315,7 @@ static void hrtick_rq_init(struct rq *rq) + rq->hrtick_csd.info = rq; + #endif + +- hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); + rq->hrtick_timer.function = hrtick; + } + #else /* CONFIG_SCHED_HRTICK */ +diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c +index 4b13df38c069..974a8f9b615a 100644 +--- a/kernel/sched/deadline.c ++++ b/kernel/sched/deadline.c +@@ -1086,7 +1086,7 @@ void init_dl_task_timer(struct sched_dl_entity *dl_se) + { + struct hrtimer *timer = &dl_se->dl_timer; + +- hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); + timer->function = dl_task_timer; + } + +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index fe58e95484cf..f35eb8130921 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -4951,9 +4951,9 @@ void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) + cfs_b->period = ns_to_ktime(default_cfs_period()); + + INIT_LIST_HEAD(&cfs_b->throttled_cfs_rq); +- hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); ++ hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD); + cfs_b->period_timer.function = sched_cfs_period_timer; +- hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); + cfs_b->slack_timer.function = sched_cfs_slack_timer; + cfs_b->distribute_running = 0; + } +diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c +index b6ca4a630050..aeb99395c03b 100644 +--- a/kernel/sched/rt.c ++++ b/kernel/sched/rt.c +@@ -45,8 +45,8 @@ void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime) + + raw_spin_lock_init(&rt_b->rt_runtime_lock); + +- hrtimer_init(&rt_b->rt_period_timer, +- CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(&rt_b->rt_period_timer, CLOCK_MONOTONIC, ++ HRTIMER_MODE_REL_HARD); + rt_b->rt_period_timer.function = sched_rt_period_timer; + } + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index e135cb27db39..1fd5ec39e7f4 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -1138,7 +1138,9 @@ void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, + * Check whether the HRTIMER_MODE_SOFT bit and hrtimer.is_soft + * match. + */ ++#ifndef CONFIG_PREEMPT_RT_BASE + WARN_ON_ONCE(!(mode & HRTIMER_MODE_SOFT) ^ !timer->is_soft); ++#endif + + base = lock_hrtimer_base(timer, &flags); + +@@ -1298,10 +1300,17 @@ static inline int hrtimer_clockid_to_base(clockid_t clock_id) + static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, + enum hrtimer_mode mode) + { +- bool softtimer = !!(mode & HRTIMER_MODE_SOFT); +- int base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0; ++ bool softtimer; ++ int base; + struct hrtimer_cpu_base *cpu_base; + ++ softtimer = !!(mode & HRTIMER_MODE_SOFT); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (!softtimer && !(mode & HRTIMER_MODE_HARD)) ++ softtimer = true; ++#endif ++ base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0; ++ + memset(timer, 0, sizeof(struct hrtimer)); + + cpu_base = raw_cpu_ptr(&hrtimer_bases); +@@ -1684,6 +1693,14 @@ static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, + enum hrtimer_mode mode, + struct task_struct *task) + { ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (!(mode & (HRTIMER_MODE_SOFT | HRTIMER_MODE_HARD))) { ++ if (task_is_realtime(current) || system_state != SYSTEM_RUNNING) ++ mode |= HRTIMER_MODE_HARD; ++ else ++ mode |= HRTIMER_MODE_SOFT; ++ } ++#endif + __hrtimer_init(&sl->timer, clock_id, mode); + sl->timer.function = hrtimer_wakeup; + sl->task = task; +diff --git a/kernel/time/tick-broadcast-hrtimer.c b/kernel/time/tick-broadcast-hrtimer.c +index a836efd34589..c50e8f3262de 100644 +--- a/kernel/time/tick-broadcast-hrtimer.c ++++ b/kernel/time/tick-broadcast-hrtimer.c +@@ -107,7 +107,7 @@ static enum hrtimer_restart bc_handler(struct hrtimer *t) + + void tick_setup_hrtimer_broadcast(void) + { +- hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); ++ hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); + bctimer.function = bc_handler; + clockevents_register_device(&ce_broadcast_hrtimer); + } +diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c +index e774a49176cc..012bc81879bf 100644 +--- a/kernel/time/tick-sched.c ++++ b/kernel/time/tick-sched.c +@@ -1314,7 +1314,7 @@ void tick_setup_sched_timer(void) + /* + * Emulate tick processing via per-CPU hrtimers: + */ +- hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); ++ hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); + ts->sched_timer.function = tick_sched_timer; + + /* Get the next period (per-CPU) */ +diff --git a/kernel/watchdog.c b/kernel/watchdog.c +index 6d60701dc636..328620fe85f6 100644 +--- a/kernel/watchdog.c ++++ b/kernel/watchdog.c +@@ -485,7 +485,7 @@ static void watchdog_enable(unsigned int cpu) + * Start the timer first to prevent the NMI watchdog triggering + * before the timer has a chance to fire. + */ +- hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); + hrtimer->function = watchdog_timer_fn; + hrtimer_start(hrtimer, ns_to_ktime(sample_period), + HRTIMER_MODE_REL_PINNED); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0100-hrtimers-Prepare-full-preemption.patch linux-4.19.118/debian/patches-rt/0100-hrtimers-Prepare-full-preemption.patch --- linux-4.19.98/debian/patches-rt/0100-hrtimers-Prepare-full-preemption.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0100-hrtimers-Prepare-full-preemption.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,290 +0,0 @@ -From e033fc3f9345af04f20c1d45fa8ee453caaf5b1c Mon Sep 17 00:00:00 2001 -From: Ingo Molnar -Date: Fri, 3 Jul 2009 08:29:34 -0500 -Subject: [PATCH 100/290] hrtimers: Prepare full preemption -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Make cancellation of a running callback in softirq context safe -against preemption. - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner ---- - fs/timerfd.c | 5 ++++- - include/linux/hrtimer.h | 13 +++++++++++- - include/linux/posix-timers.h | 2 +- - kernel/time/alarmtimer.c | 2 +- - kernel/time/hrtimer.c | 33 +++++++++++++++++++++++++++++- - kernel/time/itimer.c | 1 + - kernel/time/posix-timers.c | 39 ++++++++++++++++++++++++++++++++++-- - 7 files changed, 88 insertions(+), 7 deletions(-) - -diff --git a/fs/timerfd.c b/fs/timerfd.c -index d69ad801eb80..82d0f52414a6 100644 ---- a/fs/timerfd.c -+++ b/fs/timerfd.c -@@ -471,7 +471,10 @@ static int do_timerfd_settime(int ufd, int flags, - break; - } - spin_unlock_irq(&ctx->wqh.lock); -- cpu_relax(); -+ if (isalarm(ctx)) -+ hrtimer_wait_for_timer(&ctx->t.alarm.timer); -+ else -+ hrtimer_wait_for_timer(&ctx->t.tmr); - } - - /* -diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h -index cbd041b22088..8714f1a37d84 100644 ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - struct hrtimer_clock_base; - struct hrtimer_cpu_base; -@@ -216,6 +217,9 @@ struct hrtimer_cpu_base { - ktime_t expires_next; - struct hrtimer *next_timer; - ktime_t softirq_expires_next; -+#ifdef CONFIG_PREEMPT_RT_BASE -+ wait_queue_head_t wait; -+#endif - struct hrtimer *softirq_next_timer; - struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; - } ____cacheline_aligned; -@@ -433,6 +437,13 @@ static inline void hrtimer_restart(struct hrtimer *timer) - hrtimer_start_expires(timer, HRTIMER_MODE_ABS); - } - -+/* Softirq preemption could deadlock timer removal */ -+#ifdef CONFIG_PREEMPT_RT_BASE -+ extern void hrtimer_wait_for_timer(const struct hrtimer *timer); -+#else -+# define hrtimer_wait_for_timer(timer) do { cpu_relax(); } while (0) -+#endif -+ - /* Query timers: */ - extern ktime_t __hrtimer_get_remaining(const struct hrtimer *timer, bool adjust); - -@@ -464,7 +475,7 @@ static inline bool hrtimer_is_queued(struct hrtimer *timer) - * Helper function to check, whether the timer is running the callback - * function - */ --static inline int hrtimer_callback_running(struct hrtimer *timer) -+static inline int hrtimer_callback_running(const struct hrtimer *timer) - { - return timer->base->running == timer; - } -diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h -index ee7e987ea1b4..0571b498db73 100644 ---- a/include/linux/posix-timers.h -+++ b/include/linux/posix-timers.h -@@ -114,8 +114,8 @@ struct k_itimer { - struct { - struct alarm alarmtimer; - } alarm; -- struct rcu_head rcu; - } it; -+ struct rcu_head rcu; - }; - - void run_posix_cpu_timers(struct task_struct *task); -diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c -index f4255a65c44b..1d1f077cffb3 100644 ---- a/kernel/time/alarmtimer.c -+++ b/kernel/time/alarmtimer.c -@@ -436,7 +436,7 @@ int alarm_cancel(struct alarm *alarm) - int ret = alarm_try_to_cancel(alarm); - if (ret >= 0) - return ret; -- cpu_relax(); -+ hrtimer_wait_for_timer(&alarm->timer); - } - } - EXPORT_SYMBOL_GPL(alarm_cancel); -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index c6f755495a63..e135cb27db39 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -939,6 +939,33 @@ u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval) - } - EXPORT_SYMBOL_GPL(hrtimer_forward); - -+#ifdef CONFIG_PREEMPT_RT_BASE -+# define wake_up_timer_waiters(b) wake_up(&(b)->wait) -+ -+/** -+ * hrtimer_wait_for_timer - Wait for a running timer -+ * -+ * @timer: timer to wait for -+ * -+ * The function waits in case the timers callback function is -+ * currently executed on the waitqueue of the timer base. The -+ * waitqueue is woken up after the timer callback function has -+ * finished execution. -+ */ -+void hrtimer_wait_for_timer(const struct hrtimer *timer) -+{ -+ struct hrtimer_clock_base *base = timer->base; -+ -+ if (base && base->cpu_base && -+ base->index >= HRTIMER_BASE_MONOTONIC_SOFT) -+ wait_event(base->cpu_base->wait, -+ !(hrtimer_callback_running(timer))); -+} -+ -+#else -+# define wake_up_timer_waiters(b) do { } while (0) -+#endif -+ - /* - * enqueue_hrtimer - internal function to (re)start a timer - * -@@ -1174,7 +1201,7 @@ int hrtimer_cancel(struct hrtimer *timer) - - if (ret >= 0) - return ret; -- cpu_relax(); -+ hrtimer_wait_for_timer(timer); - } - } - EXPORT_SYMBOL_GPL(hrtimer_cancel); -@@ -1480,6 +1507,7 @@ static __latent_entropy void hrtimer_run_softirq(struct softirq_action *h) - hrtimer_update_softirq_timer(cpu_base, true); - - raw_spin_unlock_irqrestore(&cpu_base->lock, flags); -+ wake_up_timer_waiters(cpu_base); - } - - #ifdef CONFIG_HIGH_RES_TIMERS -@@ -1849,6 +1877,9 @@ int hrtimers_prepare_cpu(unsigned int cpu) - cpu_base->softirq_next_timer = NULL; - cpu_base->expires_next = KTIME_MAX; - cpu_base->softirq_expires_next = KTIME_MAX; -+#ifdef CONFIG_PREEMPT_RT_BASE -+ init_waitqueue_head(&cpu_base->wait); -+#endif - return 0; - } - -diff --git a/kernel/time/itimer.c b/kernel/time/itimer.c -index 9a65713c8309..55b0e58368bf 100644 ---- a/kernel/time/itimer.c -+++ b/kernel/time/itimer.c -@@ -215,6 +215,7 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) - /* We are sharing ->siglock with it_real_fn() */ - if (hrtimer_try_to_cancel(timer) < 0) { - spin_unlock_irq(&tsk->sighand->siglock); -+ hrtimer_wait_for_timer(&tsk->signal->real_timer); - goto again; - } - expires = timeval_to_ktime(value->it_value); -diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c -index 5a01c4fdbfef..a5ec421e3437 100644 ---- a/kernel/time/posix-timers.c -+++ b/kernel/time/posix-timers.c -@@ -463,7 +463,7 @@ static struct k_itimer * alloc_posix_timer(void) - - static void k_itimer_rcu_free(struct rcu_head *head) - { -- struct k_itimer *tmr = container_of(head, struct k_itimer, it.rcu); -+ struct k_itimer *tmr = container_of(head, struct k_itimer, rcu); - - kmem_cache_free(posix_timers_cache, tmr); - } -@@ -480,7 +480,7 @@ static void release_posix_timer(struct k_itimer *tmr, int it_id_set) - } - put_pid(tmr->it_pid); - sigqueue_free(tmr->sigq); -- call_rcu(&tmr->it.rcu, k_itimer_rcu_free); -+ call_rcu(&tmr->rcu, k_itimer_rcu_free); - } - - static int common_timer_create(struct k_itimer *new_timer) -@@ -821,6 +821,22 @@ static void common_hrtimer_arm(struct k_itimer *timr, ktime_t expires, - hrtimer_start_expires(timer, HRTIMER_MODE_ABS); - } - -+/* -+ * Protected by RCU! -+ */ -+static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timr) -+{ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (kc->timer_arm == common_hrtimer_arm) -+ hrtimer_wait_for_timer(&timr->it.real.timer); -+ else if (kc == &alarm_clock) -+ hrtimer_wait_for_timer(&timr->it.alarm.alarmtimer.timer); -+ else -+ /* FIXME: Whacky hack for posix-cpu-timers */ -+ schedule_timeout(1); -+#endif -+} -+ - static int common_hrtimer_try_to_cancel(struct k_itimer *timr) - { - return hrtimer_try_to_cancel(&timr->it.real.timer); -@@ -885,6 +901,7 @@ static int do_timer_settime(timer_t timer_id, int flags, - if (!timr) - return -EINVAL; - -+ rcu_read_lock(); - kc = timr->kclock; - if (WARN_ON_ONCE(!kc || !kc->timer_set)) - error = -EINVAL; -@@ -893,9 +910,12 @@ static int do_timer_settime(timer_t timer_id, int flags, - - unlock_timer(timr, flag); - if (error == TIMER_RETRY) { -+ timer_wait_for_callback(kc, timr); - old_spec64 = NULL; // We already got the old time... -+ rcu_read_unlock(); - goto retry; - } -+ rcu_read_unlock(); - - return error; - } -@@ -977,10 +997,15 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id) - if (!timer) - return -EINVAL; - -+ rcu_read_lock(); - if (timer_delete_hook(timer) == TIMER_RETRY) { - unlock_timer(timer, flags); -+ timer_wait_for_callback(clockid_to_kclock(timer->it_clock), -+ timer); -+ rcu_read_unlock(); - goto retry_delete; - } -+ rcu_read_unlock(); - - spin_lock(¤t->sighand->siglock); - list_del(&timer->list); -@@ -1006,8 +1031,18 @@ static void itimer_delete(struct k_itimer *timer) - retry_delete: - spin_lock_irqsave(&timer->it_lock, flags); - -+ /* On RT we can race with a deletion */ -+ if (!timer->it_signal) { -+ unlock_timer(timer, flags); -+ return; -+ } -+ - if (timer_delete_hook(timer) == TIMER_RETRY) { -+ rcu_read_lock(); - unlock_timer(timer, flags); -+ timer_wait_for_callback(clockid_to_kclock(timer->it_clock), -+ timer); -+ rcu_read_unlock(); - goto retry_delete; - } - list_del(&timer->list); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0101-hrtimer-by-timers-by-default-into-the-softirq-contex.patch linux-4.19.118/debian/patches-rt/0101-hrtimer-by-timers-by-default-into-the-softirq-contex.patch --- linux-4.19.98/debian/patches-rt/0101-hrtimer-by-timers-by-default-into-the-softirq-contex.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0101-hrtimer-by-timers-by-default-into-the-softirq-contex.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,237 +0,0 @@ -From b26ce46313b85d2d4f52b053c1602b3c6d3e3f9f Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 3 Jul 2009 08:44:31 -0500 -Subject: [PATCH 101/290] hrtimer: by timers by default into the softirq - context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -We can't have hrtimers callbacks running in hardirq context on RT. Therefore -the timers are deferred to the softirq context by default. -There are few timers which expect to be run in hardirq context even on RT. -Those are: -- very short running where low latency is critical (kvm lapic) -- timers which take raw locks and need run in hard-irq context (perf, sched) -- wake up related timer (kernel side of clock_nanosleep() and so on) - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/kvm/lapic.c | 2 +- - include/linux/hrtimer.h | 6 ++++++ - kernel/events/core.c | 4 ++-- - kernel/sched/core.c | 2 +- - kernel/sched/deadline.c | 2 +- - kernel/sched/fair.c | 4 ++-- - kernel/sched/rt.c | 4 ++-- - kernel/time/hrtimer.c | 21 +++++++++++++++++++-- - kernel/time/tick-broadcast-hrtimer.c | 2 +- - kernel/time/tick-sched.c | 2 +- - kernel/watchdog.c | 2 +- - 11 files changed, 37 insertions(+), 14 deletions(-) - -diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c -index 262e49301cae..c2f51b6e8974 100644 ---- a/arch/x86/kvm/lapic.c -+++ b/arch/x86/kvm/lapic.c -@@ -2257,7 +2257,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu) - apic->vcpu = vcpu; - - hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC, -- HRTIMER_MODE_ABS_PINNED); -+ HRTIMER_MODE_ABS_PINNED_HARD); - apic->lapic_timer.timer.function = apic_timer_fn; - - /* -diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h -index 8714f1a37d84..082147c07831 100644 ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -42,6 +42,7 @@ enum hrtimer_mode { - HRTIMER_MODE_REL = 0x01, - HRTIMER_MODE_PINNED = 0x02, - HRTIMER_MODE_SOFT = 0x04, -+ HRTIMER_MODE_HARD = 0x08, - - HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED, - HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED, -@@ -52,6 +53,11 @@ enum hrtimer_mode { - HRTIMER_MODE_ABS_PINNED_SOFT = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_SOFT, - HRTIMER_MODE_REL_PINNED_SOFT = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_SOFT, - -+ HRTIMER_MODE_ABS_HARD = HRTIMER_MODE_ABS | HRTIMER_MODE_HARD, -+ HRTIMER_MODE_REL_HARD = HRTIMER_MODE_REL | HRTIMER_MODE_HARD, -+ -+ HRTIMER_MODE_ABS_PINNED_HARD = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_HARD, -+ HRTIMER_MODE_REL_PINNED_HARD = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_HARD, - }; - - /* -diff --git a/kernel/events/core.c b/kernel/events/core.c -index 460d5fd3ec4e..60a883088961 100644 ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -1102,7 +1102,7 @@ static void __perf_mux_hrtimer_init(struct perf_cpu_context *cpuctx, int cpu) - cpuctx->hrtimer_interval = ns_to_ktime(NSEC_PER_MSEC * interval); - - raw_spin_lock_init(&cpuctx->hrtimer_lock); -- hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); -+ hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD); - timer->function = perf_mux_hrtimer_handler; - } - -@@ -9239,7 +9239,7 @@ static void perf_swevent_init_hrtimer(struct perf_event *event) - if (!is_sampling_event(event)) - return; - -- hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); - hwc->hrtimer.function = perf_swevent_hrtimer; - - /* -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 584978640512..2f6b4365d070 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -315,7 +315,7 @@ static void hrtick_rq_init(struct rq *rq) - rq->hrtick_csd.info = rq; - #endif - -- hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); - rq->hrtick_timer.function = hrtick; - } - #else /* CONFIG_SCHED_HRTICK */ -diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c -index 4b13df38c069..974a8f9b615a 100644 ---- a/kernel/sched/deadline.c -+++ b/kernel/sched/deadline.c -@@ -1086,7 +1086,7 @@ void init_dl_task_timer(struct sched_dl_entity *dl_se) - { - struct hrtimer *timer = &dl_se->dl_timer; - -- hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); - timer->function = dl_task_timer; - } - -diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c -index 6e6d9e999814..21cf60c360e8 100644 ---- a/kernel/sched/fair.c -+++ b/kernel/sched/fair.c -@@ -4914,9 +4914,9 @@ void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) - cfs_b->period = ns_to_ktime(default_cfs_period()); - - INIT_LIST_HEAD(&cfs_b->throttled_cfs_rq); -- hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); -+ hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD); - cfs_b->period_timer.function = sched_cfs_period_timer; -- hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); - cfs_b->slack_timer.function = sched_cfs_slack_timer; - cfs_b->distribute_running = 0; - } -diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c -index b6ca4a630050..aeb99395c03b 100644 ---- a/kernel/sched/rt.c -+++ b/kernel/sched/rt.c -@@ -45,8 +45,8 @@ void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime) - - raw_spin_lock_init(&rt_b->rt_runtime_lock); - -- hrtimer_init(&rt_b->rt_period_timer, -- CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_init(&rt_b->rt_period_timer, CLOCK_MONOTONIC, -+ HRTIMER_MODE_REL_HARD); - rt_b->rt_period_timer.function = sched_rt_period_timer; - } - -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index e135cb27db39..1fd5ec39e7f4 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -1138,7 +1138,9 @@ void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, - * Check whether the HRTIMER_MODE_SOFT bit and hrtimer.is_soft - * match. - */ -+#ifndef CONFIG_PREEMPT_RT_BASE - WARN_ON_ONCE(!(mode & HRTIMER_MODE_SOFT) ^ !timer->is_soft); -+#endif - - base = lock_hrtimer_base(timer, &flags); - -@@ -1298,10 +1300,17 @@ static inline int hrtimer_clockid_to_base(clockid_t clock_id) - static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, - enum hrtimer_mode mode) - { -- bool softtimer = !!(mode & HRTIMER_MODE_SOFT); -- int base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0; -+ bool softtimer; -+ int base; - struct hrtimer_cpu_base *cpu_base; - -+ softtimer = !!(mode & HRTIMER_MODE_SOFT); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (!softtimer && !(mode & HRTIMER_MODE_HARD)) -+ softtimer = true; -+#endif -+ base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0; -+ - memset(timer, 0, sizeof(struct hrtimer)); - - cpu_base = raw_cpu_ptr(&hrtimer_bases); -@@ -1684,6 +1693,14 @@ static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, - enum hrtimer_mode mode, - struct task_struct *task) - { -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (!(mode & (HRTIMER_MODE_SOFT | HRTIMER_MODE_HARD))) { -+ if (task_is_realtime(current) || system_state != SYSTEM_RUNNING) -+ mode |= HRTIMER_MODE_HARD; -+ else -+ mode |= HRTIMER_MODE_SOFT; -+ } -+#endif - __hrtimer_init(&sl->timer, clock_id, mode); - sl->timer.function = hrtimer_wakeup; - sl->task = task; -diff --git a/kernel/time/tick-broadcast-hrtimer.c b/kernel/time/tick-broadcast-hrtimer.c -index a836efd34589..c50e8f3262de 100644 ---- a/kernel/time/tick-broadcast-hrtimer.c -+++ b/kernel/time/tick-broadcast-hrtimer.c -@@ -107,7 +107,7 @@ static enum hrtimer_restart bc_handler(struct hrtimer *t) - - void tick_setup_hrtimer_broadcast(void) - { -- hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); -+ hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); - bctimer.function = bc_handler; - clockevents_register_device(&ce_broadcast_hrtimer); - } -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 54fd344ef973..c217af74dddf 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -1310,7 +1310,7 @@ void tick_setup_sched_timer(void) - /* - * Emulate tick processing via per-CPU hrtimers: - */ -- hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); -+ hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); - ts->sched_timer.function = tick_sched_timer; - - /* Get the next period (per-CPU) */ -diff --git a/kernel/watchdog.c b/kernel/watchdog.c -index bbc4940f21af..defd493ba967 100644 ---- a/kernel/watchdog.c -+++ b/kernel/watchdog.c -@@ -483,7 +483,7 @@ static void watchdog_enable(unsigned int cpu) - * Start the timer first to prevent the NMI watchdog triggering - * before the timer has a chance to fire. - */ -- hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); - hrtimer->function = watchdog_timer_fn; - hrtimer_start(hrtimer, ns_to_ktime(sample_period), - HRTIMER_MODE_REL_PINNED); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0101-sched-fair-Make-the-hrtimers-non-hard-again.patch linux-4.19.118/debian/patches-rt/0101-sched-fair-Make-the-hrtimers-non-hard-again.patch --- linux-4.19.98/debian/patches-rt/0101-sched-fair-Make-the-hrtimers-non-hard-again.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0101-sched-fair-Make-the-hrtimers-non-hard-again.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,34 @@ +From 0cf31ad4768bed54a110b2c9bf62827799d41e8a Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 8 Jan 2019 12:31:06 +0100 +Subject: [PATCH 101/325] sched/fair: Make the hrtimers non-hard again +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Since commit "sched/fair: Robustify CFS-bandwidth timer locking" both +hrtimer can run in softirq context because now interrupts are disabled +as part of the locking procedure. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/sched/fair.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index f35eb8130921..fe58e95484cf 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -4951,9 +4951,9 @@ void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) + cfs_b->period = ns_to_ktime(default_cfs_period()); + + INIT_LIST_HEAD(&cfs_b->throttled_cfs_rq); +- hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD); ++ hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); + cfs_b->period_timer.function = sched_cfs_period_timer; +- hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); ++ hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + cfs_b->slack_timer.function = sched_cfs_slack_timer; + cfs_b->distribute_running = 0; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0102-hrtimer-Move-schedule_work-call-to-helper-thread.patch linux-4.19.118/debian/patches-rt/0102-hrtimer-Move-schedule_work-call-to-helper-thread.patch --- linux-4.19.98/debian/patches-rt/0102-hrtimer-Move-schedule_work-call-to-helper-thread.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0102-hrtimer-Move-schedule_work-call-to-helper-thread.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,98 @@ +From 41922c56a8fa6df2534420fe522232d8c448aae2 Mon Sep 17 00:00:00 2001 +From: Yang Shi +Date: Mon, 16 Sep 2013 14:09:19 -0700 +Subject: [PATCH 102/325] hrtimer: Move schedule_work call to helper thread +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +When run ltp leapsec_timer test, the following call trace is caught: + +BUG: sleeping function called from invalid context at kernel/rtmutex.c:659 +in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/1 +Preemption disabled at:[] cpu_startup_entry+0x133/0x310 + +CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.10.10-rt3 #2 +Hardware name: Intel Corporation Calpella platform/MATXM-CORE-411-B, BIOS 4.6.3 08/18/2010 +ffffffff81c2f800 ffff880076843e40 ffffffff8169918d ffff880076843e58 +ffffffff8106db31 ffff88007684b4a0 ffff880076843e70 ffffffff8169d9c0 +ffff88007684b4a0 ffff880076843eb0 ffffffff81059da1 0000001876851200 +Call Trace: + [] dump_stack+0x19/0x1b +[] __might_sleep+0xf1/0x170 +[] rt_spin_lock+0x20/0x50 +[] queue_work_on+0x61/0x100 +[] clock_was_set_delayed+0x21/0x30 +[] do_timer+0x40e/0x660 +[] tick_do_update_jiffies64+0xf7/0x140 +[] tick_check_idle+0x92/0xc0 +[] irq_enter+0x57/0x70 +[] smp_apic_timer_interrupt+0x3e/0x9b +[] apic_timer_interrupt+0x6a/0x70 + [] ? cpuidle_enter_state+0x4c/0xc0 +[] cpuidle_idle_call+0xd8/0x2d0 +[] arch_cpu_idle+0xe/0x30 +[] cpu_startup_entry+0x19e/0x310 +[] start_secondary+0x1ad/0x1b0 + +The clock_was_set_delayed is called in hard IRQ handler (timer interrupt), which +calls schedule_work. + +Under PREEMPT_RT_FULL, schedule_work calls spinlocks which could sleep, so it's +not safe to call schedule_work in interrupt context. + +Reference upstream commit b68d61c705ef02384c0538b8d9374545097899ca +(rt,ntp: Move call to schedule_delayed_work() to helper thread) +from git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git, which +makes a similar change. + +Signed-off-by: Yang Shi +[bigeasy: use swork_queue() instead a helper thread] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/hrtimer.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 1fd5ec39e7f4..9f3412acdb16 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -730,6 +730,29 @@ static void hrtimer_switch_to_hres(void) + retrigger_next_event(NULL); + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ ++static struct swork_event clock_set_delay_work; ++ ++static void run_clock_set_delay(struct swork_event *event) ++{ ++ clock_was_set(); ++} ++ ++void clock_was_set_delayed(void) ++{ ++ swork_queue(&clock_set_delay_work); ++} ++ ++static __init int create_clock_set_delay_thread(void) ++{ ++ WARN_ON(swork_get()); ++ INIT_SWORK(&clock_set_delay_work, run_clock_set_delay); ++ return 0; ++} ++early_initcall(create_clock_set_delay_thread); ++#else /* PREEMPT_RT_FULL */ ++ + static void clock_was_set_work(struct work_struct *work) + { + clock_was_set(); +@@ -745,6 +768,7 @@ void clock_was_set_delayed(void) + { + schedule_work(&hrtimer_work); + } ++#endif + + #else + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0102-sched-fair-Make-the-hrtimers-non-hard-again.patch linux-4.19.118/debian/patches-rt/0102-sched-fair-Make-the-hrtimers-non-hard-again.patch --- linux-4.19.98/debian/patches-rt/0102-sched-fair-Make-the-hrtimers-non-hard-again.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0102-sched-fair-Make-the-hrtimers-non-hard-again.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -From 1f9048fd4cb26be3c10ac92b6c9b2e90d5005888 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 8 Jan 2019 12:31:06 +0100 -Subject: [PATCH 102/290] sched/fair: Make the hrtimers non-hard again -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Since commit "sched/fair: Robustify CFS-bandwidth timer locking" both -hrtimer can run in softirq context because now interrupts are disabled -as part of the locking procedure. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/sched/fair.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c -index 21cf60c360e8..6e6d9e999814 100644 ---- a/kernel/sched/fair.c -+++ b/kernel/sched/fair.c -@@ -4914,9 +4914,9 @@ void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) - cfs_b->period = ns_to_ktime(default_cfs_period()); - - INIT_LIST_HEAD(&cfs_b->throttled_cfs_rq); -- hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD); -+ hrtimer_init(&cfs_b->period_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED); - cfs_b->period_timer.function = sched_cfs_period_timer; -- hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); -+ hrtimer_init(&cfs_b->slack_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - cfs_b->slack_timer.function = sched_cfs_slack_timer; - cfs_b->distribute_running = 0; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0103-hrtimer-Move-schedule_work-call-to-helper-thread.patch linux-4.19.118/debian/patches-rt/0103-hrtimer-Move-schedule_work-call-to-helper-thread.patch --- linux-4.19.98/debian/patches-rt/0103-hrtimer-Move-schedule_work-call-to-helper-thread.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0103-hrtimer-Move-schedule_work-call-to-helper-thread.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -From 1669cbc2eb152b7ae7f94cb966fbfd888a191cc8 Mon Sep 17 00:00:00 2001 -From: Yang Shi -Date: Mon, 16 Sep 2013 14:09:19 -0700 -Subject: [PATCH 103/290] hrtimer: Move schedule_work call to helper thread -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -When run ltp leapsec_timer test, the following call trace is caught: - -BUG: sleeping function called from invalid context at kernel/rtmutex.c:659 -in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/1 -Preemption disabled at:[] cpu_startup_entry+0x133/0x310 - -CPU: 1 PID: 0 Comm: swapper/1 Not tainted 3.10.10-rt3 #2 -Hardware name: Intel Corporation Calpella platform/MATXM-CORE-411-B, BIOS 4.6.3 08/18/2010 -ffffffff81c2f800 ffff880076843e40 ffffffff8169918d ffff880076843e58 -ffffffff8106db31 ffff88007684b4a0 ffff880076843e70 ffffffff8169d9c0 -ffff88007684b4a0 ffff880076843eb0 ffffffff81059da1 0000001876851200 -Call Trace: - [] dump_stack+0x19/0x1b -[] __might_sleep+0xf1/0x170 -[] rt_spin_lock+0x20/0x50 -[] queue_work_on+0x61/0x100 -[] clock_was_set_delayed+0x21/0x30 -[] do_timer+0x40e/0x660 -[] tick_do_update_jiffies64+0xf7/0x140 -[] tick_check_idle+0x92/0xc0 -[] irq_enter+0x57/0x70 -[] smp_apic_timer_interrupt+0x3e/0x9b -[] apic_timer_interrupt+0x6a/0x70 - [] ? cpuidle_enter_state+0x4c/0xc0 -[] cpuidle_idle_call+0xd8/0x2d0 -[] arch_cpu_idle+0xe/0x30 -[] cpu_startup_entry+0x19e/0x310 -[] start_secondary+0x1ad/0x1b0 - -The clock_was_set_delayed is called in hard IRQ handler (timer interrupt), which -calls schedule_work. - -Under PREEMPT_RT_FULL, schedule_work calls spinlocks which could sleep, so it's -not safe to call schedule_work in interrupt context. - -Reference upstream commit b68d61c705ef02384c0538b8d9374545097899ca -(rt,ntp: Move call to schedule_delayed_work() to helper thread) -from git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git, which -makes a similar change. - -Signed-off-by: Yang Shi -[bigeasy: use swork_queue() instead a helper thread] -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/time/hrtimer.c | 24 ++++++++++++++++++++++++ - 1 file changed, 24 insertions(+) - -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 1fd5ec39e7f4..9f3412acdb16 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -730,6 +730,29 @@ static void hrtimer_switch_to_hres(void) - retrigger_next_event(NULL); - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ -+static struct swork_event clock_set_delay_work; -+ -+static void run_clock_set_delay(struct swork_event *event) -+{ -+ clock_was_set(); -+} -+ -+void clock_was_set_delayed(void) -+{ -+ swork_queue(&clock_set_delay_work); -+} -+ -+static __init int create_clock_set_delay_thread(void) -+{ -+ WARN_ON(swork_get()); -+ INIT_SWORK(&clock_set_delay_work, run_clock_set_delay); -+ return 0; -+} -+early_initcall(create_clock_set_delay_thread); -+#else /* PREEMPT_RT_FULL */ -+ - static void clock_was_set_work(struct work_struct *work) - { - clock_was_set(); -@@ -745,6 +768,7 @@ void clock_was_set_delayed(void) - { - schedule_work(&hrtimer_work); - } -+#endif - - #else - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0103-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch linux-4.19.118/debian/patches-rt/0103-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch --- linux-4.19.98/debian/patches-rt/0103-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0103-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,51 @@ +From 6b0b0a70d8daac88d3492deb4dfa74c7e232fa8e Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 6 Dec 2018 10:15:13 +0100 +Subject: [PATCH 103/325] hrtimer: move state change before hrtimer_cancel in + do_nanosleep() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +There is a small window between setting t->task to NULL and waking the +task up (which would set TASK_RUNNING). So the timer would fire, run and +set ->task to NULL while the other side/do_nanosleep() wouldn't enter +freezable_schedule(). After all we are peemptible here (in +do_nanosleep() and on the timer wake up path) and on KVM/virt the +virt-CPU might get preempted. +So do_nanosleep() wouldn't enter freezable_schedule() but cancel the +timer which is still running and wait for it via +hrtimer_wait_for_timer(). Then wait_event()/might_sleep() would complain +that it is invoked with state != TASK_RUNNING. +This isn't a problem since it would be reset to TASK_RUNNING later +anyway and we don't rely on the previous state. + +Move the state update to TASK_RUNNING before hrtimer_cancel() so there +are no complains from might_sleep() about wrong state. + +Cc: stable-rt@vger.kernel.org +Reviewed-by: Daniel Bristot de Oliveira +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/hrtimer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 9f3412acdb16..b800efb64238 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -1788,12 +1788,12 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod + if (likely(t->task)) + freezable_schedule(); + ++ __set_current_state(TASK_RUNNING); + hrtimer_cancel(&t->timer); + mode = HRTIMER_MODE_ABS; + + } while (t->task && !signal_pending(current)); + +- __set_current_state(TASK_RUNNING); + + if (!t->task) + return 0; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0104-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch linux-4.19.118/debian/patches-rt/0104-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch --- linux-4.19.98/debian/patches-rt/0104-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0104-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -From b62f8583e5a6a8a86192ed4bc3cef3e923f295d0 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 6 Dec 2018 10:15:13 +0100 -Subject: [PATCH 104/290] hrtimer: move state change before hrtimer_cancel in - do_nanosleep() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -There is a small window between setting t->task to NULL and waking the -task up (which would set TASK_RUNNING). So the timer would fire, run and -set ->task to NULL while the other side/do_nanosleep() wouldn't enter -freezable_schedule(). After all we are peemptible here (in -do_nanosleep() and on the timer wake up path) and on KVM/virt the -virt-CPU might get preempted. -So do_nanosleep() wouldn't enter freezable_schedule() but cancel the -timer which is still running and wait for it via -hrtimer_wait_for_timer(). Then wait_event()/might_sleep() would complain -that it is invoked with state != TASK_RUNNING. -This isn't a problem since it would be reset to TASK_RUNNING later -anyway and we don't rely on the previous state. - -Move the state update to TASK_RUNNING before hrtimer_cancel() so there -are no complains from might_sleep() about wrong state. - -Cc: stable-rt@vger.kernel.org -Reviewed-by: Daniel Bristot de Oliveira -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/time/hrtimer.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 9f3412acdb16..b800efb64238 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -1788,12 +1788,12 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod - if (likely(t->task)) - freezable_schedule(); - -+ __set_current_state(TASK_RUNNING); - hrtimer_cancel(&t->timer); - mode = HRTIMER_MODE_ABS; - - } while (t->task && !signal_pending(current)); - -- __set_current_state(TASK_RUNNING); - - if (!t->task) - return 0; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0104-posix-timers-Thread-posix-cpu-timers-on-rt.patch linux-4.19.118/debian/patches-rt/0104-posix-timers-Thread-posix-cpu-timers-on-rt.patch --- linux-4.19.98/debian/patches-rt/0104-posix-timers-Thread-posix-cpu-timers-on-rt.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0104-posix-timers-Thread-posix-cpu-timers-on-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,269 @@ +From 60c7b398c11f739be117b6e30a9b09f615e406a0 Mon Sep 17 00:00:00 2001 +From: John Stultz +Date: Fri, 3 Jul 2009 08:29:58 -0500 +Subject: [PATCH 104/325] posix-timers: Thread posix-cpu-timers on -rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +posix-cpu-timer code takes non -rt safe locks in hard irq +context. Move it to a thread. + +[ 3.0 fixes from Peter Zijlstra ] + +Signed-off-by: John Stultz +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 3 + + init/init_task.c | 7 ++ + kernel/fork.c | 3 + + kernel/time/posix-cpu-timers.c | 154 ++++++++++++++++++++++++++++++++- + 4 files changed, 164 insertions(+), 3 deletions(-) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index e4af260f81c5..a90b6be626cd 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -832,6 +832,9 @@ struct task_struct { + #ifdef CONFIG_POSIX_TIMERS + struct task_cputime cputime_expires; + struct list_head cpu_timers[3]; ++#ifdef CONFIG_PREEMPT_RT_BASE ++ struct task_struct *posix_timer_list; ++#endif + #endif + + /* Process credentials: */ +diff --git a/init/init_task.c b/init/init_task.c +index 0b49b9cf5571..9e3362748214 100644 +--- a/init/init_task.c ++++ b/init/init_task.c +@@ -50,6 +50,12 @@ static struct sighand_struct init_sighand = { + .signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(init_sighand.signalfd_wqh), + }; + ++#if defined(CONFIG_POSIX_TIMERS) && defined(CONFIG_PREEMPT_RT_BASE) ++# define INIT_TIMER_LIST .posix_timer_list = NULL, ++#else ++# define INIT_TIMER_LIST ++#endif ++ + /* + * Set up the first task table, touch at your own risk!. Base=0, + * limit=0x1fffff (=2MB) +@@ -119,6 +125,7 @@ struct task_struct init_task + INIT_CPU_TIMERS(init_task) + .pi_lock = __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock), + .timer_slack_ns = 50000, /* 50 usec default slack */ ++ INIT_TIMER_LIST + .thread_pid = &init_struct_pid, + .thread_group = LIST_HEAD_INIT(init_task.thread_group), + .thread_node = LIST_HEAD_INIT(init_signals.thread_head), +diff --git a/kernel/fork.c b/kernel/fork.c +index bc182d6fa2a9..ccfcd44a370f 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -1590,6 +1590,9 @@ static void rt_mutex_init_task(struct task_struct *p) + */ + static void posix_cpu_timers_init(struct task_struct *tsk) + { ++#ifdef CONFIG_PREEMPT_RT_BASE ++ tsk->posix_timer_list = NULL; ++#endif + tsk->cputime_expires.prof_exp = 0; + tsk->cputime_expires.virt_exp = 0; + tsk->cputime_expires.sched_exp = 0; +diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c +index d62d7ae5201c..8d95e8de98b2 100644 +--- a/kernel/time/posix-cpu-timers.c ++++ b/kernel/time/posix-cpu-timers.c +@@ -3,8 +3,10 @@ + * Implement CPU time clocks for the POSIX clock interface. + */ + ++#include + #include + #include ++#include + #include + #include + #include +@@ -15,6 +17,7 @@ + #include + #include + #include ++#include + + #include "posix-timers.h" + +@@ -1140,14 +1143,12 @@ static inline int fastpath_timer_check(struct task_struct *tsk) + * already updated our counts. We need to check if any timers fire now. + * Interrupts are disabled. + */ +-void run_posix_cpu_timers(struct task_struct *tsk) ++static void __run_posix_cpu_timers(struct task_struct *tsk) + { + LIST_HEAD(firing); + struct k_itimer *timer, *next; + unsigned long flags; + +- lockdep_assert_irqs_disabled(); +- + /* + * The fast path checks that there are no expired thread or thread + * group timers. If that's so, just return. +@@ -1200,6 +1201,153 @@ void run_posix_cpu_timers(struct task_struct *tsk) + } + } + ++#ifdef CONFIG_PREEMPT_RT_BASE ++#include ++#include ++DEFINE_PER_CPU(struct task_struct *, posix_timer_task); ++DEFINE_PER_CPU(struct task_struct *, posix_timer_tasklist); ++DEFINE_PER_CPU(bool, posix_timer_th_active); ++ ++static void posix_cpu_kthread_fn(unsigned int cpu) ++{ ++ struct task_struct *tsk = NULL; ++ struct task_struct *next = NULL; ++ ++ BUG_ON(per_cpu(posix_timer_task, cpu) != current); ++ ++ /* grab task list */ ++ raw_local_irq_disable(); ++ tsk = per_cpu(posix_timer_tasklist, cpu); ++ per_cpu(posix_timer_tasklist, cpu) = NULL; ++ raw_local_irq_enable(); ++ ++ /* its possible the list is empty, just return */ ++ if (!tsk) ++ return; ++ ++ /* Process task list */ ++ while (1) { ++ /* save next */ ++ next = tsk->posix_timer_list; ++ ++ /* run the task timers, clear its ptr and ++ * unreference it ++ */ ++ __run_posix_cpu_timers(tsk); ++ tsk->posix_timer_list = NULL; ++ put_task_struct(tsk); ++ ++ /* check if this is the last on the list */ ++ if (next == tsk) ++ break; ++ tsk = next; ++ } ++} ++ ++static inline int __fastpath_timer_check(struct task_struct *tsk) ++{ ++ /* tsk == current, ensure it is safe to use ->signal/sighand */ ++ if (unlikely(tsk->exit_state)) ++ return 0; ++ ++ if (!task_cputime_zero(&tsk->cputime_expires)) ++ return 1; ++ ++ if (!task_cputime_zero(&tsk->signal->cputime_expires)) ++ return 1; ++ ++ return 0; ++} ++ ++void run_posix_cpu_timers(struct task_struct *tsk) ++{ ++ unsigned int cpu = smp_processor_id(); ++ struct task_struct *tasklist; ++ ++ BUG_ON(!irqs_disabled()); ++ ++ if (per_cpu(posix_timer_th_active, cpu) != true) ++ return; ++ ++ /* get per-cpu references */ ++ tasklist = per_cpu(posix_timer_tasklist, cpu); ++ ++ /* check to see if we're already queued */ ++ if (!tsk->posix_timer_list && __fastpath_timer_check(tsk)) { ++ get_task_struct(tsk); ++ if (tasklist) { ++ tsk->posix_timer_list = tasklist; ++ } else { ++ /* ++ * The list is terminated by a self-pointing ++ * task_struct ++ */ ++ tsk->posix_timer_list = tsk; ++ } ++ per_cpu(posix_timer_tasklist, cpu) = tsk; ++ ++ wake_up_process(per_cpu(posix_timer_task, cpu)); ++ } ++} ++ ++static int posix_cpu_kthread_should_run(unsigned int cpu) ++{ ++ return __this_cpu_read(posix_timer_tasklist) != NULL; ++} ++ ++static void posix_cpu_kthread_park(unsigned int cpu) ++{ ++ this_cpu_write(posix_timer_th_active, false); ++} ++ ++static void posix_cpu_kthread_unpark(unsigned int cpu) ++{ ++ this_cpu_write(posix_timer_th_active, true); ++} ++ ++static void posix_cpu_kthread_setup(unsigned int cpu) ++{ ++ struct sched_param sp; ++ ++ sp.sched_priority = MAX_RT_PRIO - 1; ++ sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); ++ posix_cpu_kthread_unpark(cpu); ++} ++ ++static struct smp_hotplug_thread posix_cpu_thread = { ++ .store = &posix_timer_task, ++ .thread_should_run = posix_cpu_kthread_should_run, ++ .thread_fn = posix_cpu_kthread_fn, ++ .thread_comm = "posixcputmr/%u", ++ .setup = posix_cpu_kthread_setup, ++ .park = posix_cpu_kthread_park, ++ .unpark = posix_cpu_kthread_unpark, ++}; ++ ++static int __init posix_cpu_thread_init(void) ++{ ++ /* Start one for boot CPU. */ ++ unsigned long cpu; ++ int ret; ++ ++ /* init the per-cpu posix_timer_tasklets */ ++ for_each_possible_cpu(cpu) ++ per_cpu(posix_timer_tasklist, cpu) = NULL; ++ ++ ret = smpboot_register_percpu_thread(&posix_cpu_thread); ++ WARN_ON(ret); ++ ++ return 0; ++} ++early_initcall(posix_cpu_thread_init); ++#else /* CONFIG_PREEMPT_RT_BASE */ ++void run_posix_cpu_timers(struct task_struct *tsk) ++{ ++ lockdep_assert_irqs_disabled(); ++ __run_posix_cpu_timers(tsk); ++} ++#endif /* CONFIG_PREEMPT_RT_BASE */ ++ + /* + * Set one of the process-wide special case CPU timers or RLIMIT_CPU. + * The tsk->sighand->siglock must be held by the caller. +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0105-posix-timers-Thread-posix-cpu-timers-on-rt.patch linux-4.19.118/debian/patches-rt/0105-posix-timers-Thread-posix-cpu-timers-on-rt.patch --- linux-4.19.98/debian/patches-rt/0105-posix-timers-Thread-posix-cpu-timers-on-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0105-posix-timers-Thread-posix-cpu-timers-on-rt.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,269 +0,0 @@ -From e63ab953f4da79eb0d2767e029e61f4d8491f131 Mon Sep 17 00:00:00 2001 -From: John Stultz -Date: Fri, 3 Jul 2009 08:29:58 -0500 -Subject: [PATCH 105/290] posix-timers: Thread posix-cpu-timers on -rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -posix-cpu-timer code takes non -rt safe locks in hard irq -context. Move it to a thread. - -[ 3.0 fixes from Peter Zijlstra ] - -Signed-off-by: John Stultz -Signed-off-by: Thomas Gleixner ---- - include/linux/sched.h | 3 + - init/init_task.c | 7 ++ - kernel/fork.c | 3 + - kernel/time/posix-cpu-timers.c | 154 ++++++++++++++++++++++++++++++++- - 4 files changed, 164 insertions(+), 3 deletions(-) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index c87c11bfd9d9..ba37d39d5c6b 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -832,6 +832,9 @@ struct task_struct { - #ifdef CONFIG_POSIX_TIMERS - struct task_cputime cputime_expires; - struct list_head cpu_timers[3]; -+#ifdef CONFIG_PREEMPT_RT_BASE -+ struct task_struct *posix_timer_list; -+#endif - #endif - - /* Process credentials: */ -diff --git a/init/init_task.c b/init/init_task.c -index 0b49b9cf5571..9e3362748214 100644 ---- a/init/init_task.c -+++ b/init/init_task.c -@@ -50,6 +50,12 @@ static struct sighand_struct init_sighand = { - .signalfd_wqh = __WAIT_QUEUE_HEAD_INITIALIZER(init_sighand.signalfd_wqh), - }; - -+#if defined(CONFIG_POSIX_TIMERS) && defined(CONFIG_PREEMPT_RT_BASE) -+# define INIT_TIMER_LIST .posix_timer_list = NULL, -+#else -+# define INIT_TIMER_LIST -+#endif -+ - /* - * Set up the first task table, touch at your own risk!. Base=0, - * limit=0x1fffff (=2MB) -@@ -119,6 +125,7 @@ struct task_struct init_task - INIT_CPU_TIMERS(init_task) - .pi_lock = __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock), - .timer_slack_ns = 50000, /* 50 usec default slack */ -+ INIT_TIMER_LIST - .thread_pid = &init_struct_pid, - .thread_group = LIST_HEAD_INIT(init_task.thread_group), - .thread_node = LIST_HEAD_INIT(init_signals.thread_head), -diff --git a/kernel/fork.c b/kernel/fork.c -index 8c285876eb52..b3744a043f46 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -1580,6 +1580,9 @@ static void rt_mutex_init_task(struct task_struct *p) - */ - static void posix_cpu_timers_init(struct task_struct *tsk) - { -+#ifdef CONFIG_PREEMPT_RT_BASE -+ tsk->posix_timer_list = NULL; -+#endif - tsk->cputime_expires.prof_exp = 0; - tsk->cputime_expires.virt_exp = 0; - tsk->cputime_expires.sched_exp = 0; -diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c -index d62d7ae5201c..8d95e8de98b2 100644 ---- a/kernel/time/posix-cpu-timers.c -+++ b/kernel/time/posix-cpu-timers.c -@@ -3,8 +3,10 @@ - * Implement CPU time clocks for the POSIX clock interface. - */ - -+#include - #include - #include -+#include - #include - #include - #include -@@ -15,6 +17,7 @@ - #include - #include - #include -+#include - - #include "posix-timers.h" - -@@ -1140,14 +1143,12 @@ static inline int fastpath_timer_check(struct task_struct *tsk) - * already updated our counts. We need to check if any timers fire now. - * Interrupts are disabled. - */ --void run_posix_cpu_timers(struct task_struct *tsk) -+static void __run_posix_cpu_timers(struct task_struct *tsk) - { - LIST_HEAD(firing); - struct k_itimer *timer, *next; - unsigned long flags; - -- lockdep_assert_irqs_disabled(); -- - /* - * The fast path checks that there are no expired thread or thread - * group timers. If that's so, just return. -@@ -1200,6 +1201,153 @@ void run_posix_cpu_timers(struct task_struct *tsk) - } - } - -+#ifdef CONFIG_PREEMPT_RT_BASE -+#include -+#include -+DEFINE_PER_CPU(struct task_struct *, posix_timer_task); -+DEFINE_PER_CPU(struct task_struct *, posix_timer_tasklist); -+DEFINE_PER_CPU(bool, posix_timer_th_active); -+ -+static void posix_cpu_kthread_fn(unsigned int cpu) -+{ -+ struct task_struct *tsk = NULL; -+ struct task_struct *next = NULL; -+ -+ BUG_ON(per_cpu(posix_timer_task, cpu) != current); -+ -+ /* grab task list */ -+ raw_local_irq_disable(); -+ tsk = per_cpu(posix_timer_tasklist, cpu); -+ per_cpu(posix_timer_tasklist, cpu) = NULL; -+ raw_local_irq_enable(); -+ -+ /* its possible the list is empty, just return */ -+ if (!tsk) -+ return; -+ -+ /* Process task list */ -+ while (1) { -+ /* save next */ -+ next = tsk->posix_timer_list; -+ -+ /* run the task timers, clear its ptr and -+ * unreference it -+ */ -+ __run_posix_cpu_timers(tsk); -+ tsk->posix_timer_list = NULL; -+ put_task_struct(tsk); -+ -+ /* check if this is the last on the list */ -+ if (next == tsk) -+ break; -+ tsk = next; -+ } -+} -+ -+static inline int __fastpath_timer_check(struct task_struct *tsk) -+{ -+ /* tsk == current, ensure it is safe to use ->signal/sighand */ -+ if (unlikely(tsk->exit_state)) -+ return 0; -+ -+ if (!task_cputime_zero(&tsk->cputime_expires)) -+ return 1; -+ -+ if (!task_cputime_zero(&tsk->signal->cputime_expires)) -+ return 1; -+ -+ return 0; -+} -+ -+void run_posix_cpu_timers(struct task_struct *tsk) -+{ -+ unsigned int cpu = smp_processor_id(); -+ struct task_struct *tasklist; -+ -+ BUG_ON(!irqs_disabled()); -+ -+ if (per_cpu(posix_timer_th_active, cpu) != true) -+ return; -+ -+ /* get per-cpu references */ -+ tasklist = per_cpu(posix_timer_tasklist, cpu); -+ -+ /* check to see if we're already queued */ -+ if (!tsk->posix_timer_list && __fastpath_timer_check(tsk)) { -+ get_task_struct(tsk); -+ if (tasklist) { -+ tsk->posix_timer_list = tasklist; -+ } else { -+ /* -+ * The list is terminated by a self-pointing -+ * task_struct -+ */ -+ tsk->posix_timer_list = tsk; -+ } -+ per_cpu(posix_timer_tasklist, cpu) = tsk; -+ -+ wake_up_process(per_cpu(posix_timer_task, cpu)); -+ } -+} -+ -+static int posix_cpu_kthread_should_run(unsigned int cpu) -+{ -+ return __this_cpu_read(posix_timer_tasklist) != NULL; -+} -+ -+static void posix_cpu_kthread_park(unsigned int cpu) -+{ -+ this_cpu_write(posix_timer_th_active, false); -+} -+ -+static void posix_cpu_kthread_unpark(unsigned int cpu) -+{ -+ this_cpu_write(posix_timer_th_active, true); -+} -+ -+static void posix_cpu_kthread_setup(unsigned int cpu) -+{ -+ struct sched_param sp; -+ -+ sp.sched_priority = MAX_RT_PRIO - 1; -+ sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); -+ posix_cpu_kthread_unpark(cpu); -+} -+ -+static struct smp_hotplug_thread posix_cpu_thread = { -+ .store = &posix_timer_task, -+ .thread_should_run = posix_cpu_kthread_should_run, -+ .thread_fn = posix_cpu_kthread_fn, -+ .thread_comm = "posixcputmr/%u", -+ .setup = posix_cpu_kthread_setup, -+ .park = posix_cpu_kthread_park, -+ .unpark = posix_cpu_kthread_unpark, -+}; -+ -+static int __init posix_cpu_thread_init(void) -+{ -+ /* Start one for boot CPU. */ -+ unsigned long cpu; -+ int ret; -+ -+ /* init the per-cpu posix_timer_tasklets */ -+ for_each_possible_cpu(cpu) -+ per_cpu(posix_timer_tasklist, cpu) = NULL; -+ -+ ret = smpboot_register_percpu_thread(&posix_cpu_thread); -+ WARN_ON(ret); -+ -+ return 0; -+} -+early_initcall(posix_cpu_thread_init); -+#else /* CONFIG_PREEMPT_RT_BASE */ -+void run_posix_cpu_timers(struct task_struct *tsk) -+{ -+ lockdep_assert_irqs_disabled(); -+ __run_posix_cpu_timers(tsk); -+} -+#endif /* CONFIG_PREEMPT_RT_BASE */ -+ - /* - * Set one of the process-wide special case CPU timers or RLIMIT_CPU. - * The tsk->sighand->siglock must be held by the caller. --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0105-sched-Move-task_struct-cleanup-to-RCU.patch linux-4.19.118/debian/patches-rt/0105-sched-Move-task_struct-cleanup-to-RCU.patch --- linux-4.19.98/debian/patches-rt/0105-sched-Move-task_struct-cleanup-to-RCU.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0105-sched-Move-task_struct-cleanup-to-RCU.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,96 @@ +From 97846d957dd8a3d2b13c5095b2487c4977f0cb93 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 31 May 2011 16:59:16 +0200 +Subject: [PATCH 105/325] sched: Move task_struct cleanup to RCU +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +__put_task_struct() does quite some expensive work. We don't want to +burden random tasks with that. + +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 3 +++ + include/linux/sched/task.h | 11 ++++++++++- + kernel/fork.c | 15 ++++++++++++++- + 3 files changed, 27 insertions(+), 2 deletions(-) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index a90b6be626cd..0b8850b6093b 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1194,6 +1194,9 @@ struct task_struct { + unsigned int sequential_io; + unsigned int sequential_io_avg; + #endif ++#ifdef CONFIG_PREEMPT_RT_BASE ++ struct rcu_head put_rcu; ++#endif + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + unsigned long task_state_change; + #endif +diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h +index 44c6f15800ff..d2b33e57c636 100644 +--- a/include/linux/sched/task.h ++++ b/include/linux/sched/task.h +@@ -90,6 +90,15 @@ extern void sched_exec(void); + + #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) + ++#ifdef CONFIG_PREEMPT_RT_BASE ++extern void __put_task_struct_cb(struct rcu_head *rhp); ++ ++static inline void put_task_struct(struct task_struct *t) ++{ ++ if (atomic_dec_and_test(&t->usage)) ++ call_rcu(&t->put_rcu, __put_task_struct_cb); ++} ++#else + extern void __put_task_struct(struct task_struct *t); + + static inline void put_task_struct(struct task_struct *t) +@@ -97,7 +106,7 @@ static inline void put_task_struct(struct task_struct *t) + if (atomic_dec_and_test(&t->usage)) + __put_task_struct(t); + } +- ++#endif + struct task_struct *task_rcu_dereference(struct task_struct **ptask); + + #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT +diff --git a/kernel/fork.c b/kernel/fork.c +index ccfcd44a370f..309f4a20d4ac 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -676,7 +676,9 @@ static inline void put_signal_struct(struct signal_struct *sig) + if (atomic_dec_and_test(&sig->sigcnt)) + free_signal_struct(sig); + } +- ++#ifdef CONFIG_PREEMPT_RT_BASE ++static ++#endif + void __put_task_struct(struct task_struct *tsk) + { + WARN_ON(!tsk->exit_state); +@@ -693,7 +695,18 @@ void __put_task_struct(struct task_struct *tsk) + if (!profile_handoff_task(tsk)) + free_task(tsk); + } ++#ifndef CONFIG_PREEMPT_RT_BASE + EXPORT_SYMBOL_GPL(__put_task_struct); ++#else ++void __put_task_struct_cb(struct rcu_head *rhp) ++{ ++ struct task_struct *tsk = container_of(rhp, struct task_struct, put_rcu); ++ ++ __put_task_struct(tsk); ++ ++} ++EXPORT_SYMBOL_GPL(__put_task_struct_cb); ++#endif + + void __init __weak arch_task_cache_init(void) { } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0106-sched-Limit-the-number-of-task-migrations-per-batch.patch linux-4.19.118/debian/patches-rt/0106-sched-Limit-the-number-of-task-migrations-per-batch.patch --- linux-4.19.98/debian/patches-rt/0106-sched-Limit-the-number-of-task-migrations-per-batch.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0106-sched-Limit-the-number-of-task-migrations-per-batch.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,33 @@ +From f7d8e7c485e3b32f915bfdf26698b947abaeaf10 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Mon, 6 Jun 2011 12:12:51 +0200 +Subject: [PATCH 106/325] sched: Limit the number of task migrations per batch +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Put an upper limit on the number of tasks which are migrated per batch +to avoid large latencies. + +Signed-off-by: Thomas Gleixner +--- + kernel/sched/core.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 2f6b4365d070..5c23d1272429 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -44,7 +44,11 @@ const_debug unsigned int sysctl_sched_features = + * Number of tasks to iterate in a single balance run. + * Limited because this is done with IRQs disabled. + */ ++#ifdef CONFIG_PREEMPT_RT_FULL ++const_debug unsigned int sysctl_sched_nr_migrate = 8; ++#else + const_debug unsigned int sysctl_sched_nr_migrate = 32; ++#endif + + /* + * period over which we measure -rt task CPU usage in us. +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0106-sched-Move-task_struct-cleanup-to-RCU.patch linux-4.19.118/debian/patches-rt/0106-sched-Move-task_struct-cleanup-to-RCU.patch --- linux-4.19.98/debian/patches-rt/0106-sched-Move-task_struct-cleanup-to-RCU.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0106-sched-Move-task_struct-cleanup-to-RCU.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -From 64754a230b30e0beeda510f8a0dfcf82075166a7 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 31 May 2011 16:59:16 +0200 -Subject: [PATCH 106/290] sched: Move task_struct cleanup to RCU -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -__put_task_struct() does quite some expensive work. We don't want to -burden random tasks with that. - -Signed-off-by: Thomas Gleixner ---- - include/linux/sched.h | 3 +++ - include/linux/sched/task.h | 11 ++++++++++- - kernel/fork.c | 15 ++++++++++++++- - 3 files changed, 27 insertions(+), 2 deletions(-) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index ba37d39d5c6b..a1ef00db6baa 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1194,6 +1194,9 @@ struct task_struct { - unsigned int sequential_io; - unsigned int sequential_io_avg; - #endif -+#ifdef CONFIG_PREEMPT_RT_BASE -+ struct rcu_head put_rcu; -+#endif - #ifdef CONFIG_DEBUG_ATOMIC_SLEEP - unsigned long task_state_change; - #endif -diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h -index 44c6f15800ff..d2b33e57c636 100644 ---- a/include/linux/sched/task.h -+++ b/include/linux/sched/task.h -@@ -90,6 +90,15 @@ extern void sched_exec(void); - - #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0) - -+#ifdef CONFIG_PREEMPT_RT_BASE -+extern void __put_task_struct_cb(struct rcu_head *rhp); -+ -+static inline void put_task_struct(struct task_struct *t) -+{ -+ if (atomic_dec_and_test(&t->usage)) -+ call_rcu(&t->put_rcu, __put_task_struct_cb); -+} -+#else - extern void __put_task_struct(struct task_struct *t); - - static inline void put_task_struct(struct task_struct *t) -@@ -97,7 +106,7 @@ static inline void put_task_struct(struct task_struct *t) - if (atomic_dec_and_test(&t->usage)) - __put_task_struct(t); - } -- -+#endif - struct task_struct *task_rcu_dereference(struct task_struct **ptask); - - #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT -diff --git a/kernel/fork.c b/kernel/fork.c -index b3744a043f46..4b85282d9a07 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -666,7 +666,9 @@ static inline void put_signal_struct(struct signal_struct *sig) - if (atomic_dec_and_test(&sig->sigcnt)) - free_signal_struct(sig); - } -- -+#ifdef CONFIG_PREEMPT_RT_BASE -+static -+#endif - void __put_task_struct(struct task_struct *tsk) - { - WARN_ON(!tsk->exit_state); -@@ -683,7 +685,18 @@ void __put_task_struct(struct task_struct *tsk) - if (!profile_handoff_task(tsk)) - free_task(tsk); - } -+#ifndef CONFIG_PREEMPT_RT_BASE - EXPORT_SYMBOL_GPL(__put_task_struct); -+#else -+void __put_task_struct_cb(struct rcu_head *rhp) -+{ -+ struct task_struct *tsk = container_of(rhp, struct task_struct, put_rcu); -+ -+ __put_task_struct(tsk); -+ -+} -+EXPORT_SYMBOL_GPL(__put_task_struct_cb); -+#endif - - void __init __weak arch_task_cache_init(void) { } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0107-sched-Limit-the-number-of-task-migrations-per-batch.patch linux-4.19.118/debian/patches-rt/0107-sched-Limit-the-number-of-task-migrations-per-batch.patch --- linux-4.19.98/debian/patches-rt/0107-sched-Limit-the-number-of-task-migrations-per-batch.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0107-sched-Limit-the-number-of-task-migrations-per-batch.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -From 5d814c2f67298a28fc845d4444a083e1438c621a Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Mon, 6 Jun 2011 12:12:51 +0200 -Subject: [PATCH 107/290] sched: Limit the number of task migrations per batch -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Put an upper limit on the number of tasks which are migrated per batch -to avoid large latencies. - -Signed-off-by: Thomas Gleixner ---- - kernel/sched/core.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 2f6b4365d070..5c23d1272429 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -44,7 +44,11 @@ const_debug unsigned int sysctl_sched_features = - * Number of tasks to iterate in a single balance run. - * Limited because this is done with IRQs disabled. - */ -+#ifdef CONFIG_PREEMPT_RT_FULL -+const_debug unsigned int sysctl_sched_nr_migrate = 8; -+#else - const_debug unsigned int sysctl_sched_nr_migrate = 32; -+#endif - - /* - * period over which we measure -rt task CPU usage in us. --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0107-sched-Move-mmdrop-to-RCU-on-RT.patch linux-4.19.118/debian/patches-rt/0107-sched-Move-mmdrop-to-RCU-on-RT.patch --- linux-4.19.98/debian/patches-rt/0107-sched-Move-mmdrop-to-RCU-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0107-sched-Move-mmdrop-to-RCU-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,140 @@ +From 9d712d36877d0b56524f63fc76ae36ecfc75ec1e Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Mon, 6 Jun 2011 12:20:33 +0200 +Subject: [PATCH 107/325] sched: Move mmdrop to RCU on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Takes sleeping locks and calls into the memory allocator, so nothing +we want to do in task switch and oder atomic contexts. + +Signed-off-by: Thomas Gleixner +--- + include/linux/mm_types.h | 4 ++++ + include/linux/sched/mm.h | 11 +++++++++++ + kernel/fork.c | 13 +++++++++++++ + kernel/sched/core.c | 18 ++++++++++++++++-- + 4 files changed, 44 insertions(+), 2 deletions(-) + +diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h +index 3a9a996af229..202b736ccbfa 100644 +--- a/include/linux/mm_types.h ++++ b/include/linux/mm_types.h +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -487,6 +488,9 @@ struct mm_struct { + bool tlb_flush_batched; + #endif + struct uprobes_state uprobes_state; ++#ifdef CONFIG_PREEMPT_RT_BASE ++ struct rcu_head delayed_drop; ++#endif + #ifdef CONFIG_HUGETLB_PAGE + atomic_long_t hugetlb_usage; + #endif +diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h +index e9d4e389aed9..fb59f96fdd2e 100644 +--- a/include/linux/sched/mm.h ++++ b/include/linux/sched/mm.h +@@ -49,6 +49,17 @@ static inline void mmdrop(struct mm_struct *mm) + __mmdrop(mm); + } + ++#ifdef CONFIG_PREEMPT_RT_BASE ++extern void __mmdrop_delayed(struct rcu_head *rhp); ++static inline void mmdrop_delayed(struct mm_struct *mm) ++{ ++ if (atomic_dec_and_test(&mm->mm_count)) ++ call_rcu(&mm->delayed_drop, __mmdrop_delayed); ++} ++#else ++# define mmdrop_delayed(mm) mmdrop(mm) ++#endif ++ + /* + * This has to be called after a get_task_mm()/mmget_not_zero() + * followed by taking the mmap_sem for writing before modifying the +diff --git a/kernel/fork.c b/kernel/fork.c +index 309f4a20d4ac..d4ec53c72577 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -642,6 +642,19 @@ void __mmdrop(struct mm_struct *mm) + } + EXPORT_SYMBOL_GPL(__mmdrop); + ++#ifdef CONFIG_PREEMPT_RT_BASE ++/* ++ * RCU callback for delayed mm drop. Not strictly rcu, but we don't ++ * want another facility to make this work. ++ */ ++void __mmdrop_delayed(struct rcu_head *rhp) ++{ ++ struct mm_struct *mm = container_of(rhp, struct mm_struct, delayed_drop); ++ ++ __mmdrop(mm); ++} ++#endif ++ + static void mmdrop_async_fn(struct work_struct *work) + { + struct mm_struct *mm; +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 5c23d1272429..cb89c90513dd 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -2729,9 +2729,13 @@ static struct rq *finish_task_switch(struct task_struct *prev) + * provided by mmdrop(), + * - a sync_core for SYNC_CORE. + */ ++ /* ++ * We use mmdrop_delayed() here so we don't have to do the ++ * full __mmdrop() when we are the last user. ++ */ + if (mm) { + membarrier_mm_sync_core_before_usermode(mm); +- mmdrop(mm); ++ mmdrop_delayed(mm); + } + if (unlikely(prev_state == TASK_DEAD)) { + if (prev->sched_class->task_dead) +@@ -5601,6 +5605,8 @@ void sched_setnuma(struct task_struct *p, int nid) + #endif /* CONFIG_NUMA_BALANCING */ + + #ifdef CONFIG_HOTPLUG_CPU ++static DEFINE_PER_CPU(struct mm_struct *, idle_last_mm); ++ + /* + * Ensure that the idle task is using init_mm right before its CPU goes + * offline. +@@ -5616,7 +5622,11 @@ void idle_task_exit(void) + current->active_mm = &init_mm; + finish_arch_post_lock_switch(); + } +- mmdrop(mm); ++ /* ++ * Defer the cleanup to an alive cpu. On RT we can neither ++ * call mmdrop() nor mmdrop_delayed() from here. ++ */ ++ per_cpu(idle_last_mm, smp_processor_id()) = mm; + } + + /* +@@ -5928,6 +5938,10 @@ int sched_cpu_dying(unsigned int cpu) + update_max_interval(); + nohz_balance_exit_idle(rq); + hrtick_clear(rq); ++ if (per_cpu(idle_last_mm, cpu)) { ++ mmdrop_delayed(per_cpu(idle_last_mm, cpu)); ++ per_cpu(idle_last_mm, cpu) = NULL; ++ } + return 0; + } + #endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0108-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch linux-4.19.118/debian/patches-rt/0108-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch --- linux-4.19.98/debian/patches-rt/0108-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0108-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,70 @@ +From 93d5750f6bd9a39e9e4de3773c7ab669b446e214 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 21 Nov 2016 19:31:08 +0100 +Subject: [PATCH 108/325] kernel/sched: move stack + kprobe clean up to + __put_task_struct() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +There is no need to free the stack before the task struct (except for reasons +mentioned in commit 68f24b08ee89 ("sched/core: Free the stack early if +CONFIG_THREAD_INFO_IN_TASK")). This also comes handy on -RT because we can't +free memory in preempt disabled region. + +Cc: stable-rt@vger.kernel.org #for kprobe_flush_task() +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/fork.c | 10 ++++++++++ + kernel/sched/core.c | 9 --------- + 2 files changed, 10 insertions(+), 9 deletions(-) + +diff --git a/kernel/fork.c b/kernel/fork.c +index d4ec53c72577..29b54a64daf5 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -698,6 +699,15 @@ void __put_task_struct(struct task_struct *tsk) + WARN_ON(atomic_read(&tsk->usage)); + WARN_ON(tsk == current); + ++ /* ++ * Remove function-return probe instances associated with this ++ * task and put them back on the free list. ++ */ ++ kprobe_flush_task(tsk); ++ ++ /* Task is done with its stack. */ ++ put_task_stack(tsk); ++ + cgroup_free(tsk); + task_numa_free(tsk, true); + security_task_free(tsk); +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index cb89c90513dd..79e0d052e848 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -2741,15 +2741,6 @@ static struct rq *finish_task_switch(struct task_struct *prev) + if (prev->sched_class->task_dead) + prev->sched_class->task_dead(prev); + +- /* +- * Remove function-return probe instances associated with this +- * task and put them back on the free list. +- */ +- kprobe_flush_task(prev); +- +- /* Task is done with its stack. */ +- put_task_stack(prev); +- + put_task_struct(prev); + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0108-sched-Move-mmdrop-to-RCU-on-RT.patch linux-4.19.118/debian/patches-rt/0108-sched-Move-mmdrop-to-RCU-on-RT.patch --- linux-4.19.98/debian/patches-rt/0108-sched-Move-mmdrop-to-RCU-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0108-sched-Move-mmdrop-to-RCU-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,140 +0,0 @@ -From 265373d21c09c71609a28e9412050091f086ffd0 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Mon, 6 Jun 2011 12:20:33 +0200 -Subject: [PATCH 108/290] sched: Move mmdrop to RCU on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Takes sleeping locks and calls into the memory allocator, so nothing -we want to do in task switch and oder atomic contexts. - -Signed-off-by: Thomas Gleixner ---- - include/linux/mm_types.h | 4 ++++ - include/linux/sched/mm.h | 11 +++++++++++ - kernel/fork.c | 13 +++++++++++++ - kernel/sched/core.c | 18 ++++++++++++++++-- - 4 files changed, 44 insertions(+), 2 deletions(-) - -diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h -index 3a9a996af229..202b736ccbfa 100644 ---- a/include/linux/mm_types.h -+++ b/include/linux/mm_types.h -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -487,6 +488,9 @@ struct mm_struct { - bool tlb_flush_batched; - #endif - struct uprobes_state uprobes_state; -+#ifdef CONFIG_PREEMPT_RT_BASE -+ struct rcu_head delayed_drop; -+#endif - #ifdef CONFIG_HUGETLB_PAGE - atomic_long_t hugetlb_usage; - #endif -diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h -index e9d4e389aed9..fb59f96fdd2e 100644 ---- a/include/linux/sched/mm.h -+++ b/include/linux/sched/mm.h -@@ -49,6 +49,17 @@ static inline void mmdrop(struct mm_struct *mm) - __mmdrop(mm); - } - -+#ifdef CONFIG_PREEMPT_RT_BASE -+extern void __mmdrop_delayed(struct rcu_head *rhp); -+static inline void mmdrop_delayed(struct mm_struct *mm) -+{ -+ if (atomic_dec_and_test(&mm->mm_count)) -+ call_rcu(&mm->delayed_drop, __mmdrop_delayed); -+} -+#else -+# define mmdrop_delayed(mm) mmdrop(mm) -+#endif -+ - /* - * This has to be called after a get_task_mm()/mmget_not_zero() - * followed by taking the mmap_sem for writing before modifying the -diff --git a/kernel/fork.c b/kernel/fork.c -index 4b85282d9a07..e05834c2420c 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -632,6 +632,19 @@ void __mmdrop(struct mm_struct *mm) - } - EXPORT_SYMBOL_GPL(__mmdrop); - -+#ifdef CONFIG_PREEMPT_RT_BASE -+/* -+ * RCU callback for delayed mm drop. Not strictly rcu, but we don't -+ * want another facility to make this work. -+ */ -+void __mmdrop_delayed(struct rcu_head *rhp) -+{ -+ struct mm_struct *mm = container_of(rhp, struct mm_struct, delayed_drop); -+ -+ __mmdrop(mm); -+} -+#endif -+ - static void mmdrop_async_fn(struct work_struct *work) - { - struct mm_struct *mm; -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 5c23d1272429..cb89c90513dd 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -2729,9 +2729,13 @@ static struct rq *finish_task_switch(struct task_struct *prev) - * provided by mmdrop(), - * - a sync_core for SYNC_CORE. - */ -+ /* -+ * We use mmdrop_delayed() here so we don't have to do the -+ * full __mmdrop() when we are the last user. -+ */ - if (mm) { - membarrier_mm_sync_core_before_usermode(mm); -- mmdrop(mm); -+ mmdrop_delayed(mm); - } - if (unlikely(prev_state == TASK_DEAD)) { - if (prev->sched_class->task_dead) -@@ -5601,6 +5605,8 @@ void sched_setnuma(struct task_struct *p, int nid) - #endif /* CONFIG_NUMA_BALANCING */ - - #ifdef CONFIG_HOTPLUG_CPU -+static DEFINE_PER_CPU(struct mm_struct *, idle_last_mm); -+ - /* - * Ensure that the idle task is using init_mm right before its CPU goes - * offline. -@@ -5616,7 +5622,11 @@ void idle_task_exit(void) - current->active_mm = &init_mm; - finish_arch_post_lock_switch(); - } -- mmdrop(mm); -+ /* -+ * Defer the cleanup to an alive cpu. On RT we can neither -+ * call mmdrop() nor mmdrop_delayed() from here. -+ */ -+ per_cpu(idle_last_mm, smp_processor_id()) = mm; - } - - /* -@@ -5928,6 +5938,10 @@ int sched_cpu_dying(unsigned int cpu) - update_max_interval(); - nohz_balance_exit_idle(rq); - hrtick_clear(rq); -+ if (per_cpu(idle_last_mm, cpu)) { -+ mmdrop_delayed(per_cpu(idle_last_mm, cpu)); -+ per_cpu(idle_last_mm, cpu) = NULL; -+ } - return 0; - } - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0109-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch linux-4.19.118/debian/patches-rt/0109-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch --- linux-4.19.98/debian/patches-rt/0109-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0109-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -From ebf1a9a382707d58a0bba64660e90f2d9088d8f6 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 21 Nov 2016 19:31:08 +0100 -Subject: [PATCH 109/290] kernel/sched: move stack + kprobe clean up to - __put_task_struct() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -There is no need to free the stack before the task struct (except for reasons -mentioned in commit 68f24b08ee89 ("sched/core: Free the stack early if -CONFIG_THREAD_INFO_IN_TASK")). This also comes handy on -RT because we can't -free memory in preempt disabled region. - -Cc: stable-rt@vger.kernel.org #for kprobe_flush_task() -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/fork.c | 10 ++++++++++ - kernel/sched/core.c | 9 --------- - 2 files changed, 10 insertions(+), 9 deletions(-) - -diff --git a/kernel/fork.c b/kernel/fork.c -index e05834c2420c..a6f39cbb71c3 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -688,6 +689,15 @@ void __put_task_struct(struct task_struct *tsk) - WARN_ON(atomic_read(&tsk->usage)); - WARN_ON(tsk == current); - -+ /* -+ * Remove function-return probe instances associated with this -+ * task and put them back on the free list. -+ */ -+ kprobe_flush_task(tsk); -+ -+ /* Task is done with its stack. */ -+ put_task_stack(tsk); -+ - cgroup_free(tsk); - task_numa_free(tsk, true); - security_task_free(tsk); -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index cb89c90513dd..79e0d052e848 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -2741,15 +2741,6 @@ static struct rq *finish_task_switch(struct task_struct *prev) - if (prev->sched_class->task_dead) - prev->sched_class->task_dead(prev); - -- /* -- * Remove function-return probe instances associated with this -- * task and put them back on the free list. -- */ -- kprobe_flush_task(prev); -- -- /* Task is done with its stack. */ -- put_task_stack(prev); -- - put_task_struct(prev); - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0109-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch linux-4.19.118/debian/patches-rt/0109-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch --- linux-4.19.98/debian/patches-rt/0109-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0109-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,108 @@ +From 59729bf436bda277795b157fd494206ee00a0918 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sat, 25 Jun 2011 09:21:04 +0200 +Subject: [PATCH 109/325] sched: Add saved_state for tasks blocked on sleeping + locks +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Spinlocks are state preserving in !RT. RT changes the state when a +task gets blocked on a lock. So we need to remember the state before +the lock contention. If a regular wakeup (not a RTmutex related +wakeup) happens, the saved_state is updated to running. When the lock +sleep is done, the saved state is restored. + +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 3 +++ + kernel/sched/core.c | 33 ++++++++++++++++++++++++++++++++- + kernel/sched/sched.h | 1 + + 3 files changed, 36 insertions(+), 1 deletion(-) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 0b8850b6093b..f180bfadff33 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -600,6 +600,8 @@ struct task_struct { + #endif + /* -1 unrunnable, 0 runnable, >0 stopped: */ + volatile long state; ++ /* saved state for "spinlock sleepers" */ ++ volatile long saved_state; + + /* + * This begins the randomizable portion of task_struct. Only +@@ -1621,6 +1623,7 @@ extern struct task_struct *find_get_task_by_vpid(pid_t nr); + + extern int wake_up_state(struct task_struct *tsk, unsigned int state); + extern int wake_up_process(struct task_struct *tsk); ++extern int wake_up_lock_sleeper(struct task_struct *tsk); + extern void wake_up_new_task(struct task_struct *tsk); + + #ifdef CONFIG_SMP +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 79e0d052e848..d1c564acff76 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1999,8 +1999,27 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) + */ + raw_spin_lock_irqsave(&p->pi_lock, flags); + smp_mb__after_spinlock(); +- if (!(p->state & state)) ++ if (!(p->state & state)) { ++ /* ++ * The task might be running due to a spinlock sleeper ++ * wakeup. Check the saved state and set it to running ++ * if the wakeup condition is true. ++ */ ++ if (!(wake_flags & WF_LOCK_SLEEPER)) { ++ if (p->saved_state & state) { ++ p->saved_state = TASK_RUNNING; ++ success = 1; ++ } ++ } + goto out; ++ } ++ ++ /* ++ * If this is a regular wakeup, then we can unconditionally ++ * clear the saved state of a "lock sleeper". ++ */ ++ if (!(wake_flags & WF_LOCK_SLEEPER)) ++ p->saved_state = TASK_RUNNING; + + trace_sched_waking(p); + +@@ -2164,6 +2183,18 @@ int wake_up_process(struct task_struct *p) + } + EXPORT_SYMBOL(wake_up_process); + ++/** ++ * wake_up_lock_sleeper - Wake up a specific process blocked on a "sleeping lock" ++ * @p: The process to be woken up. ++ * ++ * Same as wake_up_process() above, but wake_flags=WF_LOCK_SLEEPER to indicate ++ * the nature of the wakeup. ++ */ ++int wake_up_lock_sleeper(struct task_struct *p) ++{ ++ return try_to_wake_up(p, TASK_UNINTERRUPTIBLE, WF_LOCK_SLEEPER); ++} ++ + int wake_up_state(struct task_struct *p, unsigned int state) + { + return try_to_wake_up(p, state, 0); +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index 94bec97bd5e2..c79e32488940 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -1439,6 +1439,7 @@ static inline int task_on_rq_migrating(struct task_struct *p) + #define WF_SYNC 0x01 /* Waker goes to sleep after wakeup */ + #define WF_FORK 0x02 /* Child wakeup after fork */ + #define WF_MIGRATED 0x4 /* Internal use, task got migrated */ ++#define WF_LOCK_SLEEPER 0x08 /* wakeup spinlock "sleeper" */ + + /* + * To aid in avoiding the subversion of "niceness" due to uneven distribution +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0110-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch linux-4.19.118/debian/patches-rt/0110-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch --- linux-4.19.98/debian/patches-rt/0110-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0110-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -From 321628fe4e281be121ed55fdf60c24c6d58cc051 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sat, 25 Jun 2011 09:21:04 +0200 -Subject: [PATCH 110/290] sched: Add saved_state for tasks blocked on sleeping - locks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Spinlocks are state preserving in !RT. RT changes the state when a -task gets blocked on a lock. So we need to remember the state before -the lock contention. If a regular wakeup (not a RTmutex related -wakeup) happens, the saved_state is updated to running. When the lock -sleep is done, the saved state is restored. - -Signed-off-by: Thomas Gleixner ---- - include/linux/sched.h | 3 +++ - kernel/sched/core.c | 33 ++++++++++++++++++++++++++++++++- - kernel/sched/sched.h | 1 + - 3 files changed, 36 insertions(+), 1 deletion(-) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index a1ef00db6baa..c073a3273beb 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -600,6 +600,8 @@ struct task_struct { - #endif - /* -1 unrunnable, 0 runnable, >0 stopped: */ - volatile long state; -+ /* saved state for "spinlock sleepers" */ -+ volatile long saved_state; - - /* - * This begins the randomizable portion of task_struct. Only -@@ -1621,6 +1623,7 @@ extern struct task_struct *find_get_task_by_vpid(pid_t nr); - - extern int wake_up_state(struct task_struct *tsk, unsigned int state); - extern int wake_up_process(struct task_struct *tsk); -+extern int wake_up_lock_sleeper(struct task_struct *tsk); - extern void wake_up_new_task(struct task_struct *tsk); - - #ifdef CONFIG_SMP -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 79e0d052e848..d1c564acff76 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1999,8 +1999,27 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) - */ - raw_spin_lock_irqsave(&p->pi_lock, flags); - smp_mb__after_spinlock(); -- if (!(p->state & state)) -+ if (!(p->state & state)) { -+ /* -+ * The task might be running due to a spinlock sleeper -+ * wakeup. Check the saved state and set it to running -+ * if the wakeup condition is true. -+ */ -+ if (!(wake_flags & WF_LOCK_SLEEPER)) { -+ if (p->saved_state & state) { -+ p->saved_state = TASK_RUNNING; -+ success = 1; -+ } -+ } - goto out; -+ } -+ -+ /* -+ * If this is a regular wakeup, then we can unconditionally -+ * clear the saved state of a "lock sleeper". -+ */ -+ if (!(wake_flags & WF_LOCK_SLEEPER)) -+ p->saved_state = TASK_RUNNING; - - trace_sched_waking(p); - -@@ -2164,6 +2183,18 @@ int wake_up_process(struct task_struct *p) - } - EXPORT_SYMBOL(wake_up_process); - -+/** -+ * wake_up_lock_sleeper - Wake up a specific process blocked on a "sleeping lock" -+ * @p: The process to be woken up. -+ * -+ * Same as wake_up_process() above, but wake_flags=WF_LOCK_SLEEPER to indicate -+ * the nature of the wakeup. -+ */ -+int wake_up_lock_sleeper(struct task_struct *p) -+{ -+ return try_to_wake_up(p, TASK_UNINTERRUPTIBLE, WF_LOCK_SLEEPER); -+} -+ - int wake_up_state(struct task_struct *p, unsigned int state) - { - return try_to_wake_up(p, state, 0); -diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h -index 94bec97bd5e2..c79e32488940 100644 ---- a/kernel/sched/sched.h -+++ b/kernel/sched/sched.h -@@ -1439,6 +1439,7 @@ static inline int task_on_rq_migrating(struct task_struct *p) - #define WF_SYNC 0x01 /* Waker goes to sleep after wakeup */ - #define WF_FORK 0x02 /* Child wakeup after fork */ - #define WF_MIGRATED 0x4 /* Internal use, task got migrated */ -+#define WF_LOCK_SLEEPER 0x08 /* wakeup spinlock "sleeper" */ - - /* - * To aid in avoiding the subversion of "niceness" due to uneven distribution --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0110-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch linux-4.19.118/debian/patches-rt/0110-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch --- linux-4.19.98/debian/patches-rt/0110-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0110-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,57 @@ +From ae13a78b6abe7d64003fa44196eeda8814ca4d48 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 7 Jun 2011 09:19:06 +0200 +Subject: [PATCH 110/325] sched: Do not account rcu_preempt_depth on RT in + might_sleep() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +RT changes the rcu_preempt_depth semantics, so we cannot check for it +in might_sleep(). + +Signed-off-by: Thomas Gleixner +--- + include/linux/rcupdate.h | 7 +++++++ + kernel/sched/core.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h +index 68cbe111420b..027c58cdbb6e 100644 +--- a/include/linux/rcupdate.h ++++ b/include/linux/rcupdate.h +@@ -73,6 +73,11 @@ void synchronize_rcu(void); + * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. + */ + #define rcu_preempt_depth() (current->rcu_read_lock_nesting) ++#ifndef CONFIG_PREEMPT_RT_FULL ++#define sched_rcu_preempt_depth() rcu_preempt_depth() ++#else ++static inline int sched_rcu_preempt_depth(void) { return 0; } ++#endif + + #else /* #ifdef CONFIG_PREEMPT_RCU */ + +@@ -96,6 +101,8 @@ static inline int rcu_preempt_depth(void) + return 0; + } + ++#define sched_rcu_preempt_depth() rcu_preempt_depth() ++ + #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ + + /* Internal to kernel */ +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index d1c564acff76..59d43c084023 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -6198,7 +6198,7 @@ void __init sched_init(void) + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + static inline int preempt_count_equals(int preempt_offset) + { +- int nested = preempt_count() + rcu_preempt_depth(); ++ int nested = preempt_count() + sched_rcu_preempt_depth(); + + return (nested == preempt_offset); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0111-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch linux-4.19.118/debian/patches-rt/0111-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch --- linux-4.19.98/debian/patches-rt/0111-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0111-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -From 26013bccba0816bd1eb6c1f7233f1f3600d89093 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 7 Jun 2011 09:19:06 +0200 -Subject: [PATCH 111/290] sched: Do not account rcu_preempt_depth on RT in - might_sleep() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -RT changes the rcu_preempt_depth semantics, so we cannot check for it -in might_sleep(). - -Signed-off-by: Thomas Gleixner ---- - include/linux/rcupdate.h | 7 +++++++ - kernel/sched/core.c | 2 +- - 2 files changed, 8 insertions(+), 1 deletion(-) - -diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h -index 68cbe111420b..027c58cdbb6e 100644 ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -73,6 +73,11 @@ void synchronize_rcu(void); - * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. - */ - #define rcu_preempt_depth() (current->rcu_read_lock_nesting) -+#ifndef CONFIG_PREEMPT_RT_FULL -+#define sched_rcu_preempt_depth() rcu_preempt_depth() -+#else -+static inline int sched_rcu_preempt_depth(void) { return 0; } -+#endif - - #else /* #ifdef CONFIG_PREEMPT_RCU */ - -@@ -96,6 +101,8 @@ static inline int rcu_preempt_depth(void) - return 0; - } - -+#define sched_rcu_preempt_depth() rcu_preempt_depth() -+ - #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ - - /* Internal to kernel */ -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index d1c564acff76..59d43c084023 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -6198,7 +6198,7 @@ void __init sched_init(void) - #ifdef CONFIG_DEBUG_ATOMIC_SLEEP - static inline int preempt_count_equals(int preempt_offset) - { -- int nested = preempt_count() + rcu_preempt_depth(); -+ int nested = preempt_count() + sched_rcu_preempt_depth(); - - return (nested == preempt_offset); - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0111-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch linux-4.19.118/debian/patches-rt/0111-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch --- linux-4.19.98/debian/patches-rt/0111-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0111-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,33 @@ +From 9774ed0ae21bac1e01f919117ee09f5490d7c7c3 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sun, 17 Jul 2011 22:51:33 +0200 +Subject: [PATCH 111/325] sched: Use the proper LOCK_OFFSET for cond_resched() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +RT does not increment preempt count when a 'sleeping' spinlock is +locked. Update PREEMPT_LOCK_OFFSET for that case. + +Signed-off-by: Thomas Gleixner +--- + include/linux/preempt.h | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index f7a17fcc3fec..b7fe717eb1f4 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -118,7 +118,11 @@ + /* + * The preempt_count offset after spin_lock() + */ ++#if !defined(CONFIG_PREEMPT_RT_FULL) + #define PREEMPT_LOCK_OFFSET PREEMPT_DISABLE_OFFSET ++#else ++#define PREEMPT_LOCK_OFFSET 0 ++#endif + + /* + * The preempt_count offset needed for things like: +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0112-sched-Disable-TTWU_QUEUE-on-RT.patch linux-4.19.118/debian/patches-rt/0112-sched-Disable-TTWU_QUEUE-on-RT.patch --- linux-4.19.98/debian/patches-rt/0112-sched-Disable-TTWU_QUEUE-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0112-sched-Disable-TTWU_QUEUE-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,38 @@ +From d944dd60ea381b06696f77f6900bfad524f0c5b8 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 13 Sep 2011 16:42:35 +0200 +Subject: [PATCH 112/325] sched: Disable TTWU_QUEUE on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The queued remote wakeup mechanism can introduce rather large +latencies if the number of migrated tasks is high. Disable it for RT. + +Signed-off-by: Thomas Gleixner +--- + kernel/sched/features.h | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/kernel/sched/features.h b/kernel/sched/features.h +index 85ae8488039c..68de18405857 100644 +--- a/kernel/sched/features.h ++++ b/kernel/sched/features.h +@@ -46,11 +46,16 @@ SCHED_FEAT(LB_BIAS, true) + */ + SCHED_FEAT(NONTASK_CAPACITY, true) + ++#ifdef CONFIG_PREEMPT_RT_FULL ++SCHED_FEAT(TTWU_QUEUE, false) ++#else ++ + /* + * Queue remote wakeups on the target CPU and process them + * using the scheduler IPI. Reduces rq->lock contention/bounces. + */ + SCHED_FEAT(TTWU_QUEUE, true) ++#endif + + /* + * When doing wakeups, attempt to limit superfluous scans of the LLC domain. +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0112-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch linux-4.19.118/debian/patches-rt/0112-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch --- linux-4.19.98/debian/patches-rt/0112-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0112-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -From e1018349e034a1bc9768c8870ae436d76d07d3b4 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 22:51:33 +0200 -Subject: [PATCH 112/290] sched: Use the proper LOCK_OFFSET for cond_resched() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -RT does not increment preempt count when a 'sleeping' spinlock is -locked. Update PREEMPT_LOCK_OFFSET for that case. - -Signed-off-by: Thomas Gleixner ---- - include/linux/preempt.h | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index f7a17fcc3fec..b7fe717eb1f4 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -118,7 +118,11 @@ - /* - * The preempt_count offset after spin_lock() - */ -+#if !defined(CONFIG_PREEMPT_RT_FULL) - #define PREEMPT_LOCK_OFFSET PREEMPT_DISABLE_OFFSET -+#else -+#define PREEMPT_LOCK_OFFSET 0 -+#endif - - /* - * The preempt_count offset needed for things like: --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0113-sched-Disable-TTWU_QUEUE-on-RT.patch linux-4.19.118/debian/patches-rt/0113-sched-Disable-TTWU_QUEUE-on-RT.patch --- linux-4.19.98/debian/patches-rt/0113-sched-Disable-TTWU_QUEUE-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0113-sched-Disable-TTWU_QUEUE-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -From 8f8e3eb8db6bc5ae01fe12e677a6e95df0366beb Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 13 Sep 2011 16:42:35 +0200 -Subject: [PATCH 113/290] sched: Disable TTWU_QUEUE on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The queued remote wakeup mechanism can introduce rather large -latencies if the number of migrated tasks is high. Disable it for RT. - -Signed-off-by: Thomas Gleixner ---- - kernel/sched/features.h | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/kernel/sched/features.h b/kernel/sched/features.h -index 85ae8488039c..68de18405857 100644 ---- a/kernel/sched/features.h -+++ b/kernel/sched/features.h -@@ -46,11 +46,16 @@ SCHED_FEAT(LB_BIAS, true) - */ - SCHED_FEAT(NONTASK_CAPACITY, true) - -+#ifdef CONFIG_PREEMPT_RT_FULL -+SCHED_FEAT(TTWU_QUEUE, false) -+#else -+ - /* - * Queue remote wakeups on the target CPU and process them - * using the scheduler IPI. Reduces rq->lock contention/bounces. - */ - SCHED_FEAT(TTWU_QUEUE, true) -+#endif - - /* - * When doing wakeups, attempt to limit superfluous scans of the LLC domain. --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0113-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch linux-4.19.118/debian/patches-rt/0113-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch --- linux-4.19.98/debian/patches-rt/0113-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0113-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,45 @@ +From 7617fdb778960b1313b4e27bb3429d28c5d42957 Mon Sep 17 00:00:00 2001 +From: Steven Rostedt +Date: Mon, 18 Mar 2013 15:12:49 -0400 +Subject: [PATCH 113/325] sched/workqueue: Only wake up idle workers if not + blocked on sleeping spin lock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In -rt, most spin_locks() turn into mutexes. One of these spin_lock +conversions is performed on the workqueue gcwq->lock. When the idle +worker is worken, the first thing it will do is grab that same lock and +it too will block, possibly jumping into the same code, but because +nr_running would already be decremented it prevents an infinite loop. + +But this is still a waste of CPU cycles, and it doesn't follow the method +of mainline, as new workers should only be woken when a worker thread is +truly going to sleep, and not just blocked on a spin_lock(). + +Check the saved_state too before waking up new workers. + + +Signed-off-by: Steven Rostedt +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/sched/core.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 59d43c084023..e792543de8eb 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -3539,8 +3539,10 @@ static void __sched notrace __schedule(bool preempt) + * If a worker went to sleep, notify and ask workqueue + * whether it wants to wake up a task to maintain + * concurrency. ++ * Only call wake up if prev isn't blocked on a sleeping ++ * spin lock. + */ +- if (prev->flags & PF_WQ_WORKER) { ++ if (prev->flags & PF_WQ_WORKER && !prev->saved_state) { + struct task_struct *to_wakeup; + + to_wakeup = wq_worker_sleeping(prev); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0114-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch linux-4.19.118/debian/patches-rt/0114-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch --- linux-4.19.98/debian/patches-rt/0114-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0114-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,162 @@ +From 418bcb5747f1358c0afc713ba2294fe33b5878de Mon Sep 17 00:00:00 2001 +From: Daniel Bristot de Oliveira +Date: Mon, 26 Jun 2017 17:07:15 +0200 +Subject: [PATCH 114/325] rt: Increase/decrease the nr of migratory tasks when + enabling/disabling migration +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +There is a problem in the migrate_disable()/enable() implementation +regarding the number of migratory tasks in the rt/dl RQs. The problem +is the following: + +When a task is attached to the rt runqueue, it is checked if it either +can run in more than one CPU, or if it is with migration disable. If +either check is true, the rt_rq->rt_nr_migratory counter is not +increased. The counter increases otherwise. + +When the task is detached, the same check is done. If either check is +true, the rt_rq->rt_nr_migratory counter is not decreased. The counter +decreases otherwise. The same check is done in the dl scheduler. + +One important thing is that, migrate disable/enable does not touch this +counter for tasks attached to the rt rq. So suppose the following chain +of events. + +Assumptions: +Task A is the only runnable task in A Task B runs on the CPU B +Task A runs on CFS (non-rt) Task B has RT priority +Thus, rt_nr_migratory is 0 B is running +Task A can run on all CPUS. + +Timeline: + CPU A/TASK A CPU B/TASK B +A takes the rt mutex X . +A disables migration . + . B tries to take the rt mutex X + . As it is held by A { + . A inherits the rt priority of B + . A is dequeued from CFS RQ of CPU A + . A is enqueued in the RT RQ of CPU A + . As migration is disabled + . rt_nr_migratory in A is not increased + . +A enables migration +A releases the rt mutex X { + A returns to its original priority + A ask to be dequeued from RT RQ { + As migration is now enabled and it can run on all CPUS { + rt_nr_migratory should be decreased + As rt_nr_migratory is 0, rt_nr_migratory under flows + } +} + +This variable is important because it notifies if there are more than one +runnable & migratory task in the runqueue. If there are more than one +tasks, the rt_rq is set as overloaded, and then tries to migrate some +tasks. This rule is important to keep the scheduler working conserving, +that is, in a system with M CPUs, the M highest priority tasks should be +running. + +As rt_nr_migratory is unsigned, it will become > 0, notifying that the +RQ is overloaded, activating pushing mechanism without need. + +This patch fixes this problem by decreasing/increasing the +rt/dl_nr_migratory in the migrate disable/enable operations. + +Reported-by: Pei Zhang +Reported-by: Luiz Capitulino +Signed-off-by: Daniel Bristot de Oliveira +Cc: Luis Claudio R. Goncalves +Cc: Clark Williams +Cc: Luiz Capitulino +Cc: Sebastian Andrzej Siewior +Cc: Thomas Gleixner +Cc: Steven Rostedt +Cc: Peter Zijlstra +Cc: Ingo Molnar +Cc: LKML +Cc: linux-rt-users +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/sched/core.c | 49 ++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 44 insertions(+), 5 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index e792543de8eb..57617777c4ba 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7185,6 +7185,47 @@ const u32 sched_prio_to_wmult[40] = { + + #if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) + ++static inline void ++update_nr_migratory(struct task_struct *p, long delta) ++{ ++ if (unlikely((p->sched_class == &rt_sched_class || ++ p->sched_class == &dl_sched_class) && ++ p->nr_cpus_allowed > 1)) { ++ if (p->sched_class == &rt_sched_class) ++ task_rq(p)->rt.rt_nr_migratory += delta; ++ else ++ task_rq(p)->dl.dl_nr_migratory += delta; ++ } ++} ++ ++static inline void ++migrate_disable_update_cpus_allowed(struct task_struct *p) ++{ ++ struct rq *rq; ++ struct rq_flags rf; ++ ++ p->cpus_ptr = cpumask_of(smp_processor_id()); ++ ++ rq = task_rq_lock(p, &rf); ++ update_nr_migratory(p, -1); ++ p->nr_cpus_allowed = 1; ++ task_rq_unlock(rq, p, &rf); ++} ++ ++static inline void ++migrate_enable_update_cpus_allowed(struct task_struct *p) ++{ ++ struct rq *rq; ++ struct rq_flags rf; ++ ++ p->cpus_ptr = &p->cpus_mask; ++ ++ rq = task_rq_lock(p, &rf); ++ p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask); ++ update_nr_migratory(p, 1); ++ task_rq_unlock(rq, p, &rf); ++} ++ + void migrate_disable(void) + { + struct task_struct *p = current; +@@ -7208,10 +7249,9 @@ void migrate_disable(void) + } + + preempt_disable(); +- p->migrate_disable = 1; + +- p->cpus_ptr = cpumask_of(smp_processor_id()); +- p->nr_cpus_allowed = 1; ++ migrate_disable_update_cpus_allowed(p); ++ p->migrate_disable = 1; + + preempt_enable(); + } +@@ -7243,9 +7283,8 @@ void migrate_enable(void) + + preempt_disable(); + +- p->cpus_ptr = &p->cpus_mask; +- p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask); + p->migrate_disable = 0; ++ migrate_enable_update_cpus_allowed(p); + + if (p->migrate_disable_update) { + struct rq *rq; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0114-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch linux-4.19.118/debian/patches-rt/0114-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch --- linux-4.19.98/debian/patches-rt/0114-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0114-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -From 43f8cfb3d7b686b307dbde08375843c434206f95 Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Mon, 18 Mar 2013 15:12:49 -0400 -Subject: [PATCH 114/290] sched/workqueue: Only wake up idle workers if not - blocked on sleeping spin lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In -rt, most spin_locks() turn into mutexes. One of these spin_lock -conversions is performed on the workqueue gcwq->lock. When the idle -worker is worken, the first thing it will do is grab that same lock and -it too will block, possibly jumping into the same code, but because -nr_running would already be decremented it prevents an infinite loop. - -But this is still a waste of CPU cycles, and it doesn't follow the method -of mainline, as new workers should only be woken when a worker thread is -truly going to sleep, and not just blocked on a spin_lock(). - -Check the saved_state too before waking up new workers. - - -Signed-off-by: Steven Rostedt -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/sched/core.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 59d43c084023..e792543de8eb 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3539,8 +3539,10 @@ static void __sched notrace __schedule(bool preempt) - * If a worker went to sleep, notify and ask workqueue - * whether it wants to wake up a task to maintain - * concurrency. -+ * Only call wake up if prev isn't blocked on a sleeping -+ * spin lock. - */ -- if (prev->flags & PF_WQ_WORKER) { -+ if (prev->flags & PF_WQ_WORKER && !prev->saved_state) { - struct task_struct *to_wakeup; - - to_wakeup = wq_worker_sleeping(prev); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0115-hotplug-Lightweight-get-online-cpus.patch linux-4.19.118/debian/patches-rt/0115-hotplug-Lightweight-get-online-cpus.patch --- linux-4.19.98/debian/patches-rt/0115-hotplug-Lightweight-get-online-cpus.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0115-hotplug-Lightweight-get-online-cpus.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,101 @@ +From 97c38013b1a149d864cda397094e7038085f4e80 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 15 Jun 2011 12:36:06 +0200 +Subject: [PATCH 115/325] hotplug: Lightweight get online cpus +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +get_online_cpus() is a heavy weight function which involves a global +mutex. migrate_disable() wants a simpler construct which prevents only +a CPU from going doing while a task is in a migrate disabled section. + +Implement a per cpu lockless mechanism, which serializes only in the +real unplug case on a global mutex. That serialization affects only +tasks on the cpu which should be brought down. + +Signed-off-by: Thomas Gleixner +--- + include/linux/cpu.h | 5 +++++ + kernel/cpu.c | 15 +++++++++++++++ + kernel/sched/core.c | 4 ++++ + 3 files changed, 24 insertions(+) + +diff --git a/include/linux/cpu.h b/include/linux/cpu.h +index aab4273810e3..e67645924404 100644 +--- a/include/linux/cpu.h ++++ b/include/linux/cpu.h +@@ -118,6 +118,8 @@ extern void cpu_hotplug_disable(void); + extern void cpu_hotplug_enable(void); + void clear_tasks_mm_cpumask(int cpu); + int cpu_down(unsigned int cpu); ++extern void pin_current_cpu(void); ++extern void unpin_current_cpu(void); + + #else /* CONFIG_HOTPLUG_CPU */ + +@@ -129,6 +131,9 @@ static inline int cpus_read_trylock(void) { return true; } + static inline void lockdep_assert_cpus_held(void) { } + static inline void cpu_hotplug_disable(void) { } + static inline void cpu_hotplug_enable(void) { } ++static inline void pin_current_cpu(void) { } ++static inline void unpin_current_cpu(void) { } ++ + #endif /* !CONFIG_HOTPLUG_CPU */ + + /* Wrappers which go away once all code is converted */ +diff --git a/kernel/cpu.c b/kernel/cpu.c +index 2d850eaaf82e..328d7bf67d2f 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -281,6 +281,21 @@ static int cpu_hotplug_disabled; + + #ifdef CONFIG_HOTPLUG_CPU + ++/** ++ * pin_current_cpu - Prevent the current cpu from being unplugged ++ */ ++void pin_current_cpu(void) ++{ ++ ++} ++ ++/** ++ * unpin_current_cpu - Allow unplug of current cpu ++ */ ++void unpin_current_cpu(void) ++{ ++} ++ + DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock); + + void cpus_read_lock(void) +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 57617777c4ba..42b42ebf52bc 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7249,6 +7249,7 @@ void migrate_disable(void) + } + + preempt_disable(); ++ pin_current_cpu(); + + migrate_disable_update_cpus_allowed(p); + p->migrate_disable = 1; +@@ -7314,12 +7315,15 @@ void migrate_enable(void) + arg.task = p; + arg.dest_cpu = dest_cpu; + ++ unpin_current_cpu(); + preempt_enable(); + stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); + tlb_migrate_finish(p->mm); ++ + return; + } + } ++ unpin_current_cpu(); + preempt_enable(); + } + EXPORT_SYMBOL(migrate_enable); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0115-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch linux-4.19.118/debian/patches-rt/0115-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch --- linux-4.19.98/debian/patches-rt/0115-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0115-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,162 +0,0 @@ -From c53c9ce9f8bc7a16fadae5e065224163e69b07ff Mon Sep 17 00:00:00 2001 -From: Daniel Bristot de Oliveira -Date: Mon, 26 Jun 2017 17:07:15 +0200 -Subject: [PATCH 115/290] rt: Increase/decrease the nr of migratory tasks when - enabling/disabling migration -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -There is a problem in the migrate_disable()/enable() implementation -regarding the number of migratory tasks in the rt/dl RQs. The problem -is the following: - -When a task is attached to the rt runqueue, it is checked if it either -can run in more than one CPU, or if it is with migration disable. If -either check is true, the rt_rq->rt_nr_migratory counter is not -increased. The counter increases otherwise. - -When the task is detached, the same check is done. If either check is -true, the rt_rq->rt_nr_migratory counter is not decreased. The counter -decreases otherwise. The same check is done in the dl scheduler. - -One important thing is that, migrate disable/enable does not touch this -counter for tasks attached to the rt rq. So suppose the following chain -of events. - -Assumptions: -Task A is the only runnable task in A Task B runs on the CPU B -Task A runs on CFS (non-rt) Task B has RT priority -Thus, rt_nr_migratory is 0 B is running -Task A can run on all CPUS. - -Timeline: - CPU A/TASK A CPU B/TASK B -A takes the rt mutex X . -A disables migration . - . B tries to take the rt mutex X - . As it is held by A { - . A inherits the rt priority of B - . A is dequeued from CFS RQ of CPU A - . A is enqueued in the RT RQ of CPU A - . As migration is disabled - . rt_nr_migratory in A is not increased - . -A enables migration -A releases the rt mutex X { - A returns to its original priority - A ask to be dequeued from RT RQ { - As migration is now enabled and it can run on all CPUS { - rt_nr_migratory should be decreased - As rt_nr_migratory is 0, rt_nr_migratory under flows - } -} - -This variable is important because it notifies if there are more than one -runnable & migratory task in the runqueue. If there are more than one -tasks, the rt_rq is set as overloaded, and then tries to migrate some -tasks. This rule is important to keep the scheduler working conserving, -that is, in a system with M CPUs, the M highest priority tasks should be -running. - -As rt_nr_migratory is unsigned, it will become > 0, notifying that the -RQ is overloaded, activating pushing mechanism without need. - -This patch fixes this problem by decreasing/increasing the -rt/dl_nr_migratory in the migrate disable/enable operations. - -Reported-by: Pei Zhang -Reported-by: Luiz Capitulino -Signed-off-by: Daniel Bristot de Oliveira -Cc: Luis Claudio R. Goncalves -Cc: Clark Williams -Cc: Luiz Capitulino -Cc: Sebastian Andrzej Siewior -Cc: Thomas Gleixner -Cc: Steven Rostedt -Cc: Peter Zijlstra -Cc: Ingo Molnar -Cc: LKML -Cc: linux-rt-users -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/sched/core.c | 49 ++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 44 insertions(+), 5 deletions(-) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index e792543de8eb..57617777c4ba 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -7185,6 +7185,47 @@ const u32 sched_prio_to_wmult[40] = { - - #if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) - -+static inline void -+update_nr_migratory(struct task_struct *p, long delta) -+{ -+ if (unlikely((p->sched_class == &rt_sched_class || -+ p->sched_class == &dl_sched_class) && -+ p->nr_cpus_allowed > 1)) { -+ if (p->sched_class == &rt_sched_class) -+ task_rq(p)->rt.rt_nr_migratory += delta; -+ else -+ task_rq(p)->dl.dl_nr_migratory += delta; -+ } -+} -+ -+static inline void -+migrate_disable_update_cpus_allowed(struct task_struct *p) -+{ -+ struct rq *rq; -+ struct rq_flags rf; -+ -+ p->cpus_ptr = cpumask_of(smp_processor_id()); -+ -+ rq = task_rq_lock(p, &rf); -+ update_nr_migratory(p, -1); -+ p->nr_cpus_allowed = 1; -+ task_rq_unlock(rq, p, &rf); -+} -+ -+static inline void -+migrate_enable_update_cpus_allowed(struct task_struct *p) -+{ -+ struct rq *rq; -+ struct rq_flags rf; -+ -+ p->cpus_ptr = &p->cpus_mask; -+ -+ rq = task_rq_lock(p, &rf); -+ p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask); -+ update_nr_migratory(p, 1); -+ task_rq_unlock(rq, p, &rf); -+} -+ - void migrate_disable(void) - { - struct task_struct *p = current; -@@ -7208,10 +7249,9 @@ void migrate_disable(void) - } - - preempt_disable(); -- p->migrate_disable = 1; - -- p->cpus_ptr = cpumask_of(smp_processor_id()); -- p->nr_cpus_allowed = 1; -+ migrate_disable_update_cpus_allowed(p); -+ p->migrate_disable = 1; - - preempt_enable(); - } -@@ -7243,9 +7283,8 @@ void migrate_enable(void) - - preempt_disable(); - -- p->cpus_ptr = &p->cpus_mask; -- p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask); - p->migrate_disable = 0; -+ migrate_enable_update_cpus_allowed(p); - - if (p->migrate_disable_update) { - struct rq *rq; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0116-hotplug-Lightweight-get-online-cpus.patch linux-4.19.118/debian/patches-rt/0116-hotplug-Lightweight-get-online-cpus.patch --- linux-4.19.98/debian/patches-rt/0116-hotplug-Lightweight-get-online-cpus.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0116-hotplug-Lightweight-get-online-cpus.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -From 65664847f66b61a354b87a68ee4538850100b07f Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 15 Jun 2011 12:36:06 +0200 -Subject: [PATCH 116/290] hotplug: Lightweight get online cpus -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -get_online_cpus() is a heavy weight function which involves a global -mutex. migrate_disable() wants a simpler construct which prevents only -a CPU from going doing while a task is in a migrate disabled section. - -Implement a per cpu lockless mechanism, which serializes only in the -real unplug case on a global mutex. That serialization affects only -tasks on the cpu which should be brought down. - -Signed-off-by: Thomas Gleixner ---- - include/linux/cpu.h | 5 +++++ - kernel/cpu.c | 15 +++++++++++++++ - kernel/sched/core.c | 4 ++++ - 3 files changed, 24 insertions(+) - -diff --git a/include/linux/cpu.h b/include/linux/cpu.h -index aab4273810e3..e67645924404 100644 ---- a/include/linux/cpu.h -+++ b/include/linux/cpu.h -@@ -118,6 +118,8 @@ extern void cpu_hotplug_disable(void); - extern void cpu_hotplug_enable(void); - void clear_tasks_mm_cpumask(int cpu); - int cpu_down(unsigned int cpu); -+extern void pin_current_cpu(void); -+extern void unpin_current_cpu(void); - - #else /* CONFIG_HOTPLUG_CPU */ - -@@ -129,6 +131,9 @@ static inline int cpus_read_trylock(void) { return true; } - static inline void lockdep_assert_cpus_held(void) { } - static inline void cpu_hotplug_disable(void) { } - static inline void cpu_hotplug_enable(void) { } -+static inline void pin_current_cpu(void) { } -+static inline void unpin_current_cpu(void) { } -+ - #endif /* !CONFIG_HOTPLUG_CPU */ - - /* Wrappers which go away once all code is converted */ -diff --git a/kernel/cpu.c b/kernel/cpu.c -index 8d6b8b5493f9..cf1f2eb6bb90 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -281,6 +281,21 @@ static int cpu_hotplug_disabled; - - #ifdef CONFIG_HOTPLUG_CPU - -+/** -+ * pin_current_cpu - Prevent the current cpu from being unplugged -+ */ -+void pin_current_cpu(void) -+{ -+ -+} -+ -+/** -+ * unpin_current_cpu - Allow unplug of current cpu -+ */ -+void unpin_current_cpu(void) -+{ -+} -+ - DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock); - - void cpus_read_lock(void) -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 57617777c4ba..42b42ebf52bc 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -7249,6 +7249,7 @@ void migrate_disable(void) - } - - preempt_disable(); -+ pin_current_cpu(); - - migrate_disable_update_cpus_allowed(p); - p->migrate_disable = 1; -@@ -7314,12 +7315,15 @@ void migrate_enable(void) - arg.task = p; - arg.dest_cpu = dest_cpu; - -+ unpin_current_cpu(); - preempt_enable(); - stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); - tlb_migrate_finish(p->mm); -+ - return; - } - } -+ unpin_current_cpu(); - preempt_enable(); - } - EXPORT_SYMBOL(migrate_enable); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0116-trace-Add-migrate-disabled-counter-to-tracing-output.patch linux-4.19.118/debian/patches-rt/0116-trace-Add-migrate-disabled-counter-to-tracing-output.patch --- linux-4.19.98/debian/patches-rt/0116-trace-Add-migrate-disabled-counter-to-tracing-output.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0116-trace-Add-migrate-disabled-counter-to-tracing-output.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,86 @@ +From 9ea64a4be6dfb32d2a562b28857bef0ae9fa163b Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sun, 17 Jul 2011 21:56:42 +0200 +Subject: [PATCH 116/325] trace: Add migrate-disabled counter to tracing output +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Signed-off-by: Thomas Gleixner +--- + include/linux/trace_events.h | 2 ++ + kernel/trace/trace.c | 9 ++++++--- + kernel/trace/trace_events.c | 2 ++ + kernel/trace/trace_output.c | 5 +++++ + 4 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h +index 0643c083ed86..1cc4d2da954c 100644 +--- a/include/linux/trace_events.h ++++ b/include/linux/trace_events.h +@@ -62,6 +62,8 @@ struct trace_entry { + unsigned char flags; + unsigned char preempt_count; + int pid; ++ unsigned short migrate_disable; ++ unsigned short padding; + }; + + #define TRACE_EVENT_TYPE_MAX \ +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index c41f7d1ab5fa..1fac8a2de78f 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -2151,6 +2151,8 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, + ((pc & SOFTIRQ_OFFSET) ? TRACE_FLAG_SOFTIRQ : 0) | + (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | + (test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0); ++ ++ entry->migrate_disable = (tsk) ? __migrate_disabled(tsk) & 0xFF : 0; + } + EXPORT_SYMBOL_GPL(tracing_generic_entry_update); + +@@ -3354,9 +3356,10 @@ static void print_lat_help_header(struct seq_file *m) + "# | / _----=> need-resched \n" + "# || / _---=> hardirq/softirq \n" + "# ||| / _--=> preempt-depth \n" +- "# |||| / delay \n" +- "# cmd pid ||||| time | caller \n" +- "# \\ / ||||| \\ | / \n"); ++ "# |||| / _--=> migrate-disable\n" ++ "# ||||| / delay \n" ++ "# cmd pid |||||| time | caller \n" ++ "# \\ / ||||| \\ | / \n"); + } + + static void print_event_info(struct trace_buffer *buf, struct seq_file *m) +diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c +index ec340e1cbffc..1febb0ca4c81 100644 +--- a/kernel/trace/trace_events.c ++++ b/kernel/trace/trace_events.c +@@ -188,6 +188,8 @@ static int trace_define_common_fields(void) + __common_field(unsigned char, flags); + __common_field(unsigned char, preempt_count); + __common_field(int, pid); ++ __common_field(unsigned short, migrate_disable); ++ __common_field(unsigned short, padding); + + return ret; + } +diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c +index 6e6cc64faa38..46c96744f09d 100644 +--- a/kernel/trace/trace_output.c ++++ b/kernel/trace/trace_output.c +@@ -494,6 +494,11 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) + else + trace_seq_putc(s, '.'); + ++ if (entry->migrate_disable) ++ trace_seq_printf(s, "%x", entry->migrate_disable); ++ else ++ trace_seq_putc(s, '.'); ++ + return !trace_seq_has_overflowed(s); + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0117-lockdep-Make-it-RT-aware.patch linux-4.19.118/debian/patches-rt/0117-lockdep-Make-it-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0117-lockdep-Make-it-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0117-lockdep-Make-it-RT-aware.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,78 @@ +From 8ed2b42d1e41402d585e7907ef754461cda3ff25 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sun, 17 Jul 2011 18:51:23 +0200 +Subject: [PATCH 117/325] lockdep: Make it RT aware +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +teach lockdep that we don't really do softirqs on -RT. + +Signed-off-by: Thomas Gleixner +--- + include/linux/irqflags.h | 23 +++++++++++++++-------- + kernel/locking/lockdep.c | 2 ++ + 2 files changed, 17 insertions(+), 8 deletions(-) + +diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h +index 21619c92c377..b20eeb25e9fa 100644 +--- a/include/linux/irqflags.h ++++ b/include/linux/irqflags.h +@@ -43,14 +43,6 @@ do { \ + do { \ + current->hardirq_context--; \ + } while (0) +-# define lockdep_softirq_enter() \ +-do { \ +- current->softirq_context++; \ +-} while (0) +-# define lockdep_softirq_exit() \ +-do { \ +- current->softirq_context--; \ +-} while (0) + #else + # define trace_hardirqs_on() do { } while (0) + # define trace_hardirqs_off() do { } while (0) +@@ -64,6 +56,21 @@ do { \ + # define lockdep_softirq_exit() do { } while (0) + #endif + ++#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_PREEMPT_RT_FULL) ++# define lockdep_softirq_enter() \ ++do { \ ++ current->softirq_context++; \ ++} while (0) ++# define lockdep_softirq_exit() \ ++do { \ ++ current->softirq_context--; \ ++} while (0) ++ ++#else ++# define lockdep_softirq_enter() do { } while (0) ++# define lockdep_softirq_exit() do { } while (0) ++#endif ++ + #if defined(CONFIG_IRQSOFF_TRACER) || \ + defined(CONFIG_PREEMPT_TRACER) + extern void stop_critical_timings(void); +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index 1e272f6a01e7..1938b4bfb098 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -3826,6 +3826,7 @@ static void check_flags(unsigned long flags) + } + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * We dont accurately track softirq state in e.g. + * hardirq contexts (such as on 4KSTACKS), so only +@@ -3840,6 +3841,7 @@ static void check_flags(unsigned long flags) + DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled); + } + } ++#endif + + if (!debug_locks) + print_irqtrace_events(current); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0117-trace-Add-migrate-disabled-counter-to-tracing-output.patch linux-4.19.118/debian/patches-rt/0117-trace-Add-migrate-disabled-counter-to-tracing-output.patch --- linux-4.19.98/debian/patches-rt/0117-trace-Add-migrate-disabled-counter-to-tracing-output.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0117-trace-Add-migrate-disabled-counter-to-tracing-output.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -From b1443b83989e9c493e9d82d8a8a88a3862ea2286 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 21:56:42 +0200 -Subject: [PATCH 117/290] trace: Add migrate-disabled counter to tracing output -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Signed-off-by: Thomas Gleixner ---- - include/linux/trace_events.h | 2 ++ - kernel/trace/trace.c | 9 ++++++--- - kernel/trace/trace_events.c | 2 ++ - kernel/trace/trace_output.c | 5 +++++ - 4 files changed, 15 insertions(+), 3 deletions(-) - -diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h -index 0643c083ed86..1cc4d2da954c 100644 ---- a/include/linux/trace_events.h -+++ b/include/linux/trace_events.h -@@ -62,6 +62,8 @@ struct trace_entry { - unsigned char flags; - unsigned char preempt_count; - int pid; -+ unsigned short migrate_disable; -+ unsigned short padding; - }; - - #define TRACE_EVENT_TYPE_MAX \ -diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index e61aa1c68e99..5eccf1c201db 100644 ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -2149,6 +2149,8 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, - ((pc & SOFTIRQ_OFFSET) ? TRACE_FLAG_SOFTIRQ : 0) | - (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | - (test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0); -+ -+ entry->migrate_disable = (tsk) ? __migrate_disabled(tsk) & 0xFF : 0; - } - EXPORT_SYMBOL_GPL(tracing_generic_entry_update); - -@@ -3352,9 +3354,10 @@ static void print_lat_help_header(struct seq_file *m) - "# | / _----=> need-resched \n" - "# || / _---=> hardirq/softirq \n" - "# ||| / _--=> preempt-depth \n" -- "# |||| / delay \n" -- "# cmd pid ||||| time | caller \n" -- "# \\ / ||||| \\ | / \n"); -+ "# |||| / _--=> migrate-disable\n" -+ "# ||||| / delay \n" -+ "# cmd pid |||||| time | caller \n" -+ "# \\ / ||||| \\ | / \n"); - } - - static void print_event_info(struct trace_buffer *buf, struct seq_file *m) -diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c -index ec340e1cbffc..1febb0ca4c81 100644 ---- a/kernel/trace/trace_events.c -+++ b/kernel/trace/trace_events.c -@@ -188,6 +188,8 @@ static int trace_define_common_fields(void) - __common_field(unsigned char, flags); - __common_field(unsigned char, preempt_count); - __common_field(int, pid); -+ __common_field(unsigned short, migrate_disable); -+ __common_field(unsigned short, padding); - - return ret; - } -diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c -index 6e6cc64faa38..46c96744f09d 100644 ---- a/kernel/trace/trace_output.c -+++ b/kernel/trace/trace_output.c -@@ -494,6 +494,11 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) - else - trace_seq_putc(s, '.'); - -+ if (entry->migrate_disable) -+ trace_seq_printf(s, "%x", entry->migrate_disable); -+ else -+ trace_seq_putc(s, '.'); -+ - return !trace_seq_has_overflowed(s); - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0118-lockdep-Make-it-RT-aware.patch linux-4.19.118/debian/patches-rt/0118-lockdep-Make-it-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0118-lockdep-Make-it-RT-aware.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0118-lockdep-Make-it-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -From 25df2718875a1f8e4d5fc79fd0720e5000074ccb Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 18:51:23 +0200 -Subject: [PATCH 118/290] lockdep: Make it RT aware -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -teach lockdep that we don't really do softirqs on -RT. - -Signed-off-by: Thomas Gleixner ---- - include/linux/irqflags.h | 23 +++++++++++++++-------- - kernel/locking/lockdep.c | 2 ++ - 2 files changed, 17 insertions(+), 8 deletions(-) - -diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h -index 21619c92c377..b20eeb25e9fa 100644 ---- a/include/linux/irqflags.h -+++ b/include/linux/irqflags.h -@@ -43,14 +43,6 @@ do { \ - do { \ - current->hardirq_context--; \ - } while (0) --# define lockdep_softirq_enter() \ --do { \ -- current->softirq_context++; \ --} while (0) --# define lockdep_softirq_exit() \ --do { \ -- current->softirq_context--; \ --} while (0) - #else - # define trace_hardirqs_on() do { } while (0) - # define trace_hardirqs_off() do { } while (0) -@@ -64,6 +56,21 @@ do { \ - # define lockdep_softirq_exit() do { } while (0) - #endif - -+#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_PREEMPT_RT_FULL) -+# define lockdep_softirq_enter() \ -+do { \ -+ current->softirq_context++; \ -+} while (0) -+# define lockdep_softirq_exit() \ -+do { \ -+ current->softirq_context--; \ -+} while (0) -+ -+#else -+# define lockdep_softirq_enter() do { } while (0) -+# define lockdep_softirq_exit() do { } while (0) -+#endif -+ - #if defined(CONFIG_IRQSOFF_TRACER) || \ - defined(CONFIG_PREEMPT_TRACER) - extern void stop_critical_timings(void); -diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c -index 1e272f6a01e7..1938b4bfb098 100644 ---- a/kernel/locking/lockdep.c -+++ b/kernel/locking/lockdep.c -@@ -3826,6 +3826,7 @@ static void check_flags(unsigned long flags) - } - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * We dont accurately track softirq state in e.g. - * hardirq contexts (such as on 4KSTACKS), so only -@@ -3840,6 +3841,7 @@ static void check_flags(unsigned long flags) - DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled); - } - } -+#endif - - if (!debug_locks) - print_irqtrace_events(current); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0118-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch linux-4.19.118/debian/patches-rt/0118-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch --- linux-4.19.98/debian/patches-rt/0118-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0118-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,303 @@ +From af236a3575387c398e7192cc9f09098679b05e77 Mon Sep 17 00:00:00 2001 +From: Ingo Molnar +Date: Tue, 29 Nov 2011 20:18:22 -0500 +Subject: [PATCH 118/325] tasklet: Prevent tasklets from going into infinite + spin in RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +When CONFIG_PREEMPT_RT_FULL is enabled, tasklets run as threads, +and spinlocks turn are mutexes. But this can cause issues with +tasks disabling tasklets. A tasklet runs under ksoftirqd, and +if a tasklets are disabled with tasklet_disable(), the tasklet +count is increased. When a tasklet runs, it checks this counter +and if it is set, it adds itself back on the softirq queue and +returns. + +The problem arises in RT because ksoftirq will see that a softirq +is ready to run (the tasklet softirq just re-armed itself), and will +not sleep, but instead run the softirqs again. The tasklet softirq +will still see that the count is non-zero and will not execute +the tasklet and requeue itself on the softirq again, which will +cause ksoftirqd to run it again and again and again. + +It gets worse because ksoftirqd runs as a real-time thread. +If it preempted the task that disabled tasklets, and that task +has migration disabled, or can't run for other reasons, the tasklet +softirq will never run because the count will never be zero, and +ksoftirqd will go into an infinite loop. As an RT task, it this +becomes a big problem. + +This is a hack solution to have tasklet_disable stop tasklets, and +when a tasklet runs, instead of requeueing the tasklet softirqd +it delays it. When tasklet_enable() is called, and tasklets are +waiting, then the tasklet_enable() will kick the tasklets to continue. +This prevents the lock up from ksoftirq going into an infinite loop. + +[ rostedt@goodmis.org: ported to 3.0-rt ] + +Signed-off-by: Ingo Molnar +Signed-off-by: Steven Rostedt +Signed-off-by: Thomas Gleixner +--- + include/linux/interrupt.h | 33 +++++----- + kernel/softirq.c | 126 ++++++++++++++++++++++++++++++++------ + 2 files changed, 125 insertions(+), 34 deletions(-) + +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index 315f852b4981..35fa335c475b 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -536,8 +536,9 @@ static inline struct task_struct *this_cpu_ksoftirqd(void) + to be executed on some cpu at least once after this. + * If the tasklet is already scheduled, but its execution is still not + started, it will be executed only once. +- * If this tasklet is already running on another CPU (or schedule is called +- from tasklet itself), it is rescheduled for later. ++ * If this tasklet is already running on another CPU, it is rescheduled ++ for later. ++ * Schedule must not be called from the tasklet itself (a lockup occurs) + * Tasklet is strictly serialized wrt itself, but not + wrt another tasklets. If client needs some intertask synchronization, + he makes it with spinlocks. +@@ -562,27 +563,36 @@ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data } + enum + { + TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */ +- TASKLET_STATE_RUN /* Tasklet is running (SMP only) */ ++ TASKLET_STATE_RUN, /* Tasklet is running (SMP only) */ ++ TASKLET_STATE_PENDING /* Tasklet is pending */ + }; + +-#ifdef CONFIG_SMP ++#define TASKLET_STATEF_SCHED (1 << TASKLET_STATE_SCHED) ++#define TASKLET_STATEF_RUN (1 << TASKLET_STATE_RUN) ++#define TASKLET_STATEF_PENDING (1 << TASKLET_STATE_PENDING) ++ ++#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) + static inline int tasklet_trylock(struct tasklet_struct *t) + { + return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state); + } + ++static inline int tasklet_tryunlock(struct tasklet_struct *t) ++{ ++ return cmpxchg(&t->state, TASKLET_STATEF_RUN, 0) == TASKLET_STATEF_RUN; ++} ++ + static inline void tasklet_unlock(struct tasklet_struct *t) + { + smp_mb__before_atomic(); + clear_bit(TASKLET_STATE_RUN, &(t)->state); + } + +-static inline void tasklet_unlock_wait(struct tasklet_struct *t) +-{ +- while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); } +-} ++extern void tasklet_unlock_wait(struct tasklet_struct *t); ++ + #else + #define tasklet_trylock(t) 1 ++#define tasklet_tryunlock(t) 1 + #define tasklet_unlock_wait(t) do { } while (0) + #define tasklet_unlock(t) do { } while (0) + #endif +@@ -616,12 +626,7 @@ static inline void tasklet_disable(struct tasklet_struct *t) + smp_mb(); + } + +-static inline void tasklet_enable(struct tasklet_struct *t) +-{ +- smp_mb__before_atomic(); +- atomic_dec(&t->count); +-} +- ++extern void tasklet_enable(struct tasklet_struct *t); + extern void tasklet_kill(struct tasklet_struct *t); + extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu); + extern void tasklet_init(struct tasklet_struct *t, +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 6f584861d329..1d3a482246cc 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -475,11 +476,38 @@ static void __tasklet_schedule_common(struct tasklet_struct *t, + unsigned long flags; + + local_irq_save(flags); ++ if (!tasklet_trylock(t)) { ++ local_irq_restore(flags); ++ return; ++ } ++ + head = this_cpu_ptr(headp); +- t->next = NULL; +- *head->tail = t; +- head->tail = &(t->next); +- raise_softirq_irqoff(softirq_nr); ++again: ++ /* We may have been preempted before tasklet_trylock ++ * and __tasklet_action may have already run. ++ * So double check the sched bit while the takslet ++ * is locked before adding it to the list. ++ */ ++ if (test_bit(TASKLET_STATE_SCHED, &t->state)) { ++ t->next = NULL; ++ *head->tail = t; ++ head->tail = &(t->next); ++ raise_softirq_irqoff(softirq_nr); ++ tasklet_unlock(t); ++ } else { ++ /* This is subtle. If we hit the corner case above ++ * It is possible that we get preempted right here, ++ * and another task has successfully called ++ * tasklet_schedule(), then this function, and ++ * failed on the trylock. Thus we must be sure ++ * before releasing the tasklet lock, that the ++ * SCHED_BIT is clear. Otherwise the tasklet ++ * may get its SCHED_BIT set, but not added to the ++ * list ++ */ ++ if (!tasklet_tryunlock(t)) ++ goto again; ++ } + local_irq_restore(flags); + } + +@@ -497,11 +525,21 @@ void __tasklet_hi_schedule(struct tasklet_struct *t) + } + EXPORT_SYMBOL(__tasklet_hi_schedule); + ++void tasklet_enable(struct tasklet_struct *t) ++{ ++ if (!atomic_dec_and_test(&t->count)) ++ return; ++ if (test_and_clear_bit(TASKLET_STATE_PENDING, &t->state)) ++ tasklet_schedule(t); ++} ++EXPORT_SYMBOL(tasklet_enable); ++ + static void tasklet_action_common(struct softirq_action *a, + struct tasklet_head *tl_head, + unsigned int softirq_nr) + { + struct tasklet_struct *list; ++ int loops = 1000000; + + local_irq_disable(); + list = tl_head->head; +@@ -513,25 +551,56 @@ static void tasklet_action_common(struct softirq_action *a, + struct tasklet_struct *t = list; + + list = list->next; ++ /* ++ * Should always succeed - after a tasklist got on the ++ * list (after getting the SCHED bit set from 0 to 1), ++ * nothing but the tasklet softirq it got queued to can ++ * lock it: ++ */ ++ if (!tasklet_trylock(t)) { ++ WARN_ON(1); ++ continue; ++ } + +- if (tasklet_trylock(t)) { +- if (!atomic_read(&t->count)) { +- if (!test_and_clear_bit(TASKLET_STATE_SCHED, +- &t->state)) +- BUG(); +- t->func(t->data); ++ t->next = NULL; ++ ++ if (unlikely(atomic_read(&t->count))) { ++out_disabled: ++ /* implicit unlock: */ ++ wmb(); ++ t->state = TASKLET_STATEF_PENDING; ++ continue; ++ } ++ /* ++ * After this point on the tasklet might be rescheduled ++ * on another CPU, but it can only be added to another ++ * CPU's tasklet list if we unlock the tasklet (which we ++ * dont do yet). ++ */ ++ if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) ++ WARN_ON(1); ++again: ++ t->func(t->data); ++ ++ while (!tasklet_tryunlock(t)) { ++ /* ++ * If it got disabled meanwhile, bail out: ++ */ ++ if (atomic_read(&t->count)) ++ goto out_disabled; ++ /* ++ * If it got scheduled meanwhile, re-execute ++ * the tasklet function: ++ */ ++ if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) ++ goto again; ++ if (!--loops) { ++ printk("hm, tasklet state: %08lx\n", t->state); ++ WARN_ON(1); + tasklet_unlock(t); +- continue; ++ break; + } +- tasklet_unlock(t); + } +- +- local_irq_disable(); +- t->next = NULL; +- *tl_head->tail = t; +- tl_head->tail = &t->next; +- __raise_softirq_irqoff(softirq_nr); +- local_irq_enable(); + } + } + +@@ -563,7 +632,7 @@ void tasklet_kill(struct tasklet_struct *t) + + while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { + do { +- yield(); ++ msleep(1); + } while (test_bit(TASKLET_STATE_SCHED, &t->state)); + } + tasklet_unlock_wait(t); +@@ -637,6 +706,23 @@ void __init softirq_init(void) + open_softirq(HI_SOFTIRQ, tasklet_hi_action); + } + ++#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) ++void tasklet_unlock_wait(struct tasklet_struct *t) ++{ ++ while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { ++ /* ++ * Hack for now to avoid this busy-loop: ++ */ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ msleep(1); ++#else ++ barrier(); ++#endif ++ } ++} ++EXPORT_SYMBOL(tasklet_unlock_wait); ++#endif ++ + static int ksoftirqd_should_run(unsigned int cpu) + { + return local_softirq_pending(); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0119-softirq-Check-preemption-after-reenabling-interrupts.patch linux-4.19.118/debian/patches-rt/0119-softirq-Check-preemption-after-reenabling-interrupts.patch --- linux-4.19.98/debian/patches-rt/0119-softirq-Check-preemption-after-reenabling-interrupts.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0119-softirq-Check-preemption-after-reenabling-interrupts.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,180 @@ +From 3e6511a5a97439410e2888198a743dfe4162bcbc Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sun, 13 Nov 2011 17:17:09 +0100 +Subject: [PATCH 119/325] softirq: Check preemption after reenabling interrupts +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +raise_softirq_irqoff() disables interrupts and wakes the softirq +daemon, but after reenabling interrupts there is no preemption check, +so the execution of the softirq thread might be delayed arbitrarily. + +In principle we could add that check to local_irq_enable/restore, but +that's overkill as the rasie_softirq_irqoff() sections are the only +ones which show this behaviour. + +Reported-by: Carsten Emde +Signed-off-by: Thomas Gleixner +--- + block/blk-softirq.c | 3 +++ + include/linux/preempt.h | 3 +++ + lib/irq_poll.c | 5 +++++ + net/core/dev.c | 7 +++++++ + 4 files changed, 18 insertions(+) + +diff --git a/block/blk-softirq.c b/block/blk-softirq.c +index 15c1f5e12eb8..1628277885a1 100644 +--- a/block/blk-softirq.c ++++ b/block/blk-softirq.c +@@ -53,6 +53,7 @@ static void trigger_softirq(void *data) + raise_softirq_irqoff(BLOCK_SOFTIRQ); + + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + + /* +@@ -91,6 +92,7 @@ static int blk_softirq_cpu_dead(unsigned int cpu) + this_cpu_ptr(&blk_cpu_done)); + raise_softirq_irqoff(BLOCK_SOFTIRQ); + local_irq_enable(); ++ preempt_check_resched_rt(); + + return 0; + } +@@ -143,6 +145,7 @@ void __blk_complete_request(struct request *req) + goto do_local; + + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(__blk_complete_request); + +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index b7fe717eb1f4..9984f2b75b73 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -187,8 +187,10 @@ do { \ + + #ifdef CONFIG_PREEMPT_RT_BASE + # define preempt_enable_no_resched() sched_preempt_enable_no_resched() ++# define preempt_check_resched_rt() preempt_check_resched() + #else + # define preempt_enable_no_resched() preempt_enable() ++# define preempt_check_resched_rt() barrier(); + #endif + + #define preemptible() (preempt_count() == 0 && !irqs_disabled()) +@@ -275,6 +277,7 @@ do { \ + #define preempt_disable_notrace() barrier() + #define preempt_enable_no_resched_notrace() barrier() + #define preempt_enable_notrace() barrier() ++#define preempt_check_resched_rt() barrier() + #define preemptible() 0 + + #define migrate_disable() barrier() +diff --git a/lib/irq_poll.c b/lib/irq_poll.c +index 86a709954f5a..9c069ef83d6d 100644 +--- a/lib/irq_poll.c ++++ b/lib/irq_poll.c +@@ -37,6 +37,7 @@ void irq_poll_sched(struct irq_poll *iop) + list_add_tail(&iop->list, this_cpu_ptr(&blk_cpu_iopoll)); + __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(irq_poll_sched); + +@@ -72,6 +73,7 @@ void irq_poll_complete(struct irq_poll *iop) + local_irq_save(flags); + __irq_poll_complete(iop); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(irq_poll_complete); + +@@ -96,6 +98,7 @@ static void __latent_entropy irq_poll_softirq(struct softirq_action *h) + } + + local_irq_enable(); ++ preempt_check_resched_rt(); + + /* Even though interrupts have been re-enabled, this + * access is safe because interrupts can only add new +@@ -133,6 +136,7 @@ static void __latent_entropy irq_poll_softirq(struct softirq_action *h) + __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); + + local_irq_enable(); ++ preempt_check_resched_rt(); + } + + /** +@@ -196,6 +200,7 @@ static int irq_poll_cpu_dead(unsigned int cpu) + this_cpu_ptr(&blk_cpu_iopoll)); + __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); + local_irq_enable(); ++ preempt_check_resched_rt(); + + return 0; + } +diff --git a/net/core/dev.c b/net/core/dev.c +index 2f4d35101f4d..626743ea0d53 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -2727,6 +2727,7 @@ static void __netif_reschedule(struct Qdisc *q) + sd->output_queue_tailp = &q->next_sched; + raise_softirq_irqoff(NET_TX_SOFTIRQ); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + + void __netif_schedule(struct Qdisc *q) +@@ -2789,6 +2790,7 @@ void __dev_kfree_skb_irq(struct sk_buff *skb, enum skb_free_reason reason) + __this_cpu_write(softnet_data.completion_queue, skb); + raise_softirq_irqoff(NET_TX_SOFTIRQ); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(__dev_kfree_skb_irq); + +@@ -4263,6 +4265,7 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, + rps_unlock(sd); + + local_irq_restore(flags); ++ preempt_check_resched_rt(); + + atomic_long_inc(&skb->dev->rx_dropped); + kfree_skb(skb); +@@ -5803,12 +5806,14 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd) + sd->rps_ipi_list = NULL; + + local_irq_enable(); ++ preempt_check_resched_rt(); + + /* Send pending IPI's to kick RPS processing on remote cpus. */ + net_rps_send_ipi(remsd); + } else + #endif + local_irq_enable(); ++ preempt_check_resched_rt(); + } + + static bool sd_has_rps_ipi_waiting(struct softnet_data *sd) +@@ -5886,6 +5891,7 @@ void __napi_schedule(struct napi_struct *n) + local_irq_save(flags); + ____napi_schedule(this_cpu_ptr(&softnet_data), n); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(__napi_schedule); + +@@ -9488,6 +9494,7 @@ static int dev_cpu_dead(unsigned int oldcpu) + + raise_softirq_irqoff(NET_TX_SOFTIRQ); + local_irq_enable(); ++ preempt_check_resched_rt(); + + #ifdef CONFIG_RPS + remsd = oldsd->rps_ipi_list; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0119-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch linux-4.19.118/debian/patches-rt/0119-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch --- linux-4.19.98/debian/patches-rt/0119-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0119-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,303 +0,0 @@ -From 30b45605a910b13cdacec56a13b7715aa4aef8f9 Mon Sep 17 00:00:00 2001 -From: Ingo Molnar -Date: Tue, 29 Nov 2011 20:18:22 -0500 -Subject: [PATCH 119/290] tasklet: Prevent tasklets from going into infinite - spin in RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -When CONFIG_PREEMPT_RT_FULL is enabled, tasklets run as threads, -and spinlocks turn are mutexes. But this can cause issues with -tasks disabling tasklets. A tasklet runs under ksoftirqd, and -if a tasklets are disabled with tasklet_disable(), the tasklet -count is increased. When a tasklet runs, it checks this counter -and if it is set, it adds itself back on the softirq queue and -returns. - -The problem arises in RT because ksoftirq will see that a softirq -is ready to run (the tasklet softirq just re-armed itself), and will -not sleep, but instead run the softirqs again. The tasklet softirq -will still see that the count is non-zero and will not execute -the tasklet and requeue itself on the softirq again, which will -cause ksoftirqd to run it again and again and again. - -It gets worse because ksoftirqd runs as a real-time thread. -If it preempted the task that disabled tasklets, and that task -has migration disabled, or can't run for other reasons, the tasklet -softirq will never run because the count will never be zero, and -ksoftirqd will go into an infinite loop. As an RT task, it this -becomes a big problem. - -This is a hack solution to have tasklet_disable stop tasklets, and -when a tasklet runs, instead of requeueing the tasklet softirqd -it delays it. When tasklet_enable() is called, and tasklets are -waiting, then the tasklet_enable() will kick the tasklets to continue. -This prevents the lock up from ksoftirq going into an infinite loop. - -[ rostedt@goodmis.org: ported to 3.0-rt ] - -Signed-off-by: Ingo Molnar -Signed-off-by: Steven Rostedt -Signed-off-by: Thomas Gleixner ---- - include/linux/interrupt.h | 33 +++++----- - kernel/softirq.c | 126 ++++++++++++++++++++++++++++++++------ - 2 files changed, 125 insertions(+), 34 deletions(-) - -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index a943c07b54ba..e74936c7be48 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -542,8 +542,9 @@ static inline struct task_struct *this_cpu_ksoftirqd(void) - to be executed on some cpu at least once after this. - * If the tasklet is already scheduled, but its execution is still not - started, it will be executed only once. -- * If this tasklet is already running on another CPU (or schedule is called -- from tasklet itself), it is rescheduled for later. -+ * If this tasklet is already running on another CPU, it is rescheduled -+ for later. -+ * Schedule must not be called from the tasklet itself (a lockup occurs) - * Tasklet is strictly serialized wrt itself, but not - wrt another tasklets. If client needs some intertask synchronization, - he makes it with spinlocks. -@@ -568,27 +569,36 @@ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data } - enum - { - TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */ -- TASKLET_STATE_RUN /* Tasklet is running (SMP only) */ -+ TASKLET_STATE_RUN, /* Tasklet is running (SMP only) */ -+ TASKLET_STATE_PENDING /* Tasklet is pending */ - }; - --#ifdef CONFIG_SMP -+#define TASKLET_STATEF_SCHED (1 << TASKLET_STATE_SCHED) -+#define TASKLET_STATEF_RUN (1 << TASKLET_STATE_RUN) -+#define TASKLET_STATEF_PENDING (1 << TASKLET_STATE_PENDING) -+ -+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) - static inline int tasklet_trylock(struct tasklet_struct *t) - { - return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state); - } - -+static inline int tasklet_tryunlock(struct tasklet_struct *t) -+{ -+ return cmpxchg(&t->state, TASKLET_STATEF_RUN, 0) == TASKLET_STATEF_RUN; -+} -+ - static inline void tasklet_unlock(struct tasklet_struct *t) - { - smp_mb__before_atomic(); - clear_bit(TASKLET_STATE_RUN, &(t)->state); - } - --static inline void tasklet_unlock_wait(struct tasklet_struct *t) --{ -- while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); } --} -+extern void tasklet_unlock_wait(struct tasklet_struct *t); -+ - #else - #define tasklet_trylock(t) 1 -+#define tasklet_tryunlock(t) 1 - #define tasklet_unlock_wait(t) do { } while (0) - #define tasklet_unlock(t) do { } while (0) - #endif -@@ -622,12 +632,7 @@ static inline void tasklet_disable(struct tasklet_struct *t) - smp_mb(); - } - --static inline void tasklet_enable(struct tasklet_struct *t) --{ -- smp_mb__before_atomic(); -- atomic_dec(&t->count); --} -- -+extern void tasklet_enable(struct tasklet_struct *t); - extern void tasklet_kill(struct tasklet_struct *t); - extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu); - extern void tasklet_init(struct tasklet_struct *t, -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 6f584861d329..1d3a482246cc 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -475,11 +476,38 @@ static void __tasklet_schedule_common(struct tasklet_struct *t, - unsigned long flags; - - local_irq_save(flags); -+ if (!tasklet_trylock(t)) { -+ local_irq_restore(flags); -+ return; -+ } -+ - head = this_cpu_ptr(headp); -- t->next = NULL; -- *head->tail = t; -- head->tail = &(t->next); -- raise_softirq_irqoff(softirq_nr); -+again: -+ /* We may have been preempted before tasklet_trylock -+ * and __tasklet_action may have already run. -+ * So double check the sched bit while the takslet -+ * is locked before adding it to the list. -+ */ -+ if (test_bit(TASKLET_STATE_SCHED, &t->state)) { -+ t->next = NULL; -+ *head->tail = t; -+ head->tail = &(t->next); -+ raise_softirq_irqoff(softirq_nr); -+ tasklet_unlock(t); -+ } else { -+ /* This is subtle. If we hit the corner case above -+ * It is possible that we get preempted right here, -+ * and another task has successfully called -+ * tasklet_schedule(), then this function, and -+ * failed on the trylock. Thus we must be sure -+ * before releasing the tasklet lock, that the -+ * SCHED_BIT is clear. Otherwise the tasklet -+ * may get its SCHED_BIT set, but not added to the -+ * list -+ */ -+ if (!tasklet_tryunlock(t)) -+ goto again; -+ } - local_irq_restore(flags); - } - -@@ -497,11 +525,21 @@ void __tasklet_hi_schedule(struct tasklet_struct *t) - } - EXPORT_SYMBOL(__tasklet_hi_schedule); - -+void tasklet_enable(struct tasklet_struct *t) -+{ -+ if (!atomic_dec_and_test(&t->count)) -+ return; -+ if (test_and_clear_bit(TASKLET_STATE_PENDING, &t->state)) -+ tasklet_schedule(t); -+} -+EXPORT_SYMBOL(tasklet_enable); -+ - static void tasklet_action_common(struct softirq_action *a, - struct tasklet_head *tl_head, - unsigned int softirq_nr) - { - struct tasklet_struct *list; -+ int loops = 1000000; - - local_irq_disable(); - list = tl_head->head; -@@ -513,25 +551,56 @@ static void tasklet_action_common(struct softirq_action *a, - struct tasklet_struct *t = list; - - list = list->next; -+ /* -+ * Should always succeed - after a tasklist got on the -+ * list (after getting the SCHED bit set from 0 to 1), -+ * nothing but the tasklet softirq it got queued to can -+ * lock it: -+ */ -+ if (!tasklet_trylock(t)) { -+ WARN_ON(1); -+ continue; -+ } - -- if (tasklet_trylock(t)) { -- if (!atomic_read(&t->count)) { -- if (!test_and_clear_bit(TASKLET_STATE_SCHED, -- &t->state)) -- BUG(); -- t->func(t->data); -+ t->next = NULL; -+ -+ if (unlikely(atomic_read(&t->count))) { -+out_disabled: -+ /* implicit unlock: */ -+ wmb(); -+ t->state = TASKLET_STATEF_PENDING; -+ continue; -+ } -+ /* -+ * After this point on the tasklet might be rescheduled -+ * on another CPU, but it can only be added to another -+ * CPU's tasklet list if we unlock the tasklet (which we -+ * dont do yet). -+ */ -+ if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) -+ WARN_ON(1); -+again: -+ t->func(t->data); -+ -+ while (!tasklet_tryunlock(t)) { -+ /* -+ * If it got disabled meanwhile, bail out: -+ */ -+ if (atomic_read(&t->count)) -+ goto out_disabled; -+ /* -+ * If it got scheduled meanwhile, re-execute -+ * the tasklet function: -+ */ -+ if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) -+ goto again; -+ if (!--loops) { -+ printk("hm, tasklet state: %08lx\n", t->state); -+ WARN_ON(1); - tasklet_unlock(t); -- continue; -+ break; - } -- tasklet_unlock(t); - } -- -- local_irq_disable(); -- t->next = NULL; -- *tl_head->tail = t; -- tl_head->tail = &t->next; -- __raise_softirq_irqoff(softirq_nr); -- local_irq_enable(); - } - } - -@@ -563,7 +632,7 @@ void tasklet_kill(struct tasklet_struct *t) - - while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { - do { -- yield(); -+ msleep(1); - } while (test_bit(TASKLET_STATE_SCHED, &t->state)); - } - tasklet_unlock_wait(t); -@@ -637,6 +706,23 @@ void __init softirq_init(void) - open_softirq(HI_SOFTIRQ, tasklet_hi_action); - } - -+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) -+void tasklet_unlock_wait(struct tasklet_struct *t) -+{ -+ while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { -+ /* -+ * Hack for now to avoid this busy-loop: -+ */ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ msleep(1); -+#else -+ barrier(); -+#endif -+ } -+} -+EXPORT_SYMBOL(tasklet_unlock_wait); -+#endif -+ - static int ksoftirqd_should_run(unsigned int cpu) - { - return local_softirq_pending(); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0120-softirq-Check-preemption-after-reenabling-interrupts.patch linux-4.19.118/debian/patches-rt/0120-softirq-Check-preemption-after-reenabling-interrupts.patch --- linux-4.19.98/debian/patches-rt/0120-softirq-Check-preemption-after-reenabling-interrupts.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0120-softirq-Check-preemption-after-reenabling-interrupts.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ -From 8e833dc09a89e60167a67518738fc02a174737bd Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 13 Nov 2011 17:17:09 +0100 -Subject: [PATCH 120/290] softirq: Check preemption after reenabling interrupts -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -raise_softirq_irqoff() disables interrupts and wakes the softirq -daemon, but after reenabling interrupts there is no preemption check, -so the execution of the softirq thread might be delayed arbitrarily. - -In principle we could add that check to local_irq_enable/restore, but -that's overkill as the rasie_softirq_irqoff() sections are the only -ones which show this behaviour. - -Reported-by: Carsten Emde -Signed-off-by: Thomas Gleixner ---- - block/blk-softirq.c | 3 +++ - include/linux/preempt.h | 3 +++ - lib/irq_poll.c | 5 +++++ - net/core/dev.c | 7 +++++++ - 4 files changed, 18 insertions(+) - -diff --git a/block/blk-softirq.c b/block/blk-softirq.c -index 15c1f5e12eb8..1628277885a1 100644 ---- a/block/blk-softirq.c -+++ b/block/blk-softirq.c -@@ -53,6 +53,7 @@ static void trigger_softirq(void *data) - raise_softirq_irqoff(BLOCK_SOFTIRQ); - - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - - /* -@@ -91,6 +92,7 @@ static int blk_softirq_cpu_dead(unsigned int cpu) - this_cpu_ptr(&blk_cpu_done)); - raise_softirq_irqoff(BLOCK_SOFTIRQ); - local_irq_enable(); -+ preempt_check_resched_rt(); - - return 0; - } -@@ -143,6 +145,7 @@ void __blk_complete_request(struct request *req) - goto do_local; - - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(__blk_complete_request); - -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index b7fe717eb1f4..9984f2b75b73 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -187,8 +187,10 @@ do { \ - - #ifdef CONFIG_PREEMPT_RT_BASE - # define preempt_enable_no_resched() sched_preempt_enable_no_resched() -+# define preempt_check_resched_rt() preempt_check_resched() - #else - # define preempt_enable_no_resched() preempt_enable() -+# define preempt_check_resched_rt() barrier(); - #endif - - #define preemptible() (preempt_count() == 0 && !irqs_disabled()) -@@ -275,6 +277,7 @@ do { \ - #define preempt_disable_notrace() barrier() - #define preempt_enable_no_resched_notrace() barrier() - #define preempt_enable_notrace() barrier() -+#define preempt_check_resched_rt() barrier() - #define preemptible() 0 - - #define migrate_disable() barrier() -diff --git a/lib/irq_poll.c b/lib/irq_poll.c -index 86a709954f5a..9c069ef83d6d 100644 ---- a/lib/irq_poll.c -+++ b/lib/irq_poll.c -@@ -37,6 +37,7 @@ void irq_poll_sched(struct irq_poll *iop) - list_add_tail(&iop->list, this_cpu_ptr(&blk_cpu_iopoll)); - __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(irq_poll_sched); - -@@ -72,6 +73,7 @@ void irq_poll_complete(struct irq_poll *iop) - local_irq_save(flags); - __irq_poll_complete(iop); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(irq_poll_complete); - -@@ -96,6 +98,7 @@ static void __latent_entropy irq_poll_softirq(struct softirq_action *h) - } - - local_irq_enable(); -+ preempt_check_resched_rt(); - - /* Even though interrupts have been re-enabled, this - * access is safe because interrupts can only add new -@@ -133,6 +136,7 @@ static void __latent_entropy irq_poll_softirq(struct softirq_action *h) - __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); - - local_irq_enable(); -+ preempt_check_resched_rt(); - } - - /** -@@ -196,6 +200,7 @@ static int irq_poll_cpu_dead(unsigned int cpu) - this_cpu_ptr(&blk_cpu_iopoll)); - __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); - local_irq_enable(); -+ preempt_check_resched_rt(); - - return 0; - } -diff --git a/net/core/dev.c b/net/core/dev.c -index a26d87073f71..f64e9d036915 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -2727,6 +2727,7 @@ static void __netif_reschedule(struct Qdisc *q) - sd->output_queue_tailp = &q->next_sched; - raise_softirq_irqoff(NET_TX_SOFTIRQ); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - - void __netif_schedule(struct Qdisc *q) -@@ -2789,6 +2790,7 @@ void __dev_kfree_skb_irq(struct sk_buff *skb, enum skb_free_reason reason) - __this_cpu_write(softnet_data.completion_queue, skb); - raise_softirq_irqoff(NET_TX_SOFTIRQ); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(__dev_kfree_skb_irq); - -@@ -4261,6 +4263,7 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, - rps_unlock(sd); - - local_irq_restore(flags); -+ preempt_check_resched_rt(); - - atomic_long_inc(&skb->dev->rx_dropped); - kfree_skb(skb); -@@ -5830,12 +5833,14 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd) - sd->rps_ipi_list = NULL; - - local_irq_enable(); -+ preempt_check_resched_rt(); - - /* Send pending IPI's to kick RPS processing on remote cpus. */ - net_rps_send_ipi(remsd); - } else - #endif - local_irq_enable(); -+ preempt_check_resched_rt(); - } - - static bool sd_has_rps_ipi_waiting(struct softnet_data *sd) -@@ -5913,6 +5918,7 @@ void __napi_schedule(struct napi_struct *n) - local_irq_save(flags); - ____napi_schedule(this_cpu_ptr(&softnet_data), n); - local_irq_restore(flags); -+ preempt_check_resched_rt(); - } - EXPORT_SYMBOL(__napi_schedule); - -@@ -9504,6 +9510,7 @@ static int dev_cpu_dead(unsigned int oldcpu) - - raise_softirq_irqoff(NET_TX_SOFTIRQ); - local_irq_enable(); -+ preempt_check_resched_rt(); - - #ifdef CONFIG_RPS - remsd = oldsd->rps_ipi_list; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0120-softirq-Disable-softirq-stacks-for-RT.patch linux-4.19.118/debian/patches-rt/0120-softirq-Disable-softirq-stacks-for-RT.patch --- linux-4.19.98/debian/patches-rt/0120-softirq-Disable-softirq-stacks-for-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0120-softirq-Disable-softirq-stacks-for-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,177 @@ +From 2ed3d0fe9e8b5fea94a4a98b98490353bae4a22b Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Mon, 18 Jul 2011 13:59:17 +0200 +Subject: [PATCH 120/325] softirq: Disable softirq stacks for RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Disable extra stacks for softirqs. We want to preempt softirqs and +having them on special IRQ-stack does not make this easier. + +Signed-off-by: Thomas Gleixner +--- + arch/powerpc/kernel/irq.c | 2 ++ + arch/powerpc/kernel/misc_32.S | 2 ++ + arch/powerpc/kernel/misc_64.S | 2 ++ + arch/sh/kernel/irq.c | 2 ++ + arch/sparc/kernel/irq_64.c | 2 ++ + arch/x86/entry/entry_64.S | 2 ++ + arch/x86/kernel/irq_32.c | 2 ++ + include/linux/interrupt.h | 2 +- + 8 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c +index d37704ebccdb..b45a9849b687 100644 +--- a/arch/powerpc/kernel/irq.c ++++ b/arch/powerpc/kernel/irq.c +@@ -766,6 +766,7 @@ void irq_ctx_init(void) + } + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + void do_softirq_own_stack(void) + { + struct thread_info *curtp, *irqtp; +@@ -783,6 +784,7 @@ void do_softirq_own_stack(void) + if (irqtp->flags) + set_bits(irqtp->flags, &curtp->flags); + } ++#endif + + irq_hw_number_t virq_to_hw(unsigned int virq) + { +diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S +index 695b24a2d954..032ada21b7bd 100644 +--- a/arch/powerpc/kernel/misc_32.S ++++ b/arch/powerpc/kernel/misc_32.S +@@ -42,6 +42,7 @@ + * We store the saved ksp_limit in the unused part + * of the STACK_FRAME_OVERHEAD + */ ++#ifndef CONFIG_PREEMPT_RT_FULL + _GLOBAL(call_do_softirq) + mflr r0 + stw r0,4(r1) +@@ -58,6 +59,7 @@ _GLOBAL(call_do_softirq) + stw r10,THREAD+KSP_LIMIT(r2) + mtlr r0 + blr ++#endif + + /* + * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp); +diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S +index facc02964ab3..8b1774186c68 100644 +--- a/arch/powerpc/kernel/misc_64.S ++++ b/arch/powerpc/kernel/misc_64.S +@@ -32,6 +32,7 @@ + + .text + ++#ifndef CONFIG_PREEMPT_RT_FULL + _GLOBAL(call_do_softirq) + mflr r0 + std r0,16(r1) +@@ -42,6 +43,7 @@ _GLOBAL(call_do_softirq) + ld r0,16(r1) + mtlr r0 + blr ++#endif + + _GLOBAL(call_do_irq) + mflr r0 +diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c +index 5717c7cbdd97..66dd399b2007 100644 +--- a/arch/sh/kernel/irq.c ++++ b/arch/sh/kernel/irq.c +@@ -148,6 +148,7 @@ void irq_ctx_exit(int cpu) + hardirq_ctx[cpu] = NULL; + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + void do_softirq_own_stack(void) + { + struct thread_info *curctx; +@@ -175,6 +176,7 @@ void do_softirq_own_stack(void) + "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr" + ); + } ++#endif + #else + static inline void handle_one_irq(unsigned int irq) + { +diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c +index 713670e6d13d..5dfc715343f9 100644 +--- a/arch/sparc/kernel/irq_64.c ++++ b/arch/sparc/kernel/irq_64.c +@@ -854,6 +854,7 @@ void __irq_entry handler_irq(int pil, struct pt_regs *regs) + set_irq_regs(old_regs); + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + void do_softirq_own_stack(void) + { + void *orig_sp, *sp = softirq_stack[smp_processor_id()]; +@@ -868,6 +869,7 @@ void do_softirq_own_stack(void) + __asm__ __volatile__("mov %0, %%sp" + : : "r" (orig_sp)); + } ++#endif + + #ifdef CONFIG_HOTPLUG_CPU + void fixup_irqs(void) +diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S +index ccb5e3486aee..7ffd83c57ef2 100644 +--- a/arch/x86/entry/entry_64.S ++++ b/arch/x86/entry/entry_64.S +@@ -1083,6 +1083,7 @@ bad_gs: + jmp 2b + .previous + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* Call softirq on interrupt stack. Interrupts are off. */ + ENTRY(do_softirq_own_stack) + pushq %rbp +@@ -1093,6 +1094,7 @@ ENTRY(do_softirq_own_stack) + leaveq + ret + ENDPROC(do_softirq_own_stack) ++#endif + + #ifdef CONFIG_XEN + idtentry hypervisor_callback xen_do_hypervisor_callback has_error_code=0 +diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c +index 95600a99ae93..9192d76085ba 100644 +--- a/arch/x86/kernel/irq_32.c ++++ b/arch/x86/kernel/irq_32.c +@@ -130,6 +130,7 @@ void irq_ctx_init(int cpu) + cpu, per_cpu(hardirq_stack, cpu), per_cpu(softirq_stack, cpu)); + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + void do_softirq_own_stack(void) + { + struct irq_stack *irqstk; +@@ -146,6 +147,7 @@ void do_softirq_own_stack(void) + + call_on_stack(__do_softirq, isp); + } ++#endif + + bool handle_irq(struct irq_desc *desc, struct pt_regs *regs) + { +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index 35fa335c475b..eec4bec454b5 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -500,7 +500,7 @@ struct softirq_action + asmlinkage void do_softirq(void); + asmlinkage void __do_softirq(void); + +-#ifdef __ARCH_HAS_DO_SOFTIRQ ++#if defined(__ARCH_HAS_DO_SOFTIRQ) && !defined(CONFIG_PREEMPT_RT_FULL) + void do_softirq_own_stack(void); + #else + static inline void do_softirq_own_stack(void) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0121-softirq-Disable-softirq-stacks-for-RT.patch linux-4.19.118/debian/patches-rt/0121-softirq-Disable-softirq-stacks-for-RT.patch --- linux-4.19.98/debian/patches-rt/0121-softirq-Disable-softirq-stacks-for-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0121-softirq-Disable-softirq-stacks-for-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,177 +0,0 @@ -From bfa59221785f7f02d4c4439aef840c3c84aeb0b1 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Mon, 18 Jul 2011 13:59:17 +0200 -Subject: [PATCH 121/290] softirq: Disable softirq stacks for RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Disable extra stacks for softirqs. We want to preempt softirqs and -having them on special IRQ-stack does not make this easier. - -Signed-off-by: Thomas Gleixner ---- - arch/powerpc/kernel/irq.c | 2 ++ - arch/powerpc/kernel/misc_32.S | 2 ++ - arch/powerpc/kernel/misc_64.S | 2 ++ - arch/sh/kernel/irq.c | 2 ++ - arch/sparc/kernel/irq_64.c | 2 ++ - arch/x86/entry/entry_64.S | 2 ++ - arch/x86/kernel/irq_32.c | 2 ++ - include/linux/interrupt.h | 2 +- - 8 files changed, 15 insertions(+), 1 deletion(-) - -diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c -index d37704ebccdb..b45a9849b687 100644 ---- a/arch/powerpc/kernel/irq.c -+++ b/arch/powerpc/kernel/irq.c -@@ -766,6 +766,7 @@ void irq_ctx_init(void) - } - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - void do_softirq_own_stack(void) - { - struct thread_info *curtp, *irqtp; -@@ -783,6 +784,7 @@ void do_softirq_own_stack(void) - if (irqtp->flags) - set_bits(irqtp->flags, &curtp->flags); - } -+#endif - - irq_hw_number_t virq_to_hw(unsigned int virq) - { -diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S -index 695b24a2d954..032ada21b7bd 100644 ---- a/arch/powerpc/kernel/misc_32.S -+++ b/arch/powerpc/kernel/misc_32.S -@@ -42,6 +42,7 @@ - * We store the saved ksp_limit in the unused part - * of the STACK_FRAME_OVERHEAD - */ -+#ifndef CONFIG_PREEMPT_RT_FULL - _GLOBAL(call_do_softirq) - mflr r0 - stw r0,4(r1) -@@ -58,6 +59,7 @@ _GLOBAL(call_do_softirq) - stw r10,THREAD+KSP_LIMIT(r2) - mtlr r0 - blr -+#endif - - /* - * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp); -diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S -index facc02964ab3..8b1774186c68 100644 ---- a/arch/powerpc/kernel/misc_64.S -+++ b/arch/powerpc/kernel/misc_64.S -@@ -32,6 +32,7 @@ - - .text - -+#ifndef CONFIG_PREEMPT_RT_FULL - _GLOBAL(call_do_softirq) - mflr r0 - std r0,16(r1) -@@ -42,6 +43,7 @@ _GLOBAL(call_do_softirq) - ld r0,16(r1) - mtlr r0 - blr -+#endif - - _GLOBAL(call_do_irq) - mflr r0 -diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c -index 5717c7cbdd97..66dd399b2007 100644 ---- a/arch/sh/kernel/irq.c -+++ b/arch/sh/kernel/irq.c -@@ -148,6 +148,7 @@ void irq_ctx_exit(int cpu) - hardirq_ctx[cpu] = NULL; - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - void do_softirq_own_stack(void) - { - struct thread_info *curctx; -@@ -175,6 +176,7 @@ void do_softirq_own_stack(void) - "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr" - ); - } -+#endif - #else - static inline void handle_one_irq(unsigned int irq) - { -diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c -index 713670e6d13d..5dfc715343f9 100644 ---- a/arch/sparc/kernel/irq_64.c -+++ b/arch/sparc/kernel/irq_64.c -@@ -854,6 +854,7 @@ void __irq_entry handler_irq(int pil, struct pt_regs *regs) - set_irq_regs(old_regs); - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - void do_softirq_own_stack(void) - { - void *orig_sp, *sp = softirq_stack[smp_processor_id()]; -@@ -868,6 +869,7 @@ void do_softirq_own_stack(void) - __asm__ __volatile__("mov %0, %%sp" - : : "r" (orig_sp)); - } -+#endif - - #ifdef CONFIG_HOTPLUG_CPU - void fixup_irqs(void) -diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S -index ccb5e3486aee..7ffd83c57ef2 100644 ---- a/arch/x86/entry/entry_64.S -+++ b/arch/x86/entry/entry_64.S -@@ -1083,6 +1083,7 @@ bad_gs: - jmp 2b - .previous - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* Call softirq on interrupt stack. Interrupts are off. */ - ENTRY(do_softirq_own_stack) - pushq %rbp -@@ -1093,6 +1094,7 @@ ENTRY(do_softirq_own_stack) - leaveq - ret - ENDPROC(do_softirq_own_stack) -+#endif - - #ifdef CONFIG_XEN - idtentry hypervisor_callback xen_do_hypervisor_callback has_error_code=0 -diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c -index 95600a99ae93..9192d76085ba 100644 ---- a/arch/x86/kernel/irq_32.c -+++ b/arch/x86/kernel/irq_32.c -@@ -130,6 +130,7 @@ void irq_ctx_init(int cpu) - cpu, per_cpu(hardirq_stack, cpu), per_cpu(softirq_stack, cpu)); - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - void do_softirq_own_stack(void) - { - struct irq_stack *irqstk; -@@ -146,6 +147,7 @@ void do_softirq_own_stack(void) - - call_on_stack(__do_softirq, isp); - } -+#endif - - bool handle_irq(struct irq_desc *desc, struct pt_regs *regs) - { -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index e74936c7be48..cb2d1384cb0d 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -506,7 +506,7 @@ struct softirq_action - asmlinkage void do_softirq(void); - asmlinkage void __do_softirq(void); - --#ifdef __ARCH_HAS_DO_SOFTIRQ -+#if defined(__ARCH_HAS_DO_SOFTIRQ) && !defined(CONFIG_PREEMPT_RT_FULL) - void do_softirq_own_stack(void); - #else - static inline void do_softirq_own_stack(void) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0121-softirq-Split-softirq-locks.patch linux-4.19.118/debian/patches-rt/0121-softirq-Split-softirq-locks.patch --- linux-4.19.98/debian/patches-rt/0121-softirq-Split-softirq-locks.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0121-softirq-Split-softirq-locks.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,832 @@ +From 7f588c91c584d17bfab949544912fab8942a5eaf Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 4 Oct 2012 14:20:47 +0100 +Subject: [PATCH 121/325] softirq: Split softirq locks +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The 3.x RT series removed the split softirq implementation in favour +of pushing softirq processing into the context of the thread which +raised it. Though this prevents us from handling the various softirqs +at different priorities. Now instead of reintroducing the split +softirq threads we split the locks which serialize the softirq +processing. + +If a softirq is raised in context of a thread, then the softirq is +noted on a per thread field, if the thread is in a bh disabled +region. If the softirq is raised from hard interrupt context, then the +bit is set in the flag field of ksoftirqd and ksoftirqd is invoked. +When a thread leaves a bh disabled region, then it tries to execute +the softirqs which have been raised in its own context. It acquires +the per softirq / per cpu lock for the softirq and then checks, +whether the softirq is still pending in the per cpu +local_softirq_pending() field. If yes, it runs the softirq. If no, +then some other task executed it already. This allows for zero config +softirq elevation in the context of user space tasks or interrupt +threads. + +Signed-off-by: Thomas Gleixner +--- + include/linux/bottom_half.h | 34 +++ + include/linux/interrupt.h | 15 +- + include/linux/preempt.h | 15 +- + include/linux/sched.h | 3 + + init/main.c | 1 + + kernel/softirq.c | 491 ++++++++++++++++++++++++++++++------ + kernel/time/tick-sched.c | 9 +- + 7 files changed, 478 insertions(+), 90 deletions(-) + +diff --git a/include/linux/bottom_half.h b/include/linux/bottom_half.h +index a19519f4241d..40dd5ef9c154 100644 +--- a/include/linux/bottom_half.h ++++ b/include/linux/bottom_half.h +@@ -4,6 +4,39 @@ + + #include + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ ++extern void __local_bh_disable(void); ++extern void _local_bh_enable(void); ++extern void __local_bh_enable(void); ++ ++static inline void local_bh_disable(void) ++{ ++ __local_bh_disable(); ++} ++ ++static inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) ++{ ++ __local_bh_disable(); ++} ++ ++static inline void local_bh_enable(void) ++{ ++ __local_bh_enable(); ++} ++ ++static inline void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) ++{ ++ __local_bh_enable(); ++} ++ ++static inline void local_bh_enable_ip(unsigned long ip) ++{ ++ __local_bh_enable(); ++} ++ ++#else ++ + #ifdef CONFIG_TRACE_IRQFLAGS + extern void __local_bh_disable_ip(unsigned long ip, unsigned int cnt); + #else +@@ -31,5 +64,6 @@ static inline void local_bh_enable(void) + { + __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET); + } ++#endif + + #endif /* _LINUX_BH_H */ +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index eec4bec454b5..cf9860d49d57 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -497,10 +497,11 @@ struct softirq_action + void (*action)(struct softirq_action *); + }; + ++#ifndef CONFIG_PREEMPT_RT_FULL + asmlinkage void do_softirq(void); + asmlinkage void __do_softirq(void); +- +-#if defined(__ARCH_HAS_DO_SOFTIRQ) && !defined(CONFIG_PREEMPT_RT_FULL) ++static inline void thread_do_softirq(void) { do_softirq(); } ++#ifdef __ARCH_HAS_DO_SOFTIRQ + void do_softirq_own_stack(void); + #else + static inline void do_softirq_own_stack(void) +@@ -508,6 +509,9 @@ static inline void do_softirq_own_stack(void) + __do_softirq(); + } + #endif ++#else ++extern void thread_do_softirq(void); ++#endif + + extern void open_softirq(int nr, void (*action)(struct softirq_action *)); + extern void softirq_init(void); +@@ -515,6 +519,7 @@ extern void __raise_softirq_irqoff(unsigned int nr); + + extern void raise_softirq_irqoff(unsigned int nr); + extern void raise_softirq(unsigned int nr); ++extern void softirq_check_pending_idle(void); + + DECLARE_PER_CPU(struct task_struct *, ksoftirqd); + +@@ -632,6 +637,12 @@ extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu); + extern void tasklet_init(struct tasklet_struct *t, + void (*func)(unsigned long), unsigned long data); + ++#ifdef CONFIG_PREEMPT_RT_FULL ++extern void softirq_early_init(void); ++#else ++static inline void softirq_early_init(void) { } ++#endif ++ + struct tasklet_hrtimer { + struct hrtimer timer; + struct tasklet_struct tasklet; +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index 9984f2b75b73..27c3176d88d2 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -51,7 +51,11 @@ + #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) + #define NMI_OFFSET (1UL << NMI_SHIFT) + +-#define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) ++#ifndef CONFIG_PREEMPT_RT_FULL ++# define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) ++#else ++# define SOFTIRQ_DISABLE_OFFSET (0) ++#endif + + /* We use the MSB mostly because its available */ + #define PREEMPT_NEED_RESCHED 0x80000000 +@@ -81,9 +85,15 @@ + #include + + #define hardirq_count() (preempt_count() & HARDIRQ_MASK) +-#define softirq_count() (preempt_count() & SOFTIRQ_MASK) + #define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \ + | NMI_MASK)) ++#ifndef CONFIG_PREEMPT_RT_FULL ++# define softirq_count() (preempt_count() & SOFTIRQ_MASK) ++# define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) ++#else ++# define softirq_count() ((unsigned long)current->softirq_nestcnt) ++extern int in_serving_softirq(void); ++#endif + + /* + * Are we doing bottom half or hardware interrupt processing? +@@ -101,7 +111,6 @@ + #define in_irq() (hardirq_count()) + #define in_softirq() (softirq_count()) + #define in_interrupt() (irq_count()) +-#define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) + #define in_nmi() (preempt_count() & NMI_MASK) + #define in_task() (!(preempt_count() & \ + (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET))) +diff --git a/include/linux/sched.h b/include/linux/sched.h +index f180bfadff33..f4ff928e6be3 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1198,6 +1198,8 @@ struct task_struct { + #endif + #ifdef CONFIG_PREEMPT_RT_BASE + struct rcu_head put_rcu; ++ int softirq_nestcnt; ++ unsigned int softirqs_raised; + #endif + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + unsigned long task_state_change; +@@ -1395,6 +1397,7 @@ extern struct pid *cad_pid; + /* + * Per process flags + */ ++#define PF_IN_SOFTIRQ 0x00000001 /* Task is serving softirq */ + #define PF_IDLE 0x00000002 /* I am an IDLE thread */ + #define PF_EXITING 0x00000004 /* Getting shut down */ + #define PF_EXITPIDONE 0x00000008 /* PI exit done on shut down */ +diff --git a/init/main.c b/init/main.c +index 38a603f62b7b..6e02188386a7 100644 +--- a/init/main.c ++++ b/init/main.c +@@ -560,6 +560,7 @@ asmlinkage __visible void __init start_kernel(void) + setup_command_line(command_line); + setup_nr_cpu_ids(); + setup_per_cpu_areas(); ++ softirq_early_init(); + smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ + boot_cpu_hotplug_init(); + +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 1d3a482246cc..fd89f8ab85ac 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -26,7 +26,9 @@ + #include + #include + #include ++#include + #include ++#include + + #define CREATE_TRACE_POINTS + #include +@@ -63,6 +65,98 @@ const char * const softirq_to_name[NR_SOFTIRQS] = { + "TASKLET", "SCHED", "HRTIMER", "RCU" + }; + ++#ifdef CONFIG_NO_HZ_COMMON ++# ifdef CONFIG_PREEMPT_RT_FULL ++ ++struct softirq_runner { ++ struct task_struct *runner[NR_SOFTIRQS]; ++}; ++ ++static DEFINE_PER_CPU(struct softirq_runner, softirq_runners); ++ ++static inline void softirq_set_runner(unsigned int sirq) ++{ ++ struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); ++ ++ sr->runner[sirq] = current; ++} ++ ++static inline void softirq_clr_runner(unsigned int sirq) ++{ ++ struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); ++ ++ sr->runner[sirq] = NULL; ++} ++ ++/* ++ * On preempt-rt a softirq running context might be blocked on a ++ * lock. There might be no other runnable task on this CPU because the ++ * lock owner runs on some other CPU. So we have to go into idle with ++ * the pending bit set. Therefor we need to check this otherwise we ++ * warn about false positives which confuses users and defeats the ++ * whole purpose of this test. ++ * ++ * This code is called with interrupts disabled. ++ */ ++void softirq_check_pending_idle(void) ++{ ++ static int rate_limit; ++ struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); ++ u32 warnpending; ++ int i; ++ ++ if (rate_limit >= 10) ++ return; ++ ++ warnpending = local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK; ++ for (i = 0; i < NR_SOFTIRQS; i++) { ++ struct task_struct *tsk = sr->runner[i]; ++ ++ /* ++ * The wakeup code in rtmutex.c wakes up the task ++ * _before_ it sets pi_blocked_on to NULL under ++ * tsk->pi_lock. So we need to check for both: state ++ * and pi_blocked_on. ++ */ ++ if (tsk) { ++ raw_spin_lock(&tsk->pi_lock); ++ if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { ++ /* Clear all bits pending in that task */ ++ warnpending &= ~(tsk->softirqs_raised); ++ warnpending &= ~(1 << i); ++ } ++ raw_spin_unlock(&tsk->pi_lock); ++ } ++ } ++ ++ if (warnpending) { ++ printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", ++ warnpending); ++ rate_limit++; ++ } ++} ++# else ++/* ++ * On !PREEMPT_RT we just printk rate limited: ++ */ ++void softirq_check_pending_idle(void) ++{ ++ static int rate_limit; ++ ++ if (rate_limit < 10 && ++ (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { ++ printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", ++ local_softirq_pending()); ++ rate_limit++; ++ } ++} ++# endif ++ ++#else /* !CONFIG_NO_HZ_COMMON */ ++static inline void softirq_set_runner(unsigned int sirq) { } ++static inline void softirq_clr_runner(unsigned int sirq) { } ++#endif ++ + /* + * we cannot loop indefinitely here to avoid userspace starvation, + * but we also don't want to introduce a worst case 1/HZ latency +@@ -78,6 +172,27 @@ static void wakeup_softirqd(void) + wake_up_process(tsk); + } + ++static void handle_softirq(unsigned int vec_nr) ++{ ++ struct softirq_action *h = softirq_vec + vec_nr; ++ int prev_count; ++ ++ prev_count = preempt_count(); ++ ++ kstat_incr_softirqs_this_cpu(vec_nr); ++ ++ trace_softirq_entry(vec_nr); ++ h->action(h); ++ trace_softirq_exit(vec_nr); ++ if (unlikely(prev_count != preempt_count())) { ++ pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", ++ vec_nr, softirq_to_name[vec_nr], h->action, ++ prev_count, preempt_count()); ++ preempt_count_set(prev_count); ++ } ++} ++ ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * If ksoftirqd is scheduled, we do not want to process pending softirqs + * right now. Let ksoftirqd handle this at its own rate, to get fairness, +@@ -93,6 +208,47 @@ static bool ksoftirqd_running(unsigned long pending) + return tsk && (tsk->state == TASK_RUNNING); + } + ++static inline int ksoftirqd_softirq_pending(void) ++{ ++ return local_softirq_pending(); ++} ++ ++static void handle_pending_softirqs(u32 pending) ++{ ++ struct softirq_action *h = softirq_vec; ++ int softirq_bit; ++ ++ local_irq_enable(); ++ ++ h = softirq_vec; ++ ++ while ((softirq_bit = ffs(pending))) { ++ unsigned int vec_nr; ++ ++ h += softirq_bit - 1; ++ vec_nr = h - softirq_vec; ++ handle_softirq(vec_nr); ++ ++ h++; ++ pending >>= softirq_bit; ++ } ++ ++ rcu_bh_qs(); ++ local_irq_disable(); ++} ++ ++static void run_ksoftirqd(unsigned int cpu) ++{ ++ local_irq_disable(); ++ if (ksoftirqd_softirq_pending()) { ++ __do_softirq(); ++ local_irq_enable(); ++ cond_resched(); ++ return; ++ } ++ local_irq_enable(); ++} ++ + /* + * preempt_count and SOFTIRQ_OFFSET usage: + * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving +@@ -252,10 +408,8 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) + unsigned long end = jiffies + MAX_SOFTIRQ_TIME; + unsigned long old_flags = current->flags; + int max_restart = MAX_SOFTIRQ_RESTART; +- struct softirq_action *h; + bool in_hardirq; + __u32 pending; +- int softirq_bit; + + /* + * Mask out PF_MEMALLOC s current task context is borrowed for the +@@ -274,36 +428,7 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) + /* Reset the pending bitmask before enabling irqs */ + set_softirq_pending(0); + +- local_irq_enable(); +- +- h = softirq_vec; +- +- while ((softirq_bit = ffs(pending))) { +- unsigned int vec_nr; +- int prev_count; +- +- h += softirq_bit - 1; +- +- vec_nr = h - softirq_vec; +- prev_count = preempt_count(); +- +- kstat_incr_softirqs_this_cpu(vec_nr); +- +- trace_softirq_entry(vec_nr); +- h->action(h); +- trace_softirq_exit(vec_nr); +- if (unlikely(prev_count != preempt_count())) { +- pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", +- vec_nr, softirq_to_name[vec_nr], h->action, +- prev_count, preempt_count()); +- preempt_count_set(prev_count); +- } +- h++; +- pending >>= softirq_bit; +- } +- +- rcu_bh_qs(); +- local_irq_disable(); ++ handle_pending_softirqs(pending); + + pending = local_softirq_pending(); + if (pending) { +@@ -339,6 +464,248 @@ asmlinkage __visible void do_softirq(void) + local_irq_restore(flags); + } + ++/* ++ * This function must run with irqs disabled! ++ */ ++void raise_softirq_irqoff(unsigned int nr) ++{ ++ __raise_softirq_irqoff(nr); ++ ++ /* ++ * If we're in an interrupt or softirq, we're done ++ * (this also catches softirq-disabled code). We will ++ * actually run the softirq once we return from ++ * the irq or softirq. ++ * ++ * Otherwise we wake up ksoftirqd to make sure we ++ * schedule the softirq soon. ++ */ ++ if (!in_interrupt()) ++ wakeup_softirqd(); ++} ++ ++void __raise_softirq_irqoff(unsigned int nr) ++{ ++ trace_softirq_raise(nr); ++ or_softirq_pending(1UL << nr); ++} ++ ++static inline void local_bh_disable_nort(void) { local_bh_disable(); } ++static inline void _local_bh_enable_nort(void) { _local_bh_enable(); } ++static void ksoftirqd_set_sched_params(unsigned int cpu) { } ++static void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) { } ++ ++#else /* !PREEMPT_RT_FULL */ ++ ++/* ++ * On RT we serialize softirq execution with a cpu local lock per softirq ++ */ ++static DEFINE_PER_CPU(struct local_irq_lock [NR_SOFTIRQS], local_softirq_locks); ++ ++void __init softirq_early_init(void) ++{ ++ int i; ++ ++ for (i = 0; i < NR_SOFTIRQS; i++) ++ local_irq_lock_init(local_softirq_locks[i]); ++} ++ ++static void lock_softirq(int which) ++{ ++ local_lock(local_softirq_locks[which]); ++} ++ ++static void unlock_softirq(int which) ++{ ++ local_unlock(local_softirq_locks[which]); ++} ++ ++static void do_single_softirq(int which) ++{ ++ unsigned long old_flags = current->flags; ++ ++ current->flags &= ~PF_MEMALLOC; ++ vtime_account_irq_enter(current); ++ current->flags |= PF_IN_SOFTIRQ; ++ lockdep_softirq_enter(); ++ local_irq_enable(); ++ handle_softirq(which); ++ local_irq_disable(); ++ lockdep_softirq_exit(); ++ current->flags &= ~PF_IN_SOFTIRQ; ++ vtime_account_irq_enter(current); ++ current_restore_flags(old_flags, PF_MEMALLOC); ++} ++ ++/* ++ * Called with interrupts disabled. Process softirqs which were raised ++ * in current context (or on behalf of ksoftirqd). ++ */ ++static void do_current_softirqs(void) ++{ ++ while (current->softirqs_raised) { ++ int i = __ffs(current->softirqs_raised); ++ unsigned int pending, mask = (1U << i); ++ ++ current->softirqs_raised &= ~mask; ++ local_irq_enable(); ++ ++ /* ++ * If the lock is contended, we boost the owner to ++ * process the softirq or leave the critical section ++ * now. ++ */ ++ lock_softirq(i); ++ local_irq_disable(); ++ softirq_set_runner(i); ++ /* ++ * Check with the local_softirq_pending() bits, ++ * whether we need to process this still or if someone ++ * else took care of it. ++ */ ++ pending = local_softirq_pending(); ++ if (pending & mask) { ++ set_softirq_pending(pending & ~mask); ++ do_single_softirq(i); ++ } ++ softirq_clr_runner(i); ++ WARN_ON(current->softirq_nestcnt != 1); ++ local_irq_enable(); ++ unlock_softirq(i); ++ local_irq_disable(); ++ } ++} ++ ++void __local_bh_disable(void) ++{ ++ if (++current->softirq_nestcnt == 1) ++ migrate_disable(); ++} ++EXPORT_SYMBOL(__local_bh_disable); ++ ++void __local_bh_enable(void) ++{ ++ if (WARN_ON(current->softirq_nestcnt == 0)) ++ return; ++ ++ local_irq_disable(); ++ if (current->softirq_nestcnt == 1 && current->softirqs_raised) ++ do_current_softirqs(); ++ local_irq_enable(); ++ ++ if (--current->softirq_nestcnt == 0) ++ migrate_enable(); ++} ++EXPORT_SYMBOL(__local_bh_enable); ++ ++int in_serving_softirq(void) ++{ ++ return current->flags & PF_IN_SOFTIRQ; ++} ++EXPORT_SYMBOL(in_serving_softirq); ++ ++/* Called with preemption disabled */ ++static void run_ksoftirqd(unsigned int cpu) ++{ ++ local_irq_disable(); ++ current->softirq_nestcnt++; ++ ++ do_current_softirqs(); ++ current->softirq_nestcnt--; ++ local_irq_enable(); ++ cond_resched(); ++} ++ ++/* ++ * Called from netif_rx_ni(). Preemption enabled, but migration ++ * disabled. So the cpu can't go away under us. ++ */ ++void thread_do_softirq(void) ++{ ++ if (!in_serving_softirq() && current->softirqs_raised) { ++ current->softirq_nestcnt++; ++ do_current_softirqs(); ++ current->softirq_nestcnt--; ++ } ++} ++ ++static void do_raise_softirq_irqoff(unsigned int nr) ++{ ++ trace_softirq_raise(nr); ++ or_softirq_pending(1UL << nr); ++ ++ /* ++ * If we are not in a hard interrupt and inside a bh disabled ++ * region, we simply raise the flag on current. local_bh_enable() ++ * will make sure that the softirq is executed. Otherwise we ++ * delegate it to ksoftirqd. ++ */ ++ if (!in_irq() && current->softirq_nestcnt) ++ current->softirqs_raised |= (1U << nr); ++ else if (__this_cpu_read(ksoftirqd)) ++ __this_cpu_read(ksoftirqd)->softirqs_raised |= (1U << nr); ++} ++ ++void __raise_softirq_irqoff(unsigned int nr) ++{ ++ do_raise_softirq_irqoff(nr); ++ if (!in_irq() && !current->softirq_nestcnt) ++ wakeup_softirqd(); ++} ++ ++/* ++ * This function must run with irqs disabled! ++ */ ++void raise_softirq_irqoff(unsigned int nr) ++{ ++ do_raise_softirq_irqoff(nr); ++ ++ /* ++ * If we're in an hard interrupt we let irq return code deal ++ * with the wakeup of ksoftirqd. ++ */ ++ if (in_irq()) ++ return; ++ /* ++ * If we are in thread context but outside of a bh disabled ++ * region, we need to wake ksoftirqd as well. ++ * ++ * CHECKME: Some of the places which do that could be wrapped ++ * into local_bh_disable/enable pairs. Though it's unclear ++ * whether this is worth the effort. To find those places just ++ * raise a WARN() if the condition is met. ++ */ ++ if (!current->softirq_nestcnt) ++ wakeup_softirqd(); ++} ++ ++static inline int ksoftirqd_softirq_pending(void) ++{ ++ return current->softirqs_raised; ++} ++ ++static inline void local_bh_disable_nort(void) { } ++static inline void _local_bh_enable_nort(void) { } ++ ++static inline void ksoftirqd_set_sched_params(unsigned int cpu) ++{ ++ struct sched_param param = { .sched_priority = 1 }; ++ ++ sched_setscheduler(current, SCHED_FIFO, ¶m); ++ /* Take over all pending softirqs when starting */ ++ local_irq_disable(); ++ current->softirqs_raised = local_softirq_pending(); ++ local_irq_enable(); ++} ++ ++static inline void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) ++{ ++ struct sched_param param = { .sched_priority = 0 }; ++ ++ sched_setscheduler(current, SCHED_NORMAL, ¶m); ++} ++ ++#endif /* PREEMPT_RT_FULL */ + /* + * Enter an interrupt context. + */ +@@ -350,9 +717,9 @@ void irq_enter(void) + * Prevent raise_softirq from needlessly waking up ksoftirqd + * here, as softirq will be serviced on return from interrupt. + */ +- local_bh_disable(); ++ local_bh_disable_nort(); + tick_irq_enter(); +- _local_bh_enable(); ++ _local_bh_enable_nort(); + } + + __irq_enter(); +@@ -360,6 +727,7 @@ void irq_enter(void) + + static inline void invoke_softirq(void) + { ++#ifndef CONFIG_PREEMPT_RT_FULL + if (ksoftirqd_running(local_softirq_pending())) + return; + +@@ -382,6 +750,15 @@ static inline void invoke_softirq(void) + } else { + wakeup_softirqd(); + } ++#else /* PREEMPT_RT_FULL */ ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ if (__this_cpu_read(ksoftirqd) && ++ __this_cpu_read(ksoftirqd)->softirqs_raised) ++ wakeup_softirqd(); ++ local_irq_restore(flags); ++#endif + } + + static inline void tick_irq_exit(void) +@@ -417,26 +794,6 @@ void irq_exit(void) + trace_hardirq_exit(); /* must be last! */ + } + +-/* +- * This function must run with irqs disabled! +- */ +-inline void raise_softirq_irqoff(unsigned int nr) +-{ +- __raise_softirq_irqoff(nr); +- +- /* +- * If we're in an interrupt or softirq, we're done +- * (this also catches softirq-disabled code). We will +- * actually run the softirq once we return from +- * the irq or softirq. +- * +- * Otherwise we wake up ksoftirqd to make sure we +- * schedule the softirq soon. +- */ +- if (!in_interrupt()) +- wakeup_softirqd(); +-} +- + void raise_softirq(unsigned int nr) + { + unsigned long flags; +@@ -446,12 +803,6 @@ void raise_softirq(unsigned int nr) + local_irq_restore(flags); + } + +-void __raise_softirq_irqoff(unsigned int nr) +-{ +- trace_softirq_raise(nr); +- or_softirq_pending(1UL << nr); +-} +- + void open_softirq(int nr, void (*action)(struct softirq_action *)) + { + softirq_vec[nr].action = action; +@@ -725,23 +1076,7 @@ EXPORT_SYMBOL(tasklet_unlock_wait); + + static int ksoftirqd_should_run(unsigned int cpu) + { +- return local_softirq_pending(); +-} +- +-static void run_ksoftirqd(unsigned int cpu) +-{ +- local_irq_disable(); +- if (local_softirq_pending()) { +- /* +- * We can safely run softirq on inline stack, as we are not deep +- * in the task stack here. +- */ +- __do_softirq(); +- local_irq_enable(); +- cond_resched(); +- return; +- } +- local_irq_enable(); ++ return ksoftirqd_softirq_pending(); + } + + #ifdef CONFIG_HOTPLUG_CPU +@@ -808,6 +1143,8 @@ static int takeover_tasklets(unsigned int cpu) + + static struct smp_hotplug_thread softirq_threads = { + .store = &ksoftirqd, ++ .setup = ksoftirqd_set_sched_params, ++ .cleanup = ksoftirqd_clr_sched_params, + .thread_should_run = ksoftirqd_should_run, + .thread_fn = run_ksoftirqd, + .thread_comm = "ksoftirqd/%u", +diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c +index 012bc81879bf..2b0ddd50e879 100644 +--- a/kernel/time/tick-sched.c ++++ b/kernel/time/tick-sched.c +@@ -895,14 +895,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts) + return false; + + if (unlikely(local_softirq_pending() && cpu_online(cpu))) { +- static int ratelimit; +- +- if (ratelimit < 10 && +- (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { +- pr_warn("NOHZ: local_softirq_pending %02x\n", +- (unsigned int) local_softirq_pending()); +- ratelimit++; +- } ++ softirq_check_pending_idle(); + return false; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0122-net-core-use-local_bh_disable-in-netif_rx_ni.patch linux-4.19.118/debian/patches-rt/0122-net-core-use-local_bh_disable-in-netif_rx_ni.patch --- linux-4.19.98/debian/patches-rt/0122-net-core-use-local_bh_disable-in-netif_rx_ni.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0122-net-core-use-local_bh_disable-in-netif_rx_ni.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,41 @@ +From 7686cfd7088430200bd52074427f75462111fe5f Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 16 Jun 2017 19:03:16 +0200 +Subject: [PATCH 122/325] net/core: use local_bh_disable() in netif_rx_ni() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In 2004 netif_rx_ni() gained a preempt_disable() section around +netif_rx() and its do_softirq() + testing for it. The do_softirq() part +is required because netif_rx() raises the softirq but does not invoke +it. The preempt_disable() is required to remain on the same CPU which added the +skb to the per-CPU list. +All this can be avoided be putting this into a local_bh_disable()ed +section. The local_bh_enable() part will invoke do_softirq() if +required. + +Signed-off-by: Sebastian Andrzej Siewior +--- + net/core/dev.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/net/core/dev.c b/net/core/dev.c +index 626743ea0d53..655dbfac09fd 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -4531,11 +4531,9 @@ int netif_rx_ni(struct sk_buff *skb) + + trace_netif_rx_ni_entry(skb); + +- preempt_disable(); ++ local_bh_disable(); + err = netif_rx_internal(skb); +- if (local_softirq_pending()) +- do_softirq(); +- preempt_enable(); ++ local_bh_enable(); + + return err; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0122-softirq-Split-softirq-locks.patch linux-4.19.118/debian/patches-rt/0122-softirq-Split-softirq-locks.patch --- linux-4.19.98/debian/patches-rt/0122-softirq-Split-softirq-locks.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0122-softirq-Split-softirq-locks.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,832 +0,0 @@ -From e530715caf9839d15d550ed5ed57d4d928ca3806 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 4 Oct 2012 14:20:47 +0100 -Subject: [PATCH 122/290] softirq: Split softirq locks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The 3.x RT series removed the split softirq implementation in favour -of pushing softirq processing into the context of the thread which -raised it. Though this prevents us from handling the various softirqs -at different priorities. Now instead of reintroducing the split -softirq threads we split the locks which serialize the softirq -processing. - -If a softirq is raised in context of a thread, then the softirq is -noted on a per thread field, if the thread is in a bh disabled -region. If the softirq is raised from hard interrupt context, then the -bit is set in the flag field of ksoftirqd and ksoftirqd is invoked. -When a thread leaves a bh disabled region, then it tries to execute -the softirqs which have been raised in its own context. It acquires -the per softirq / per cpu lock for the softirq and then checks, -whether the softirq is still pending in the per cpu -local_softirq_pending() field. If yes, it runs the softirq. If no, -then some other task executed it already. This allows for zero config -softirq elevation in the context of user space tasks or interrupt -threads. - -Signed-off-by: Thomas Gleixner ---- - include/linux/bottom_half.h | 34 +++ - include/linux/interrupt.h | 15 +- - include/linux/preempt.h | 15 +- - include/linux/sched.h | 3 + - init/main.c | 1 + - kernel/softirq.c | 491 ++++++++++++++++++++++++++++++------ - kernel/time/tick-sched.c | 9 +- - 7 files changed, 478 insertions(+), 90 deletions(-) - -diff --git a/include/linux/bottom_half.h b/include/linux/bottom_half.h -index a19519f4241d..40dd5ef9c154 100644 ---- a/include/linux/bottom_half.h -+++ b/include/linux/bottom_half.h -@@ -4,6 +4,39 @@ - - #include - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ -+extern void __local_bh_disable(void); -+extern void _local_bh_enable(void); -+extern void __local_bh_enable(void); -+ -+static inline void local_bh_disable(void) -+{ -+ __local_bh_disable(); -+} -+ -+static inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) -+{ -+ __local_bh_disable(); -+} -+ -+static inline void local_bh_enable(void) -+{ -+ __local_bh_enable(); -+} -+ -+static inline void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) -+{ -+ __local_bh_enable(); -+} -+ -+static inline void local_bh_enable_ip(unsigned long ip) -+{ -+ __local_bh_enable(); -+} -+ -+#else -+ - #ifdef CONFIG_TRACE_IRQFLAGS - extern void __local_bh_disable_ip(unsigned long ip, unsigned int cnt); - #else -@@ -31,5 +64,6 @@ static inline void local_bh_enable(void) - { - __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET); - } -+#endif - - #endif /* _LINUX_BH_H */ -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index cb2d1384cb0d..6c25b962ba89 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -503,10 +503,11 @@ struct softirq_action - void (*action)(struct softirq_action *); - }; - -+#ifndef CONFIG_PREEMPT_RT_FULL - asmlinkage void do_softirq(void); - asmlinkage void __do_softirq(void); -- --#if defined(__ARCH_HAS_DO_SOFTIRQ) && !defined(CONFIG_PREEMPT_RT_FULL) -+static inline void thread_do_softirq(void) { do_softirq(); } -+#ifdef __ARCH_HAS_DO_SOFTIRQ - void do_softirq_own_stack(void); - #else - static inline void do_softirq_own_stack(void) -@@ -514,6 +515,9 @@ static inline void do_softirq_own_stack(void) - __do_softirq(); - } - #endif -+#else -+extern void thread_do_softirq(void); -+#endif - - extern void open_softirq(int nr, void (*action)(struct softirq_action *)); - extern void softirq_init(void); -@@ -521,6 +525,7 @@ extern void __raise_softirq_irqoff(unsigned int nr); - - extern void raise_softirq_irqoff(unsigned int nr); - extern void raise_softirq(unsigned int nr); -+extern void softirq_check_pending_idle(void); - - DECLARE_PER_CPU(struct task_struct *, ksoftirqd); - -@@ -638,6 +643,12 @@ extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu); - extern void tasklet_init(struct tasklet_struct *t, - void (*func)(unsigned long), unsigned long data); - -+#ifdef CONFIG_PREEMPT_RT_FULL -+extern void softirq_early_init(void); -+#else -+static inline void softirq_early_init(void) { } -+#endif -+ - struct tasklet_hrtimer { - struct hrtimer timer; - struct tasklet_struct tasklet; -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index 9984f2b75b73..27c3176d88d2 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -51,7 +51,11 @@ - #define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT) - #define NMI_OFFSET (1UL << NMI_SHIFT) - --#define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) -+#ifndef CONFIG_PREEMPT_RT_FULL -+# define SOFTIRQ_DISABLE_OFFSET (2 * SOFTIRQ_OFFSET) -+#else -+# define SOFTIRQ_DISABLE_OFFSET (0) -+#endif - - /* We use the MSB mostly because its available */ - #define PREEMPT_NEED_RESCHED 0x80000000 -@@ -81,9 +85,15 @@ - #include - - #define hardirq_count() (preempt_count() & HARDIRQ_MASK) --#define softirq_count() (preempt_count() & SOFTIRQ_MASK) - #define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \ - | NMI_MASK)) -+#ifndef CONFIG_PREEMPT_RT_FULL -+# define softirq_count() (preempt_count() & SOFTIRQ_MASK) -+# define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) -+#else -+# define softirq_count() ((unsigned long)current->softirq_nestcnt) -+extern int in_serving_softirq(void); -+#endif - - /* - * Are we doing bottom half or hardware interrupt processing? -@@ -101,7 +111,6 @@ - #define in_irq() (hardirq_count()) - #define in_softirq() (softirq_count()) - #define in_interrupt() (irq_count()) --#define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) - #define in_nmi() (preempt_count() & NMI_MASK) - #define in_task() (!(preempt_count() & \ - (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET))) -diff --git a/include/linux/sched.h b/include/linux/sched.h -index c073a3273beb..baa5fceea0ff 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1198,6 +1198,8 @@ struct task_struct { - #endif - #ifdef CONFIG_PREEMPT_RT_BASE - struct rcu_head put_rcu; -+ int softirq_nestcnt; -+ unsigned int softirqs_raised; - #endif - #ifdef CONFIG_DEBUG_ATOMIC_SLEEP - unsigned long task_state_change; -@@ -1395,6 +1397,7 @@ extern struct pid *cad_pid; - /* - * Per process flags - */ -+#define PF_IN_SOFTIRQ 0x00000001 /* Task is serving softirq */ - #define PF_IDLE 0x00000002 /* I am an IDLE thread */ - #define PF_EXITING 0x00000004 /* Getting shut down */ - #define PF_EXITPIDONE 0x00000008 /* PI exit done on shut down */ -diff --git a/init/main.c b/init/main.c -index 38a603f62b7b..6e02188386a7 100644 ---- a/init/main.c -+++ b/init/main.c -@@ -560,6 +560,7 @@ asmlinkage __visible void __init start_kernel(void) - setup_command_line(command_line); - setup_nr_cpu_ids(); - setup_per_cpu_areas(); -+ softirq_early_init(); - smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ - boot_cpu_hotplug_init(); - -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 1d3a482246cc..fd89f8ab85ac 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -26,7 +26,9 @@ - #include - #include - #include -+#include - #include -+#include - - #define CREATE_TRACE_POINTS - #include -@@ -63,6 +65,98 @@ const char * const softirq_to_name[NR_SOFTIRQS] = { - "TASKLET", "SCHED", "HRTIMER", "RCU" - }; - -+#ifdef CONFIG_NO_HZ_COMMON -+# ifdef CONFIG_PREEMPT_RT_FULL -+ -+struct softirq_runner { -+ struct task_struct *runner[NR_SOFTIRQS]; -+}; -+ -+static DEFINE_PER_CPU(struct softirq_runner, softirq_runners); -+ -+static inline void softirq_set_runner(unsigned int sirq) -+{ -+ struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); -+ -+ sr->runner[sirq] = current; -+} -+ -+static inline void softirq_clr_runner(unsigned int sirq) -+{ -+ struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); -+ -+ sr->runner[sirq] = NULL; -+} -+ -+/* -+ * On preempt-rt a softirq running context might be blocked on a -+ * lock. There might be no other runnable task on this CPU because the -+ * lock owner runs on some other CPU. So we have to go into idle with -+ * the pending bit set. Therefor we need to check this otherwise we -+ * warn about false positives which confuses users and defeats the -+ * whole purpose of this test. -+ * -+ * This code is called with interrupts disabled. -+ */ -+void softirq_check_pending_idle(void) -+{ -+ static int rate_limit; -+ struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); -+ u32 warnpending; -+ int i; -+ -+ if (rate_limit >= 10) -+ return; -+ -+ warnpending = local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK; -+ for (i = 0; i < NR_SOFTIRQS; i++) { -+ struct task_struct *tsk = sr->runner[i]; -+ -+ /* -+ * The wakeup code in rtmutex.c wakes up the task -+ * _before_ it sets pi_blocked_on to NULL under -+ * tsk->pi_lock. So we need to check for both: state -+ * and pi_blocked_on. -+ */ -+ if (tsk) { -+ raw_spin_lock(&tsk->pi_lock); -+ if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { -+ /* Clear all bits pending in that task */ -+ warnpending &= ~(tsk->softirqs_raised); -+ warnpending &= ~(1 << i); -+ } -+ raw_spin_unlock(&tsk->pi_lock); -+ } -+ } -+ -+ if (warnpending) { -+ printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", -+ warnpending); -+ rate_limit++; -+ } -+} -+# else -+/* -+ * On !PREEMPT_RT we just printk rate limited: -+ */ -+void softirq_check_pending_idle(void) -+{ -+ static int rate_limit; -+ -+ if (rate_limit < 10 && -+ (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { -+ printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", -+ local_softirq_pending()); -+ rate_limit++; -+ } -+} -+# endif -+ -+#else /* !CONFIG_NO_HZ_COMMON */ -+static inline void softirq_set_runner(unsigned int sirq) { } -+static inline void softirq_clr_runner(unsigned int sirq) { } -+#endif -+ - /* - * we cannot loop indefinitely here to avoid userspace starvation, - * but we also don't want to introduce a worst case 1/HZ latency -@@ -78,6 +172,27 @@ static void wakeup_softirqd(void) - wake_up_process(tsk); - } - -+static void handle_softirq(unsigned int vec_nr) -+{ -+ struct softirq_action *h = softirq_vec + vec_nr; -+ int prev_count; -+ -+ prev_count = preempt_count(); -+ -+ kstat_incr_softirqs_this_cpu(vec_nr); -+ -+ trace_softirq_entry(vec_nr); -+ h->action(h); -+ trace_softirq_exit(vec_nr); -+ if (unlikely(prev_count != preempt_count())) { -+ pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", -+ vec_nr, softirq_to_name[vec_nr], h->action, -+ prev_count, preempt_count()); -+ preempt_count_set(prev_count); -+ } -+} -+ -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * If ksoftirqd is scheduled, we do not want to process pending softirqs - * right now. Let ksoftirqd handle this at its own rate, to get fairness, -@@ -93,6 +208,47 @@ static bool ksoftirqd_running(unsigned long pending) - return tsk && (tsk->state == TASK_RUNNING); - } - -+static inline int ksoftirqd_softirq_pending(void) -+{ -+ return local_softirq_pending(); -+} -+ -+static void handle_pending_softirqs(u32 pending) -+{ -+ struct softirq_action *h = softirq_vec; -+ int softirq_bit; -+ -+ local_irq_enable(); -+ -+ h = softirq_vec; -+ -+ while ((softirq_bit = ffs(pending))) { -+ unsigned int vec_nr; -+ -+ h += softirq_bit - 1; -+ vec_nr = h - softirq_vec; -+ handle_softirq(vec_nr); -+ -+ h++; -+ pending >>= softirq_bit; -+ } -+ -+ rcu_bh_qs(); -+ local_irq_disable(); -+} -+ -+static void run_ksoftirqd(unsigned int cpu) -+{ -+ local_irq_disable(); -+ if (ksoftirqd_softirq_pending()) { -+ __do_softirq(); -+ local_irq_enable(); -+ cond_resched(); -+ return; -+ } -+ local_irq_enable(); -+} -+ - /* - * preempt_count and SOFTIRQ_OFFSET usage: - * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving -@@ -252,10 +408,8 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) - unsigned long end = jiffies + MAX_SOFTIRQ_TIME; - unsigned long old_flags = current->flags; - int max_restart = MAX_SOFTIRQ_RESTART; -- struct softirq_action *h; - bool in_hardirq; - __u32 pending; -- int softirq_bit; - - /* - * Mask out PF_MEMALLOC s current task context is borrowed for the -@@ -274,36 +428,7 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) - /* Reset the pending bitmask before enabling irqs */ - set_softirq_pending(0); - -- local_irq_enable(); -- -- h = softirq_vec; -- -- while ((softirq_bit = ffs(pending))) { -- unsigned int vec_nr; -- int prev_count; -- -- h += softirq_bit - 1; -- -- vec_nr = h - softirq_vec; -- prev_count = preempt_count(); -- -- kstat_incr_softirqs_this_cpu(vec_nr); -- -- trace_softirq_entry(vec_nr); -- h->action(h); -- trace_softirq_exit(vec_nr); -- if (unlikely(prev_count != preempt_count())) { -- pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n", -- vec_nr, softirq_to_name[vec_nr], h->action, -- prev_count, preempt_count()); -- preempt_count_set(prev_count); -- } -- h++; -- pending >>= softirq_bit; -- } -- -- rcu_bh_qs(); -- local_irq_disable(); -+ handle_pending_softirqs(pending); - - pending = local_softirq_pending(); - if (pending) { -@@ -339,6 +464,248 @@ asmlinkage __visible void do_softirq(void) - local_irq_restore(flags); - } - -+/* -+ * This function must run with irqs disabled! -+ */ -+void raise_softirq_irqoff(unsigned int nr) -+{ -+ __raise_softirq_irqoff(nr); -+ -+ /* -+ * If we're in an interrupt or softirq, we're done -+ * (this also catches softirq-disabled code). We will -+ * actually run the softirq once we return from -+ * the irq or softirq. -+ * -+ * Otherwise we wake up ksoftirqd to make sure we -+ * schedule the softirq soon. -+ */ -+ if (!in_interrupt()) -+ wakeup_softirqd(); -+} -+ -+void __raise_softirq_irqoff(unsigned int nr) -+{ -+ trace_softirq_raise(nr); -+ or_softirq_pending(1UL << nr); -+} -+ -+static inline void local_bh_disable_nort(void) { local_bh_disable(); } -+static inline void _local_bh_enable_nort(void) { _local_bh_enable(); } -+static void ksoftirqd_set_sched_params(unsigned int cpu) { } -+static void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) { } -+ -+#else /* !PREEMPT_RT_FULL */ -+ -+/* -+ * On RT we serialize softirq execution with a cpu local lock per softirq -+ */ -+static DEFINE_PER_CPU(struct local_irq_lock [NR_SOFTIRQS], local_softirq_locks); -+ -+void __init softirq_early_init(void) -+{ -+ int i; -+ -+ for (i = 0; i < NR_SOFTIRQS; i++) -+ local_irq_lock_init(local_softirq_locks[i]); -+} -+ -+static void lock_softirq(int which) -+{ -+ local_lock(local_softirq_locks[which]); -+} -+ -+static void unlock_softirq(int which) -+{ -+ local_unlock(local_softirq_locks[which]); -+} -+ -+static void do_single_softirq(int which) -+{ -+ unsigned long old_flags = current->flags; -+ -+ current->flags &= ~PF_MEMALLOC; -+ vtime_account_irq_enter(current); -+ current->flags |= PF_IN_SOFTIRQ; -+ lockdep_softirq_enter(); -+ local_irq_enable(); -+ handle_softirq(which); -+ local_irq_disable(); -+ lockdep_softirq_exit(); -+ current->flags &= ~PF_IN_SOFTIRQ; -+ vtime_account_irq_enter(current); -+ current_restore_flags(old_flags, PF_MEMALLOC); -+} -+ -+/* -+ * Called with interrupts disabled. Process softirqs which were raised -+ * in current context (or on behalf of ksoftirqd). -+ */ -+static void do_current_softirqs(void) -+{ -+ while (current->softirqs_raised) { -+ int i = __ffs(current->softirqs_raised); -+ unsigned int pending, mask = (1U << i); -+ -+ current->softirqs_raised &= ~mask; -+ local_irq_enable(); -+ -+ /* -+ * If the lock is contended, we boost the owner to -+ * process the softirq or leave the critical section -+ * now. -+ */ -+ lock_softirq(i); -+ local_irq_disable(); -+ softirq_set_runner(i); -+ /* -+ * Check with the local_softirq_pending() bits, -+ * whether we need to process this still or if someone -+ * else took care of it. -+ */ -+ pending = local_softirq_pending(); -+ if (pending & mask) { -+ set_softirq_pending(pending & ~mask); -+ do_single_softirq(i); -+ } -+ softirq_clr_runner(i); -+ WARN_ON(current->softirq_nestcnt != 1); -+ local_irq_enable(); -+ unlock_softirq(i); -+ local_irq_disable(); -+ } -+} -+ -+void __local_bh_disable(void) -+{ -+ if (++current->softirq_nestcnt == 1) -+ migrate_disable(); -+} -+EXPORT_SYMBOL(__local_bh_disable); -+ -+void __local_bh_enable(void) -+{ -+ if (WARN_ON(current->softirq_nestcnt == 0)) -+ return; -+ -+ local_irq_disable(); -+ if (current->softirq_nestcnt == 1 && current->softirqs_raised) -+ do_current_softirqs(); -+ local_irq_enable(); -+ -+ if (--current->softirq_nestcnt == 0) -+ migrate_enable(); -+} -+EXPORT_SYMBOL(__local_bh_enable); -+ -+int in_serving_softirq(void) -+{ -+ return current->flags & PF_IN_SOFTIRQ; -+} -+EXPORT_SYMBOL(in_serving_softirq); -+ -+/* Called with preemption disabled */ -+static void run_ksoftirqd(unsigned int cpu) -+{ -+ local_irq_disable(); -+ current->softirq_nestcnt++; -+ -+ do_current_softirqs(); -+ current->softirq_nestcnt--; -+ local_irq_enable(); -+ cond_resched(); -+} -+ -+/* -+ * Called from netif_rx_ni(). Preemption enabled, but migration -+ * disabled. So the cpu can't go away under us. -+ */ -+void thread_do_softirq(void) -+{ -+ if (!in_serving_softirq() && current->softirqs_raised) { -+ current->softirq_nestcnt++; -+ do_current_softirqs(); -+ current->softirq_nestcnt--; -+ } -+} -+ -+static void do_raise_softirq_irqoff(unsigned int nr) -+{ -+ trace_softirq_raise(nr); -+ or_softirq_pending(1UL << nr); -+ -+ /* -+ * If we are not in a hard interrupt and inside a bh disabled -+ * region, we simply raise the flag on current. local_bh_enable() -+ * will make sure that the softirq is executed. Otherwise we -+ * delegate it to ksoftirqd. -+ */ -+ if (!in_irq() && current->softirq_nestcnt) -+ current->softirqs_raised |= (1U << nr); -+ else if (__this_cpu_read(ksoftirqd)) -+ __this_cpu_read(ksoftirqd)->softirqs_raised |= (1U << nr); -+} -+ -+void __raise_softirq_irqoff(unsigned int nr) -+{ -+ do_raise_softirq_irqoff(nr); -+ if (!in_irq() && !current->softirq_nestcnt) -+ wakeup_softirqd(); -+} -+ -+/* -+ * This function must run with irqs disabled! -+ */ -+void raise_softirq_irqoff(unsigned int nr) -+{ -+ do_raise_softirq_irqoff(nr); -+ -+ /* -+ * If we're in an hard interrupt we let irq return code deal -+ * with the wakeup of ksoftirqd. -+ */ -+ if (in_irq()) -+ return; -+ /* -+ * If we are in thread context but outside of a bh disabled -+ * region, we need to wake ksoftirqd as well. -+ * -+ * CHECKME: Some of the places which do that could be wrapped -+ * into local_bh_disable/enable pairs. Though it's unclear -+ * whether this is worth the effort. To find those places just -+ * raise a WARN() if the condition is met. -+ */ -+ if (!current->softirq_nestcnt) -+ wakeup_softirqd(); -+} -+ -+static inline int ksoftirqd_softirq_pending(void) -+{ -+ return current->softirqs_raised; -+} -+ -+static inline void local_bh_disable_nort(void) { } -+static inline void _local_bh_enable_nort(void) { } -+ -+static inline void ksoftirqd_set_sched_params(unsigned int cpu) -+{ -+ struct sched_param param = { .sched_priority = 1 }; -+ -+ sched_setscheduler(current, SCHED_FIFO, ¶m); -+ /* Take over all pending softirqs when starting */ -+ local_irq_disable(); -+ current->softirqs_raised = local_softirq_pending(); -+ local_irq_enable(); -+} -+ -+static inline void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) -+{ -+ struct sched_param param = { .sched_priority = 0 }; -+ -+ sched_setscheduler(current, SCHED_NORMAL, ¶m); -+} -+ -+#endif /* PREEMPT_RT_FULL */ - /* - * Enter an interrupt context. - */ -@@ -350,9 +717,9 @@ void irq_enter(void) - * Prevent raise_softirq from needlessly waking up ksoftirqd - * here, as softirq will be serviced on return from interrupt. - */ -- local_bh_disable(); -+ local_bh_disable_nort(); - tick_irq_enter(); -- _local_bh_enable(); -+ _local_bh_enable_nort(); - } - - __irq_enter(); -@@ -360,6 +727,7 @@ void irq_enter(void) - - static inline void invoke_softirq(void) - { -+#ifndef CONFIG_PREEMPT_RT_FULL - if (ksoftirqd_running(local_softirq_pending())) - return; - -@@ -382,6 +750,15 @@ static inline void invoke_softirq(void) - } else { - wakeup_softirqd(); - } -+#else /* PREEMPT_RT_FULL */ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ if (__this_cpu_read(ksoftirqd) && -+ __this_cpu_read(ksoftirqd)->softirqs_raised) -+ wakeup_softirqd(); -+ local_irq_restore(flags); -+#endif - } - - static inline void tick_irq_exit(void) -@@ -417,26 +794,6 @@ void irq_exit(void) - trace_hardirq_exit(); /* must be last! */ - } - --/* -- * This function must run with irqs disabled! -- */ --inline void raise_softirq_irqoff(unsigned int nr) --{ -- __raise_softirq_irqoff(nr); -- -- /* -- * If we're in an interrupt or softirq, we're done -- * (this also catches softirq-disabled code). We will -- * actually run the softirq once we return from -- * the irq or softirq. -- * -- * Otherwise we wake up ksoftirqd to make sure we -- * schedule the softirq soon. -- */ -- if (!in_interrupt()) -- wakeup_softirqd(); --} -- - void raise_softirq(unsigned int nr) - { - unsigned long flags; -@@ -446,12 +803,6 @@ void raise_softirq(unsigned int nr) - local_irq_restore(flags); - } - --void __raise_softirq_irqoff(unsigned int nr) --{ -- trace_softirq_raise(nr); -- or_softirq_pending(1UL << nr); --} -- - void open_softirq(int nr, void (*action)(struct softirq_action *)) - { - softirq_vec[nr].action = action; -@@ -725,23 +1076,7 @@ EXPORT_SYMBOL(tasklet_unlock_wait); - - static int ksoftirqd_should_run(unsigned int cpu) - { -- return local_softirq_pending(); --} -- --static void run_ksoftirqd(unsigned int cpu) --{ -- local_irq_disable(); -- if (local_softirq_pending()) { -- /* -- * We can safely run softirq on inline stack, as we are not deep -- * in the task stack here. -- */ -- __do_softirq(); -- local_irq_enable(); -- cond_resched(); -- return; -- } -- local_irq_enable(); -+ return ksoftirqd_softirq_pending(); - } - - #ifdef CONFIG_HOTPLUG_CPU -@@ -808,6 +1143,8 @@ static int takeover_tasklets(unsigned int cpu) - - static struct smp_hotplug_thread softirq_threads = { - .store = &ksoftirqd, -+ .setup = ksoftirqd_set_sched_params, -+ .cleanup = ksoftirqd_clr_sched_params, - .thread_should_run = ksoftirqd_should_run, - .thread_fn = run_ksoftirqd, - .thread_comm = "ksoftirqd/%u", -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index c217af74dddf..6482945f8ae8 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -891,14 +891,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts) - return false; - - if (unlikely(local_softirq_pending() && cpu_online(cpu))) { -- static int ratelimit; -- -- if (ratelimit < 10 && -- (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { -- pr_warn("NOHZ: local_softirq_pending %02x\n", -- (unsigned int) local_softirq_pending()); -- ratelimit++; -- } -+ softirq_check_pending_idle(); - return false; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0123-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch linux-4.19.118/debian/patches-rt/0123-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch --- linux-4.19.98/debian/patches-rt/0123-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0123-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,161 @@ +From 563f92a709b074d89146410c177c5e70db3cd3fa Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 31 Jan 2012 13:01:27 +0100 +Subject: [PATCH 123/325] genirq: Allow disabling of softirq processing in irq + thread context +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The processing of softirqs in irq thread context is a performance gain +for the non-rt workloads of a system, but it's counterproductive for +interrupts which are explicitely related to the realtime +workload. Allow such interrupts to prevent softirq processing in their +thread context. + +Signed-off-by: Thomas Gleixner +--- + include/linux/interrupt.h | 2 ++ + include/linux/irq.h | 4 +++- + kernel/irq/manage.c | 13 ++++++++++++- + kernel/irq/settings.h | 12 ++++++++++++ + kernel/softirq.c | 9 +++++++++ + 5 files changed, 38 insertions(+), 2 deletions(-) + +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index cf9860d49d57..e1438fe66467 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -61,6 +61,7 @@ + * interrupt handler after suspending interrupts. For system + * wakeup devices users need to implement wakeup detection in + * their interrupt handlers. ++ * IRQF_NO_SOFTIRQ_CALL - Do not process softirqs in the irq thread context (RT) + */ + #define IRQF_SHARED 0x00000080 + #define IRQF_PROBE_SHARED 0x00000100 +@@ -74,6 +75,7 @@ + #define IRQF_NO_THREAD 0x00010000 + #define IRQF_EARLY_RESUME 0x00020000 + #define IRQF_COND_SUSPEND 0x00040000 ++#define IRQF_NO_SOFTIRQ_CALL 0x00080000 + + #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) + +diff --git a/include/linux/irq.h b/include/linux/irq.h +index 6ecaf056ab63..d2487df7ae89 100644 +--- a/include/linux/irq.h ++++ b/include/linux/irq.h +@@ -69,6 +69,7 @@ enum irqchip_irq_state; + * IRQ_IS_POLLED - Always polled by another interrupt. Exclude + * it from the spurious interrupt detection + * mechanism and from core side polling. ++ * IRQ_NO_SOFTIRQ_CALL - No softirq processing in the irq thread context (RT) + * IRQ_DISABLE_UNLAZY - Disable lazy irq disable + */ + enum { +@@ -96,13 +97,14 @@ enum { + IRQ_PER_CPU_DEVID = (1 << 17), + IRQ_IS_POLLED = (1 << 18), + IRQ_DISABLE_UNLAZY = (1 << 19), ++ IRQ_NO_SOFTIRQ_CALL = (1 << 20), + }; + + #define IRQF_MODIFY_MASK \ + (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ + IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ + IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \ +- IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY) ++ IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY | IRQ_NO_SOFTIRQ_CALL) + + #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) + +diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c +index 0809bf7743af..ccd8af6fe49d 100644 +--- a/kernel/irq/manage.c ++++ b/kernel/irq/manage.c +@@ -957,7 +957,15 @@ irq_forced_thread_fn(struct irq_desc *desc, struct irqaction *action) + atomic_inc(&desc->threads_handled); + + irq_finalize_oneshot(desc, action); +- local_bh_enable(); ++ /* ++ * Interrupts which have real time requirements can be set up ++ * to avoid softirq processing in the thread handler. This is ++ * safe as these interrupts do not raise soft interrupts. ++ */ ++ if (irq_settings_no_softirq_call(desc)) ++ _local_bh_enable(); ++ else ++ local_bh_enable(); + return ret; + } + +@@ -1467,6 +1475,9 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) + irqd_set(&desc->irq_data, IRQD_NO_BALANCING); + } + ++ if (new->flags & IRQF_NO_SOFTIRQ_CALL) ++ irq_settings_set_no_softirq_call(desc); ++ + if (irq_settings_can_autoenable(desc)) { + irq_startup(desc, IRQ_RESEND, IRQ_START_COND); + } else { +diff --git a/kernel/irq/settings.h b/kernel/irq/settings.h +index e43795cd2ccf..47e2f9e23586 100644 +--- a/kernel/irq/settings.h ++++ b/kernel/irq/settings.h +@@ -17,6 +17,7 @@ enum { + _IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID, + _IRQ_IS_POLLED = IRQ_IS_POLLED, + _IRQ_DISABLE_UNLAZY = IRQ_DISABLE_UNLAZY, ++ _IRQ_NO_SOFTIRQ_CALL = IRQ_NO_SOFTIRQ_CALL, + _IRQF_MODIFY_MASK = IRQF_MODIFY_MASK, + }; + +@@ -31,6 +32,7 @@ enum { + #define IRQ_PER_CPU_DEVID GOT_YOU_MORON + #define IRQ_IS_POLLED GOT_YOU_MORON + #define IRQ_DISABLE_UNLAZY GOT_YOU_MORON ++#define IRQ_NO_SOFTIRQ_CALL GOT_YOU_MORON + #undef IRQF_MODIFY_MASK + #define IRQF_MODIFY_MASK GOT_YOU_MORON + +@@ -41,6 +43,16 @@ irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set) + desc->status_use_accessors |= (set & _IRQF_MODIFY_MASK); + } + ++static inline bool irq_settings_no_softirq_call(struct irq_desc *desc) ++{ ++ return desc->status_use_accessors & _IRQ_NO_SOFTIRQ_CALL; ++} ++ ++static inline void irq_settings_set_no_softirq_call(struct irq_desc *desc) ++{ ++ desc->status_use_accessors |= _IRQ_NO_SOFTIRQ_CALL; ++} ++ + static inline bool irq_settings_is_per_cpu(struct irq_desc *desc) + { + return desc->status_use_accessors & _IRQ_PER_CPU; +diff --git a/kernel/softirq.c b/kernel/softirq.c +index fd89f8ab85ac..3e9333d148ad 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -598,6 +598,15 @@ void __local_bh_enable(void) + } + EXPORT_SYMBOL(__local_bh_enable); + ++void _local_bh_enable(void) ++{ ++ if (WARN_ON(current->softirq_nestcnt == 0)) ++ return; ++ if (--current->softirq_nestcnt == 0) ++ migrate_enable(); ++} ++EXPORT_SYMBOL(_local_bh_enable); ++ + int in_serving_softirq(void) + { + return current->flags & PF_IN_SOFTIRQ; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0123-net-core-use-local_bh_disable-in-netif_rx_ni.patch linux-4.19.118/debian/patches-rt/0123-net-core-use-local_bh_disable-in-netif_rx_ni.patch --- linux-4.19.98/debian/patches-rt/0123-net-core-use-local_bh_disable-in-netif_rx_ni.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0123-net-core-use-local_bh_disable-in-netif_rx_ni.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -From 506e743f138f50503ba86a10f91b8d6ee2855e69 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 16 Jun 2017 19:03:16 +0200 -Subject: [PATCH 123/290] net/core: use local_bh_disable() in netif_rx_ni() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In 2004 netif_rx_ni() gained a preempt_disable() section around -netif_rx() and its do_softirq() + testing for it. The do_softirq() part -is required because netif_rx() raises the softirq but does not invoke -it. The preempt_disable() is required to remain on the same CPU which added the -skb to the per-CPU list. -All this can be avoided be putting this into a local_bh_disable()ed -section. The local_bh_enable() part will invoke do_softirq() if -required. - -Signed-off-by: Sebastian Andrzej Siewior ---- - net/core/dev.c | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - -diff --git a/net/core/dev.c b/net/core/dev.c -index f64e9d036915..4926a260bf0e 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4541,11 +4541,9 @@ int netif_rx_ni(struct sk_buff *skb) - - trace_netif_rx_ni_entry(skb); - -- preempt_disable(); -+ local_bh_disable(); - err = netif_rx_internal(skb); -- if (local_softirq_pending()) -- do_softirq(); -- preempt_enable(); -+ local_bh_enable(); - - return err; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0124-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch linux-4.19.118/debian/patches-rt/0124-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch --- linux-4.19.98/debian/patches-rt/0124-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0124-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -From 393c57f1d000ec029efc1fcedfbacc5a6195d15c Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 31 Jan 2012 13:01:27 +0100 -Subject: [PATCH 124/290] genirq: Allow disabling of softirq processing in irq - thread context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The processing of softirqs in irq thread context is a performance gain -for the non-rt workloads of a system, but it's counterproductive for -interrupts which are explicitely related to the realtime -workload. Allow such interrupts to prevent softirq processing in their -thread context. - -Signed-off-by: Thomas Gleixner ---- - include/linux/interrupt.h | 2 ++ - include/linux/irq.h | 4 +++- - kernel/irq/manage.c | 13 ++++++++++++- - kernel/irq/settings.h | 12 ++++++++++++ - kernel/softirq.c | 9 +++++++++ - 5 files changed, 38 insertions(+), 2 deletions(-) - -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 6c25b962ba89..99f8b7ace7c9 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -62,6 +62,7 @@ - * interrupt handler after suspending interrupts. For system - * wakeup devices users need to implement wakeup detection in - * their interrupt handlers. -+ * IRQF_NO_SOFTIRQ_CALL - Do not process softirqs in the irq thread context (RT) - */ - #define IRQF_SHARED 0x00000080 - #define IRQF_PROBE_SHARED 0x00000100 -@@ -75,6 +76,7 @@ - #define IRQF_NO_THREAD 0x00010000 - #define IRQF_EARLY_RESUME 0x00020000 - #define IRQF_COND_SUSPEND 0x00040000 -+#define IRQF_NO_SOFTIRQ_CALL 0x00080000 - - #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD) - -diff --git a/include/linux/irq.h b/include/linux/irq.h -index c9bffda04a45..73d3146db74d 100644 ---- a/include/linux/irq.h -+++ b/include/linux/irq.h -@@ -69,6 +69,7 @@ enum irqchip_irq_state; - * IRQ_IS_POLLED - Always polled by another interrupt. Exclude - * it from the spurious interrupt detection - * mechanism and from core side polling. -+ * IRQ_NO_SOFTIRQ_CALL - No softirq processing in the irq thread context (RT) - * IRQ_DISABLE_UNLAZY - Disable lazy irq disable - */ - enum { -@@ -96,13 +97,14 @@ enum { - IRQ_PER_CPU_DEVID = (1 << 17), - IRQ_IS_POLLED = (1 << 18), - IRQ_DISABLE_UNLAZY = (1 << 19), -+ IRQ_NO_SOFTIRQ_CALL = (1 << 20), - }; - - #define IRQF_MODIFY_MASK \ - (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \ - IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \ - IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \ -- IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY) -+ IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY | IRQ_NO_SOFTIRQ_CALL) - - #define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING) - -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index eadcbfbd434a..3858ac895777 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -1004,7 +1004,15 @@ irq_forced_thread_fn(struct irq_desc *desc, struct irqaction *action) - atomic_inc(&desc->threads_handled); - - irq_finalize_oneshot(desc, action); -- local_bh_enable(); -+ /* -+ * Interrupts which have real time requirements can be set up -+ * to avoid softirq processing in the thread handler. This is -+ * safe as these interrupts do not raise soft interrupts. -+ */ -+ if (irq_settings_no_softirq_call(desc)) -+ _local_bh_enable(); -+ else -+ local_bh_enable(); - return ret; - } - -@@ -1514,6 +1522,9 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) - irqd_set(&desc->irq_data, IRQD_NO_BALANCING); - } - -+ if (new->flags & IRQF_NO_SOFTIRQ_CALL) -+ irq_settings_set_no_softirq_call(desc); -+ - if (irq_settings_can_autoenable(desc)) { - irq_startup(desc, IRQ_RESEND, IRQ_START_COND); - } else { -diff --git a/kernel/irq/settings.h b/kernel/irq/settings.h -index e43795cd2ccf..47e2f9e23586 100644 ---- a/kernel/irq/settings.h -+++ b/kernel/irq/settings.h -@@ -17,6 +17,7 @@ enum { - _IRQ_PER_CPU_DEVID = IRQ_PER_CPU_DEVID, - _IRQ_IS_POLLED = IRQ_IS_POLLED, - _IRQ_DISABLE_UNLAZY = IRQ_DISABLE_UNLAZY, -+ _IRQ_NO_SOFTIRQ_CALL = IRQ_NO_SOFTIRQ_CALL, - _IRQF_MODIFY_MASK = IRQF_MODIFY_MASK, - }; - -@@ -31,6 +32,7 @@ enum { - #define IRQ_PER_CPU_DEVID GOT_YOU_MORON - #define IRQ_IS_POLLED GOT_YOU_MORON - #define IRQ_DISABLE_UNLAZY GOT_YOU_MORON -+#define IRQ_NO_SOFTIRQ_CALL GOT_YOU_MORON - #undef IRQF_MODIFY_MASK - #define IRQF_MODIFY_MASK GOT_YOU_MORON - -@@ -41,6 +43,16 @@ irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set) - desc->status_use_accessors |= (set & _IRQF_MODIFY_MASK); - } - -+static inline bool irq_settings_no_softirq_call(struct irq_desc *desc) -+{ -+ return desc->status_use_accessors & _IRQ_NO_SOFTIRQ_CALL; -+} -+ -+static inline void irq_settings_set_no_softirq_call(struct irq_desc *desc) -+{ -+ desc->status_use_accessors |= _IRQ_NO_SOFTIRQ_CALL; -+} -+ - static inline bool irq_settings_is_per_cpu(struct irq_desc *desc) - { - return desc->status_use_accessors & _IRQ_PER_CPU; -diff --git a/kernel/softirq.c b/kernel/softirq.c -index fd89f8ab85ac..3e9333d148ad 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -598,6 +598,15 @@ void __local_bh_enable(void) - } - EXPORT_SYMBOL(__local_bh_enable); - -+void _local_bh_enable(void) -+{ -+ if (WARN_ON(current->softirq_nestcnt == 0)) -+ return; -+ if (--current->softirq_nestcnt == 0) -+ migrate_enable(); -+} -+EXPORT_SYMBOL(_local_bh_enable); -+ - int in_serving_softirq(void) - { - return current->flags & PF_IN_SOFTIRQ; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0124-softirq-split-timer-softirqs-out-of-ksoftirqd.patch linux-4.19.118/debian/patches-rt/0124-softirq-split-timer-softirqs-out-of-ksoftirqd.patch --- linux-4.19.98/debian/patches-rt/0124-softirq-split-timer-softirqs-out-of-ksoftirqd.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0124-softirq-split-timer-softirqs-out-of-ksoftirqd.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,215 @@ +From 5b1827a76c3fd349c3e0f8fcf77c1b054b34aedc Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 20 Jan 2016 16:34:17 +0100 +Subject: [PATCH 124/325] softirq: split timer softirqs out of ksoftirqd +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The softirqd runs in -RT with SCHED_FIFO (prio 1) and deals mostly with +timer wakeup which can not happen in hardirq context. The prio has been +risen from the normal SCHED_OTHER so the timer wakeup does not happen +too late. +With enough networking load it is possible that the system never goes +idle and schedules ksoftirqd and everything else with a higher priority. +One of the tasks left behind is one of RCU's threads and so we see stalls +and eventually run out of memory. +This patch moves the TIMER and HRTIMER softirqs out of the `ksoftirqd` +thread into its own `ktimersoftd`. The former can now run SCHED_OTHER +(same as mainline) and the latter at SCHED_FIFO due to the wakeups. + +From networking point of view: The NAPI callback runs after the network +interrupt thread completes. If its run time takes too long the NAPI code +itself schedules the `ksoftirqd`. Here in the thread it can run at +SCHED_OTHER priority and it won't defer RCU anymore. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/softirq.c | 85 +++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 73 insertions(+), 12 deletions(-) + +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 3e9333d148ad..fe4e59c80a08 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -59,6 +59,10 @@ EXPORT_PER_CPU_SYMBOL(irq_stat); + static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; + + DEFINE_PER_CPU(struct task_struct *, ksoftirqd); ++#ifdef CONFIG_PREEMPT_RT_FULL ++#define TIMER_SOFTIRQS ((1 << TIMER_SOFTIRQ) | (1 << HRTIMER_SOFTIRQ)) ++DEFINE_PER_CPU(struct task_struct *, ktimer_softirqd); ++#endif + + const char * const softirq_to_name[NR_SOFTIRQS] = { + "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL", +@@ -172,6 +176,17 @@ static void wakeup_softirqd(void) + wake_up_process(tsk); + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++static void wakeup_timer_softirqd(void) ++{ ++ /* Interrupts are disabled: no need to stop preemption */ ++ struct task_struct *tsk = __this_cpu_read(ktimer_softirqd); ++ ++ if (tsk && tsk->state != TASK_RUNNING) ++ wake_up_process(tsk); ++} ++#endif ++ + static void handle_softirq(unsigned int vec_nr) + { + struct softirq_action *h = softirq_vec + vec_nr; +@@ -493,7 +508,6 @@ void __raise_softirq_irqoff(unsigned int nr) + static inline void local_bh_disable_nort(void) { local_bh_disable(); } + static inline void _local_bh_enable_nort(void) { _local_bh_enable(); } + static void ksoftirqd_set_sched_params(unsigned int cpu) { } +-static void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) { } + + #else /* !PREEMPT_RT_FULL */ + +@@ -640,8 +654,12 @@ void thread_do_softirq(void) + + static void do_raise_softirq_irqoff(unsigned int nr) + { ++ unsigned int mask; ++ ++ mask = 1UL << nr; ++ + trace_softirq_raise(nr); +- or_softirq_pending(1UL << nr); ++ or_softirq_pending(mask); + + /* + * If we are not in a hard interrupt and inside a bh disabled +@@ -650,16 +668,29 @@ static void do_raise_softirq_irqoff(unsigned int nr) + * delegate it to ksoftirqd. + */ + if (!in_irq() && current->softirq_nestcnt) +- current->softirqs_raised |= (1U << nr); +- else if (__this_cpu_read(ksoftirqd)) +- __this_cpu_read(ksoftirqd)->softirqs_raised |= (1U << nr); ++ current->softirqs_raised |= mask; ++ else if (!__this_cpu_read(ksoftirqd) || !__this_cpu_read(ktimer_softirqd)) ++ return; ++ ++ if (mask & TIMER_SOFTIRQS) ++ __this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask; ++ else ++ __this_cpu_read(ksoftirqd)->softirqs_raised |= mask; ++} ++ ++static void wakeup_proper_softirq(unsigned int nr) ++{ ++ if ((1UL << nr) & TIMER_SOFTIRQS) ++ wakeup_timer_softirqd(); ++ else ++ wakeup_softirqd(); + } + + void __raise_softirq_irqoff(unsigned int nr) + { + do_raise_softirq_irqoff(nr); + if (!in_irq() && !current->softirq_nestcnt) +- wakeup_softirqd(); ++ wakeup_proper_softirq(nr); + } + + /* +@@ -685,7 +716,7 @@ void raise_softirq_irqoff(unsigned int nr) + * raise a WARN() if the condition is met. + */ + if (!current->softirq_nestcnt) +- wakeup_softirqd(); ++ wakeup_proper_softirq(nr); + } + + static inline int ksoftirqd_softirq_pending(void) +@@ -697,23 +728,38 @@ static inline void local_bh_disable_nort(void) { } + static inline void _local_bh_enable_nort(void) { } + + static inline void ksoftirqd_set_sched_params(unsigned int cpu) ++{ ++ /* Take over all but timer pending softirqs when starting */ ++ local_irq_disable(); ++ current->softirqs_raised = local_softirq_pending() & ~TIMER_SOFTIRQS; ++ local_irq_enable(); ++} ++ ++static inline void ktimer_softirqd_set_sched_params(unsigned int cpu) + { + struct sched_param param = { .sched_priority = 1 }; + + sched_setscheduler(current, SCHED_FIFO, ¶m); +- /* Take over all pending softirqs when starting */ ++ ++ /* Take over timer pending softirqs when starting */ + local_irq_disable(); +- current->softirqs_raised = local_softirq_pending(); ++ current->softirqs_raised = local_softirq_pending() & TIMER_SOFTIRQS; + local_irq_enable(); + } + +-static inline void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) ++static inline void ktimer_softirqd_clr_sched_params(unsigned int cpu, ++ bool online) + { + struct sched_param param = { .sched_priority = 0 }; + + sched_setscheduler(current, SCHED_NORMAL, ¶m); + } + ++static int ktimer_softirqd_should_run(unsigned int cpu) ++{ ++ return current->softirqs_raised; ++} ++ + #endif /* PREEMPT_RT_FULL */ + /* + * Enter an interrupt context. +@@ -766,6 +812,9 @@ static inline void invoke_softirq(void) + if (__this_cpu_read(ksoftirqd) && + __this_cpu_read(ksoftirqd)->softirqs_raised) + wakeup_softirqd(); ++ if (__this_cpu_read(ktimer_softirqd) && ++ __this_cpu_read(ktimer_softirqd)->softirqs_raised) ++ wakeup_timer_softirqd(); + local_irq_restore(flags); + #endif + } +@@ -1153,18 +1202,30 @@ static int takeover_tasklets(unsigned int cpu) + static struct smp_hotplug_thread softirq_threads = { + .store = &ksoftirqd, + .setup = ksoftirqd_set_sched_params, +- .cleanup = ksoftirqd_clr_sched_params, + .thread_should_run = ksoftirqd_should_run, + .thread_fn = run_ksoftirqd, + .thread_comm = "ksoftirqd/%u", + }; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++static struct smp_hotplug_thread softirq_timer_threads = { ++ .store = &ktimer_softirqd, ++ .setup = ktimer_softirqd_set_sched_params, ++ .cleanup = ktimer_softirqd_clr_sched_params, ++ .thread_should_run = ktimer_softirqd_should_run, ++ .thread_fn = run_ksoftirqd, ++ .thread_comm = "ktimersoftd/%u", ++}; ++#endif ++ + static __init int spawn_ksoftirqd(void) + { + cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL, + takeover_tasklets); + BUG_ON(smpboot_register_percpu_thread(&softirq_threads)); +- ++#ifdef CONFIG_PREEMPT_RT_FULL ++ BUG_ON(smpboot_register_percpu_thread(&softirq_timer_threads)); ++#endif + return 0; + } + early_initcall(spawn_ksoftirqd); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0125-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch linux-4.19.118/debian/patches-rt/0125-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch --- linux-4.19.98/debian/patches-rt/0125-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0125-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,112 @@ +From 4d3cb3bcde462ea3b82c902bf79c233e68f7d29a Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 18 Feb 2019 13:19:59 +0100 +Subject: [PATCH 125/325] softirq: Avoid "local_softirq_pending" messages if + ksoftirqd is blocked +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +If the ksoftirqd thread has a softirq pending and is blocked on the +`local_softirq_locks' lock then softirq_check_pending_idle() won't +complain because the "lock owner" will mask away this softirq from the +mask of pending softirqs. +If ksoftirqd has an additional softirq pending then it won't be masked +out because we never look at ksoftirqd's mask. + +If there are still pending softirqs while going to idle check +ksoftirqd's and ktimersfotd's mask before complaining about unhandled +softirqs. + +Cc: stable-rt@vger.kernel.org +Tested-by: Juri Lelli +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/softirq.c | 57 ++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 41 insertions(+), 16 deletions(-) + +diff --git a/kernel/softirq.c b/kernel/softirq.c +index fe4e59c80a08..1920985eeb09 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -92,6 +92,31 @@ static inline void softirq_clr_runner(unsigned int sirq) + sr->runner[sirq] = NULL; + } + ++static bool softirq_check_runner_tsk(struct task_struct *tsk, ++ unsigned int *pending) ++{ ++ bool ret = false; ++ ++ if (!tsk) ++ return ret; ++ ++ /* ++ * The wakeup code in rtmutex.c wakes up the task ++ * _before_ it sets pi_blocked_on to NULL under ++ * tsk->pi_lock. So we need to check for both: state ++ * and pi_blocked_on. ++ */ ++ raw_spin_lock(&tsk->pi_lock); ++ if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { ++ /* Clear all bits pending in that task */ ++ *pending &= ~(tsk->softirqs_raised); ++ ret = true; ++ } ++ raw_spin_unlock(&tsk->pi_lock); ++ ++ return ret; ++} ++ + /* + * On preempt-rt a softirq running context might be blocked on a + * lock. There might be no other runnable task on this CPU because the +@@ -104,6 +129,7 @@ static inline void softirq_clr_runner(unsigned int sirq) + */ + void softirq_check_pending_idle(void) + { ++ struct task_struct *tsk; + static int rate_limit; + struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); + u32 warnpending; +@@ -113,24 +139,23 @@ void softirq_check_pending_idle(void) + return; + + warnpending = local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK; ++ if (!warnpending) ++ return; + for (i = 0; i < NR_SOFTIRQS; i++) { +- struct task_struct *tsk = sr->runner[i]; ++ tsk = sr->runner[i]; + +- /* +- * The wakeup code in rtmutex.c wakes up the task +- * _before_ it sets pi_blocked_on to NULL under +- * tsk->pi_lock. So we need to check for both: state +- * and pi_blocked_on. +- */ +- if (tsk) { +- raw_spin_lock(&tsk->pi_lock); +- if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { +- /* Clear all bits pending in that task */ +- warnpending &= ~(tsk->softirqs_raised); +- warnpending &= ~(1 << i); +- } +- raw_spin_unlock(&tsk->pi_lock); +- } ++ if (softirq_check_runner_tsk(tsk, &warnpending)) ++ warnpending &= ~(1 << i); ++ } ++ ++ if (warnpending) { ++ tsk = __this_cpu_read(ksoftirqd); ++ softirq_check_runner_tsk(tsk, &warnpending); ++ } ++ ++ if (warnpending) { ++ tsk = __this_cpu_read(ktimer_softirqd); ++ softirq_check_runner_tsk(tsk, &warnpending); + } + + if (warnpending) { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0125-softirq-split-timer-softirqs-out-of-ksoftirqd.patch linux-4.19.118/debian/patches-rt/0125-softirq-split-timer-softirqs-out-of-ksoftirqd.patch --- linux-4.19.98/debian/patches-rt/0125-softirq-split-timer-softirqs-out-of-ksoftirqd.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0125-softirq-split-timer-softirqs-out-of-ksoftirqd.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,215 +0,0 @@ -From 74b99df23856c57791eccaa46030824066095f30 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 20 Jan 2016 16:34:17 +0100 -Subject: [PATCH 125/290] softirq: split timer softirqs out of ksoftirqd -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The softirqd runs in -RT with SCHED_FIFO (prio 1) and deals mostly with -timer wakeup which can not happen in hardirq context. The prio has been -risen from the normal SCHED_OTHER so the timer wakeup does not happen -too late. -With enough networking load it is possible that the system never goes -idle and schedules ksoftirqd and everything else with a higher priority. -One of the tasks left behind is one of RCU's threads and so we see stalls -and eventually run out of memory. -This patch moves the TIMER and HRTIMER softirqs out of the `ksoftirqd` -thread into its own `ktimersoftd`. The former can now run SCHED_OTHER -(same as mainline) and the latter at SCHED_FIFO due to the wakeups. - -From networking point of view: The NAPI callback runs after the network -interrupt thread completes. If its run time takes too long the NAPI code -itself schedules the `ksoftirqd`. Here in the thread it can run at -SCHED_OTHER priority and it won't defer RCU anymore. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/softirq.c | 85 +++++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 73 insertions(+), 12 deletions(-) - -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 3e9333d148ad..fe4e59c80a08 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -59,6 +59,10 @@ EXPORT_PER_CPU_SYMBOL(irq_stat); - static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp; - - DEFINE_PER_CPU(struct task_struct *, ksoftirqd); -+#ifdef CONFIG_PREEMPT_RT_FULL -+#define TIMER_SOFTIRQS ((1 << TIMER_SOFTIRQ) | (1 << HRTIMER_SOFTIRQ)) -+DEFINE_PER_CPU(struct task_struct *, ktimer_softirqd); -+#endif - - const char * const softirq_to_name[NR_SOFTIRQS] = { - "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL", -@@ -172,6 +176,17 @@ static void wakeup_softirqd(void) - wake_up_process(tsk); - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+static void wakeup_timer_softirqd(void) -+{ -+ /* Interrupts are disabled: no need to stop preemption */ -+ struct task_struct *tsk = __this_cpu_read(ktimer_softirqd); -+ -+ if (tsk && tsk->state != TASK_RUNNING) -+ wake_up_process(tsk); -+} -+#endif -+ - static void handle_softirq(unsigned int vec_nr) - { - struct softirq_action *h = softirq_vec + vec_nr; -@@ -493,7 +508,6 @@ void __raise_softirq_irqoff(unsigned int nr) - static inline void local_bh_disable_nort(void) { local_bh_disable(); } - static inline void _local_bh_enable_nort(void) { _local_bh_enable(); } - static void ksoftirqd_set_sched_params(unsigned int cpu) { } --static void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) { } - - #else /* !PREEMPT_RT_FULL */ - -@@ -640,8 +654,12 @@ void thread_do_softirq(void) - - static void do_raise_softirq_irqoff(unsigned int nr) - { -+ unsigned int mask; -+ -+ mask = 1UL << nr; -+ - trace_softirq_raise(nr); -- or_softirq_pending(1UL << nr); -+ or_softirq_pending(mask); - - /* - * If we are not in a hard interrupt and inside a bh disabled -@@ -650,16 +668,29 @@ static void do_raise_softirq_irqoff(unsigned int nr) - * delegate it to ksoftirqd. - */ - if (!in_irq() && current->softirq_nestcnt) -- current->softirqs_raised |= (1U << nr); -- else if (__this_cpu_read(ksoftirqd)) -- __this_cpu_read(ksoftirqd)->softirqs_raised |= (1U << nr); -+ current->softirqs_raised |= mask; -+ else if (!__this_cpu_read(ksoftirqd) || !__this_cpu_read(ktimer_softirqd)) -+ return; -+ -+ if (mask & TIMER_SOFTIRQS) -+ __this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask; -+ else -+ __this_cpu_read(ksoftirqd)->softirqs_raised |= mask; -+} -+ -+static void wakeup_proper_softirq(unsigned int nr) -+{ -+ if ((1UL << nr) & TIMER_SOFTIRQS) -+ wakeup_timer_softirqd(); -+ else -+ wakeup_softirqd(); - } - - void __raise_softirq_irqoff(unsigned int nr) - { - do_raise_softirq_irqoff(nr); - if (!in_irq() && !current->softirq_nestcnt) -- wakeup_softirqd(); -+ wakeup_proper_softirq(nr); - } - - /* -@@ -685,7 +716,7 @@ void raise_softirq_irqoff(unsigned int nr) - * raise a WARN() if the condition is met. - */ - if (!current->softirq_nestcnt) -- wakeup_softirqd(); -+ wakeup_proper_softirq(nr); - } - - static inline int ksoftirqd_softirq_pending(void) -@@ -697,23 +728,38 @@ static inline void local_bh_disable_nort(void) { } - static inline void _local_bh_enable_nort(void) { } - - static inline void ksoftirqd_set_sched_params(unsigned int cpu) -+{ -+ /* Take over all but timer pending softirqs when starting */ -+ local_irq_disable(); -+ current->softirqs_raised = local_softirq_pending() & ~TIMER_SOFTIRQS; -+ local_irq_enable(); -+} -+ -+static inline void ktimer_softirqd_set_sched_params(unsigned int cpu) - { - struct sched_param param = { .sched_priority = 1 }; - - sched_setscheduler(current, SCHED_FIFO, ¶m); -- /* Take over all pending softirqs when starting */ -+ -+ /* Take over timer pending softirqs when starting */ - local_irq_disable(); -- current->softirqs_raised = local_softirq_pending(); -+ current->softirqs_raised = local_softirq_pending() & TIMER_SOFTIRQS; - local_irq_enable(); - } - --static inline void ksoftirqd_clr_sched_params(unsigned int cpu, bool online) -+static inline void ktimer_softirqd_clr_sched_params(unsigned int cpu, -+ bool online) - { - struct sched_param param = { .sched_priority = 0 }; - - sched_setscheduler(current, SCHED_NORMAL, ¶m); - } - -+static int ktimer_softirqd_should_run(unsigned int cpu) -+{ -+ return current->softirqs_raised; -+} -+ - #endif /* PREEMPT_RT_FULL */ - /* - * Enter an interrupt context. -@@ -766,6 +812,9 @@ static inline void invoke_softirq(void) - if (__this_cpu_read(ksoftirqd) && - __this_cpu_read(ksoftirqd)->softirqs_raised) - wakeup_softirqd(); -+ if (__this_cpu_read(ktimer_softirqd) && -+ __this_cpu_read(ktimer_softirqd)->softirqs_raised) -+ wakeup_timer_softirqd(); - local_irq_restore(flags); - #endif - } -@@ -1153,18 +1202,30 @@ static int takeover_tasklets(unsigned int cpu) - static struct smp_hotplug_thread softirq_threads = { - .store = &ksoftirqd, - .setup = ksoftirqd_set_sched_params, -- .cleanup = ksoftirqd_clr_sched_params, - .thread_should_run = ksoftirqd_should_run, - .thread_fn = run_ksoftirqd, - .thread_comm = "ksoftirqd/%u", - }; - -+#ifdef CONFIG_PREEMPT_RT_FULL -+static struct smp_hotplug_thread softirq_timer_threads = { -+ .store = &ktimer_softirqd, -+ .setup = ktimer_softirqd_set_sched_params, -+ .cleanup = ktimer_softirqd_clr_sched_params, -+ .thread_should_run = ktimer_softirqd_should_run, -+ .thread_fn = run_ksoftirqd, -+ .thread_comm = "ktimersoftd/%u", -+}; -+#endif -+ - static __init int spawn_ksoftirqd(void) - { - cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL, - takeover_tasklets); - BUG_ON(smpboot_register_percpu_thread(&softirq_threads)); -- -+#ifdef CONFIG_PREEMPT_RT_FULL -+ BUG_ON(smpboot_register_percpu_thread(&softirq_timer_threads)); -+#endif - return 0; - } - early_initcall(spawn_ksoftirqd); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch linux-4.19.118/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch --- linux-4.19.98/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -From ece86c041648cc912cb0e5f6c921ce25c8ffc506 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 18 Feb 2019 13:19:59 +0100 -Subject: [PATCH 126/290] softirq: Avoid "local_softirq_pending" messages if - ksoftirqd is blocked -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -If the ksoftirqd thread has a softirq pending and is blocked on the -`local_softirq_locks' lock then softirq_check_pending_idle() won't -complain because the "lock owner" will mask away this softirq from the -mask of pending softirqs. -If ksoftirqd has an additional softirq pending then it won't be masked -out because we never look at ksoftirqd's mask. - -If there are still pending softirqs while going to idle check -ksoftirqd's and ktimersfotd's mask before complaining about unhandled -softirqs. - -Cc: stable-rt@vger.kernel.org -Tested-by: Juri Lelli -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/softirq.c | 57 ++++++++++++++++++++++++++++++++++-------------- - 1 file changed, 41 insertions(+), 16 deletions(-) - -diff --git a/kernel/softirq.c b/kernel/softirq.c -index fe4e59c80a08..1920985eeb09 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -92,6 +92,31 @@ static inline void softirq_clr_runner(unsigned int sirq) - sr->runner[sirq] = NULL; - } - -+static bool softirq_check_runner_tsk(struct task_struct *tsk, -+ unsigned int *pending) -+{ -+ bool ret = false; -+ -+ if (!tsk) -+ return ret; -+ -+ /* -+ * The wakeup code in rtmutex.c wakes up the task -+ * _before_ it sets pi_blocked_on to NULL under -+ * tsk->pi_lock. So we need to check for both: state -+ * and pi_blocked_on. -+ */ -+ raw_spin_lock(&tsk->pi_lock); -+ if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { -+ /* Clear all bits pending in that task */ -+ *pending &= ~(tsk->softirqs_raised); -+ ret = true; -+ } -+ raw_spin_unlock(&tsk->pi_lock); -+ -+ return ret; -+} -+ - /* - * On preempt-rt a softirq running context might be blocked on a - * lock. There might be no other runnable task on this CPU because the -@@ -104,6 +129,7 @@ static inline void softirq_clr_runner(unsigned int sirq) - */ - void softirq_check_pending_idle(void) - { -+ struct task_struct *tsk; - static int rate_limit; - struct softirq_runner *sr = this_cpu_ptr(&softirq_runners); - u32 warnpending; -@@ -113,24 +139,23 @@ void softirq_check_pending_idle(void) - return; - - warnpending = local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK; -+ if (!warnpending) -+ return; - for (i = 0; i < NR_SOFTIRQS; i++) { -- struct task_struct *tsk = sr->runner[i]; -+ tsk = sr->runner[i]; - -- /* -- * The wakeup code in rtmutex.c wakes up the task -- * _before_ it sets pi_blocked_on to NULL under -- * tsk->pi_lock. So we need to check for both: state -- * and pi_blocked_on. -- */ -- if (tsk) { -- raw_spin_lock(&tsk->pi_lock); -- if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { -- /* Clear all bits pending in that task */ -- warnpending &= ~(tsk->softirqs_raised); -- warnpending &= ~(1 << i); -- } -- raw_spin_unlock(&tsk->pi_lock); -- } -+ if (softirq_check_runner_tsk(tsk, &warnpending)) -+ warnpending &= ~(1 << i); -+ } -+ -+ if (warnpending) { -+ tsk = __this_cpu_read(ksoftirqd); -+ softirq_check_runner_tsk(tsk, &warnpending); -+ } -+ -+ if (warnpending) { -+ tsk = __this_cpu_read(ktimer_softirqd); -+ softirq_check_runner_tsk(tsk, &warnpending); - } - - if (warnpending) { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-task.patch linux-4.19.118/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-task.patch --- linux-4.19.98/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-task.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0126-softirq-Avoid-local_softirq_pending-messages-if-task.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,41 @@ +From 7bf55b1409bf1fdbfd5c017c1fd64129b2f24210 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 19 Feb 2019 16:49:29 +0100 +Subject: [PATCH 126/325] softirq: Avoid "local_softirq_pending" messages if + task is in cpu_chill() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +If the softirq thread enters cpu_chill() then ->state is UNINTERRUPTIBLE +and has no ->pi_blocked_on set and so its mask is not taken into account. + +->sleeping_lock is increased by cpu_chill() since it is also requried to +avoid a splat by RCU in case cpu_chill() is used while a RCU-read lock +is held. Use the same mechanism for the softirq-pending check. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/softirq.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 1920985eeb09..27a4bb2303d0 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -105,9 +105,12 @@ static bool softirq_check_runner_tsk(struct task_struct *tsk, + * _before_ it sets pi_blocked_on to NULL under + * tsk->pi_lock. So we need to check for both: state + * and pi_blocked_on. ++ * The test against UNINTERRUPTIBLE + ->sleeping_lock is in case the ++ * task does cpu_chill(). + */ + raw_spin_lock(&tsk->pi_lock); +- if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { ++ if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING || ++ (tsk->state == TASK_UNINTERRUPTIBLE && tsk->sleeping_lock)) { + /* Clear all bits pending in that task */ + *pending &= ~(tsk->softirqs_raised); + ret = true; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0127-rtmutex-trylock-is-okay-on-RT.patch linux-4.19.118/debian/patches-rt/0127-rtmutex-trylock-is-okay-on-RT.patch --- linux-4.19.98/debian/patches-rt/0127-rtmutex-trylock-is-okay-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0127-rtmutex-trylock-is-okay-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,34 @@ +From e3c2fa3a8755063343e3ce1072db61a9044dda46 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 2 Dec 2015 11:34:07 +0100 +Subject: [PATCH 127/325] rtmutex: trylock is okay on -RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +non-RT kernel could deadlock on rt_mutex_trylock() in softirq context. On +-RT we don't run softirqs in IRQ context but in thread context so it is +not a issue here. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rtmutex.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 9562aaa2afdc..72abe7c121fa 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1583,7 +1583,11 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) + { + int ret; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (WARN_ON_ONCE(in_irq() || in_nmi())) ++#else + if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) ++#endif + return 0; + + ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0127-softirq-Avoid-local_softirq_pending-messages-if-task.patch linux-4.19.118/debian/patches-rt/0127-softirq-Avoid-local_softirq_pending-messages-if-task.patch --- linux-4.19.98/debian/patches-rt/0127-softirq-Avoid-local_softirq_pending-messages-if-task.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0127-softirq-Avoid-local_softirq_pending-messages-if-task.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -From 7bc071d971f2caab6d8cf678fa51ac0f0f84be57 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 19 Feb 2019 16:49:29 +0100 -Subject: [PATCH 127/290] softirq: Avoid "local_softirq_pending" messages if - task is in cpu_chill() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -If the softirq thread enters cpu_chill() then ->state is UNINTERRUPTIBLE -and has no ->pi_blocked_on set and so its mask is not taken into account. - -->sleeping_lock is increased by cpu_chill() since it is also requried to -avoid a splat by RCU in case cpu_chill() is used while a RCU-read lock -is held. Use the same mechanism for the softirq-pending check. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/softirq.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 1920985eeb09..27a4bb2303d0 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -105,9 +105,12 @@ static bool softirq_check_runner_tsk(struct task_struct *tsk, - * _before_ it sets pi_blocked_on to NULL under - * tsk->pi_lock. So we need to check for both: state - * and pi_blocked_on. -+ * The test against UNINTERRUPTIBLE + ->sleeping_lock is in case the -+ * task does cpu_chill(). - */ - raw_spin_lock(&tsk->pi_lock); -- if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING) { -+ if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING || -+ (tsk->state == TASK_UNINTERRUPTIBLE && tsk->sleeping_lock)) { - /* Clear all bits pending in that task */ - *pending &= ~(tsk->softirqs_raised); - ret = true; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch linux-4.19.118/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch --- linux-4.19.98/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,151 @@ +From a519c1de9cb8fa6407865a391460b71b3d9f7ba5 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 15 Sep 2016 10:51:27 +0200 +Subject: [PATCH 128/325] fs/nfs: turn rmdir_sem into a semaphore +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The RW semaphore had a reader side which used the _non_owner version +because it most likely took the reader lock in one thread and released it +in another which would cause lockdep to complain if the "regular" +version was used. +On -RT we need the owner because the rw lock is turned into a rtmutex. +The semaphores on the hand are "plain simple" and should work as +expected. We can't have multiple readers but on -RT we don't allow +multiple readers anyway so that is not a loss. + +Signed-off-by: Sebastian Andrzej Siewior +--- + fs/nfs/dir.c | 8 ++++++++ + fs/nfs/inode.c | 4 ++++ + fs/nfs/unlink.c | 31 +++++++++++++++++++++++++++---- + include/linux/nfs_fs.h | 4 ++++ + 4 files changed, 43 insertions(+), 4 deletions(-) + +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c +index 4ae726e70d87..c60b20884c45 100644 +--- a/fs/nfs/dir.c ++++ b/fs/nfs/dir.c +@@ -1836,7 +1836,11 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry) + + trace_nfs_rmdir_enter(dir, dentry); + if (d_really_is_positive(dentry)) { ++#ifdef CONFIG_PREEMPT_RT_BASE ++ down(&NFS_I(d_inode(dentry))->rmdir_sem); ++#else + down_write(&NFS_I(d_inode(dentry))->rmdir_sem); ++#endif + error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); + /* Ensure the VFS deletes this inode */ + switch (error) { +@@ -1846,7 +1850,11 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry) + case -ENOENT: + nfs_dentry_handle_enoent(dentry); + } ++#ifdef CONFIG_PREEMPT_RT_BASE ++ up(&NFS_I(d_inode(dentry))->rmdir_sem); ++#else + up_write(&NFS_I(d_inode(dentry))->rmdir_sem); ++#endif + } else + error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); + trace_nfs_rmdir_exit(dir, dentry, error); +diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c +index e4cd3a2fe698..6f22c8d65760 100644 +--- a/fs/nfs/inode.c ++++ b/fs/nfs/inode.c +@@ -2104,7 +2104,11 @@ static void init_once(void *foo) + atomic_long_set(&nfsi->nrequests, 0); + atomic_long_set(&nfsi->commit_info.ncommit, 0); + atomic_set(&nfsi->commit_info.rpcs_out, 0); ++#ifdef CONFIG_PREEMPT_RT_BASE ++ sema_init(&nfsi->rmdir_sem, 1); ++#else + init_rwsem(&nfsi->rmdir_sem); ++#endif + mutex_init(&nfsi->commit_mutex); + nfs4_init_once(nfsi); + } +diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c +index fd61bf0fce63..ce9100b5604d 100644 +--- a/fs/nfs/unlink.c ++++ b/fs/nfs/unlink.c +@@ -52,6 +52,29 @@ static void nfs_async_unlink_done(struct rpc_task *task, void *calldata) + rpc_restart_call_prepare(task); + } + ++#ifdef CONFIG_PREEMPT_RT_BASE ++static void nfs_down_anon(struct semaphore *sema) ++{ ++ down(sema); ++} ++ ++static void nfs_up_anon(struct semaphore *sema) ++{ ++ up(sema); ++} ++ ++#else ++static void nfs_down_anon(struct rw_semaphore *rwsem) ++{ ++ down_read_non_owner(rwsem); ++} ++ ++static void nfs_up_anon(struct rw_semaphore *rwsem) ++{ ++ up_read_non_owner(rwsem); ++} ++#endif ++ + /** + * nfs_async_unlink_release - Release the sillydelete data. + * @task: rpc_task of the sillydelete +@@ -65,7 +88,7 @@ static void nfs_async_unlink_release(void *calldata) + struct dentry *dentry = data->dentry; + struct super_block *sb = dentry->d_sb; + +- up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); ++ nfs_up_anon(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); + d_lookup_done(dentry); + nfs_free_unlinkdata(data); + dput(dentry); +@@ -118,10 +141,10 @@ static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nf + struct inode *dir = d_inode(dentry->d_parent); + struct dentry *alias; + +- down_read_non_owner(&NFS_I(dir)->rmdir_sem); ++ nfs_down_anon(&NFS_I(dir)->rmdir_sem); + alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq); + if (IS_ERR(alias)) { +- up_read_non_owner(&NFS_I(dir)->rmdir_sem); ++ nfs_up_anon(&NFS_I(dir)->rmdir_sem); + return 0; + } + if (!d_in_lookup(alias)) { +@@ -143,7 +166,7 @@ static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nf + ret = 0; + spin_unlock(&alias->d_lock); + dput(alias); +- up_read_non_owner(&NFS_I(dir)->rmdir_sem); ++ nfs_up_anon(&NFS_I(dir)->rmdir_sem); + /* + * If we'd displaced old cached devname, free it. At that + * point dentry is definitely not a root, so we won't need +diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h +index a0831e9d19c9..94b6fefd90b0 100644 +--- a/include/linux/nfs_fs.h ++++ b/include/linux/nfs_fs.h +@@ -163,7 +163,11 @@ struct nfs_inode { + + /* Readers: in-flight sillydelete RPC calls */ + /* Writers: rmdir */ ++#ifdef CONFIG_PREEMPT_RT_BASE ++ struct semaphore rmdir_sem; ++#else + struct rw_semaphore rmdir_sem; ++#endif + struct mutex commit_mutex; + + #if IS_ENABLED(CONFIG_NFS_V4) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0128-rtmutex-trylock-is-okay-on-RT.patch linux-4.19.118/debian/patches-rt/0128-rtmutex-trylock-is-okay-on-RT.patch --- linux-4.19.98/debian/patches-rt/0128-rtmutex-trylock-is-okay-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0128-rtmutex-trylock-is-okay-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -From f883f2d061fa3f01c9c2657223aa1cfb02b9aef3 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 2 Dec 2015 11:34:07 +0100 -Subject: [PATCH 128/290] rtmutex: trylock is okay on -RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -non-RT kernel could deadlock on rt_mutex_trylock() in softirq context. On --RT we don't run softirqs in IRQ context but in thread context so it is -not a issue here. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 9562aaa2afdc..72abe7c121fa 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1583,7 +1583,11 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) - { - int ret; - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (WARN_ON_ONCE(in_irq() || in_nmi())) -+#else - if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) -+#endif - return 0; - - ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0129-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch linux-4.19.118/debian/patches-rt/0129-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch --- linux-4.19.98/debian/patches-rt/0129-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0129-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,151 +0,0 @@ -From e3f69c0b583258222d76fafb057b054796b9ad31 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 15 Sep 2016 10:51:27 +0200 -Subject: [PATCH 129/290] fs/nfs: turn rmdir_sem into a semaphore -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The RW semaphore had a reader side which used the _non_owner version -because it most likely took the reader lock in one thread and released it -in another which would cause lockdep to complain if the "regular" -version was used. -On -RT we need the owner because the rw lock is turned into a rtmutex. -The semaphores on the hand are "plain simple" and should work as -expected. We can't have multiple readers but on -RT we don't allow -multiple readers anyway so that is not a loss. - -Signed-off-by: Sebastian Andrzej Siewior ---- - fs/nfs/dir.c | 8 ++++++++ - fs/nfs/inode.c | 4 ++++ - fs/nfs/unlink.c | 31 +++++++++++++++++++++++++++---- - include/linux/nfs_fs.h | 4 ++++ - 4 files changed, 43 insertions(+), 4 deletions(-) - -diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c -index b8d686087952..17f8a9259971 100644 ---- a/fs/nfs/dir.c -+++ b/fs/nfs/dir.c -@@ -1815,7 +1815,11 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry) - - trace_nfs_rmdir_enter(dir, dentry); - if (d_really_is_positive(dentry)) { -+#ifdef CONFIG_PREEMPT_RT_BASE -+ down(&NFS_I(d_inode(dentry))->rmdir_sem); -+#else - down_write(&NFS_I(d_inode(dentry))->rmdir_sem); -+#endif - error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); - /* Ensure the VFS deletes this inode */ - switch (error) { -@@ -1825,7 +1829,11 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry) - case -ENOENT: - nfs_dentry_handle_enoent(dentry); - } -+#ifdef CONFIG_PREEMPT_RT_BASE -+ up(&NFS_I(d_inode(dentry))->rmdir_sem); -+#else - up_write(&NFS_I(d_inode(dentry))->rmdir_sem); -+#endif - } else - error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); - trace_nfs_rmdir_exit(dir, dentry, error); -diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c -index e4cd3a2fe698..6f22c8d65760 100644 ---- a/fs/nfs/inode.c -+++ b/fs/nfs/inode.c -@@ -2104,7 +2104,11 @@ static void init_once(void *foo) - atomic_long_set(&nfsi->nrequests, 0); - atomic_long_set(&nfsi->commit_info.ncommit, 0); - atomic_set(&nfsi->commit_info.rpcs_out, 0); -+#ifdef CONFIG_PREEMPT_RT_BASE -+ sema_init(&nfsi->rmdir_sem, 1); -+#else - init_rwsem(&nfsi->rmdir_sem); -+#endif - mutex_init(&nfsi->commit_mutex); - nfs4_init_once(nfsi); - } -diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c -index fd61bf0fce63..ce9100b5604d 100644 ---- a/fs/nfs/unlink.c -+++ b/fs/nfs/unlink.c -@@ -52,6 +52,29 @@ static void nfs_async_unlink_done(struct rpc_task *task, void *calldata) - rpc_restart_call_prepare(task); - } - -+#ifdef CONFIG_PREEMPT_RT_BASE -+static void nfs_down_anon(struct semaphore *sema) -+{ -+ down(sema); -+} -+ -+static void nfs_up_anon(struct semaphore *sema) -+{ -+ up(sema); -+} -+ -+#else -+static void nfs_down_anon(struct rw_semaphore *rwsem) -+{ -+ down_read_non_owner(rwsem); -+} -+ -+static void nfs_up_anon(struct rw_semaphore *rwsem) -+{ -+ up_read_non_owner(rwsem); -+} -+#endif -+ - /** - * nfs_async_unlink_release - Release the sillydelete data. - * @task: rpc_task of the sillydelete -@@ -65,7 +88,7 @@ static void nfs_async_unlink_release(void *calldata) - struct dentry *dentry = data->dentry; - struct super_block *sb = dentry->d_sb; - -- up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); -+ nfs_up_anon(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem); - d_lookup_done(dentry); - nfs_free_unlinkdata(data); - dput(dentry); -@@ -118,10 +141,10 @@ static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nf - struct inode *dir = d_inode(dentry->d_parent); - struct dentry *alias; - -- down_read_non_owner(&NFS_I(dir)->rmdir_sem); -+ nfs_down_anon(&NFS_I(dir)->rmdir_sem); - alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq); - if (IS_ERR(alias)) { -- up_read_non_owner(&NFS_I(dir)->rmdir_sem); -+ nfs_up_anon(&NFS_I(dir)->rmdir_sem); - return 0; - } - if (!d_in_lookup(alias)) { -@@ -143,7 +166,7 @@ static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nf - ret = 0; - spin_unlock(&alias->d_lock); - dput(alias); -- up_read_non_owner(&NFS_I(dir)->rmdir_sem); -+ nfs_up_anon(&NFS_I(dir)->rmdir_sem); - /* - * If we'd displaced old cached devname, free it. At that - * point dentry is definitely not a root, so we won't need -diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h -index a0831e9d19c9..94b6fefd90b0 100644 ---- a/include/linux/nfs_fs.h -+++ b/include/linux/nfs_fs.h -@@ -163,7 +163,11 @@ struct nfs_inode { - - /* Readers: in-flight sillydelete RPC calls */ - /* Writers: rmdir */ -+#ifdef CONFIG_PREEMPT_RT_BASE -+ struct semaphore rmdir_sem; -+#else - struct rw_semaphore rmdir_sem; -+#endif - struct mutex commit_mutex; - - #if IS_ENABLED(CONFIG_NFS_V4) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0129-rtmutex-Handle-the-various-new-futex-race-conditions.patch linux-4.19.118/debian/patches-rt/0129-rtmutex-Handle-the-various-new-futex-race-conditions.patch --- linux-4.19.98/debian/patches-rt/0129-rtmutex-Handle-the-various-new-futex-race-conditions.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0129-rtmutex-Handle-the-various-new-futex-race-conditions.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,255 @@ +From 1fa5c17a8433d8aa590a042209a3f2211ec87663 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 10 Jun 2011 11:04:15 +0200 +Subject: [PATCH 129/325] rtmutex: Handle the various new futex race conditions +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +RT opens a few new interesting race conditions in the rtmutex/futex +combo due to futex hash bucket lock being a 'sleeping' spinlock and +therefor not disabling preemption. + +Signed-off-by: Thomas Gleixner +--- + kernel/futex.c | 77 ++++++++++++++++++++++++++------- + kernel/locking/rtmutex.c | 36 ++++++++++++--- + kernel/locking/rtmutex_common.h | 2 + + 3 files changed, 94 insertions(+), 21 deletions(-) + +diff --git a/kernel/futex.c b/kernel/futex.c +index a8081f82579e..c922e994f524 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -2166,6 +2166,16 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + requeue_pi_wake_futex(this, &key2, hb2); + drop_count++; + continue; ++ } else if (ret == -EAGAIN) { ++ /* ++ * Waiter was woken by timeout or ++ * signal and has set pi_blocked_on to ++ * PI_WAKEUP_INPROGRESS before we ++ * tried to enqueue it on the rtmutex. ++ */ ++ this->pi_state = NULL; ++ put_pi_state(pi_state); ++ continue; + } else if (ret) { + /* + * rt_mutex_start_proxy_lock() detected a +@@ -3244,7 +3254,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + struct hrtimer_sleeper timeout, *to = NULL; + struct futex_pi_state *pi_state = NULL; + struct rt_mutex_waiter rt_waiter; +- struct futex_hash_bucket *hb; ++ struct futex_hash_bucket *hb, *hb2; + union futex_key key2 = FUTEX_KEY_INIT; + struct futex_q q = futex_q_init; + int res, ret; +@@ -3302,20 +3312,55 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + /* Queue the futex_q, drop the hb lock, wait for wakeup. */ + futex_wait_queue_me(hb, &q, to); + +- spin_lock(&hb->lock); +- ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); +- spin_unlock(&hb->lock); +- if (ret) +- goto out_put_keys; ++ /* ++ * On RT we must avoid races with requeue and trying to block ++ * on two mutexes (hb->lock and uaddr2's rtmutex) by ++ * serializing access to pi_blocked_on with pi_lock. ++ */ ++ raw_spin_lock_irq(¤t->pi_lock); ++ if (current->pi_blocked_on) { ++ /* ++ * We have been requeued or are in the process of ++ * being requeued. ++ */ ++ raw_spin_unlock_irq(¤t->pi_lock); ++ } else { ++ /* ++ * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS ++ * prevents a concurrent requeue from moving us to the ++ * uaddr2 rtmutex. After that we can safely acquire ++ * (and possibly block on) hb->lock. ++ */ ++ current->pi_blocked_on = PI_WAKEUP_INPROGRESS; ++ raw_spin_unlock_irq(¤t->pi_lock); ++ ++ spin_lock(&hb->lock); ++ ++ /* ++ * Clean up pi_blocked_on. We might leak it otherwise ++ * when we succeeded with the hb->lock in the fast ++ * path. ++ */ ++ raw_spin_lock_irq(¤t->pi_lock); ++ current->pi_blocked_on = NULL; ++ raw_spin_unlock_irq(¤t->pi_lock); ++ ++ ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); ++ spin_unlock(&hb->lock); ++ if (ret) ++ goto out_put_keys; ++ } + + /* +- * In order for us to be here, we know our q.key == key2, and since +- * we took the hb->lock above, we also know that futex_requeue() has +- * completed and we no longer have to concern ourselves with a wakeup +- * race with the atomic proxy lock acquisition by the requeue code. The +- * futex_requeue dropped our key1 reference and incremented our key2 +- * reference count. ++ * In order to be here, we have either been requeued, are in ++ * the process of being requeued, or requeue successfully ++ * acquired uaddr2 on our behalf. If pi_blocked_on was ++ * non-null above, we may be racing with a requeue. Do not ++ * rely on q->lock_ptr to be hb2->lock until after blocking on ++ * hb->lock or hb2->lock. The futex_requeue dropped our key1 ++ * reference and incremented our key2 reference count. + */ ++ hb2 = hash_futex(&key2); + + /* Check if the requeue code acquired the second futex for us. */ + if (!q.rt_waiter) { +@@ -3324,7 +3369,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * did a lock-steal - fix up the PI-state in that case. + */ + if (q.pi_state && (q.pi_state->owner != current)) { +- spin_lock(q.lock_ptr); ++ spin_lock(&hb2->lock); ++ BUG_ON(&hb2->lock != q.lock_ptr); + ret = fixup_pi_state_owner(uaddr2, &q, current); + if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { + pi_state = q.pi_state; +@@ -3335,7 +3381,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * the requeue_pi() code acquired for us. + */ + put_pi_state(q.pi_state); +- spin_unlock(q.lock_ptr); ++ spin_unlock(&hb2->lock); + } + } else { + struct rt_mutex *pi_mutex; +@@ -3349,7 +3395,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + pi_mutex = &q.pi_state->pi_mutex; + ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); + +- spin_lock(q.lock_ptr); ++ spin_lock(&hb2->lock); ++ BUG_ON(&hb2->lock != q.lock_ptr); + if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) + ret = 0; + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 72abe7c121fa..71d161c93b98 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -135,6 +135,11 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) + WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); + } + ++static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) ++{ ++ return waiter && waiter != PI_WAKEUP_INPROGRESS; ++} ++ + /* + * We can speed up the acquire/release, if there's no debugging state to be + * set up. +@@ -379,7 +384,8 @@ int max_lock_depth = 1024; + + static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) + { +- return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; ++ return rt_mutex_real_waiter(p->pi_blocked_on) ? ++ p->pi_blocked_on->lock : NULL; + } + + /* +@@ -515,7 +521,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * reached or the state of the chain has changed while we + * dropped the locks. + */ +- if (!waiter) ++ if (!rt_mutex_real_waiter(waiter)) + goto out_unlock_pi; + + /* +@@ -951,6 +957,22 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + return -EDEADLK; + + raw_spin_lock(&task->pi_lock); ++ /* ++ * In the case of futex requeue PI, this will be a proxy ++ * lock. The task will wake unaware that it is enqueueed on ++ * this lock. Avoid blocking on two locks and corrupting ++ * pi_blocked_on via the PI_WAKEUP_INPROGRESS ++ * flag. futex_wait_requeue_pi() sets this when it wakes up ++ * before requeue (due to a signal or timeout). Do not enqueue ++ * the task if PI_WAKEUP_INPROGRESS is set. ++ */ ++ if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { ++ raw_spin_unlock(&task->pi_lock); ++ return -EAGAIN; ++ } ++ ++ BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); ++ + waiter->task = task; + waiter->lock = lock; + waiter->prio = task->prio; +@@ -974,7 +996,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + rt_mutex_enqueue_pi(owner, waiter); + + rt_mutex_adjust_prio(owner); +- if (owner->pi_blocked_on) ++ if (rt_mutex_real_waiter(owner->pi_blocked_on)) + chain_walk = 1; + } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { + chain_walk = 1; +@@ -1070,7 +1092,7 @@ static void remove_waiter(struct rt_mutex *lock, + { + bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); + struct task_struct *owner = rt_mutex_owner(lock); +- struct rt_mutex *next_lock; ++ struct rt_mutex *next_lock = NULL; + + lockdep_assert_held(&lock->wait_lock); + +@@ -1096,7 +1118,8 @@ static void remove_waiter(struct rt_mutex *lock, + rt_mutex_adjust_prio(owner); + + /* Store the lock on which owner is blocked or NULL */ +- next_lock = task_blocked_on_lock(owner); ++ if (rt_mutex_real_waiter(owner->pi_blocked_on)) ++ next_lock = task_blocked_on_lock(owner); + + raw_spin_unlock(&owner->pi_lock); + +@@ -1132,7 +1155,8 @@ void rt_mutex_adjust_pi(struct task_struct *task) + raw_spin_lock_irqsave(&task->pi_lock, flags); + + waiter = task->pi_blocked_on; +- if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { ++ if (!rt_mutex_real_waiter(waiter) || ++ rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { + raw_spin_unlock_irqrestore(&task->pi_lock, flags); + return; + } +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index d1d62f942be2..f4b6596d224a 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -130,6 +130,8 @@ enum rtmutex_chainwalk { + /* + * PI-futex support (proxy locking functions, etc.): + */ ++#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) ++ + extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); + extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, + struct task_struct *proxy_owner); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0130-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch linux-4.19.118/debian/patches-rt/0130-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch --- linux-4.19.98/debian/patches-rt/0130-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0130-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,121 @@ +From 4210e8e1f78fc819dfe27d2918ff33b0f5f6d0df Mon Sep 17 00:00:00 2001 +From: Steven Rostedt +Date: Tue, 14 Jul 2015 14:26:34 +0200 +Subject: [PATCH 130/325] futex: Fix bug on when a requeued RT task times out +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Requeue with timeout causes a bug with PREEMPT_RT_FULL. + +The bug comes from a timed out condition. + + + TASK 1 TASK 2 + ------ ------ + futex_wait_requeue_pi() + futex_wait_queue_me() + + + double_lock_hb(); + + raw_spin_lock(pi_lock); + if (current->pi_blocked_on) { + } else { + current->pi_blocked_on = PI_WAKE_INPROGRESS; + run_spin_unlock(pi_lock); + spin_lock(hb->lock); <-- blocked! + + + plist_for_each_entry_safe(this) { + rt_mutex_start_proxy_lock(); + task_blocks_on_rt_mutex(); + BUG_ON(task->pi_blocked_on)!!!! + +The BUG_ON() actually has a check for PI_WAKE_INPROGRESS, but the +problem is that, after TASK 1 sets PI_WAKE_INPROGRESS, it then tries to +grab the hb->lock, which it fails to do so. As the hb->lock is a mutex, +it will block and set the "pi_blocked_on" to the hb->lock. + +When TASK 2 goes to requeue it, the check for PI_WAKE_INPROGESS fails +because the task1's pi_blocked_on is no longer set to that, but instead, +set to the hb->lock. + +The fix: + +When calling rt_mutex_start_proxy_lock() a check is made to see +if the proxy tasks pi_blocked_on is set. If so, exit out early. +Otherwise set it to a new flag PI_REQUEUE_INPROGRESS, which notifies +the proxy task that it is being requeued, and will handle things +appropriately. + + +Signed-off-by: Steven Rostedt +Signed-off-by: Thomas Gleixner +--- + kernel/locking/rtmutex.c | 31 ++++++++++++++++++++++++++++++- + kernel/locking/rtmutex_common.h | 1 + + 2 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 71d161c93b98..1c3f56d3d9b6 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -137,7 +137,8 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) + + static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) + { +- return waiter && waiter != PI_WAKEUP_INPROGRESS; ++ return waiter && waiter != PI_WAKEUP_INPROGRESS && ++ waiter != PI_REQUEUE_INPROGRESS; + } + + /* +@@ -1784,6 +1785,34 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + if (try_to_take_rt_mutex(lock, task, NULL)) + return 1; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ /* ++ * In PREEMPT_RT there's an added race. ++ * If the task, that we are about to requeue, times out, ++ * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue ++ * to skip this task. But right after the task sets ++ * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then ++ * block on the spin_lock(&hb->lock), which in RT is an rtmutex. ++ * This will replace the PI_WAKEUP_INPROGRESS with the actual ++ * lock that it blocks on. We *must not* place this task ++ * on this proxy lock in that case. ++ * ++ * To prevent this race, we first take the task's pi_lock ++ * and check if it has updated its pi_blocked_on. If it has, ++ * we assume that it woke up and we return -EAGAIN. ++ * Otherwise, we set the task's pi_blocked_on to ++ * PI_REQUEUE_INPROGRESS, so that if the task is waking up ++ * it will know that we are in the process of requeuing it. ++ */ ++ raw_spin_lock(&task->pi_lock); ++ if (task->pi_blocked_on) { ++ raw_spin_unlock(&task->pi_lock); ++ return -EAGAIN; ++ } ++ task->pi_blocked_on = PI_REQUEUE_INPROGRESS; ++ raw_spin_unlock(&task->pi_lock); ++#endif ++ + /* We enforce deadlock detection for futexes */ + ret = task_blocks_on_rt_mutex(lock, waiter, task, + RT_MUTEX_FULL_CHAINWALK); +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index f4b6596d224a..461527f3f7af 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -131,6 +131,7 @@ enum rtmutex_chainwalk { + * PI-futex support (proxy locking functions, etc.): + */ + #define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) ++#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) + + extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); + extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0130-rtmutex-Handle-the-various-new-futex-race-conditions.patch linux-4.19.118/debian/patches-rt/0130-rtmutex-Handle-the-various-new-futex-race-conditions.patch --- linux-4.19.98/debian/patches-rt/0130-rtmutex-Handle-the-various-new-futex-race-conditions.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0130-rtmutex-Handle-the-various-new-futex-race-conditions.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,255 +0,0 @@ -From ad0da5a36ccd4cb2f3a320244327b586e3c435c3 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 10 Jun 2011 11:04:15 +0200 -Subject: [PATCH 130/290] rtmutex: Handle the various new futex race conditions -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -RT opens a few new interesting race conditions in the rtmutex/futex -combo due to futex hash bucket lock being a 'sleeping' spinlock and -therefor not disabling preemption. - -Signed-off-by: Thomas Gleixner ---- - kernel/futex.c | 77 ++++++++++++++++++++++++++------- - kernel/locking/rtmutex.c | 36 ++++++++++++--- - kernel/locking/rtmutex_common.h | 2 + - 3 files changed, 94 insertions(+), 21 deletions(-) - -diff --git a/kernel/futex.c b/kernel/futex.c -index 23e1f8a478e8..5ec49f862c53 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -2149,6 +2149,16 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, - requeue_pi_wake_futex(this, &key2, hb2); - drop_count++; - continue; -+ } else if (ret == -EAGAIN) { -+ /* -+ * Waiter was woken by timeout or -+ * signal and has set pi_blocked_on to -+ * PI_WAKEUP_INPROGRESS before we -+ * tried to enqueue it on the rtmutex. -+ */ -+ this->pi_state = NULL; -+ put_pi_state(pi_state); -+ continue; - } else if (ret) { - /* - * rt_mutex_start_proxy_lock() detected a -@@ -3227,7 +3237,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - struct hrtimer_sleeper timeout, *to = NULL; - struct futex_pi_state *pi_state = NULL; - struct rt_mutex_waiter rt_waiter; -- struct futex_hash_bucket *hb; -+ struct futex_hash_bucket *hb, *hb2; - union futex_key key2 = FUTEX_KEY_INIT; - struct futex_q q = futex_q_init; - int res, ret; -@@ -3285,20 +3295,55 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - /* Queue the futex_q, drop the hb lock, wait for wakeup. */ - futex_wait_queue_me(hb, &q, to); - -- spin_lock(&hb->lock); -- ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); -- spin_unlock(&hb->lock); -- if (ret) -- goto out_put_keys; -+ /* -+ * On RT we must avoid races with requeue and trying to block -+ * on two mutexes (hb->lock and uaddr2's rtmutex) by -+ * serializing access to pi_blocked_on with pi_lock. -+ */ -+ raw_spin_lock_irq(¤t->pi_lock); -+ if (current->pi_blocked_on) { -+ /* -+ * We have been requeued or are in the process of -+ * being requeued. -+ */ -+ raw_spin_unlock_irq(¤t->pi_lock); -+ } else { -+ /* -+ * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS -+ * prevents a concurrent requeue from moving us to the -+ * uaddr2 rtmutex. After that we can safely acquire -+ * (and possibly block on) hb->lock. -+ */ -+ current->pi_blocked_on = PI_WAKEUP_INPROGRESS; -+ raw_spin_unlock_irq(¤t->pi_lock); -+ -+ spin_lock(&hb->lock); -+ -+ /* -+ * Clean up pi_blocked_on. We might leak it otherwise -+ * when we succeeded with the hb->lock in the fast -+ * path. -+ */ -+ raw_spin_lock_irq(¤t->pi_lock); -+ current->pi_blocked_on = NULL; -+ raw_spin_unlock_irq(¤t->pi_lock); -+ -+ ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); -+ spin_unlock(&hb->lock); -+ if (ret) -+ goto out_put_keys; -+ } - - /* -- * In order for us to be here, we know our q.key == key2, and since -- * we took the hb->lock above, we also know that futex_requeue() has -- * completed and we no longer have to concern ourselves with a wakeup -- * race with the atomic proxy lock acquisition by the requeue code. The -- * futex_requeue dropped our key1 reference and incremented our key2 -- * reference count. -+ * In order to be here, we have either been requeued, are in -+ * the process of being requeued, or requeue successfully -+ * acquired uaddr2 on our behalf. If pi_blocked_on was -+ * non-null above, we may be racing with a requeue. Do not -+ * rely on q->lock_ptr to be hb2->lock until after blocking on -+ * hb->lock or hb2->lock. The futex_requeue dropped our key1 -+ * reference and incremented our key2 reference count. - */ -+ hb2 = hash_futex(&key2); - - /* Check if the requeue code acquired the second futex for us. */ - if (!q.rt_waiter) { -@@ -3307,7 +3352,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * did a lock-steal - fix up the PI-state in that case. - */ - if (q.pi_state && (q.pi_state->owner != current)) { -- spin_lock(q.lock_ptr); -+ spin_lock(&hb2->lock); -+ BUG_ON(&hb2->lock != q.lock_ptr); - ret = fixup_pi_state_owner(uaddr2, &q, current); - if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { - pi_state = q.pi_state; -@@ -3318,7 +3364,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * the requeue_pi() code acquired for us. - */ - put_pi_state(q.pi_state); -- spin_unlock(q.lock_ptr); -+ spin_unlock(&hb2->lock); - } - } else { - struct rt_mutex *pi_mutex; -@@ -3332,7 +3378,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - pi_mutex = &q.pi_state->pi_mutex; - ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); - -- spin_lock(q.lock_ptr); -+ spin_lock(&hb2->lock); -+ BUG_ON(&hb2->lock != q.lock_ptr); - if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) - ret = 0; - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 72abe7c121fa..71d161c93b98 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -135,6 +135,11 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) - WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); - } - -+static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) -+{ -+ return waiter && waiter != PI_WAKEUP_INPROGRESS; -+} -+ - /* - * We can speed up the acquire/release, if there's no debugging state to be - * set up. -@@ -379,7 +384,8 @@ int max_lock_depth = 1024; - - static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) - { -- return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; -+ return rt_mutex_real_waiter(p->pi_blocked_on) ? -+ p->pi_blocked_on->lock : NULL; - } - - /* -@@ -515,7 +521,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, - * reached or the state of the chain has changed while we - * dropped the locks. - */ -- if (!waiter) -+ if (!rt_mutex_real_waiter(waiter)) - goto out_unlock_pi; - - /* -@@ -951,6 +957,22 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, - return -EDEADLK; - - raw_spin_lock(&task->pi_lock); -+ /* -+ * In the case of futex requeue PI, this will be a proxy -+ * lock. The task will wake unaware that it is enqueueed on -+ * this lock. Avoid blocking on two locks and corrupting -+ * pi_blocked_on via the PI_WAKEUP_INPROGRESS -+ * flag. futex_wait_requeue_pi() sets this when it wakes up -+ * before requeue (due to a signal or timeout). Do not enqueue -+ * the task if PI_WAKEUP_INPROGRESS is set. -+ */ -+ if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { -+ raw_spin_unlock(&task->pi_lock); -+ return -EAGAIN; -+ } -+ -+ BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); -+ - waiter->task = task; - waiter->lock = lock; - waiter->prio = task->prio; -@@ -974,7 +996,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, - rt_mutex_enqueue_pi(owner, waiter); - - rt_mutex_adjust_prio(owner); -- if (owner->pi_blocked_on) -+ if (rt_mutex_real_waiter(owner->pi_blocked_on)) - chain_walk = 1; - } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { - chain_walk = 1; -@@ -1070,7 +1092,7 @@ static void remove_waiter(struct rt_mutex *lock, - { - bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); - struct task_struct *owner = rt_mutex_owner(lock); -- struct rt_mutex *next_lock; -+ struct rt_mutex *next_lock = NULL; - - lockdep_assert_held(&lock->wait_lock); - -@@ -1096,7 +1118,8 @@ static void remove_waiter(struct rt_mutex *lock, - rt_mutex_adjust_prio(owner); - - /* Store the lock on which owner is blocked or NULL */ -- next_lock = task_blocked_on_lock(owner); -+ if (rt_mutex_real_waiter(owner->pi_blocked_on)) -+ next_lock = task_blocked_on_lock(owner); - - raw_spin_unlock(&owner->pi_lock); - -@@ -1132,7 +1155,8 @@ void rt_mutex_adjust_pi(struct task_struct *task) - raw_spin_lock_irqsave(&task->pi_lock, flags); - - waiter = task->pi_blocked_on; -- if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { -+ if (!rt_mutex_real_waiter(waiter) || -+ rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { - raw_spin_unlock_irqrestore(&task->pi_lock, flags); - return; - } -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index d1d62f942be2..f4b6596d224a 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -130,6 +130,8 @@ enum rtmutex_chainwalk { - /* - * PI-futex support (proxy locking functions, etc.): - */ -+#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) -+ - extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); - extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, - struct task_struct *proxy_owner); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0131-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch linux-4.19.118/debian/patches-rt/0131-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch --- linux-4.19.98/debian/patches-rt/0131-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0131-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,50 @@ +From ceb4c8f4c8a3887cc786895ea767fa9ad43b2959 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 1 Mar 2013 11:17:42 +0100 +Subject: [PATCH 131/325] futex: Ensure lock/unlock symetry versus pi_lock and + hash bucket lock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In exit_pi_state_list() we have the following locking construct: + + spin_lock(&hb->lock); + raw_spin_lock_irq(&curr->pi_lock); + + ... + spin_unlock(&hb->lock); + +In !RT this works, but on RT the migrate_enable() function which is +called from spin_unlock() sees atomic context due to the held pi_lock +and just decrements the migrate_disable_atomic counter of the +task. Now the next call to migrate_disable() sees the counter being +negative and issues a warning. That check should be in +migrate_enable() already. + +Fix this by dropping pi_lock before unlocking hb->lock and reaquire +pi_lock after that again. This is safe as the loop code reevaluates +head again under the pi_lock. + +Reported-by: Yong Zhang +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/futex.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/kernel/futex.c b/kernel/futex.c +index c922e994f524..cde7ff6f9a48 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -938,7 +938,9 @@ void exit_pi_state_list(struct task_struct *curr) + if (head->next != next) { + /* retain curr->pi_lock for the loop invariant */ + raw_spin_unlock(&pi_state->pi_mutex.wait_lock); ++ raw_spin_unlock_irq(&curr->pi_lock); + spin_unlock(&hb->lock); ++ raw_spin_lock_irq(&curr->pi_lock); + put_pi_state(pi_state); + continue; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0131-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch linux-4.19.118/debian/patches-rt/0131-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch --- linux-4.19.98/debian/patches-rt/0131-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0131-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -From 7edf91c5189d3b406d53b139fd703354cc43dd16 Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: [PATCH 131/290] futex: Fix bug on when a requeued RT task times out -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Requeue with timeout causes a bug with PREEMPT_RT_FULL. - -The bug comes from a timed out condition. - - - TASK 1 TASK 2 - ------ ------ - futex_wait_requeue_pi() - futex_wait_queue_me() - - - double_lock_hb(); - - raw_spin_lock(pi_lock); - if (current->pi_blocked_on) { - } else { - current->pi_blocked_on = PI_WAKE_INPROGRESS; - run_spin_unlock(pi_lock); - spin_lock(hb->lock); <-- blocked! - - - plist_for_each_entry_safe(this) { - rt_mutex_start_proxy_lock(); - task_blocks_on_rt_mutex(); - BUG_ON(task->pi_blocked_on)!!!! - -The BUG_ON() actually has a check for PI_WAKE_INPROGRESS, but the -problem is that, after TASK 1 sets PI_WAKE_INPROGRESS, it then tries to -grab the hb->lock, which it fails to do so. As the hb->lock is a mutex, -it will block and set the "pi_blocked_on" to the hb->lock. - -When TASK 2 goes to requeue it, the check for PI_WAKE_INPROGESS fails -because the task1's pi_blocked_on is no longer set to that, but instead, -set to the hb->lock. - -The fix: - -When calling rt_mutex_start_proxy_lock() a check is made to see -if the proxy tasks pi_blocked_on is set. If so, exit out early. -Otherwise set it to a new flag PI_REQUEUE_INPROGRESS, which notifies -the proxy task that it is being requeued, and will handle things -appropriately. - - -Signed-off-by: Steven Rostedt -Signed-off-by: Thomas Gleixner ---- - kernel/locking/rtmutex.c | 31 ++++++++++++++++++++++++++++++- - kernel/locking/rtmutex_common.h | 1 + - 2 files changed, 31 insertions(+), 1 deletion(-) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 71d161c93b98..1c3f56d3d9b6 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -137,7 +137,8 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) - - static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) - { -- return waiter && waiter != PI_WAKEUP_INPROGRESS; -+ return waiter && waiter != PI_WAKEUP_INPROGRESS && -+ waiter != PI_REQUEUE_INPROGRESS; - } - - /* -@@ -1784,6 +1785,34 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, - if (try_to_take_rt_mutex(lock, task, NULL)) - return 1; - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ /* -+ * In PREEMPT_RT there's an added race. -+ * If the task, that we are about to requeue, times out, -+ * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue -+ * to skip this task. But right after the task sets -+ * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then -+ * block on the spin_lock(&hb->lock), which in RT is an rtmutex. -+ * This will replace the PI_WAKEUP_INPROGRESS with the actual -+ * lock that it blocks on. We *must not* place this task -+ * on this proxy lock in that case. -+ * -+ * To prevent this race, we first take the task's pi_lock -+ * and check if it has updated its pi_blocked_on. If it has, -+ * we assume that it woke up and we return -EAGAIN. -+ * Otherwise, we set the task's pi_blocked_on to -+ * PI_REQUEUE_INPROGRESS, so that if the task is waking up -+ * it will know that we are in the process of requeuing it. -+ */ -+ raw_spin_lock(&task->pi_lock); -+ if (task->pi_blocked_on) { -+ raw_spin_unlock(&task->pi_lock); -+ return -EAGAIN; -+ } -+ task->pi_blocked_on = PI_REQUEUE_INPROGRESS; -+ raw_spin_unlock(&task->pi_lock); -+#endif -+ - /* We enforce deadlock detection for futexes */ - ret = task_blocks_on_rt_mutex(lock, waiter, task, - RT_MUTEX_FULL_CHAINWALK); -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index f4b6596d224a..461527f3f7af 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -131,6 +131,7 @@ enum rtmutex_chainwalk { - * PI-futex support (proxy locking functions, etc.): - */ - #define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) -+#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) - - extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); - extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0132-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch linux-4.19.118/debian/patches-rt/0132-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch --- linux-4.19.98/debian/patches-rt/0132-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0132-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -From 6a2f8ae29dd9f3697e918a18a871efdaa4d919d9 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 1 Mar 2013 11:17:42 +0100 -Subject: [PATCH 132/290] futex: Ensure lock/unlock symetry versus pi_lock and - hash bucket lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In exit_pi_state_list() we have the following locking construct: - - spin_lock(&hb->lock); - raw_spin_lock_irq(&curr->pi_lock); - - ... - spin_unlock(&hb->lock); - -In !RT this works, but on RT the migrate_enable() function which is -called from spin_unlock() sees atomic context due to the held pi_lock -and just decrements the migrate_disable_atomic counter of the -task. Now the next call to migrate_disable() sees the counter being -negative and issues a warning. That check should be in -migrate_enable() already. - -Fix this by dropping pi_lock before unlocking hb->lock and reaquire -pi_lock after that again. This is safe as the loop code reevaluates -head again under the pi_lock. - -Reported-by: Yong Zhang -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/futex.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/kernel/futex.c b/kernel/futex.c -index 5ec49f862c53..60be4530c767 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -921,7 +921,9 @@ void exit_pi_state_list(struct task_struct *curr) - if (head->next != next) { - /* retain curr->pi_lock for the loop invariant */ - raw_spin_unlock(&pi_state->pi_mutex.wait_lock); -+ raw_spin_unlock_irq(&curr->pi_lock); - spin_unlock(&hb->lock); -+ raw_spin_lock_irq(&curr->pi_lock); - put_pi_state(pi_state); - continue; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0132-pid.h-include-atomic.h.patch linux-4.19.118/debian/patches-rt/0132-pid.h-include-atomic.h.patch --- linux-4.19.98/debian/patches-rt/0132-pid.h-include-atomic.h.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0132-pid.h-include-atomic.h.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,43 @@ +From a3a3d3d03bfe53c007e888ee891dbd703972d1ea Mon Sep 17 00:00:00 2001 +From: Grygorii Strashko +Date: Tue, 21 Jul 2015 19:43:56 +0300 +Subject: [PATCH 132/325] pid.h: include atomic.h +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +This patch fixes build error: + CC kernel/pid_namespace.o +In file included from kernel/pid_namespace.c:11:0: +include/linux/pid.h: In function 'get_pid': +include/linux/pid.h:78:3: error: implicit declaration of function 'atomic_inc' [-Werror=implicit-function-declaration] + atomic_inc(&pid->count); + ^ +which happens when + CONFIG_PROVE_LOCKING=n + CONFIG_DEBUG_SPINLOCK=n + CONFIG_DEBUG_MUTEXES=n + CONFIG_DEBUG_LOCK_ALLOC=n + CONFIG_PID_NS=y + +Vanilla gets this via spinlock.h. + +Signed-off-by: Grygorii Strashko +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/pid.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/include/linux/pid.h b/include/linux/pid.h +index 14a9a39da9c7..a9026a5da196 100644 +--- a/include/linux/pid.h ++++ b/include/linux/pid.h +@@ -3,6 +3,7 @@ + #define _LINUX_PID_H + + #include ++#include + + enum pid_type + { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0133-arm-include-definition-for-cpumask_t.patch linux-4.19.118/debian/patches-rt/0133-arm-include-definition-for-cpumask_t.patch --- linux-4.19.98/debian/patches-rt/0133-arm-include-definition-for-cpumask_t.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0133-arm-include-definition-for-cpumask_t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,31 @@ +From 1fc05f4412c1b09b10d06886933ba1ccd0e18f33 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 22 Dec 2016 17:28:33 +0100 +Subject: [PATCH 133/325] arm: include definition for cpumask_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +This definition gets pulled in by other files. With the (later) split of +RCU and spinlock.h it won't compile anymore. +The split is done in ("rbtree: don't include the rcu header"). + +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/arm/include/asm/irq.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h +index 46d41140df27..c421b5b81946 100644 +--- a/arch/arm/include/asm/irq.h ++++ b/arch/arm/include/asm/irq.h +@@ -23,6 +23,8 @@ + #endif + + #ifndef __ASSEMBLY__ ++#include ++ + struct irqaction; + struct pt_regs; + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0133-pid.h-include-atomic.h.patch linux-4.19.118/debian/patches-rt/0133-pid.h-include-atomic.h.patch --- linux-4.19.98/debian/patches-rt/0133-pid.h-include-atomic.h.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0133-pid.h-include-atomic.h.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -From 5e16582aa3ade481ac6b23ffe90016f2d285f18a Mon Sep 17 00:00:00 2001 -From: Grygorii Strashko -Date: Tue, 21 Jul 2015 19:43:56 +0300 -Subject: [PATCH 133/290] pid.h: include atomic.h -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -This patch fixes build error: - CC kernel/pid_namespace.o -In file included from kernel/pid_namespace.c:11:0: -include/linux/pid.h: In function 'get_pid': -include/linux/pid.h:78:3: error: implicit declaration of function 'atomic_inc' [-Werror=implicit-function-declaration] - atomic_inc(&pid->count); - ^ -which happens when - CONFIG_PROVE_LOCKING=n - CONFIG_DEBUG_SPINLOCK=n - CONFIG_DEBUG_MUTEXES=n - CONFIG_DEBUG_LOCK_ALLOC=n - CONFIG_PID_NS=y - -Vanilla gets this via spinlock.h. - -Signed-off-by: Grygorii Strashko -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/pid.h | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/include/linux/pid.h b/include/linux/pid.h -index 14a9a39da9c7..a9026a5da196 100644 ---- a/include/linux/pid.h -+++ b/include/linux/pid.h -@@ -3,6 +3,7 @@ - #define _LINUX_PID_H - - #include -+#include - - enum pid_type - { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0134-arm-include-definition-for-cpumask_t.patch linux-4.19.118/debian/patches-rt/0134-arm-include-definition-for-cpumask_t.patch --- linux-4.19.98/debian/patches-rt/0134-arm-include-definition-for-cpumask_t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0134-arm-include-definition-for-cpumask_t.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -From e104dba071027b30e97bc63e57da11ad26516141 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 22 Dec 2016 17:28:33 +0100 -Subject: [PATCH 134/290] arm: include definition for cpumask_t -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -This definition gets pulled in by other files. With the (later) split of -RCU and spinlock.h it won't compile anymore. -The split is done in ("rbtree: don't include the rcu header"). - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm/include/asm/irq.h | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h -index 46d41140df27..c421b5b81946 100644 ---- a/arch/arm/include/asm/irq.h -+++ b/arch/arm/include/asm/irq.h -@@ -23,6 +23,8 @@ - #endif - - #ifndef __ASSEMBLY__ -+#include -+ - struct irqaction; - struct pt_regs; - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0134-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch linux-4.19.118/debian/patches-rt/0134-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch --- linux-4.19.98/debian/patches-rt/0134-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0134-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,34 @@ +From 1814e9a2c2092f55d4e2fa99192af5eff0c364f3 Mon Sep 17 00:00:00 2001 +From: "Wolfgang M. Reimer" +Date: Tue, 21 Jul 2015 16:20:07 +0200 +Subject: [PATCH 134/325] locking: locktorture: Do NOT include rwlock.h + directly +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Including rwlock.h directly will cause kernel builds to fail +if CONFIG_PREEMPT_RT_FULL is defined. The correct header file +(rwlock_rt.h OR rwlock.h) will be included by spinlock.h which +is included by locktorture.c anyway. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Wolfgang M. Reimer +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/locktorture.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c +index 7d0b0ed74404..a81e6ef33a04 100644 +--- a/kernel/locking/locktorture.c ++++ b/kernel/locking/locktorture.c +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + #include + #include + #include +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0135-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch linux-4.19.118/debian/patches-rt/0135-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch --- linux-4.19.98/debian/patches-rt/0135-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0135-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -From 002db8d9c11d02194c1e281091b8b577b9f36014 Mon Sep 17 00:00:00 2001 -From: "Wolfgang M. Reimer" -Date: Tue, 21 Jul 2015 16:20:07 +0200 -Subject: [PATCH 135/290] locking: locktorture: Do NOT include rwlock.h - directly -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Including rwlock.h directly will cause kernel builds to fail -if CONFIG_PREEMPT_RT_FULL is defined. The correct header file -(rwlock_rt.h OR rwlock.h) will be included by spinlock.h which -is included by locktorture.c anyway. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Wolfgang M. Reimer -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/locktorture.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c -index 7d0b0ed74404..a81e6ef33a04 100644 ---- a/kernel/locking/locktorture.c -+++ b/kernel/locking/locktorture.c -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - #include - #include - #include --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0135-rtmutex-Add-rtmutex_lock_killable.patch linux-4.19.118/debian/patches-rt/0135-rtmutex-Add-rtmutex_lock_killable.patch --- linux-4.19.98/debian/patches-rt/0135-rtmutex-Add-rtmutex_lock_killable.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0135-rtmutex-Add-rtmutex_lock_killable.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,60 @@ +From 468920c7b2db6dba23677a7f6ab507a27cb16d5d Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 9 Jun 2011 11:43:52 +0200 +Subject: [PATCH 135/325] rtmutex: Add rtmutex_lock_killable() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Add "killable" type to rtmutex. We need this since rtmutex are used as +"normal" mutexes which do use this type. + +Signed-off-by: Thomas Gleixner +--- + include/linux/rtmutex.h | 1 + + kernel/locking/rtmutex.c | 19 +++++++++++++++++++ + 2 files changed, 20 insertions(+) + +diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h +index 6fd615a0eea9..81ece6a8291a 100644 +--- a/include/linux/rtmutex.h ++++ b/include/linux/rtmutex.h +@@ -115,6 +115,7 @@ extern void rt_mutex_lock(struct rt_mutex *lock); + #endif + + extern int rt_mutex_lock_interruptible(struct rt_mutex *lock); ++extern int rt_mutex_lock_killable(struct rt_mutex *lock); + extern int rt_mutex_timed_lock(struct rt_mutex *lock, + struct hrtimer_sleeper *timeout); + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 1c3f56d3d9b6..a4b2af7718f8 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1562,6 +1562,25 @@ int __sched __rt_mutex_futex_trylock(struct rt_mutex *lock) + return __rt_mutex_slowtrylock(lock); + } + ++/** ++ * rt_mutex_lock_killable - lock a rt_mutex killable ++ * ++ * @lock: the rt_mutex to be locked ++ * @detect_deadlock: deadlock detection on/off ++ * ++ * Returns: ++ * 0 on success ++ * -EINTR when interrupted by a signal ++ * -EDEADLK when the lock would deadlock (when deadlock detection is on) ++ */ ++int __sched rt_mutex_lock_killable(struct rt_mutex *lock) ++{ ++ might_sleep(); ++ ++ return rt_mutex_fastlock(lock, TASK_KILLABLE, rt_mutex_slowlock); ++} ++EXPORT_SYMBOL_GPL(rt_mutex_lock_killable); ++ + /** + * rt_mutex_timed_lock - lock a rt_mutex interruptible + * the timeout structure is provided +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0136-rtmutex-Add-rtmutex_lock_killable.patch linux-4.19.118/debian/patches-rt/0136-rtmutex-Add-rtmutex_lock_killable.patch --- linux-4.19.98/debian/patches-rt/0136-rtmutex-Add-rtmutex_lock_killable.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0136-rtmutex-Add-rtmutex_lock_killable.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -From bdcf220d6064da9072193b604f5fdaf9f7cf952f Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 9 Jun 2011 11:43:52 +0200 -Subject: [PATCH 136/290] rtmutex: Add rtmutex_lock_killable() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Add "killable" type to rtmutex. We need this since rtmutex are used as -"normal" mutexes which do use this type. - -Signed-off-by: Thomas Gleixner ---- - include/linux/rtmutex.h | 1 + - kernel/locking/rtmutex.c | 19 +++++++++++++++++++ - 2 files changed, 20 insertions(+) - -diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h -index 6fd615a0eea9..81ece6a8291a 100644 ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -115,6 +115,7 @@ extern void rt_mutex_lock(struct rt_mutex *lock); - #endif - - extern int rt_mutex_lock_interruptible(struct rt_mutex *lock); -+extern int rt_mutex_lock_killable(struct rt_mutex *lock); - extern int rt_mutex_timed_lock(struct rt_mutex *lock, - struct hrtimer_sleeper *timeout); - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 1c3f56d3d9b6..a4b2af7718f8 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1562,6 +1562,25 @@ int __sched __rt_mutex_futex_trylock(struct rt_mutex *lock) - return __rt_mutex_slowtrylock(lock); - } - -+/** -+ * rt_mutex_lock_killable - lock a rt_mutex killable -+ * -+ * @lock: the rt_mutex to be locked -+ * @detect_deadlock: deadlock detection on/off -+ * -+ * Returns: -+ * 0 on success -+ * -EINTR when interrupted by a signal -+ * -EDEADLK when the lock would deadlock (when deadlock detection is on) -+ */ -+int __sched rt_mutex_lock_killable(struct rt_mutex *lock) -+{ -+ might_sleep(); -+ -+ return rt_mutex_fastlock(lock, TASK_KILLABLE, rt_mutex_slowlock); -+} -+EXPORT_SYMBOL_GPL(rt_mutex_lock_killable); -+ - /** - * rt_mutex_timed_lock - lock a rt_mutex interruptible - * the timeout structure is provided --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0136-rtmutex-Make-lock_killable-work.patch linux-4.19.118/debian/patches-rt/0136-rtmutex-Make-lock_killable-work.patch --- linux-4.19.98/debian/patches-rt/0136-rtmutex-Make-lock_killable-work.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0136-rtmutex-Make-lock_killable-work.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,51 @@ +From a83438da0a4366a5f9d3930dec26bd77c5f60a63 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sat, 1 Apr 2017 12:50:59 +0200 +Subject: [PATCH 136/325] rtmutex: Make lock_killable work +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Locking an rt mutex killable does not work because signal handling is +restricted to TASK_INTERRUPTIBLE. + +Use signal_pending_state() unconditionaly. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rtmutex.c | 19 +++++++------------ + 1 file changed, 7 insertions(+), 12 deletions(-) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index a4b2af7718f8..f058bb976212 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1201,18 +1201,13 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state, + if (try_to_take_rt_mutex(lock, current, waiter)) + break; + +- /* +- * TASK_INTERRUPTIBLE checks for signals and +- * timeout. Ignored otherwise. +- */ +- if (likely(state == TASK_INTERRUPTIBLE)) { +- /* Signal pending? */ +- if (signal_pending(current)) +- ret = -EINTR; +- if (timeout && !timeout->task) +- ret = -ETIMEDOUT; +- if (ret) +- break; ++ if (timeout && !timeout->task) { ++ ret = -ETIMEDOUT; ++ break; ++ } ++ if (signal_pending_state(state, current)) { ++ ret = -EINTR; ++ break; + } + + raw_spin_unlock_irq(&lock->wait_lock); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0137-rtmutex-Make-lock_killable-work.patch linux-4.19.118/debian/patches-rt/0137-rtmutex-Make-lock_killable-work.patch --- linux-4.19.98/debian/patches-rt/0137-rtmutex-Make-lock_killable-work.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0137-rtmutex-Make-lock_killable-work.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -From 6320c2a328b759909197f3ff76944b43141bc563 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sat, 1 Apr 2017 12:50:59 +0200 -Subject: [PATCH 137/290] rtmutex: Make lock_killable work -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Locking an rt mutex killable does not work because signal handling is -restricted to TASK_INTERRUPTIBLE. - -Use signal_pending_state() unconditionaly. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 19 +++++++------------ - 1 file changed, 7 insertions(+), 12 deletions(-) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index a4b2af7718f8..f058bb976212 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1201,18 +1201,13 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state, - if (try_to_take_rt_mutex(lock, current, waiter)) - break; - -- /* -- * TASK_INTERRUPTIBLE checks for signals and -- * timeout. Ignored otherwise. -- */ -- if (likely(state == TASK_INTERRUPTIBLE)) { -- /* Signal pending? */ -- if (signal_pending(current)) -- ret = -EINTR; -- if (timeout && !timeout->task) -- ret = -ETIMEDOUT; -- if (ret) -- break; -+ if (timeout && !timeout->task) { -+ ret = -ETIMEDOUT; -+ break; -+ } -+ if (signal_pending_state(state, current)) { -+ ret = -EINTR; -+ break; - } - - raw_spin_unlock_irq(&lock->wait_lock); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0137-spinlock-Split-the-lock-types-header.patch linux-4.19.118/debian/patches-rt/0137-spinlock-Split-the-lock-types-header.patch --- linux-4.19.98/debian/patches-rt/0137-spinlock-Split-the-lock-types-header.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0137-spinlock-Split-the-lock-types-header.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,221 @@ +From dba0ea2e3bd9761d43099e882fe6e51aa1c77bea Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 29 Jun 2011 19:34:01 +0200 +Subject: [PATCH 137/325] spinlock: Split the lock types header +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Split raw_spinlock into its own file and the remaining spinlock_t into +its own non-RT header. The non-RT header will be replaced later by sleeping +spinlocks. + +Signed-off-by: Thomas Gleixner +--- + include/linux/rwlock_types.h | 4 ++ + include/linux/spinlock_types.h | 71 +---------------------------- + include/linux/spinlock_types_nort.h | 33 ++++++++++++++ + include/linux/spinlock_types_raw.h | 55 ++++++++++++++++++++++ + 4 files changed, 94 insertions(+), 69 deletions(-) + create mode 100644 include/linux/spinlock_types_nort.h + create mode 100644 include/linux/spinlock_types_raw.h + +diff --git a/include/linux/rwlock_types.h b/include/linux/rwlock_types.h +index 857a72ceb794..c21683f3e14a 100644 +--- a/include/linux/rwlock_types.h ++++ b/include/linux/rwlock_types.h +@@ -1,6 +1,10 @@ + #ifndef __LINUX_RWLOCK_TYPES_H + #define __LINUX_RWLOCK_TYPES_H + ++#if !defined(__LINUX_SPINLOCK_TYPES_H) ++# error "Do not include directly, include spinlock_types.h" ++#endif ++ + /* + * include/linux/rwlock_types.h - generic rwlock type definitions + * and initializers +diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h +index 24b4e6f2c1a2..5c8664d57fb8 100644 +--- a/include/linux/spinlock_types.h ++++ b/include/linux/spinlock_types.h +@@ -9,76 +9,9 @@ + * Released under the General Public License (GPL). + */ + +-#if defined(CONFIG_SMP) +-# include +-#else +-# include +-#endif ++#include + +-#include +- +-typedef struct raw_spinlock { +- arch_spinlock_t raw_lock; +-#ifdef CONFIG_DEBUG_SPINLOCK +- unsigned int magic, owner_cpu; +- void *owner; +-#endif +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +- struct lockdep_map dep_map; +-#endif +-} raw_spinlock_t; +- +-#define SPINLOCK_MAGIC 0xdead4ead +- +-#define SPINLOCK_OWNER_INIT ((void *)-1L) +- +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +-# define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } +-#else +-# define SPIN_DEP_MAP_INIT(lockname) +-#endif +- +-#ifdef CONFIG_DEBUG_SPINLOCK +-# define SPIN_DEBUG_INIT(lockname) \ +- .magic = SPINLOCK_MAGIC, \ +- .owner_cpu = -1, \ +- .owner = SPINLOCK_OWNER_INIT, +-#else +-# define SPIN_DEBUG_INIT(lockname) +-#endif +- +-#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ +- { \ +- .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ +- SPIN_DEBUG_INIT(lockname) \ +- SPIN_DEP_MAP_INIT(lockname) } +- +-#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ +- (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) +- +-#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) +- +-typedef struct spinlock { +- union { +- struct raw_spinlock rlock; +- +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +-# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) +- struct { +- u8 __padding[LOCK_PADSIZE]; +- struct lockdep_map dep_map; +- }; +-#endif +- }; +-} spinlock_t; +- +-#define __SPIN_LOCK_INITIALIZER(lockname) \ +- { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } } +- +-#define __SPIN_LOCK_UNLOCKED(lockname) \ +- (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) +- +-#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) ++#include + + #include + +diff --git a/include/linux/spinlock_types_nort.h b/include/linux/spinlock_types_nort.h +new file mode 100644 +index 000000000000..f1dac1fb1d6a +--- /dev/null ++++ b/include/linux/spinlock_types_nort.h +@@ -0,0 +1,33 @@ ++#ifndef __LINUX_SPINLOCK_TYPES_NORT_H ++#define __LINUX_SPINLOCK_TYPES_NORT_H ++ ++#ifndef __LINUX_SPINLOCK_TYPES_H ++#error "Do not include directly. Include spinlock_types.h instead" ++#endif ++ ++/* ++ * The non RT version maps spinlocks to raw_spinlocks ++ */ ++typedef struct spinlock { ++ union { ++ struct raw_spinlock rlock; ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) ++ struct { ++ u8 __padding[LOCK_PADSIZE]; ++ struct lockdep_map dep_map; ++ }; ++#endif ++ }; ++} spinlock_t; ++ ++#define __SPIN_LOCK_INITIALIZER(lockname) \ ++ { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } } ++ ++#define __SPIN_LOCK_UNLOCKED(lockname) \ ++ (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) ++ ++#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) ++ ++#endif +diff --git a/include/linux/spinlock_types_raw.h b/include/linux/spinlock_types_raw.h +new file mode 100644 +index 000000000000..822bf64a61d3 +--- /dev/null ++++ b/include/linux/spinlock_types_raw.h +@@ -0,0 +1,55 @@ ++#ifndef __LINUX_SPINLOCK_TYPES_RAW_H ++#define __LINUX_SPINLOCK_TYPES_RAW_H ++ ++#include ++ ++#if defined(CONFIG_SMP) ++# include ++#else ++# include ++#endif ++ ++#include ++ ++typedef struct raw_spinlock { ++ arch_spinlock_t raw_lock; ++#ifdef CONFIG_DEBUG_SPINLOCK ++ unsigned int magic, owner_cpu; ++ void *owner; ++#endif ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++} raw_spinlock_t; ++ ++#define SPINLOCK_MAGIC 0xdead4ead ++ ++#define SPINLOCK_OWNER_INIT ((void *)-1L) ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } ++#else ++# define SPIN_DEP_MAP_INIT(lockname) ++#endif ++ ++#ifdef CONFIG_DEBUG_SPINLOCK ++# define SPIN_DEBUG_INIT(lockname) \ ++ .magic = SPINLOCK_MAGIC, \ ++ .owner_cpu = -1, \ ++ .owner = SPINLOCK_OWNER_INIT, ++#else ++# define SPIN_DEBUG_INIT(lockname) ++#endif ++ ++#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ ++ { \ ++ .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ ++ SPIN_DEBUG_INIT(lockname) \ ++ SPIN_DEP_MAP_INIT(lockname) } ++ ++#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ ++ (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) ++ ++#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) ++ ++#endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0138-rtmutex-Avoid-include-hell.patch linux-4.19.118/debian/patches-rt/0138-rtmutex-Avoid-include-hell.patch --- linux-4.19.98/debian/patches-rt/0138-rtmutex-Avoid-include-hell.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0138-rtmutex-Avoid-include-hell.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,30 @@ +From 01781dadb365c4590a6709c8a180b04813ae6e66 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 29 Jun 2011 20:06:39 +0200 +Subject: [PATCH 138/325] rtmutex: Avoid include hell +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Include only the required raw types. This avoids pulling in the +complete spinlock header which in turn requires rtmutex.h at some point. + +Signed-off-by: Thomas Gleixner +--- + include/linux/rtmutex.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h +index 81ece6a8291a..a355289b1fa1 100644 +--- a/include/linux/rtmutex.h ++++ b/include/linux/rtmutex.h +@@ -15,7 +15,7 @@ + + #include + #include +-#include ++#include + + extern int max_lock_depth; /* for sysctl */ + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0138-spinlock-Split-the-lock-types-header.patch linux-4.19.118/debian/patches-rt/0138-spinlock-Split-the-lock-types-header.patch --- linux-4.19.98/debian/patches-rt/0138-spinlock-Split-the-lock-types-header.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0138-spinlock-Split-the-lock-types-header.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,221 +0,0 @@ -From 575aa1d2041b59a87bb62ae844b43779bb1114e6 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 29 Jun 2011 19:34:01 +0200 -Subject: [PATCH 138/290] spinlock: Split the lock types header -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Split raw_spinlock into its own file and the remaining spinlock_t into -its own non-RT header. The non-RT header will be replaced later by sleeping -spinlocks. - -Signed-off-by: Thomas Gleixner ---- - include/linux/rwlock_types.h | 4 ++ - include/linux/spinlock_types.h | 71 +---------------------------- - include/linux/spinlock_types_nort.h | 33 ++++++++++++++ - include/linux/spinlock_types_raw.h | 55 ++++++++++++++++++++++ - 4 files changed, 94 insertions(+), 69 deletions(-) - create mode 100644 include/linux/spinlock_types_nort.h - create mode 100644 include/linux/spinlock_types_raw.h - -diff --git a/include/linux/rwlock_types.h b/include/linux/rwlock_types.h -index 857a72ceb794..c21683f3e14a 100644 ---- a/include/linux/rwlock_types.h -+++ b/include/linux/rwlock_types.h -@@ -1,6 +1,10 @@ - #ifndef __LINUX_RWLOCK_TYPES_H - #define __LINUX_RWLOCK_TYPES_H - -+#if !defined(__LINUX_SPINLOCK_TYPES_H) -+# error "Do not include directly, include spinlock_types.h" -+#endif -+ - /* - * include/linux/rwlock_types.h - generic rwlock type definitions - * and initializers -diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h -index 24b4e6f2c1a2..5c8664d57fb8 100644 ---- a/include/linux/spinlock_types.h -+++ b/include/linux/spinlock_types.h -@@ -9,76 +9,9 @@ - * Released under the General Public License (GPL). - */ - --#if defined(CONFIG_SMP) --# include --#else --# include --#endif -+#include - --#include -- --typedef struct raw_spinlock { -- arch_spinlock_t raw_lock; --#ifdef CONFIG_DEBUG_SPINLOCK -- unsigned int magic, owner_cpu; -- void *owner; --#endif --#ifdef CONFIG_DEBUG_LOCK_ALLOC -- struct lockdep_map dep_map; --#endif --} raw_spinlock_t; -- --#define SPINLOCK_MAGIC 0xdead4ead -- --#define SPINLOCK_OWNER_INIT ((void *)-1L) -- --#ifdef CONFIG_DEBUG_LOCK_ALLOC --# define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } --#else --# define SPIN_DEP_MAP_INIT(lockname) --#endif -- --#ifdef CONFIG_DEBUG_SPINLOCK --# define SPIN_DEBUG_INIT(lockname) \ -- .magic = SPINLOCK_MAGIC, \ -- .owner_cpu = -1, \ -- .owner = SPINLOCK_OWNER_INIT, --#else --# define SPIN_DEBUG_INIT(lockname) --#endif -- --#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ -- { \ -- .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ -- SPIN_DEBUG_INIT(lockname) \ -- SPIN_DEP_MAP_INIT(lockname) } -- --#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ -- (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) -- --#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) -- --typedef struct spinlock { -- union { -- struct raw_spinlock rlock; -- --#ifdef CONFIG_DEBUG_LOCK_ALLOC --# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) -- struct { -- u8 __padding[LOCK_PADSIZE]; -- struct lockdep_map dep_map; -- }; --#endif -- }; --} spinlock_t; -- --#define __SPIN_LOCK_INITIALIZER(lockname) \ -- { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } } -- --#define __SPIN_LOCK_UNLOCKED(lockname) \ -- (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) -- --#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) -+#include - - #include - -diff --git a/include/linux/spinlock_types_nort.h b/include/linux/spinlock_types_nort.h -new file mode 100644 -index 000000000000..f1dac1fb1d6a ---- /dev/null -+++ b/include/linux/spinlock_types_nort.h -@@ -0,0 +1,33 @@ -+#ifndef __LINUX_SPINLOCK_TYPES_NORT_H -+#define __LINUX_SPINLOCK_TYPES_NORT_H -+ -+#ifndef __LINUX_SPINLOCK_TYPES_H -+#error "Do not include directly. Include spinlock_types.h instead" -+#endif -+ -+/* -+ * The non RT version maps spinlocks to raw_spinlocks -+ */ -+typedef struct spinlock { -+ union { -+ struct raw_spinlock rlock; -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) -+ struct { -+ u8 __padding[LOCK_PADSIZE]; -+ struct lockdep_map dep_map; -+ }; -+#endif -+ }; -+} spinlock_t; -+ -+#define __SPIN_LOCK_INITIALIZER(lockname) \ -+ { { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } } -+ -+#define __SPIN_LOCK_UNLOCKED(lockname) \ -+ (spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname) -+ -+#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) -+ -+#endif -diff --git a/include/linux/spinlock_types_raw.h b/include/linux/spinlock_types_raw.h -new file mode 100644 -index 000000000000..822bf64a61d3 ---- /dev/null -+++ b/include/linux/spinlock_types_raw.h -@@ -0,0 +1,55 @@ -+#ifndef __LINUX_SPINLOCK_TYPES_RAW_H -+#define __LINUX_SPINLOCK_TYPES_RAW_H -+ -+#include -+ -+#if defined(CONFIG_SMP) -+# include -+#else -+# include -+#endif -+ -+#include -+ -+typedef struct raw_spinlock { -+ arch_spinlock_t raw_lock; -+#ifdef CONFIG_DEBUG_SPINLOCK -+ unsigned int magic, owner_cpu; -+ void *owner; -+#endif -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+} raw_spinlock_t; -+ -+#define SPINLOCK_MAGIC 0xdead4ead -+ -+#define SPINLOCK_OWNER_INIT ((void *)-1L) -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define SPIN_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } -+#else -+# define SPIN_DEP_MAP_INIT(lockname) -+#endif -+ -+#ifdef CONFIG_DEBUG_SPINLOCK -+# define SPIN_DEBUG_INIT(lockname) \ -+ .magic = SPINLOCK_MAGIC, \ -+ .owner_cpu = -1, \ -+ .owner = SPINLOCK_OWNER_INIT, -+#else -+# define SPIN_DEBUG_INIT(lockname) -+#endif -+ -+#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ -+ { \ -+ .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ -+ SPIN_DEBUG_INIT(lockname) \ -+ SPIN_DEP_MAP_INIT(lockname) } -+ -+#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ -+ (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) -+ -+#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) -+ -+#endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0139-rbtree-don-t-include-the-rcu-header.patch linux-4.19.118/debian/patches-rt/0139-rbtree-don-t-include-the-rcu-header.patch --- linux-4.19.98/debian/patches-rt/0139-rbtree-don-t-include-the-rcu-header.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0139-rbtree-don-t-include-the-rcu-header.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,175 @@ +From e537e5c666a1da306d036aa5fa1a695c4aaf4163 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 26 Feb 2019 16:56:02 +0100 +Subject: [PATCH 139/325] rbtree: don't include the rcu header +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The RCU header pulls in spinlock.h and fails due not yet defined types: + +|In file included from include/linux/spinlock.h:275:0, +| from include/linux/rcupdate.h:38, +| from include/linux/rbtree.h:34, +| from include/linux/rtmutex.h:17, +| from include/linux/spinlock_types.h:18, +| from kernel/bounds.c:13: +|include/linux/rwlock_rt.h:16:38: error: unknown type name ‘rwlock_t’ +| extern void __lockfunc rt_write_lock(rwlock_t *rwlock); +| ^ + +This patch moves the required RCU function from the rcupdate.h header file into +a new header file which can be included by both users. + +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/rbtree.h | 2 +- + include/linux/rcu_assign_pointer.h | 54 ++++++++++++++++++++++++++++++ + include/linux/rcupdate.h | 49 +-------------------------- + 3 files changed, 56 insertions(+), 49 deletions(-) + create mode 100644 include/linux/rcu_assign_pointer.h + +diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h +index fcbeed4053ef..2aa2aec354c2 100644 +--- a/include/linux/rbtree.h ++++ b/include/linux/rbtree.h +@@ -31,7 +31,7 @@ + + #include + #include +-#include ++#include + + struct rb_node { + unsigned long __rb_parent_color; +diff --git a/include/linux/rcu_assign_pointer.h b/include/linux/rcu_assign_pointer.h +new file mode 100644 +index 000000000000..7066962a4379 +--- /dev/null ++++ b/include/linux/rcu_assign_pointer.h +@@ -0,0 +1,54 @@ ++#ifndef __LINUX_RCU_ASSIGN_POINTER_H__ ++#define __LINUX_RCU_ASSIGN_POINTER_H__ ++#include ++#include ++ ++/** ++ * RCU_INITIALIZER() - statically initialize an RCU-protected global variable ++ * @v: The value to statically initialize with. ++ */ ++#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v) ++ ++/** ++ * rcu_assign_pointer() - assign to RCU-protected pointer ++ * @p: pointer to assign to ++ * @v: value to assign (publish) ++ * ++ * Assigns the specified value to the specified RCU-protected ++ * pointer, ensuring that any concurrent RCU readers will see ++ * any prior initialization. ++ * ++ * Inserts memory barriers on architectures that require them ++ * (which is most of them), and also prevents the compiler from ++ * reordering the code that initializes the structure after the pointer ++ * assignment. More importantly, this call documents which pointers ++ * will be dereferenced by RCU read-side code. ++ * ++ * In some special cases, you may use RCU_INIT_POINTER() instead ++ * of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due ++ * to the fact that it does not constrain either the CPU or the compiler. ++ * That said, using RCU_INIT_POINTER() when you should have used ++ * rcu_assign_pointer() is a very bad thing that results in ++ * impossible-to-diagnose memory corruption. So please be careful. ++ * See the RCU_INIT_POINTER() comment header for details. ++ * ++ * Note that rcu_assign_pointer() evaluates each of its arguments only ++ * once, appearances notwithstanding. One of the "extra" evaluations ++ * is in typeof() and the other visible only to sparse (__CHECKER__), ++ * neither of which actually execute the argument. As with most cpp ++ * macros, this execute-arguments-only-once property is important, so ++ * please be careful when making changes to rcu_assign_pointer() and the ++ * other macros that it invokes. ++ */ ++#define rcu_assign_pointer(p, v) \ ++({ \ ++ uintptr_t _r_a_p__v = (uintptr_t)(v); \ ++ \ ++ if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL) \ ++ WRITE_ONCE((p), (typeof(p))(_r_a_p__v)); \ ++ else \ ++ smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \ ++ _r_a_p__v; \ ++}) ++ ++#endif +diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h +index 027c58cdbb6e..e6733d7911e9 100644 +--- a/include/linux/rcupdate.h ++++ b/include/linux/rcupdate.h +@@ -42,6 +42,7 @@ + #include + #include + #include ++#include + + #define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b)) + #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b)) +@@ -369,54 +370,6 @@ static inline void rcu_preempt_sleep_check(void) { } + ((typeof(*p) __force __kernel *)(________p1)); \ + }) + +-/** +- * RCU_INITIALIZER() - statically initialize an RCU-protected global variable +- * @v: The value to statically initialize with. +- */ +-#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v) +- +-/** +- * rcu_assign_pointer() - assign to RCU-protected pointer +- * @p: pointer to assign to +- * @v: value to assign (publish) +- * +- * Assigns the specified value to the specified RCU-protected +- * pointer, ensuring that any concurrent RCU readers will see +- * any prior initialization. +- * +- * Inserts memory barriers on architectures that require them +- * (which is most of them), and also prevents the compiler from +- * reordering the code that initializes the structure after the pointer +- * assignment. More importantly, this call documents which pointers +- * will be dereferenced by RCU read-side code. +- * +- * In some special cases, you may use RCU_INIT_POINTER() instead +- * of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due +- * to the fact that it does not constrain either the CPU or the compiler. +- * That said, using RCU_INIT_POINTER() when you should have used +- * rcu_assign_pointer() is a very bad thing that results in +- * impossible-to-diagnose memory corruption. So please be careful. +- * See the RCU_INIT_POINTER() comment header for details. +- * +- * Note that rcu_assign_pointer() evaluates each of its arguments only +- * once, appearances notwithstanding. One of the "extra" evaluations +- * is in typeof() and the other visible only to sparse (__CHECKER__), +- * neither of which actually execute the argument. As with most cpp +- * macros, this execute-arguments-only-once property is important, so +- * please be careful when making changes to rcu_assign_pointer() and the +- * other macros that it invokes. +- */ +-#define rcu_assign_pointer(p, v) \ +-({ \ +- uintptr_t _r_a_p__v = (uintptr_t)(v); \ +- \ +- if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL) \ +- WRITE_ONCE((p), (typeof(p))(_r_a_p__v)); \ +- else \ +- smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \ +- _r_a_p__v; \ +-}) +- + /** + * rcu_swap_protected() - swap an RCU and a regular pointer + * @rcu_ptr: RCU pointer +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0139-rtmutex-Avoid-include-hell.patch linux-4.19.118/debian/patches-rt/0139-rtmutex-Avoid-include-hell.patch --- linux-4.19.98/debian/patches-rt/0139-rtmutex-Avoid-include-hell.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0139-rtmutex-Avoid-include-hell.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -From 66e71d123479ba1870a7b7ab6935f7f982379ca8 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 29 Jun 2011 20:06:39 +0200 -Subject: [PATCH 139/290] rtmutex: Avoid include hell -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Include only the required raw types. This avoids pulling in the -complete spinlock header which in turn requires rtmutex.h at some point. - -Signed-off-by: Thomas Gleixner ---- - include/linux/rtmutex.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h -index 81ece6a8291a..a355289b1fa1 100644 ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -15,7 +15,7 @@ - - #include - #include --#include -+#include - - extern int max_lock_depth; /* for sysctl */ - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0140-rbtree-don-t-include-the-rcu-header.patch linux-4.19.118/debian/patches-rt/0140-rbtree-don-t-include-the-rcu-header.patch --- linux-4.19.98/debian/patches-rt/0140-rbtree-don-t-include-the-rcu-header.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0140-rbtree-don-t-include-the-rcu-header.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,175 +0,0 @@ -From a848373d9df624fd8692e4419ae43107453a6ee5 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 26 Feb 2019 16:56:02 +0100 -Subject: [PATCH 140/290] rbtree: don't include the rcu header -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The RCU header pulls in spinlock.h and fails due not yet defined types: - -|In file included from include/linux/spinlock.h:275:0, -| from include/linux/rcupdate.h:38, -| from include/linux/rbtree.h:34, -| from include/linux/rtmutex.h:17, -| from include/linux/spinlock_types.h:18, -| from kernel/bounds.c:13: -|include/linux/rwlock_rt.h:16:38: error: unknown type name ‘rwlock_t’ -| extern void __lockfunc rt_write_lock(rwlock_t *rwlock); -| ^ - -This patch moves the required RCU function from the rcupdate.h header file into -a new header file which can be included by both users. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rbtree.h | 2 +- - include/linux/rcu_assign_pointer.h | 54 ++++++++++++++++++++++++++++++ - include/linux/rcupdate.h | 49 +-------------------------- - 3 files changed, 56 insertions(+), 49 deletions(-) - create mode 100644 include/linux/rcu_assign_pointer.h - -diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h -index fcbeed4053ef..2aa2aec354c2 100644 ---- a/include/linux/rbtree.h -+++ b/include/linux/rbtree.h -@@ -31,7 +31,7 @@ - - #include - #include --#include -+#include - - struct rb_node { - unsigned long __rb_parent_color; -diff --git a/include/linux/rcu_assign_pointer.h b/include/linux/rcu_assign_pointer.h -new file mode 100644 -index 000000000000..7066962a4379 ---- /dev/null -+++ b/include/linux/rcu_assign_pointer.h -@@ -0,0 +1,54 @@ -+#ifndef __LINUX_RCU_ASSIGN_POINTER_H__ -+#define __LINUX_RCU_ASSIGN_POINTER_H__ -+#include -+#include -+ -+/** -+ * RCU_INITIALIZER() - statically initialize an RCU-protected global variable -+ * @v: The value to statically initialize with. -+ */ -+#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v) -+ -+/** -+ * rcu_assign_pointer() - assign to RCU-protected pointer -+ * @p: pointer to assign to -+ * @v: value to assign (publish) -+ * -+ * Assigns the specified value to the specified RCU-protected -+ * pointer, ensuring that any concurrent RCU readers will see -+ * any prior initialization. -+ * -+ * Inserts memory barriers on architectures that require them -+ * (which is most of them), and also prevents the compiler from -+ * reordering the code that initializes the structure after the pointer -+ * assignment. More importantly, this call documents which pointers -+ * will be dereferenced by RCU read-side code. -+ * -+ * In some special cases, you may use RCU_INIT_POINTER() instead -+ * of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due -+ * to the fact that it does not constrain either the CPU or the compiler. -+ * That said, using RCU_INIT_POINTER() when you should have used -+ * rcu_assign_pointer() is a very bad thing that results in -+ * impossible-to-diagnose memory corruption. So please be careful. -+ * See the RCU_INIT_POINTER() comment header for details. -+ * -+ * Note that rcu_assign_pointer() evaluates each of its arguments only -+ * once, appearances notwithstanding. One of the "extra" evaluations -+ * is in typeof() and the other visible only to sparse (__CHECKER__), -+ * neither of which actually execute the argument. As with most cpp -+ * macros, this execute-arguments-only-once property is important, so -+ * please be careful when making changes to rcu_assign_pointer() and the -+ * other macros that it invokes. -+ */ -+#define rcu_assign_pointer(p, v) \ -+({ \ -+ uintptr_t _r_a_p__v = (uintptr_t)(v); \ -+ \ -+ if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL) \ -+ WRITE_ONCE((p), (typeof(p))(_r_a_p__v)); \ -+ else \ -+ smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \ -+ _r_a_p__v; \ -+}) -+ -+#endif -diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h -index 027c58cdbb6e..e6733d7911e9 100644 ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -42,6 +42,7 @@ - #include - #include - #include -+#include - - #define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b)) - #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b)) -@@ -369,54 +370,6 @@ static inline void rcu_preempt_sleep_check(void) { } - ((typeof(*p) __force __kernel *)(________p1)); \ - }) - --/** -- * RCU_INITIALIZER() - statically initialize an RCU-protected global variable -- * @v: The value to statically initialize with. -- */ --#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v) -- --/** -- * rcu_assign_pointer() - assign to RCU-protected pointer -- * @p: pointer to assign to -- * @v: value to assign (publish) -- * -- * Assigns the specified value to the specified RCU-protected -- * pointer, ensuring that any concurrent RCU readers will see -- * any prior initialization. -- * -- * Inserts memory barriers on architectures that require them -- * (which is most of them), and also prevents the compiler from -- * reordering the code that initializes the structure after the pointer -- * assignment. More importantly, this call documents which pointers -- * will be dereferenced by RCU read-side code. -- * -- * In some special cases, you may use RCU_INIT_POINTER() instead -- * of rcu_assign_pointer(). RCU_INIT_POINTER() is a bit faster due -- * to the fact that it does not constrain either the CPU or the compiler. -- * That said, using RCU_INIT_POINTER() when you should have used -- * rcu_assign_pointer() is a very bad thing that results in -- * impossible-to-diagnose memory corruption. So please be careful. -- * See the RCU_INIT_POINTER() comment header for details. -- * -- * Note that rcu_assign_pointer() evaluates each of its arguments only -- * once, appearances notwithstanding. One of the "extra" evaluations -- * is in typeof() and the other visible only to sparse (__CHECKER__), -- * neither of which actually execute the argument. As with most cpp -- * macros, this execute-arguments-only-once property is important, so -- * please be careful when making changes to rcu_assign_pointer() and the -- * other macros that it invokes. -- */ --#define rcu_assign_pointer(p, v) \ --({ \ -- uintptr_t _r_a_p__v = (uintptr_t)(v); \ -- \ -- if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL) \ -- WRITE_ONCE((p), (typeof(p))(_r_a_p__v)); \ -- else \ -- smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \ -- _r_a_p__v; \ --}) -- - /** - * rcu_swap_protected() - swap an RCU and a regular pointer - * @rcu_ptr: RCU pointer --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0140-rtmutex-Provide-rt_mutex_slowlock_locked.patch linux-4.19.118/debian/patches-rt/0140-rtmutex-Provide-rt_mutex_slowlock_locked.patch --- linux-4.19.98/debian/patches-rt/0140-rtmutex-Provide-rt_mutex_slowlock_locked.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0140-rtmutex-Provide-rt_mutex_slowlock_locked.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,145 @@ +From 7cb0379b9e963273f1404397480f4b3ba4794553 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 12 Oct 2017 16:14:22 +0200 +Subject: [PATCH 140/325] rtmutex: Provide rt_mutex_slowlock_locked() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +This is the inner-part of rt_mutex_slowlock(), required for rwsem-rt. + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rtmutex.c | 67 +++++++++++++++++++-------------- + kernel/locking/rtmutex_common.h | 7 ++++ + 2 files changed, 45 insertions(+), 29 deletions(-) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index f058bb976212..921345c31161 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1244,35 +1244,16 @@ static void rt_mutex_handle_deadlock(int res, int detect_deadlock, + } + } + +-/* +- * Slow path lock function: +- */ +-static int __sched +-rt_mutex_slowlock(struct rt_mutex *lock, int state, +- struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk) ++int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, ++ struct hrtimer_sleeper *timeout, ++ enum rtmutex_chainwalk chwalk, ++ struct rt_mutex_waiter *waiter) + { +- struct rt_mutex_waiter waiter; +- unsigned long flags; +- int ret = 0; +- +- rt_mutex_init_waiter(&waiter); +- +- /* +- * Technically we could use raw_spin_[un]lock_irq() here, but this can +- * be called in early boot if the cmpxchg() fast path is disabled +- * (debug, no architecture support). In this case we will acquire the +- * rtmutex with lock->wait_lock held. But we cannot unconditionally +- * enable interrupts in that early boot case. So we need to use the +- * irqsave/restore variants. +- */ +- raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ int ret; + + /* Try to acquire the lock again: */ +- if (try_to_take_rt_mutex(lock, current, NULL)) { +- raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ if (try_to_take_rt_mutex(lock, current, NULL)) + return 0; +- } + + set_current_state(state); + +@@ -1280,16 +1261,16 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, + if (unlikely(timeout)) + hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS); + +- ret = task_blocks_on_rt_mutex(lock, &waiter, current, chwalk); ++ ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); + + if (likely(!ret)) + /* sleep on the mutex */ +- ret = __rt_mutex_slowlock(lock, state, timeout, &waiter); ++ ret = __rt_mutex_slowlock(lock, state, timeout, waiter); + + if (unlikely(ret)) { + __set_current_state(TASK_RUNNING); +- remove_waiter(lock, &waiter); +- rt_mutex_handle_deadlock(ret, chwalk, &waiter); ++ remove_waiter(lock, waiter); ++ rt_mutex_handle_deadlock(ret, chwalk, waiter); + } + + /* +@@ -1297,6 +1278,34 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, + * unconditionally. We might have to fix that up. + */ + fixup_rt_mutex_waiters(lock); ++ return ret; ++} ++ ++/* ++ * Slow path lock function: ++ */ ++static int __sched ++rt_mutex_slowlock(struct rt_mutex *lock, int state, ++ struct hrtimer_sleeper *timeout, ++ enum rtmutex_chainwalk chwalk) ++{ ++ struct rt_mutex_waiter waiter; ++ unsigned long flags; ++ int ret = 0; ++ ++ rt_mutex_init_waiter(&waiter); ++ ++ /* ++ * Technically we could use raw_spin_[un]lock_irq() here, but this can ++ * be called in early boot if the cmpxchg() fast path is disabled ++ * (debug, no architecture support). In this case we will acquire the ++ * rtmutex with lock->wait_lock held. But we cannot unconditionally ++ * enable interrupts in that early boot case. So we need to use the ++ * irqsave/restore variants. ++ */ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ ++ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, &waiter); + + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index 461527f3f7af..cb9815f0c766 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -15,6 +15,7 @@ + + #include + #include ++#include + + /* + * This is the control structure for tasks blocked on a rt_mutex, +@@ -159,6 +160,12 @@ extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, + struct wake_q_head *wqh); + + extern void rt_mutex_postunlock(struct wake_q_head *wake_q); ++/* RW semaphore special interface */ ++ ++int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, ++ struct hrtimer_sleeper *timeout, ++ enum rtmutex_chainwalk chwalk, ++ struct rt_mutex_waiter *waiter); + + #ifdef CONFIG_DEBUG_RT_MUTEXES + # include "rtmutex-debug.h" +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0141-rtmutex-Provide-rt_mutex_slowlock_locked.patch linux-4.19.118/debian/patches-rt/0141-rtmutex-Provide-rt_mutex_slowlock_locked.patch --- linux-4.19.98/debian/patches-rt/0141-rtmutex-Provide-rt_mutex_slowlock_locked.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0141-rtmutex-Provide-rt_mutex_slowlock_locked.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,145 +0,0 @@ -From 0a9e717c46c47cc03fb028892cea5e36feda7230 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 16:14:22 +0200 -Subject: [PATCH 141/290] rtmutex: Provide rt_mutex_slowlock_locked() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -This is the inner-part of rt_mutex_slowlock(), required for rwsem-rt. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 67 +++++++++++++++++++-------------- - kernel/locking/rtmutex_common.h | 7 ++++ - 2 files changed, 45 insertions(+), 29 deletions(-) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index f058bb976212..921345c31161 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1244,35 +1244,16 @@ static void rt_mutex_handle_deadlock(int res, int detect_deadlock, - } - } - --/* -- * Slow path lock function: -- */ --static int __sched --rt_mutex_slowlock(struct rt_mutex *lock, int state, -- struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk) -+int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, -+ struct hrtimer_sleeper *timeout, -+ enum rtmutex_chainwalk chwalk, -+ struct rt_mutex_waiter *waiter) - { -- struct rt_mutex_waiter waiter; -- unsigned long flags; -- int ret = 0; -- -- rt_mutex_init_waiter(&waiter); -- -- /* -- * Technically we could use raw_spin_[un]lock_irq() here, but this can -- * be called in early boot if the cmpxchg() fast path is disabled -- * (debug, no architecture support). In this case we will acquire the -- * rtmutex with lock->wait_lock held. But we cannot unconditionally -- * enable interrupts in that early boot case. So we need to use the -- * irqsave/restore variants. -- */ -- raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ int ret; - - /* Try to acquire the lock again: */ -- if (try_to_take_rt_mutex(lock, current, NULL)) { -- raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ if (try_to_take_rt_mutex(lock, current, NULL)) - return 0; -- } - - set_current_state(state); - -@@ -1280,16 +1261,16 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, - if (unlikely(timeout)) - hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS); - -- ret = task_blocks_on_rt_mutex(lock, &waiter, current, chwalk); -+ ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); - - if (likely(!ret)) - /* sleep on the mutex */ -- ret = __rt_mutex_slowlock(lock, state, timeout, &waiter); -+ ret = __rt_mutex_slowlock(lock, state, timeout, waiter); - - if (unlikely(ret)) { - __set_current_state(TASK_RUNNING); -- remove_waiter(lock, &waiter); -- rt_mutex_handle_deadlock(ret, chwalk, &waiter); -+ remove_waiter(lock, waiter); -+ rt_mutex_handle_deadlock(ret, chwalk, waiter); - } - - /* -@@ -1297,6 +1278,34 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, - * unconditionally. We might have to fix that up. - */ - fixup_rt_mutex_waiters(lock); -+ return ret; -+} -+ -+/* -+ * Slow path lock function: -+ */ -+static int __sched -+rt_mutex_slowlock(struct rt_mutex *lock, int state, -+ struct hrtimer_sleeper *timeout, -+ enum rtmutex_chainwalk chwalk) -+{ -+ struct rt_mutex_waiter waiter; -+ unsigned long flags; -+ int ret = 0; -+ -+ rt_mutex_init_waiter(&waiter); -+ -+ /* -+ * Technically we could use raw_spin_[un]lock_irq() here, but this can -+ * be called in early boot if the cmpxchg() fast path is disabled -+ * (debug, no architecture support). In this case we will acquire the -+ * rtmutex with lock->wait_lock held. But we cannot unconditionally -+ * enable interrupts in that early boot case. So we need to use the -+ * irqsave/restore variants. -+ */ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ -+ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, &waiter); - - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index 461527f3f7af..cb9815f0c766 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -15,6 +15,7 @@ - - #include - #include -+#include - - /* - * This is the control structure for tasks blocked on a rt_mutex, -@@ -159,6 +160,12 @@ extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, - struct wake_q_head *wqh); - - extern void rt_mutex_postunlock(struct wake_q_head *wake_q); -+/* RW semaphore special interface */ -+ -+int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, -+ struct hrtimer_sleeper *timeout, -+ enum rtmutex_chainwalk chwalk, -+ struct rt_mutex_waiter *waiter); - - #ifdef CONFIG_DEBUG_RT_MUTEXES - # include "rtmutex-debug.h" --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0141-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch linux-4.19.118/debian/patches-rt/0141-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch --- linux-4.19.98/debian/patches-rt/0141-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0141-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,153 @@ +From 581291e66f417f36ea5d69a433e05c457857868d Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 12 Oct 2017 16:36:39 +0200 +Subject: [PATCH 141/325] rtmutex: export lockdep-less version of rt_mutex's + lock, trylock and unlock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Required for lock implementation ontop of rtmutex. + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rtmutex.c | 67 +++++++++++++++++++++------------ + kernel/locking/rtmutex_common.h | 3 ++ + 2 files changed, 46 insertions(+), 24 deletions(-) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 921345c31161..d732976d0f05 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1494,12 +1494,33 @@ rt_mutex_fastunlock(struct rt_mutex *lock, + rt_mutex_postunlock(&wake_q); + } + +-static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) ++int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) + { + might_sleep(); ++ return rt_mutex_fastlock(lock, state, rt_mutex_slowlock); ++} ++ ++/** ++ * rt_mutex_lock_state - lock a rt_mutex with a given state ++ * ++ * @lock: The rt_mutex to be locked ++ * @state: The state to set when blocking on the rt_mutex ++ */ ++static inline int __sched rt_mutex_lock_state(struct rt_mutex *lock, ++ unsigned int subclass, int state) ++{ ++ int ret; + + mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); +- rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock); ++ ret = __rt_mutex_lock_state(lock, state); ++ if (ret) ++ mutex_release(&lock->dep_map, 1, _RET_IP_); ++ return ret; ++} ++ ++static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) ++{ ++ rt_mutex_lock_state(lock, subclass, TASK_UNINTERRUPTIBLE); + } + + #ifdef CONFIG_DEBUG_LOCK_ALLOC +@@ -1540,16 +1561,7 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock); + */ + int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock) + { +- int ret; +- +- might_sleep(); +- +- mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); +- ret = rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, rt_mutex_slowlock); +- if (ret) +- mutex_release(&lock->dep_map, 1, _RET_IP_); +- +- return ret; ++ return rt_mutex_lock_state(lock, 0, TASK_INTERRUPTIBLE); + } + EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible); + +@@ -1575,13 +1587,10 @@ int __sched __rt_mutex_futex_trylock(struct rt_mutex *lock) + * Returns: + * 0 on success + * -EINTR when interrupted by a signal +- * -EDEADLK when the lock would deadlock (when deadlock detection is on) + */ + int __sched rt_mutex_lock_killable(struct rt_mutex *lock) + { +- might_sleep(); +- +- return rt_mutex_fastlock(lock, TASK_KILLABLE, rt_mutex_slowlock); ++ return rt_mutex_lock_state(lock, 0, TASK_KILLABLE); + } + EXPORT_SYMBOL_GPL(rt_mutex_lock_killable); + +@@ -1616,6 +1625,18 @@ rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout) + } + EXPORT_SYMBOL_GPL(rt_mutex_timed_lock); + ++int __sched __rt_mutex_trylock(struct rt_mutex *lock) ++{ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (WARN_ON_ONCE(in_irq() || in_nmi())) ++#else ++ if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) ++#endif ++ return 0; ++ ++ return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); ++} ++ + /** + * rt_mutex_trylock - try to lock a rt_mutex + * +@@ -1631,14 +1652,7 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) + { + int ret; + +-#ifdef CONFIG_PREEMPT_RT_FULL +- if (WARN_ON_ONCE(in_irq() || in_nmi())) +-#else +- if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) +-#endif +- return 0; +- +- ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); ++ ret = __rt_mutex_trylock(lock); + if (ret) + mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); + +@@ -1646,6 +1660,11 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) + } + EXPORT_SYMBOL_GPL(rt_mutex_trylock); + ++void __sched __rt_mutex_unlock(struct rt_mutex *lock) ++{ ++ rt_mutex_fastunlock(lock, rt_mutex_slowunlock); ++} ++ + /** + * rt_mutex_unlock - unlock a rt_mutex + * +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index cb9815f0c766..5955ad2aa2a8 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -162,6 +162,9 @@ extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, + extern void rt_mutex_postunlock(struct wake_q_head *wake_q); + /* RW semaphore special interface */ + ++extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); ++extern int __rt_mutex_trylock(struct rt_mutex *lock); ++extern void __rt_mutex_unlock(struct rt_mutex *lock); + int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, + enum rtmutex_chainwalk chwalk, +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0142-rtmutex-add-sleeping-lock-implementation.patch linux-4.19.118/debian/patches-rt/0142-rtmutex-add-sleeping-lock-implementation.patch --- linux-4.19.98/debian/patches-rt/0142-rtmutex-add-sleeping-lock-implementation.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0142-rtmutex-add-sleeping-lock-implementation.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,1208 @@ +From 87fd28b5599c18dcef1e63eeb30a5a3bbfcc3ba4 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 12 Oct 2017 17:11:19 +0200 +Subject: [PATCH 142/325] rtmutex: add sleeping lock implementation +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/kernel.h | 4 + + include/linux/rtmutex.h | 21 +- + include/linux/sched.h | 8 + + include/linux/sched/wake_q.h | 27 +- + include/linux/spinlock_rt.h | 156 +++++++++++ + include/linux/spinlock_types_rt.h | 48 ++++ + kernel/fork.c | 1 + + kernel/futex.c | 11 +- + kernel/locking/rtmutex.c | 436 +++++++++++++++++++++++++++--- + kernel/locking/rtmutex_common.h | 14 +- + kernel/sched/core.c | 28 +- + 11 files changed, 695 insertions(+), 59 deletions(-) + create mode 100644 include/linux/spinlock_rt.h + create mode 100644 include/linux/spinlock_types_rt.h + +diff --git a/include/linux/kernel.h b/include/linux/kernel.h +index f6f94e54ab96..78f30d553037 100644 +--- a/include/linux/kernel.h ++++ b/include/linux/kernel.h +@@ -260,6 +260,9 @@ extern int _cond_resched(void); + */ + # define might_sleep() \ + do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) ++ ++# define might_sleep_no_state_check() \ ++ do { ___might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) + # define sched_annotate_sleep() (current->task_state_change = 0) + #else + static inline void ___might_sleep(const char *file, int line, +@@ -267,6 +270,7 @@ extern int _cond_resched(void); + static inline void __might_sleep(const char *file, int line, + int preempt_offset) { } + # define might_sleep() do { might_resched(); } while (0) ++# define might_sleep_no_state_check() do { might_resched(); } while (0) + # define sched_annotate_sleep() do { } while (0) + #endif + +diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h +index a355289b1fa1..138bd1e183e0 100644 +--- a/include/linux/rtmutex.h ++++ b/include/linux/rtmutex.h +@@ -14,11 +14,15 @@ + #define __LINUX_RT_MUTEX_H + + #include +-#include + #include ++#include + + extern int max_lock_depth; /* for sysctl */ + ++#ifdef CONFIG_DEBUG_MUTEXES ++#include ++#endif ++ + /** + * The rt_mutex structure + * +@@ -31,8 +35,8 @@ struct rt_mutex { + raw_spinlock_t wait_lock; + struct rb_root_cached waiters; + struct task_struct *owner; +-#ifdef CONFIG_DEBUG_RT_MUTEXES + int save_state; ++#ifdef CONFIG_DEBUG_RT_MUTEXES + const char *name, *file; + int line; + void *magic; +@@ -82,16 +86,23 @@ do { \ + #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) + #endif + +-#define __RT_MUTEX_INITIALIZER(mutexname) \ +- { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ ++#define __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ ++ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ + , .waiters = RB_ROOT_CACHED \ + , .owner = NULL \ + __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ +- __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)} ++ __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) ++ ++#define __RT_MUTEX_INITIALIZER(mutexname) \ ++ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) } + + #define DEFINE_RT_MUTEX(mutexname) \ + struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) + ++#define __RT_MUTEX_INITIALIZER_SAVE_STATE(mutexname) \ ++ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ ++ , .save_state = 1 } ++ + /** + * rt_mutex_is_locked - is the mutex locked + * @lock: the mutex to be queried +diff --git a/include/linux/sched.h b/include/linux/sched.h +index f4ff928e6be3..527d04f9163e 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -134,6 +134,9 @@ struct task_group; + smp_store_mb(current->state, (state_value)); \ + } while (0) + ++#define __set_current_state_no_track(state_value) \ ++ current->state = (state_value); ++ + #define set_special_state(state_value) \ + do { \ + unsigned long flags; /* may shadow */ \ +@@ -143,6 +146,7 @@ struct task_group; + current->state = (state_value); \ + raw_spin_unlock_irqrestore(¤t->pi_lock, flags); \ + } while (0) ++ + #else + /* + * set_current_state() includes a barrier so that the write of current->state +@@ -187,6 +191,9 @@ struct task_group; + #define set_current_state(state_value) \ + smp_store_mb(current->state, (state_value)) + ++#define __set_current_state_no_track(state_value) \ ++ __set_current_state(state_value) ++ + /* + * set_special_state() should be used for those states when the blocking task + * can not use the regular condition based wait-loop. In that case we must +@@ -914,6 +921,7 @@ struct task_struct { + raw_spinlock_t pi_lock; + + struct wake_q_node wake_q; ++ struct wake_q_node wake_q_sleeper; + + #ifdef CONFIG_RT_MUTEXES + /* PI waiters blocked on a rt_mutex held by this task: */ +diff --git a/include/linux/sched/wake_q.h b/include/linux/sched/wake_q.h +index 10b19a192b2d..ce3ccff3d9d8 100644 +--- a/include/linux/sched/wake_q.h ++++ b/include/linux/sched/wake_q.h +@@ -47,8 +47,29 @@ static inline void wake_q_init(struct wake_q_head *head) + head->lastp = &head->first; + } + +-extern void wake_q_add(struct wake_q_head *head, +- struct task_struct *task); +-extern void wake_up_q(struct wake_q_head *head); ++extern void __wake_q_add(struct wake_q_head *head, ++ struct task_struct *task, bool sleeper); ++static inline void wake_q_add(struct wake_q_head *head, ++ struct task_struct *task) ++{ ++ __wake_q_add(head, task, false); ++} ++ ++static inline void wake_q_add_sleeper(struct wake_q_head *head, ++ struct task_struct *task) ++{ ++ __wake_q_add(head, task, true); ++} ++ ++extern void __wake_up_q(struct wake_q_head *head, bool sleeper); ++static inline void wake_up_q(struct wake_q_head *head) ++{ ++ __wake_up_q(head, false); ++} ++ ++static inline void wake_up_q_sleeper(struct wake_q_head *head) ++{ ++ __wake_up_q(head, true); ++} + + #endif /* _LINUX_SCHED_WAKE_Q_H */ +diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h +new file mode 100644 +index 000000000000..3696a77fa77d +--- /dev/null ++++ b/include/linux/spinlock_rt.h +@@ -0,0 +1,156 @@ ++#ifndef __LINUX_SPINLOCK_RT_H ++#define __LINUX_SPINLOCK_RT_H ++ ++#ifndef __LINUX_SPINLOCK_H ++#error Do not include directly. Use spinlock.h ++#endif ++ ++#include ++ ++extern void ++__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key); ++ ++#define spin_lock_init(slock) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ rt_mutex_init(&(slock)->lock); \ ++ __rt_spin_lock_init(slock, #slock, &__key); \ ++} while (0) ++ ++extern void __lockfunc rt_spin_lock(spinlock_t *lock); ++extern unsigned long __lockfunc rt_spin_lock_trace_flags(spinlock_t *lock); ++extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass); ++extern void __lockfunc rt_spin_unlock(spinlock_t *lock); ++extern void __lockfunc rt_spin_unlock_wait(spinlock_t *lock); ++extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags); ++extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock); ++extern int __lockfunc rt_spin_trylock(spinlock_t *lock); ++extern int atomic_dec_and_spin_lock(atomic_t *atomic, spinlock_t *lock); ++ ++/* ++ * lockdep-less calls, for derived types like rwlock: ++ * (for trylock they can use rt_mutex_trylock() directly. ++ * Migrate disable handling must be done at the call site. ++ */ ++extern void __lockfunc __rt_spin_lock(struct rt_mutex *lock); ++extern void __lockfunc __rt_spin_trylock(struct rt_mutex *lock); ++extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock); ++ ++#define spin_lock(lock) rt_spin_lock(lock) ++ ++#define spin_lock_bh(lock) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_spin_lock(lock); \ ++ } while (0) ++ ++#define spin_lock_irq(lock) spin_lock(lock) ++ ++#define spin_do_trylock(lock) __cond_lock(lock, rt_spin_trylock(lock)) ++ ++#define spin_trylock(lock) \ ++({ \ ++ int __locked; \ ++ __locked = spin_do_trylock(lock); \ ++ __locked; \ ++}) ++ ++#ifdef CONFIG_LOCKDEP ++# define spin_lock_nested(lock, subclass) \ ++ do { \ ++ rt_spin_lock_nested(lock, subclass); \ ++ } while (0) ++ ++#define spin_lock_bh_nested(lock, subclass) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_spin_lock_nested(lock, subclass); \ ++ } while (0) ++ ++# define spin_lock_irqsave_nested(lock, flags, subclass) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ flags = 0; \ ++ rt_spin_lock_nested(lock, subclass); \ ++ } while (0) ++#else ++# define spin_lock_nested(lock, subclass) spin_lock(lock) ++# define spin_lock_bh_nested(lock, subclass) spin_lock_bh(lock) ++ ++# define spin_lock_irqsave_nested(lock, flags, subclass) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ flags = 0; \ ++ spin_lock(lock); \ ++ } while (0) ++#endif ++ ++#define spin_lock_irqsave(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ flags = 0; \ ++ spin_lock(lock); \ ++ } while (0) ++ ++static inline unsigned long spin_lock_trace_flags(spinlock_t *lock) ++{ ++ unsigned long flags = 0; ++#ifdef CONFIG_TRACE_IRQFLAGS ++ flags = rt_spin_lock_trace_flags(lock); ++#else ++ spin_lock(lock); /* lock_local */ ++#endif ++ return flags; ++} ++ ++/* FIXME: we need rt_spin_lock_nest_lock */ ++#define spin_lock_nest_lock(lock, nest_lock) spin_lock_nested(lock, 0) ++ ++#define spin_unlock(lock) rt_spin_unlock(lock) ++ ++#define spin_unlock_bh(lock) \ ++ do { \ ++ rt_spin_unlock(lock); \ ++ local_bh_enable(); \ ++ } while (0) ++ ++#define spin_unlock_irq(lock) spin_unlock(lock) ++ ++#define spin_unlock_irqrestore(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ (void) flags; \ ++ spin_unlock(lock); \ ++ } while (0) ++ ++#define spin_trylock_bh(lock) __cond_lock(lock, rt_spin_trylock_bh(lock)) ++#define spin_trylock_irq(lock) spin_trylock(lock) ++ ++#define spin_trylock_irqsave(lock, flags) \ ++ rt_spin_trylock_irqsave(lock, &(flags)) ++ ++#define spin_unlock_wait(lock) rt_spin_unlock_wait(lock) ++ ++#ifdef CONFIG_GENERIC_LOCKBREAK ++# define spin_is_contended(lock) ((lock)->break_lock) ++#else ++# define spin_is_contended(lock) (((void)(lock), 0)) ++#endif ++ ++static inline int spin_can_lock(spinlock_t *lock) ++{ ++ return !rt_mutex_is_locked(&lock->lock); ++} ++ ++static inline int spin_is_locked(spinlock_t *lock) ++{ ++ return rt_mutex_is_locked(&lock->lock); ++} ++ ++static inline void assert_spin_locked(spinlock_t *lock) ++{ ++ BUG_ON(!spin_is_locked(lock)); ++} ++ ++#endif +diff --git a/include/linux/spinlock_types_rt.h b/include/linux/spinlock_types_rt.h +new file mode 100644 +index 000000000000..3e3d8c5f7a9a +--- /dev/null ++++ b/include/linux/spinlock_types_rt.h +@@ -0,0 +1,48 @@ ++#ifndef __LINUX_SPINLOCK_TYPES_RT_H ++#define __LINUX_SPINLOCK_TYPES_RT_H ++ ++#ifndef __LINUX_SPINLOCK_TYPES_H ++#error "Do not include directly. Include spinlock_types.h instead" ++#endif ++ ++#include ++ ++/* ++ * PREEMPT_RT: spinlocks - an RT mutex plus lock-break field: ++ */ ++typedef struct spinlock { ++ struct rt_mutex lock; ++ unsigned int break_lock; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++} spinlock_t; ++ ++#ifdef CONFIG_DEBUG_RT_MUTEXES ++# define __RT_SPIN_INITIALIZER(name) \ ++ { \ ++ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ ++ .save_state = 1, \ ++ .file = __FILE__, \ ++ .line = __LINE__ , \ ++ } ++#else ++# define __RT_SPIN_INITIALIZER(name) \ ++ { \ ++ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ ++ .save_state = 1, \ ++ } ++#endif ++ ++/* ++.wait_list = PLIST_HEAD_INIT_RAW((name).lock.wait_list, (name).lock.wait_lock) ++*/ ++ ++#define __SPIN_LOCK_UNLOCKED(name) \ ++ { .lock = __RT_SPIN_INITIALIZER(name.lock), \ ++ SPIN_DEP_MAP_INIT(name) } ++ ++#define DEFINE_SPINLOCK(name) \ ++ spinlock_t name = __SPIN_LOCK_UNLOCKED(name) ++ ++#endif +diff --git a/kernel/fork.c b/kernel/fork.c +index 29b54a64daf5..ecec0f8bef7e 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -900,6 +900,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) + tsk->splice_pipe = NULL; + tsk->task_frag.page = NULL; + tsk->wake_q.next = NULL; ++ tsk->wake_q_sleeper.next = NULL; + + account_kernel_stack(tsk, 1); + +diff --git a/kernel/futex.c b/kernel/futex.c +index cde7ff6f9a48..084527af43d4 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -1496,6 +1496,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_ + struct task_struct *new_owner; + bool postunlock = false; + DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); + int ret = 0; + + new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); +@@ -1555,13 +1556,13 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_ + pi_state->owner = new_owner; + raw_spin_unlock(&new_owner->pi_lock); + +- postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q); +- ++ postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q, ++ &wake_sleeper_q); + out_unlock: + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); + + if (postunlock) +- rt_mutex_postunlock(&wake_q); ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); + + return ret; + } +@@ -2890,7 +2891,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + goto no_block; + } + +- rt_mutex_init_waiter(&rt_waiter); ++ rt_mutex_init_waiter(&rt_waiter, false); + + /* + * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not +@@ -3283,7 +3284,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * The waiter is allocated on our stack, manipulated by the requeue + * code while we sleep on uaddr. + */ +- rt_mutex_init_waiter(&rt_waiter); ++ rt_mutex_init_waiter(&rt_waiter, false); + + ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); + if (unlikely(ret != 0)) +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index d732976d0f05..88df1ff7ca2d 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -7,6 +7,11 @@ + * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner + * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt + * Copyright (C) 2006 Esben Nielsen ++ * Adaptive Spinlocks: ++ * Copyright (C) 2008 Novell, Inc., Gregory Haskins, Sven Dietrich, ++ * and Peter Morreale, ++ * Adaptive Spinlocks simplification: ++ * Copyright (C) 2008 Red Hat, Inc., Steven Rostedt + * + * See Documentation/locking/rt-mutex-design.txt for details. + */ +@@ -234,7 +239,7 @@ static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock, + * Only use with rt_mutex_waiter_{less,equal}() + */ + #define task_to_waiter(p) \ +- &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline } ++ &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline, .task = (p) } + + static inline int + rt_mutex_waiter_less(struct rt_mutex_waiter *left, +@@ -274,6 +279,27 @@ rt_mutex_waiter_equal(struct rt_mutex_waiter *left, + return 1; + } + ++#define STEAL_NORMAL 0 ++#define STEAL_LATERAL 1 ++ ++static inline int ++rt_mutex_steal(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, int mode) ++{ ++ struct rt_mutex_waiter *top_waiter = rt_mutex_top_waiter(lock); ++ ++ if (waiter == top_waiter || rt_mutex_waiter_less(waiter, top_waiter)) ++ return 1; ++ ++ /* ++ * Note that RT tasks are excluded from lateral-steals ++ * to prevent the introduction of an unbounded latency. ++ */ ++ if (mode == STEAL_NORMAL || rt_task(waiter->task)) ++ return 0; ++ ++ return rt_mutex_waiter_equal(waiter, top_waiter); ++} ++ + static void + rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) + { +@@ -378,6 +404,14 @@ static bool rt_mutex_cond_detect_deadlock(struct rt_mutex_waiter *waiter, + return debug_rt_mutex_detect_deadlock(waiter, chwalk); + } + ++static void rt_mutex_wake_waiter(struct rt_mutex_waiter *waiter) ++{ ++ if (waiter->savestate) ++ wake_up_lock_sleeper(waiter->task); ++ else ++ wake_up_process(waiter->task); ++} ++ + /* + * Max number of times we'll walk the boosting chain: + */ +@@ -703,13 +737,16 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * follow here. This is the end of the chain we are walking. + */ + if (!rt_mutex_owner(lock)) { ++ struct rt_mutex_waiter *lock_top_waiter; ++ + /* + * If the requeue [7] above changed the top waiter, + * then we need to wake the new top waiter up to try + * to get the lock. + */ +- if (prerequeue_top_waiter != rt_mutex_top_waiter(lock)) +- wake_up_process(rt_mutex_top_waiter(lock)->task); ++ lock_top_waiter = rt_mutex_top_waiter(lock); ++ if (prerequeue_top_waiter != lock_top_waiter) ++ rt_mutex_wake_waiter(lock_top_waiter); + raw_spin_unlock_irq(&lock->wait_lock); + return 0; + } +@@ -811,9 +848,11 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * @task: The task which wants to acquire the lock + * @waiter: The waiter that is queued to the lock's wait tree if the + * callsite called task_blocked_on_lock(), otherwise NULL ++ * @mode: Lock steal mode (STEAL_NORMAL, STEAL_LATERAL) + */ +-static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, +- struct rt_mutex_waiter *waiter) ++static int __try_to_take_rt_mutex(struct rt_mutex *lock, ++ struct task_struct *task, ++ struct rt_mutex_waiter *waiter, int mode) + { + lockdep_assert_held(&lock->wait_lock); + +@@ -849,12 +888,11 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + */ + if (waiter) { + /* +- * If waiter is not the highest priority waiter of +- * @lock, give up. ++ * If waiter is not the highest priority waiter of @lock, ++ * or its peer when lateral steal is allowed, give up. + */ +- if (waiter != rt_mutex_top_waiter(lock)) ++ if (!rt_mutex_steal(lock, waiter, mode)) + return 0; +- + /* + * We can acquire the lock. Remove the waiter from the + * lock waiters tree. +@@ -872,14 +910,12 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + */ + if (rt_mutex_has_waiters(lock)) { + /* +- * If @task->prio is greater than or equal to +- * the top waiter priority (kernel view), +- * @task lost. ++ * If @task->prio is greater than the top waiter ++ * priority (kernel view), or equal to it when a ++ * lateral steal is forbidden, @task lost. + */ +- if (!rt_mutex_waiter_less(task_to_waiter(task), +- rt_mutex_top_waiter(lock))) ++ if (!rt_mutex_steal(lock, task_to_waiter(task), mode)) + return 0; +- + /* + * The current top waiter stays enqueued. We + * don't have to change anything in the lock +@@ -926,6 +962,296 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + return 1; + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++/* ++ * preemptible spin_lock functions: ++ */ ++static inline void rt_spin_lock_fastlock(struct rt_mutex *lock, ++ void (*slowfn)(struct rt_mutex *lock)) ++{ ++ might_sleep_no_state_check(); ++ ++ if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) ++ return; ++ else ++ slowfn(lock); ++} ++ ++static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock, ++ void (*slowfn)(struct rt_mutex *lock)) ++{ ++ if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) ++ return; ++ else ++ slowfn(lock); ++} ++#ifdef CONFIG_SMP ++/* ++ * Note that owner is a speculative pointer and dereferencing relies ++ * on rcu_read_lock() and the check against the lock owner. ++ */ ++static int adaptive_wait(struct rt_mutex *lock, ++ struct task_struct *owner) ++{ ++ int res = 0; ++ ++ rcu_read_lock(); ++ for (;;) { ++ if (owner != rt_mutex_owner(lock)) ++ break; ++ /* ++ * Ensure that owner->on_cpu is dereferenced _after_ ++ * checking the above to be valid. ++ */ ++ barrier(); ++ if (!owner->on_cpu) { ++ res = 1; ++ break; ++ } ++ cpu_relax(); ++ } ++ rcu_read_unlock(); ++ return res; ++} ++#else ++static int adaptive_wait(struct rt_mutex *lock, ++ struct task_struct *orig_owner) ++{ ++ return 1; ++} ++#endif ++ ++static int task_blocks_on_rt_mutex(struct rt_mutex *lock, ++ struct rt_mutex_waiter *waiter, ++ struct task_struct *task, ++ enum rtmutex_chainwalk chwalk); ++/* ++ * Slow path lock function spin_lock style: this variant is very ++ * careful not to miss any non-lock wakeups. ++ * ++ * We store the current state under p->pi_lock in p->saved_state and ++ * the try_to_wake_up() code handles this accordingly. ++ */ ++void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, ++ struct rt_mutex_waiter *waiter, ++ unsigned long flags) ++{ ++ struct task_struct *lock_owner, *self = current; ++ struct rt_mutex_waiter *top_waiter; ++ int ret; ++ ++ if (__try_to_take_rt_mutex(lock, self, NULL, STEAL_LATERAL)) ++ return; ++ ++ BUG_ON(rt_mutex_owner(lock) == self); ++ ++ /* ++ * We save whatever state the task is in and we'll restore it ++ * after acquiring the lock taking real wakeups into account ++ * as well. We are serialized via pi_lock against wakeups. See ++ * try_to_wake_up(). ++ */ ++ raw_spin_lock(&self->pi_lock); ++ self->saved_state = self->state; ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ ++ ret = task_blocks_on_rt_mutex(lock, waiter, self, RT_MUTEX_MIN_CHAINWALK); ++ BUG_ON(ret); ++ ++ for (;;) { ++ /* Try to acquire the lock again. */ ++ if (__try_to_take_rt_mutex(lock, self, waiter, STEAL_LATERAL)) ++ break; ++ ++ top_waiter = rt_mutex_top_waiter(lock); ++ lock_owner = rt_mutex_owner(lock); ++ ++ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ ++ debug_rt_mutex_print_deadlock(waiter); ++ ++ if (top_waiter != waiter || adaptive_wait(lock, lock_owner)) ++ schedule(); ++ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ } ++ ++ /* ++ * Restore the task state to current->saved_state. We set it ++ * to the original state above and the try_to_wake_up() code ++ * has possibly updated it when a real (non-rtmutex) wakeup ++ * happened while we were blocked. Clear saved_state so ++ * try_to_wakeup() does not get confused. ++ */ ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(self->saved_state); ++ self->saved_state = TASK_RUNNING; ++ raw_spin_unlock(&self->pi_lock); ++ ++ /* ++ * try_to_take_rt_mutex() sets the waiter bit ++ * unconditionally. We might have to fix that up: ++ */ ++ fixup_rt_mutex_waiters(lock); ++ ++ BUG_ON(rt_mutex_has_waiters(lock) && waiter == rt_mutex_top_waiter(lock)); ++ BUG_ON(!RB_EMPTY_NODE(&waiter->tree_entry)); ++} ++ ++static void noinline __sched rt_spin_lock_slowlock(struct rt_mutex *lock) ++{ ++ struct rt_mutex_waiter waiter; ++ unsigned long flags; ++ ++ rt_mutex_init_waiter(&waiter, true); ++ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ rt_spin_lock_slowlock_locked(lock, &waiter, flags); ++ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ debug_rt_mutex_free_waiter(&waiter); ++} ++ ++static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wq_sleeper); ++/* ++ * Slow path to release a rt_mutex spin_lock style ++ */ ++void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) ++{ ++ unsigned long flags; ++ DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); ++ bool postunlock; ++ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ postunlock = __rt_mutex_unlock_common(lock, &wake_q, &wake_sleeper_q); ++ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ ++ if (postunlock) ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); ++} ++ ++void __lockfunc rt_spin_lock(spinlock_t *lock) ++{ ++ migrate_disable(); ++ spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++} ++EXPORT_SYMBOL(rt_spin_lock); ++ ++void __lockfunc __rt_spin_lock(struct rt_mutex *lock) ++{ ++ rt_spin_lock_fastlock(lock, rt_spin_lock_slowlock); ++} ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) ++{ ++ migrate_disable(); ++ spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); ++ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++} ++EXPORT_SYMBOL(rt_spin_lock_nested); ++#endif ++ ++void __lockfunc rt_spin_unlock(spinlock_t *lock) ++{ ++ /* NOTE: we always pass in '1' for nested, for simplicity */ ++ spin_release(&lock->dep_map, 1, _RET_IP_); ++ rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); ++ migrate_enable(); ++} ++EXPORT_SYMBOL(rt_spin_unlock); ++ ++void __lockfunc __rt_spin_unlock(struct rt_mutex *lock) ++{ ++ rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock); ++} ++EXPORT_SYMBOL(__rt_spin_unlock); ++ ++/* ++ * Wait for the lock to get unlocked: instead of polling for an unlock ++ * (like raw spinlocks do), we lock and unlock, to force the kernel to ++ * schedule if there's contention: ++ */ ++void __lockfunc rt_spin_unlock_wait(spinlock_t *lock) ++{ ++ spin_lock(lock); ++ spin_unlock(lock); ++} ++EXPORT_SYMBOL(rt_spin_unlock_wait); ++ ++int __lockfunc rt_spin_trylock(spinlock_t *lock) ++{ ++ int ret; ++ ++ migrate_disable(); ++ ret = __rt_mutex_trylock(&lock->lock); ++ if (ret) ++ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ else ++ migrate_enable(); ++ return ret; ++} ++EXPORT_SYMBOL(rt_spin_trylock); ++ ++int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) ++{ ++ int ret; ++ ++ local_bh_disable(); ++ ret = __rt_mutex_trylock(&lock->lock); ++ if (ret) { ++ migrate_disable(); ++ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ } else ++ local_bh_enable(); ++ return ret; ++} ++EXPORT_SYMBOL(rt_spin_trylock_bh); ++ ++int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags) ++{ ++ int ret; ++ ++ *flags = 0; ++ ret = __rt_mutex_trylock(&lock->lock); ++ if (ret) { ++ migrate_disable(); ++ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ } ++ return ret; ++} ++EXPORT_SYMBOL(rt_spin_trylock_irqsave); ++ ++void ++__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held lock: ++ */ ++ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); ++ lockdep_init_map(&lock->dep_map, name, key, 0); ++#endif ++} ++EXPORT_SYMBOL(__rt_spin_lock_init); ++ ++#endif /* PREEMPT_RT_FULL */ ++ ++static inline int ++try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, ++ struct rt_mutex_waiter *waiter) ++{ ++ return __try_to_take_rt_mutex(lock, task, waiter, STEAL_NORMAL); ++} ++ + /* + * Task blocks on lock. + * +@@ -1039,6 +1365,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + * Called with lock->wait_lock held and interrupts disabled. + */ + static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q, + struct rt_mutex *lock) + { + struct rt_mutex_waiter *waiter; +@@ -1078,7 +1405,10 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, + * Pairs with preempt_enable() in rt_mutex_postunlock(); + */ + preempt_disable(); +- wake_q_add(wake_q, waiter->task); ++ if (waiter->savestate) ++ wake_q_add_sleeper(wake_sleeper_q, waiter->task); ++ else ++ wake_q_add(wake_q, waiter->task); + raw_spin_unlock(¤t->pi_lock); + } + +@@ -1162,21 +1492,22 @@ void rt_mutex_adjust_pi(struct task_struct *task) + return; + } + next_lock = waiter->lock; +- raw_spin_unlock_irqrestore(&task->pi_lock, flags); + + /* gets dropped in rt_mutex_adjust_prio_chain()! */ + get_task_struct(task); + ++ raw_spin_unlock_irqrestore(&task->pi_lock, flags); + rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL, + next_lock, NULL, task); + } + +-void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) ++void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate) + { + debug_rt_mutex_init_waiter(waiter); + RB_CLEAR_NODE(&waiter->pi_tree_entry); + RB_CLEAR_NODE(&waiter->tree_entry); + waiter->task = NULL; ++ waiter->savestate = savestate; + } + + /** +@@ -1293,7 +1624,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, + unsigned long flags; + int ret = 0; + +- rt_mutex_init_waiter(&waiter); ++ rt_mutex_init_waiter(&waiter, false); + + /* + * Technically we could use raw_spin_[un]lock_irq() here, but this can +@@ -1366,7 +1697,8 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) + * Return whether the current task needs to call rt_mutex_postunlock(). + */ + static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, +- struct wake_q_head *wake_q) ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q) + { + unsigned long flags; + +@@ -1420,7 +1752,7 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, + * + * Queue the next waiter for wakeup once we release the wait_lock. + */ +- mark_wakeup_next_waiter(wake_q, lock); ++ mark_wakeup_next_waiter(wake_q, wake_sleeper_q, lock); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + + return true; /* call rt_mutex_postunlock() */ +@@ -1472,9 +1804,11 @@ rt_mutex_fasttrylock(struct rt_mutex *lock, + /* + * Performs the wakeup of the the top-waiter and re-enables preemption. + */ +-void rt_mutex_postunlock(struct wake_q_head *wake_q) ++void rt_mutex_postunlock(struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q) + { + wake_up_q(wake_q); ++ wake_up_q_sleeper(wake_sleeper_q); + + /* Pairs with preempt_disable() in rt_mutex_slowunlock() */ + preempt_enable(); +@@ -1483,15 +1817,17 @@ void rt_mutex_postunlock(struct wake_q_head *wake_q) + static inline void + rt_mutex_fastunlock(struct rt_mutex *lock, + bool (*slowfn)(struct rt_mutex *lock, +- struct wake_q_head *wqh)) ++ struct wake_q_head *wqh, ++ struct wake_q_head *wq_sleeper)) + { + DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); + + if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) + return; + +- if (slowfn(lock, &wake_q)) +- rt_mutex_postunlock(&wake_q); ++ if (slowfn(lock, &wake_q, &wake_sleeper_q)) ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); + } + + int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) +@@ -1673,16 +2009,13 @@ void __sched __rt_mutex_unlock(struct rt_mutex *lock) + void __sched rt_mutex_unlock(struct rt_mutex *lock) + { + mutex_release(&lock->dep_map, 1, _RET_IP_); +- rt_mutex_fastunlock(lock, rt_mutex_slowunlock); ++ __rt_mutex_unlock(lock); + } + EXPORT_SYMBOL_GPL(rt_mutex_unlock); + +-/** +- * Futex variant, that since futex variants do not use the fast-path, can be +- * simple and will not need to retry. +- */ +-bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, +- struct wake_q_head *wake_q) ++static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wq_sleeper) + { + lockdep_assert_held(&lock->wait_lock); + +@@ -1699,23 +2032,35 @@ bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, + * avoid inversion prior to the wakeup. preempt_disable() + * therein pairs with rt_mutex_postunlock(). + */ +- mark_wakeup_next_waiter(wake_q, lock); ++ mark_wakeup_next_waiter(wake_q, wq_sleeper, lock); + + return true; /* call postunlock() */ + } + ++/** ++ * Futex variant, that since futex variants do not use the fast-path, can be ++ * simple and will not need to retry. ++ */ ++bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wq_sleeper) ++{ ++ return __rt_mutex_unlock_common(lock, wake_q, wq_sleeper); ++} ++ + void __sched rt_mutex_futex_unlock(struct rt_mutex *lock) + { + DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); + unsigned long flags; + bool postunlock; + + raw_spin_lock_irqsave(&lock->wait_lock, flags); +- postunlock = __rt_mutex_futex_unlock(lock, &wake_q); ++ postunlock = __rt_mutex_futex_unlock(lock, &wake_q, &wake_sleeper_q); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + + if (postunlock) +- rt_mutex_postunlock(&wake_q); ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); + } + + /** +@@ -1754,7 +2099,7 @@ void __rt_mutex_init(struct rt_mutex *lock, const char *name, + if (name && key) + debug_rt_mutex_init(lock, name, key); + } +-EXPORT_SYMBOL_GPL(__rt_mutex_init); ++EXPORT_SYMBOL(__rt_mutex_init); + + /** + * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a +@@ -1949,6 +2294,7 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, + struct hrtimer_sleeper *to, + struct rt_mutex_waiter *waiter) + { ++ struct task_struct *tsk = current; + int ret; + + raw_spin_lock_irq(&lock->wait_lock); +@@ -1960,6 +2306,24 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, + * have to fix that up. + */ + fixup_rt_mutex_waiters(lock); ++ /* ++ * RT has a problem here when the wait got interrupted by a timeout ++ * or a signal. task->pi_blocked_on is still set. The task must ++ * acquire the hash bucket lock when returning from this function. ++ * ++ * If the hash bucket lock is contended then the ++ * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in ++ * task_blocks_on_rt_mutex() will trigger. This can be avoided by ++ * clearing task->pi_blocked_on which removes the task from the ++ * boosting chain of the rtmutex. That's correct because the task ++ * is not longer blocked on it. ++ */ ++ if (ret) { ++ raw_spin_lock(&tsk->pi_lock); ++ tsk->pi_blocked_on = NULL; ++ raw_spin_unlock(&tsk->pi_lock); ++ } ++ + raw_spin_unlock_irq(&lock->wait_lock); + + return ret; +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index 5955ad2aa2a8..6fcf0a3e180d 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -30,6 +30,7 @@ struct rt_mutex_waiter { + struct rb_node pi_tree_entry; + struct task_struct *task; + struct rt_mutex *lock; ++ bool savestate; + #ifdef CONFIG_DEBUG_RT_MUTEXES + unsigned long ip; + struct pid *deadlock_task_pid; +@@ -139,7 +140,7 @@ extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, + struct task_struct *proxy_owner); + extern void rt_mutex_proxy_unlock(struct rt_mutex *lock, + struct task_struct *proxy_owner); +-extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter); ++extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savetate); + extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + struct rt_mutex_waiter *waiter, + struct task_struct *task); +@@ -157,9 +158,12 @@ extern int __rt_mutex_futex_trylock(struct rt_mutex *l); + + extern void rt_mutex_futex_unlock(struct rt_mutex *lock); + extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, +- struct wake_q_head *wqh); ++ struct wake_q_head *wqh, ++ struct wake_q_head *wq_sleeper); ++ ++extern void rt_mutex_postunlock(struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q); + +-extern void rt_mutex_postunlock(struct wake_q_head *wake_q); + /* RW semaphore special interface */ + + extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); +@@ -169,6 +173,10 @@ int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, + enum rtmutex_chainwalk chwalk, + struct rt_mutex_waiter *waiter); ++void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, ++ struct rt_mutex_waiter *waiter, ++ unsigned long flags); ++void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock); + + #ifdef CONFIG_DEBUG_RT_MUTEXES + # include "rtmutex-debug.h" +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 42b42ebf52bc..6a0ccaea2b42 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -401,9 +401,15 @@ static bool set_nr_if_polling(struct task_struct *p) + #endif + #endif + +-void wake_q_add(struct wake_q_head *head, struct task_struct *task) ++void __wake_q_add(struct wake_q_head *head, struct task_struct *task, ++ bool sleeper) + { +- struct wake_q_node *node = &task->wake_q; ++ struct wake_q_node *node; ++ ++ if (sleeper) ++ node = &task->wake_q_sleeper; ++ else ++ node = &task->wake_q; + + /* + * Atomically grab the task, if ->wake_q is !nil already it means +@@ -426,24 +432,32 @@ void wake_q_add(struct wake_q_head *head, struct task_struct *task) + head->lastp = &node->next; + } + +-void wake_up_q(struct wake_q_head *head) ++void __wake_up_q(struct wake_q_head *head, bool sleeper) + { + struct wake_q_node *node = head->first; + + while (node != WAKE_Q_TAIL) { + struct task_struct *task; + +- task = container_of(node, struct task_struct, wake_q); ++ if (sleeper) ++ task = container_of(node, struct task_struct, wake_q_sleeper); ++ else ++ task = container_of(node, struct task_struct, wake_q); + BUG_ON(!task); + /* Task can safely be re-inserted now: */ + node = node->next; +- task->wake_q.next = NULL; +- ++ if (sleeper) ++ task->wake_q_sleeper.next = NULL; ++ else ++ task->wake_q.next = NULL; + /* + * wake_up_process() executes a full barrier, which pairs with + * the queueing in wake_q_add() so as not to miss wakeups. + */ +- wake_up_process(task); ++ if (sleeper) ++ wake_up_lock_sleeper(task); ++ else ++ wake_up_process(task); + put_task_struct(task); + } + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0142-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch linux-4.19.118/debian/patches-rt/0142-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch --- linux-4.19.98/debian/patches-rt/0142-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0142-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,153 +0,0 @@ -From bee16dd12cbcf6b35c16d789870c4b5bd5e26436 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 16:36:39 +0200 -Subject: [PATCH 142/290] rtmutex: export lockdep-less version of rt_mutex's - lock, trylock and unlock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Required for lock implementation ontop of rtmutex. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 67 +++++++++++++++++++++------------ - kernel/locking/rtmutex_common.h | 3 ++ - 2 files changed, 46 insertions(+), 24 deletions(-) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 921345c31161..d732976d0f05 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1494,12 +1494,33 @@ rt_mutex_fastunlock(struct rt_mutex *lock, - rt_mutex_postunlock(&wake_q); - } - --static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) -+int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) - { - might_sleep(); -+ return rt_mutex_fastlock(lock, state, rt_mutex_slowlock); -+} -+ -+/** -+ * rt_mutex_lock_state - lock a rt_mutex with a given state -+ * -+ * @lock: The rt_mutex to be locked -+ * @state: The state to set when blocking on the rt_mutex -+ */ -+static inline int __sched rt_mutex_lock_state(struct rt_mutex *lock, -+ unsigned int subclass, int state) -+{ -+ int ret; - - mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); -- rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock); -+ ret = __rt_mutex_lock_state(lock, state); -+ if (ret) -+ mutex_release(&lock->dep_map, 1, _RET_IP_); -+ return ret; -+} -+ -+static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) -+{ -+ rt_mutex_lock_state(lock, subclass, TASK_UNINTERRUPTIBLE); - } - - #ifdef CONFIG_DEBUG_LOCK_ALLOC -@@ -1540,16 +1561,7 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock); - */ - int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock) - { -- int ret; -- -- might_sleep(); -- -- mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -- ret = rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, rt_mutex_slowlock); -- if (ret) -- mutex_release(&lock->dep_map, 1, _RET_IP_); -- -- return ret; -+ return rt_mutex_lock_state(lock, 0, TASK_INTERRUPTIBLE); - } - EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible); - -@@ -1575,13 +1587,10 @@ int __sched __rt_mutex_futex_trylock(struct rt_mutex *lock) - * Returns: - * 0 on success - * -EINTR when interrupted by a signal -- * -EDEADLK when the lock would deadlock (when deadlock detection is on) - */ - int __sched rt_mutex_lock_killable(struct rt_mutex *lock) - { -- might_sleep(); -- -- return rt_mutex_fastlock(lock, TASK_KILLABLE, rt_mutex_slowlock); -+ return rt_mutex_lock_state(lock, 0, TASK_KILLABLE); - } - EXPORT_SYMBOL_GPL(rt_mutex_lock_killable); - -@@ -1616,6 +1625,18 @@ rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout) - } - EXPORT_SYMBOL_GPL(rt_mutex_timed_lock); - -+int __sched __rt_mutex_trylock(struct rt_mutex *lock) -+{ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (WARN_ON_ONCE(in_irq() || in_nmi())) -+#else -+ if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) -+#endif -+ return 0; -+ -+ return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); -+} -+ - /** - * rt_mutex_trylock - try to lock a rt_mutex - * -@@ -1631,14 +1652,7 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) - { - int ret; - --#ifdef CONFIG_PREEMPT_RT_FULL -- if (WARN_ON_ONCE(in_irq() || in_nmi())) --#else -- if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) --#endif -- return 0; -- -- ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); -+ ret = __rt_mutex_trylock(lock); - if (ret) - mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); - -@@ -1646,6 +1660,11 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) - } - EXPORT_SYMBOL_GPL(rt_mutex_trylock); - -+void __sched __rt_mutex_unlock(struct rt_mutex *lock) -+{ -+ rt_mutex_fastunlock(lock, rt_mutex_slowunlock); -+} -+ - /** - * rt_mutex_unlock - unlock a rt_mutex - * -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index cb9815f0c766..5955ad2aa2a8 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -162,6 +162,9 @@ extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, - extern void rt_mutex_postunlock(struct wake_q_head *wake_q); - /* RW semaphore special interface */ - -+extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); -+extern int __rt_mutex_trylock(struct rt_mutex *lock); -+extern void __rt_mutex_unlock(struct rt_mutex *lock); - int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0143-rtmutex-add-mutex-implementation-based-on-rtmutex.patch linux-4.19.118/debian/patches-rt/0143-rtmutex-add-mutex-implementation-based-on-rtmutex.patch --- linux-4.19.98/debian/patches-rt/0143-rtmutex-add-mutex-implementation-based-on-rtmutex.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0143-rtmutex-add-mutex-implementation-based-on-rtmutex.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,383 @@ +From 15d28021a92b5a0f1230c2233ae8d4736bef3094 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 12 Oct 2017 17:17:03 +0200 +Subject: [PATCH 143/325] rtmutex: add mutex implementation based on rtmutex +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/mutex_rt.h | 130 ++++++++++++++++++++++ + kernel/locking/mutex-rt.c | 223 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 353 insertions(+) + create mode 100644 include/linux/mutex_rt.h + create mode 100644 kernel/locking/mutex-rt.c + +diff --git a/include/linux/mutex_rt.h b/include/linux/mutex_rt.h +new file mode 100644 +index 000000000000..3fcb5edb1d2b +--- /dev/null ++++ b/include/linux/mutex_rt.h +@@ -0,0 +1,130 @@ ++#ifndef __LINUX_MUTEX_RT_H ++#define __LINUX_MUTEX_RT_H ++ ++#ifndef __LINUX_MUTEX_H ++#error "Please include mutex.h" ++#endif ++ ++#include ++ ++/* FIXME: Just for __lockfunc */ ++#include ++ ++struct mutex { ++ struct rt_mutex lock; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++}; ++ ++#define __MUTEX_INITIALIZER(mutexname) \ ++ { \ ++ .lock = __RT_MUTEX_INITIALIZER(mutexname.lock) \ ++ __DEP_MAP_MUTEX_INITIALIZER(mutexname) \ ++ } ++ ++#define DEFINE_MUTEX(mutexname) \ ++ struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) ++ ++extern void __mutex_do_init(struct mutex *lock, const char *name, struct lock_class_key *key); ++extern void __lockfunc _mutex_lock(struct mutex *lock); ++extern void __lockfunc _mutex_lock_io(struct mutex *lock); ++extern void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass); ++extern int __lockfunc _mutex_lock_interruptible(struct mutex *lock); ++extern int __lockfunc _mutex_lock_killable(struct mutex *lock); ++extern void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass); ++extern void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest_lock); ++extern int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass); ++extern int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass); ++extern int __lockfunc _mutex_trylock(struct mutex *lock); ++extern void __lockfunc _mutex_unlock(struct mutex *lock); ++ ++#define mutex_is_locked(l) rt_mutex_is_locked(&(l)->lock) ++#define mutex_lock(l) _mutex_lock(l) ++#define mutex_lock_interruptible(l) _mutex_lock_interruptible(l) ++#define mutex_lock_killable(l) _mutex_lock_killable(l) ++#define mutex_trylock(l) _mutex_trylock(l) ++#define mutex_unlock(l) _mutex_unlock(l) ++#define mutex_lock_io(l) _mutex_lock_io(l); ++ ++#define __mutex_owner(l) ((l)->lock.owner) ++ ++#ifdef CONFIG_DEBUG_MUTEXES ++#define mutex_destroy(l) rt_mutex_destroy(&(l)->lock) ++#else ++static inline void mutex_destroy(struct mutex *lock) {} ++#endif ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define mutex_lock_nested(l, s) _mutex_lock_nested(l, s) ++# define mutex_lock_interruptible_nested(l, s) \ ++ _mutex_lock_interruptible_nested(l, s) ++# define mutex_lock_killable_nested(l, s) \ ++ _mutex_lock_killable_nested(l, s) ++# define mutex_lock_io_nested(l, s) _mutex_lock_io_nested(l, s) ++ ++# define mutex_lock_nest_lock(lock, nest_lock) \ ++do { \ ++ typecheck(struct lockdep_map *, &(nest_lock)->dep_map); \ ++ _mutex_lock_nest_lock(lock, &(nest_lock)->dep_map); \ ++} while (0) ++ ++#else ++# define mutex_lock_nested(l, s) _mutex_lock(l) ++# define mutex_lock_interruptible_nested(l, s) \ ++ _mutex_lock_interruptible(l) ++# define mutex_lock_killable_nested(l, s) \ ++ _mutex_lock_killable(l) ++# define mutex_lock_nest_lock(lock, nest_lock) mutex_lock(lock) ++# define mutex_lock_io_nested(l, s) _mutex_lock_io(l) ++#endif ++ ++# define mutex_init(mutex) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ rt_mutex_init(&(mutex)->lock); \ ++ __mutex_do_init((mutex), #mutex, &__key); \ ++} while (0) ++ ++# define __mutex_init(mutex, name, key) \ ++do { \ ++ rt_mutex_init(&(mutex)->lock); \ ++ __mutex_do_init((mutex), name, key); \ ++} while (0) ++ ++/** ++ * These values are chosen such that FAIL and SUCCESS match the ++ * values of the regular mutex_trylock(). ++ */ ++enum mutex_trylock_recursive_enum { ++ MUTEX_TRYLOCK_FAILED = 0, ++ MUTEX_TRYLOCK_SUCCESS = 1, ++ MUTEX_TRYLOCK_RECURSIVE, ++}; ++/** ++ * mutex_trylock_recursive - trylock variant that allows recursive locking ++ * @lock: mutex to be locked ++ * ++ * This function should not be used, _ever_. It is purely for hysterical GEM ++ * raisins, and once those are gone this will be removed. ++ * ++ * Returns: ++ * MUTEX_TRYLOCK_FAILED - trylock failed, ++ * MUTEX_TRYLOCK_SUCCESS - lock acquired, ++ * MUTEX_TRYLOCK_RECURSIVE - we already owned the lock. ++ */ ++int __rt_mutex_owner_current(struct rt_mutex *lock); ++ ++static inline /* __deprecated */ __must_check enum mutex_trylock_recursive_enum ++mutex_trylock_recursive(struct mutex *lock) ++{ ++ if (unlikely(__rt_mutex_owner_current(&lock->lock))) ++ return MUTEX_TRYLOCK_RECURSIVE; ++ ++ return mutex_trylock(lock); ++} ++ ++extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); ++ ++#endif +diff --git a/kernel/locking/mutex-rt.c b/kernel/locking/mutex-rt.c +new file mode 100644 +index 000000000000..4f81595c0f52 +--- /dev/null ++++ b/kernel/locking/mutex-rt.c +@@ -0,0 +1,223 @@ ++/* ++ * kernel/rt.c ++ * ++ * Real-Time Preemption Support ++ * ++ * started by Ingo Molnar: ++ * ++ * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar ++ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner ++ * ++ * historic credit for proving that Linux spinlocks can be implemented via ++ * RT-aware mutexes goes to many people: The Pmutex project (Dirk Grambow ++ * and others) who prototyped it on 2.4 and did lots of comparative ++ * research and analysis; TimeSys, for proving that you can implement a ++ * fully preemptible kernel via the use of IRQ threading and mutexes; ++ * Bill Huey for persuasively arguing on lkml that the mutex model is the ++ * right one; and to MontaVista, who ported pmutexes to 2.6. ++ * ++ * This code is a from-scratch implementation and is not based on pmutexes, ++ * but the idea of converting spinlocks to mutexes is used here too. ++ * ++ * lock debugging, locking tree, deadlock detection: ++ * ++ * Copyright (C) 2004, LynuxWorks, Inc., Igor Manyilov, Bill Huey ++ * Released under the General Public License (GPL). ++ * ++ * Includes portions of the generic R/W semaphore implementation from: ++ * ++ * Copyright (c) 2001 David Howells (dhowells@redhat.com). ++ * - Derived partially from idea by Andrea Arcangeli ++ * - Derived also from comments by Linus ++ * ++ * Pending ownership of locks and ownership stealing: ++ * ++ * Copyright (C) 2005, Kihon Technologies Inc., Steven Rostedt ++ * ++ * (also by Steven Rostedt) ++ * - Converted single pi_lock to individual task locks. ++ * ++ * By Esben Nielsen: ++ * Doing priority inheritance with help of the scheduler. ++ * ++ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner ++ * - major rework based on Esben Nielsens initial patch ++ * - replaced thread_info references by task_struct refs ++ * - removed task->pending_owner dependency ++ * - BKL drop/reacquire for semaphore style locks to avoid deadlocks ++ * in the scheduler return path as discussed with Steven Rostedt ++ * ++ * Copyright (C) 2006, Kihon Technologies Inc. ++ * Steven Rostedt ++ * - debugged and patched Thomas Gleixner's rework. ++ * - added back the cmpxchg to the rework. ++ * - turned atomic require back on for SMP. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "rtmutex_common.h" ++ ++/* ++ * struct mutex functions ++ */ ++void __mutex_do_init(struct mutex *mutex, const char *name, ++ struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held lock: ++ */ ++ debug_check_no_locks_freed((void *)mutex, sizeof(*mutex)); ++ lockdep_init_map(&mutex->dep_map, name, key, 0); ++#endif ++ mutex->lock.save_state = 0; ++} ++EXPORT_SYMBOL(__mutex_do_init); ++ ++void __lockfunc _mutex_lock(struct mutex *lock) ++{ ++ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); ++} ++EXPORT_SYMBOL(_mutex_lock); ++ ++void __lockfunc _mutex_lock_io(struct mutex *lock) ++{ ++ int token; ++ ++ token = io_schedule_prepare(); ++ _mutex_lock(lock); ++ io_schedule_finish(token); ++} ++EXPORT_SYMBOL_GPL(_mutex_lock_io); ++ ++int __lockfunc _mutex_lock_interruptible(struct mutex *lock) ++{ ++ int ret; ++ ++ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE); ++ if (ret) ++ mutex_release(&lock->dep_map, 1, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_interruptible); ++ ++int __lockfunc _mutex_lock_killable(struct mutex *lock) ++{ ++ int ret; ++ ++ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE); ++ if (ret) ++ mutex_release(&lock->dep_map, 1, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_killable); ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass) ++{ ++ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); ++ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); ++} ++EXPORT_SYMBOL(_mutex_lock_nested); ++ ++void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass) ++{ ++ int token; ++ ++ token = io_schedule_prepare(); ++ ++ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); ++ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); ++ ++ io_schedule_finish(token); ++} ++EXPORT_SYMBOL_GPL(_mutex_lock_io_nested); ++ ++void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest) ++{ ++ mutex_acquire_nest(&lock->dep_map, 0, 0, nest, _RET_IP_); ++ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); ++} ++EXPORT_SYMBOL(_mutex_lock_nest_lock); ++ ++int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass) ++{ ++ int ret; ++ ++ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); ++ ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE); ++ if (ret) ++ mutex_release(&lock->dep_map, 1, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_interruptible_nested); ++ ++int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass) ++{ ++ int ret; ++ ++ mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); ++ ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE); ++ if (ret) ++ mutex_release(&lock->dep_map, 1, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_killable_nested); ++#endif ++ ++int __lockfunc _mutex_trylock(struct mutex *lock) ++{ ++ int ret = __rt_mutex_trylock(&lock->lock); ++ ++ if (ret) ++ mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_trylock); ++ ++void __lockfunc _mutex_unlock(struct mutex *lock) ++{ ++ mutex_release(&lock->dep_map, 1, _RET_IP_); ++ __rt_mutex_unlock(&lock->lock); ++} ++EXPORT_SYMBOL(_mutex_unlock); ++ ++/** ++ * atomic_dec_and_mutex_lock - return holding mutex if we dec to 0 ++ * @cnt: the atomic which we are to dec ++ * @lock: the mutex to return holding if we dec to 0 ++ * ++ * return true and hold lock if we dec to 0, return false otherwise ++ */ ++int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock) ++{ ++ /* dec if we can't possibly hit 0 */ ++ if (atomic_add_unless(cnt, -1, 1)) ++ return 0; ++ /* we might hit 0, so take the lock */ ++ mutex_lock(lock); ++ if (!atomic_dec_and_test(cnt)) { ++ /* when we actually did the dec, we didn't hit 0 */ ++ mutex_unlock(lock); ++ return 0; ++ } ++ /* we hit 0, and we hold the lock */ ++ return 1; ++} ++EXPORT_SYMBOL(atomic_dec_and_mutex_lock); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0143-rtmutex-add-sleeping-lock-implementation.patch linux-4.19.118/debian/patches-rt/0143-rtmutex-add-sleeping-lock-implementation.patch --- linux-4.19.98/debian/patches-rt/0143-rtmutex-add-sleeping-lock-implementation.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0143-rtmutex-add-sleeping-lock-implementation.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,1208 +0,0 @@ -From c156cbabd8b7d07e6ddf840f29799447a47d4758 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:11:19 +0200 -Subject: [PATCH 143/290] rtmutex: add sleeping lock implementation -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/kernel.h | 4 + - include/linux/rtmutex.h | 21 +- - include/linux/sched.h | 8 + - include/linux/sched/wake_q.h | 27 +- - include/linux/spinlock_rt.h | 156 +++++++++++ - include/linux/spinlock_types_rt.h | 48 ++++ - kernel/fork.c | 1 + - kernel/futex.c | 11 +- - kernel/locking/rtmutex.c | 436 +++++++++++++++++++++++++++--- - kernel/locking/rtmutex_common.h | 14 +- - kernel/sched/core.c | 28 +- - 11 files changed, 695 insertions(+), 59 deletions(-) - create mode 100644 include/linux/spinlock_rt.h - create mode 100644 include/linux/spinlock_types_rt.h - -diff --git a/include/linux/kernel.h b/include/linux/kernel.h -index f6f94e54ab96..78f30d553037 100644 ---- a/include/linux/kernel.h -+++ b/include/linux/kernel.h -@@ -260,6 +260,9 @@ extern int _cond_resched(void); - */ - # define might_sleep() \ - do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) -+ -+# define might_sleep_no_state_check() \ -+ do { ___might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) - # define sched_annotate_sleep() (current->task_state_change = 0) - #else - static inline void ___might_sleep(const char *file, int line, -@@ -267,6 +270,7 @@ extern int _cond_resched(void); - static inline void __might_sleep(const char *file, int line, - int preempt_offset) { } - # define might_sleep() do { might_resched(); } while (0) -+# define might_sleep_no_state_check() do { might_resched(); } while (0) - # define sched_annotate_sleep() do { } while (0) - #endif - -diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h -index a355289b1fa1..138bd1e183e0 100644 ---- a/include/linux/rtmutex.h -+++ b/include/linux/rtmutex.h -@@ -14,11 +14,15 @@ - #define __LINUX_RT_MUTEX_H - - #include --#include - #include -+#include - - extern int max_lock_depth; /* for sysctl */ - -+#ifdef CONFIG_DEBUG_MUTEXES -+#include -+#endif -+ - /** - * The rt_mutex structure - * -@@ -31,8 +35,8 @@ struct rt_mutex { - raw_spinlock_t wait_lock; - struct rb_root_cached waiters; - struct task_struct *owner; --#ifdef CONFIG_DEBUG_RT_MUTEXES - int save_state; -+#ifdef CONFIG_DEBUG_RT_MUTEXES - const char *name, *file; - int line; - void *magic; -@@ -82,16 +86,23 @@ do { \ - #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) - #endif - --#define __RT_MUTEX_INITIALIZER(mutexname) \ -- { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ -+#define __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ -+ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ - , .waiters = RB_ROOT_CACHED \ - , .owner = NULL \ - __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ -- __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)} -+ __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) -+ -+#define __RT_MUTEX_INITIALIZER(mutexname) \ -+ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) } - - #define DEFINE_RT_MUTEX(mutexname) \ - struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) - -+#define __RT_MUTEX_INITIALIZER_SAVE_STATE(mutexname) \ -+ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ -+ , .save_state = 1 } -+ - /** - * rt_mutex_is_locked - is the mutex locked - * @lock: the mutex to be queried -diff --git a/include/linux/sched.h b/include/linux/sched.h -index baa5fceea0ff..f25c9566ee92 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -134,6 +134,9 @@ struct task_group; - smp_store_mb(current->state, (state_value)); \ - } while (0) - -+#define __set_current_state_no_track(state_value) \ -+ current->state = (state_value); -+ - #define set_special_state(state_value) \ - do { \ - unsigned long flags; /* may shadow */ \ -@@ -143,6 +146,7 @@ struct task_group; - current->state = (state_value); \ - raw_spin_unlock_irqrestore(¤t->pi_lock, flags); \ - } while (0) -+ - #else - /* - * set_current_state() includes a barrier so that the write of current->state -@@ -187,6 +191,9 @@ struct task_group; - #define set_current_state(state_value) \ - smp_store_mb(current->state, (state_value)) - -+#define __set_current_state_no_track(state_value) \ -+ __set_current_state(state_value) -+ - /* - * set_special_state() should be used for those states when the blocking task - * can not use the regular condition based wait-loop. In that case we must -@@ -914,6 +921,7 @@ struct task_struct { - raw_spinlock_t pi_lock; - - struct wake_q_node wake_q; -+ struct wake_q_node wake_q_sleeper; - - #ifdef CONFIG_RT_MUTEXES - /* PI waiters blocked on a rt_mutex held by this task: */ -diff --git a/include/linux/sched/wake_q.h b/include/linux/sched/wake_q.h -index 10b19a192b2d..ce3ccff3d9d8 100644 ---- a/include/linux/sched/wake_q.h -+++ b/include/linux/sched/wake_q.h -@@ -47,8 +47,29 @@ static inline void wake_q_init(struct wake_q_head *head) - head->lastp = &head->first; - } - --extern void wake_q_add(struct wake_q_head *head, -- struct task_struct *task); --extern void wake_up_q(struct wake_q_head *head); -+extern void __wake_q_add(struct wake_q_head *head, -+ struct task_struct *task, bool sleeper); -+static inline void wake_q_add(struct wake_q_head *head, -+ struct task_struct *task) -+{ -+ __wake_q_add(head, task, false); -+} -+ -+static inline void wake_q_add_sleeper(struct wake_q_head *head, -+ struct task_struct *task) -+{ -+ __wake_q_add(head, task, true); -+} -+ -+extern void __wake_up_q(struct wake_q_head *head, bool sleeper); -+static inline void wake_up_q(struct wake_q_head *head) -+{ -+ __wake_up_q(head, false); -+} -+ -+static inline void wake_up_q_sleeper(struct wake_q_head *head) -+{ -+ __wake_up_q(head, true); -+} - - #endif /* _LINUX_SCHED_WAKE_Q_H */ -diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h -new file mode 100644 -index 000000000000..3696a77fa77d ---- /dev/null -+++ b/include/linux/spinlock_rt.h -@@ -0,0 +1,156 @@ -+#ifndef __LINUX_SPINLOCK_RT_H -+#define __LINUX_SPINLOCK_RT_H -+ -+#ifndef __LINUX_SPINLOCK_H -+#error Do not include directly. Use spinlock.h -+#endif -+ -+#include -+ -+extern void -+__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key); -+ -+#define spin_lock_init(slock) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ rt_mutex_init(&(slock)->lock); \ -+ __rt_spin_lock_init(slock, #slock, &__key); \ -+} while (0) -+ -+extern void __lockfunc rt_spin_lock(spinlock_t *lock); -+extern unsigned long __lockfunc rt_spin_lock_trace_flags(spinlock_t *lock); -+extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass); -+extern void __lockfunc rt_spin_unlock(spinlock_t *lock); -+extern void __lockfunc rt_spin_unlock_wait(spinlock_t *lock); -+extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags); -+extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock); -+extern int __lockfunc rt_spin_trylock(spinlock_t *lock); -+extern int atomic_dec_and_spin_lock(atomic_t *atomic, spinlock_t *lock); -+ -+/* -+ * lockdep-less calls, for derived types like rwlock: -+ * (for trylock they can use rt_mutex_trylock() directly. -+ * Migrate disable handling must be done at the call site. -+ */ -+extern void __lockfunc __rt_spin_lock(struct rt_mutex *lock); -+extern void __lockfunc __rt_spin_trylock(struct rt_mutex *lock); -+extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock); -+ -+#define spin_lock(lock) rt_spin_lock(lock) -+ -+#define spin_lock_bh(lock) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_spin_lock(lock); \ -+ } while (0) -+ -+#define spin_lock_irq(lock) spin_lock(lock) -+ -+#define spin_do_trylock(lock) __cond_lock(lock, rt_spin_trylock(lock)) -+ -+#define spin_trylock(lock) \ -+({ \ -+ int __locked; \ -+ __locked = spin_do_trylock(lock); \ -+ __locked; \ -+}) -+ -+#ifdef CONFIG_LOCKDEP -+# define spin_lock_nested(lock, subclass) \ -+ do { \ -+ rt_spin_lock_nested(lock, subclass); \ -+ } while (0) -+ -+#define spin_lock_bh_nested(lock, subclass) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_spin_lock_nested(lock, subclass); \ -+ } while (0) -+ -+# define spin_lock_irqsave_nested(lock, flags, subclass) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ flags = 0; \ -+ rt_spin_lock_nested(lock, subclass); \ -+ } while (0) -+#else -+# define spin_lock_nested(lock, subclass) spin_lock(lock) -+# define spin_lock_bh_nested(lock, subclass) spin_lock_bh(lock) -+ -+# define spin_lock_irqsave_nested(lock, flags, subclass) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ flags = 0; \ -+ spin_lock(lock); \ -+ } while (0) -+#endif -+ -+#define spin_lock_irqsave(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ flags = 0; \ -+ spin_lock(lock); \ -+ } while (0) -+ -+static inline unsigned long spin_lock_trace_flags(spinlock_t *lock) -+{ -+ unsigned long flags = 0; -+#ifdef CONFIG_TRACE_IRQFLAGS -+ flags = rt_spin_lock_trace_flags(lock); -+#else -+ spin_lock(lock); /* lock_local */ -+#endif -+ return flags; -+} -+ -+/* FIXME: we need rt_spin_lock_nest_lock */ -+#define spin_lock_nest_lock(lock, nest_lock) spin_lock_nested(lock, 0) -+ -+#define spin_unlock(lock) rt_spin_unlock(lock) -+ -+#define spin_unlock_bh(lock) \ -+ do { \ -+ rt_spin_unlock(lock); \ -+ local_bh_enable(); \ -+ } while (0) -+ -+#define spin_unlock_irq(lock) spin_unlock(lock) -+ -+#define spin_unlock_irqrestore(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ (void) flags; \ -+ spin_unlock(lock); \ -+ } while (0) -+ -+#define spin_trylock_bh(lock) __cond_lock(lock, rt_spin_trylock_bh(lock)) -+#define spin_trylock_irq(lock) spin_trylock(lock) -+ -+#define spin_trylock_irqsave(lock, flags) \ -+ rt_spin_trylock_irqsave(lock, &(flags)) -+ -+#define spin_unlock_wait(lock) rt_spin_unlock_wait(lock) -+ -+#ifdef CONFIG_GENERIC_LOCKBREAK -+# define spin_is_contended(lock) ((lock)->break_lock) -+#else -+# define spin_is_contended(lock) (((void)(lock), 0)) -+#endif -+ -+static inline int spin_can_lock(spinlock_t *lock) -+{ -+ return !rt_mutex_is_locked(&lock->lock); -+} -+ -+static inline int spin_is_locked(spinlock_t *lock) -+{ -+ return rt_mutex_is_locked(&lock->lock); -+} -+ -+static inline void assert_spin_locked(spinlock_t *lock) -+{ -+ BUG_ON(!spin_is_locked(lock)); -+} -+ -+#endif -diff --git a/include/linux/spinlock_types_rt.h b/include/linux/spinlock_types_rt.h -new file mode 100644 -index 000000000000..3e3d8c5f7a9a ---- /dev/null -+++ b/include/linux/spinlock_types_rt.h -@@ -0,0 +1,48 @@ -+#ifndef __LINUX_SPINLOCK_TYPES_RT_H -+#define __LINUX_SPINLOCK_TYPES_RT_H -+ -+#ifndef __LINUX_SPINLOCK_TYPES_H -+#error "Do not include directly. Include spinlock_types.h instead" -+#endif -+ -+#include -+ -+/* -+ * PREEMPT_RT: spinlocks - an RT mutex plus lock-break field: -+ */ -+typedef struct spinlock { -+ struct rt_mutex lock; -+ unsigned int break_lock; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+} spinlock_t; -+ -+#ifdef CONFIG_DEBUG_RT_MUTEXES -+# define __RT_SPIN_INITIALIZER(name) \ -+ { \ -+ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ -+ .save_state = 1, \ -+ .file = __FILE__, \ -+ .line = __LINE__ , \ -+ } -+#else -+# define __RT_SPIN_INITIALIZER(name) \ -+ { \ -+ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ -+ .save_state = 1, \ -+ } -+#endif -+ -+/* -+.wait_list = PLIST_HEAD_INIT_RAW((name).lock.wait_list, (name).lock.wait_lock) -+*/ -+ -+#define __SPIN_LOCK_UNLOCKED(name) \ -+ { .lock = __RT_SPIN_INITIALIZER(name.lock), \ -+ SPIN_DEP_MAP_INIT(name) } -+ -+#define DEFINE_SPINLOCK(name) \ -+ spinlock_t name = __SPIN_LOCK_UNLOCKED(name) -+ -+#endif -diff --git a/kernel/fork.c b/kernel/fork.c -index a6f39cbb71c3..7399bff2e08d 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -890,6 +890,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) - tsk->splice_pipe = NULL; - tsk->task_frag.page = NULL; - tsk->wake_q.next = NULL; -+ tsk->wake_q_sleeper.next = NULL; - - account_kernel_stack(tsk, 1); - -diff --git a/kernel/futex.c b/kernel/futex.c -index 60be4530c767..4c448dddce3c 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -1479,6 +1479,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_ - struct task_struct *new_owner; - bool postunlock = false; - DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); - int ret = 0; - - new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); -@@ -1538,13 +1539,13 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_ - pi_state->owner = new_owner; - raw_spin_unlock(&new_owner->pi_lock); - -- postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q); -- -+ postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q, -+ &wake_sleeper_q); - out_unlock: - raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); - - if (postunlock) -- rt_mutex_postunlock(&wake_q); -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); - - return ret; - } -@@ -2873,7 +2874,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, - goto no_block; - } - -- rt_mutex_init_waiter(&rt_waiter); -+ rt_mutex_init_waiter(&rt_waiter, false); - - /* - * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not -@@ -3266,7 +3267,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * The waiter is allocated on our stack, manipulated by the requeue - * code while we sleep on uaddr. - */ -- rt_mutex_init_waiter(&rt_waiter); -+ rt_mutex_init_waiter(&rt_waiter, false); - - ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); - if (unlikely(ret != 0)) -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index d732976d0f05..88df1ff7ca2d 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -7,6 +7,11 @@ - * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner - * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt - * Copyright (C) 2006 Esben Nielsen -+ * Adaptive Spinlocks: -+ * Copyright (C) 2008 Novell, Inc., Gregory Haskins, Sven Dietrich, -+ * and Peter Morreale, -+ * Adaptive Spinlocks simplification: -+ * Copyright (C) 2008 Red Hat, Inc., Steven Rostedt - * - * See Documentation/locking/rt-mutex-design.txt for details. - */ -@@ -234,7 +239,7 @@ static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock, - * Only use with rt_mutex_waiter_{less,equal}() - */ - #define task_to_waiter(p) \ -- &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline } -+ &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline, .task = (p) } - - static inline int - rt_mutex_waiter_less(struct rt_mutex_waiter *left, -@@ -274,6 +279,27 @@ rt_mutex_waiter_equal(struct rt_mutex_waiter *left, - return 1; - } - -+#define STEAL_NORMAL 0 -+#define STEAL_LATERAL 1 -+ -+static inline int -+rt_mutex_steal(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, int mode) -+{ -+ struct rt_mutex_waiter *top_waiter = rt_mutex_top_waiter(lock); -+ -+ if (waiter == top_waiter || rt_mutex_waiter_less(waiter, top_waiter)) -+ return 1; -+ -+ /* -+ * Note that RT tasks are excluded from lateral-steals -+ * to prevent the introduction of an unbounded latency. -+ */ -+ if (mode == STEAL_NORMAL || rt_task(waiter->task)) -+ return 0; -+ -+ return rt_mutex_waiter_equal(waiter, top_waiter); -+} -+ - static void - rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) - { -@@ -378,6 +404,14 @@ static bool rt_mutex_cond_detect_deadlock(struct rt_mutex_waiter *waiter, - return debug_rt_mutex_detect_deadlock(waiter, chwalk); - } - -+static void rt_mutex_wake_waiter(struct rt_mutex_waiter *waiter) -+{ -+ if (waiter->savestate) -+ wake_up_lock_sleeper(waiter->task); -+ else -+ wake_up_process(waiter->task); -+} -+ - /* - * Max number of times we'll walk the boosting chain: - */ -@@ -703,13 +737,16 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, - * follow here. This is the end of the chain we are walking. - */ - if (!rt_mutex_owner(lock)) { -+ struct rt_mutex_waiter *lock_top_waiter; -+ - /* - * If the requeue [7] above changed the top waiter, - * then we need to wake the new top waiter up to try - * to get the lock. - */ -- if (prerequeue_top_waiter != rt_mutex_top_waiter(lock)) -- wake_up_process(rt_mutex_top_waiter(lock)->task); -+ lock_top_waiter = rt_mutex_top_waiter(lock); -+ if (prerequeue_top_waiter != lock_top_waiter) -+ rt_mutex_wake_waiter(lock_top_waiter); - raw_spin_unlock_irq(&lock->wait_lock); - return 0; - } -@@ -811,9 +848,11 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, - * @task: The task which wants to acquire the lock - * @waiter: The waiter that is queued to the lock's wait tree if the - * callsite called task_blocked_on_lock(), otherwise NULL -+ * @mode: Lock steal mode (STEAL_NORMAL, STEAL_LATERAL) - */ --static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, -- struct rt_mutex_waiter *waiter) -+static int __try_to_take_rt_mutex(struct rt_mutex *lock, -+ struct task_struct *task, -+ struct rt_mutex_waiter *waiter, int mode) - { - lockdep_assert_held(&lock->wait_lock); - -@@ -849,12 +888,11 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, - */ - if (waiter) { - /* -- * If waiter is not the highest priority waiter of -- * @lock, give up. -+ * If waiter is not the highest priority waiter of @lock, -+ * or its peer when lateral steal is allowed, give up. - */ -- if (waiter != rt_mutex_top_waiter(lock)) -+ if (!rt_mutex_steal(lock, waiter, mode)) - return 0; -- - /* - * We can acquire the lock. Remove the waiter from the - * lock waiters tree. -@@ -872,14 +910,12 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, - */ - if (rt_mutex_has_waiters(lock)) { - /* -- * If @task->prio is greater than or equal to -- * the top waiter priority (kernel view), -- * @task lost. -+ * If @task->prio is greater than the top waiter -+ * priority (kernel view), or equal to it when a -+ * lateral steal is forbidden, @task lost. - */ -- if (!rt_mutex_waiter_less(task_to_waiter(task), -- rt_mutex_top_waiter(lock))) -+ if (!rt_mutex_steal(lock, task_to_waiter(task), mode)) - return 0; -- - /* - * The current top waiter stays enqueued. We - * don't have to change anything in the lock -@@ -926,6 +962,296 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, - return 1; - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+/* -+ * preemptible spin_lock functions: -+ */ -+static inline void rt_spin_lock_fastlock(struct rt_mutex *lock, -+ void (*slowfn)(struct rt_mutex *lock)) -+{ -+ might_sleep_no_state_check(); -+ -+ if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) -+ return; -+ else -+ slowfn(lock); -+} -+ -+static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock, -+ void (*slowfn)(struct rt_mutex *lock)) -+{ -+ if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) -+ return; -+ else -+ slowfn(lock); -+} -+#ifdef CONFIG_SMP -+/* -+ * Note that owner is a speculative pointer and dereferencing relies -+ * on rcu_read_lock() and the check against the lock owner. -+ */ -+static int adaptive_wait(struct rt_mutex *lock, -+ struct task_struct *owner) -+{ -+ int res = 0; -+ -+ rcu_read_lock(); -+ for (;;) { -+ if (owner != rt_mutex_owner(lock)) -+ break; -+ /* -+ * Ensure that owner->on_cpu is dereferenced _after_ -+ * checking the above to be valid. -+ */ -+ barrier(); -+ if (!owner->on_cpu) { -+ res = 1; -+ break; -+ } -+ cpu_relax(); -+ } -+ rcu_read_unlock(); -+ return res; -+} -+#else -+static int adaptive_wait(struct rt_mutex *lock, -+ struct task_struct *orig_owner) -+{ -+ return 1; -+} -+#endif -+ -+static int task_blocks_on_rt_mutex(struct rt_mutex *lock, -+ struct rt_mutex_waiter *waiter, -+ struct task_struct *task, -+ enum rtmutex_chainwalk chwalk); -+/* -+ * Slow path lock function spin_lock style: this variant is very -+ * careful not to miss any non-lock wakeups. -+ * -+ * We store the current state under p->pi_lock in p->saved_state and -+ * the try_to_wake_up() code handles this accordingly. -+ */ -+void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, -+ struct rt_mutex_waiter *waiter, -+ unsigned long flags) -+{ -+ struct task_struct *lock_owner, *self = current; -+ struct rt_mutex_waiter *top_waiter; -+ int ret; -+ -+ if (__try_to_take_rt_mutex(lock, self, NULL, STEAL_LATERAL)) -+ return; -+ -+ BUG_ON(rt_mutex_owner(lock) == self); -+ -+ /* -+ * We save whatever state the task is in and we'll restore it -+ * after acquiring the lock taking real wakeups into account -+ * as well. We are serialized via pi_lock against wakeups. See -+ * try_to_wake_up(). -+ */ -+ raw_spin_lock(&self->pi_lock); -+ self->saved_state = self->state; -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ -+ ret = task_blocks_on_rt_mutex(lock, waiter, self, RT_MUTEX_MIN_CHAINWALK); -+ BUG_ON(ret); -+ -+ for (;;) { -+ /* Try to acquire the lock again. */ -+ if (__try_to_take_rt_mutex(lock, self, waiter, STEAL_LATERAL)) -+ break; -+ -+ top_waiter = rt_mutex_top_waiter(lock); -+ lock_owner = rt_mutex_owner(lock); -+ -+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ -+ debug_rt_mutex_print_deadlock(waiter); -+ -+ if (top_waiter != waiter || adaptive_wait(lock, lock_owner)) -+ schedule(); -+ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ } -+ -+ /* -+ * Restore the task state to current->saved_state. We set it -+ * to the original state above and the try_to_wake_up() code -+ * has possibly updated it when a real (non-rtmutex) wakeup -+ * happened while we were blocked. Clear saved_state so -+ * try_to_wakeup() does not get confused. -+ */ -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(self->saved_state); -+ self->saved_state = TASK_RUNNING; -+ raw_spin_unlock(&self->pi_lock); -+ -+ /* -+ * try_to_take_rt_mutex() sets the waiter bit -+ * unconditionally. We might have to fix that up: -+ */ -+ fixup_rt_mutex_waiters(lock); -+ -+ BUG_ON(rt_mutex_has_waiters(lock) && waiter == rt_mutex_top_waiter(lock)); -+ BUG_ON(!RB_EMPTY_NODE(&waiter->tree_entry)); -+} -+ -+static void noinline __sched rt_spin_lock_slowlock(struct rt_mutex *lock) -+{ -+ struct rt_mutex_waiter waiter; -+ unsigned long flags; -+ -+ rt_mutex_init_waiter(&waiter, true); -+ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ rt_spin_lock_slowlock_locked(lock, &waiter, flags); -+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ debug_rt_mutex_free_waiter(&waiter); -+} -+ -+static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wq_sleeper); -+/* -+ * Slow path to release a rt_mutex spin_lock style -+ */ -+void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) -+{ -+ unsigned long flags; -+ DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); -+ bool postunlock; -+ -+ raw_spin_lock_irqsave(&lock->wait_lock, flags); -+ postunlock = __rt_mutex_unlock_common(lock, &wake_q, &wake_sleeper_q); -+ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); -+ -+ if (postunlock) -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); -+} -+ -+void __lockfunc rt_spin_lock(spinlock_t *lock) -+{ -+ migrate_disable(); -+ spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+} -+EXPORT_SYMBOL(rt_spin_lock); -+ -+void __lockfunc __rt_spin_lock(struct rt_mutex *lock) -+{ -+ rt_spin_lock_fastlock(lock, rt_spin_lock_slowlock); -+} -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) -+{ -+ migrate_disable(); -+ spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); -+ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -+} -+EXPORT_SYMBOL(rt_spin_lock_nested); -+#endif -+ -+void __lockfunc rt_spin_unlock(spinlock_t *lock) -+{ -+ /* NOTE: we always pass in '1' for nested, for simplicity */ -+ spin_release(&lock->dep_map, 1, _RET_IP_); -+ rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); -+ migrate_enable(); -+} -+EXPORT_SYMBOL(rt_spin_unlock); -+ -+void __lockfunc __rt_spin_unlock(struct rt_mutex *lock) -+{ -+ rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock); -+} -+EXPORT_SYMBOL(__rt_spin_unlock); -+ -+/* -+ * Wait for the lock to get unlocked: instead of polling for an unlock -+ * (like raw spinlocks do), we lock and unlock, to force the kernel to -+ * schedule if there's contention: -+ */ -+void __lockfunc rt_spin_unlock_wait(spinlock_t *lock) -+{ -+ spin_lock(lock); -+ spin_unlock(lock); -+} -+EXPORT_SYMBOL(rt_spin_unlock_wait); -+ -+int __lockfunc rt_spin_trylock(spinlock_t *lock) -+{ -+ int ret; -+ -+ migrate_disable(); -+ ret = __rt_mutex_trylock(&lock->lock); -+ if (ret) -+ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ else -+ migrate_enable(); -+ return ret; -+} -+EXPORT_SYMBOL(rt_spin_trylock); -+ -+int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) -+{ -+ int ret; -+ -+ local_bh_disable(); -+ ret = __rt_mutex_trylock(&lock->lock); -+ if (ret) { -+ migrate_disable(); -+ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ } else -+ local_bh_enable(); -+ return ret; -+} -+EXPORT_SYMBOL(rt_spin_trylock_bh); -+ -+int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags) -+{ -+ int ret; -+ -+ *flags = 0; -+ ret = __rt_mutex_trylock(&lock->lock); -+ if (ret) { -+ migrate_disable(); -+ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ } -+ return ret; -+} -+EXPORT_SYMBOL(rt_spin_trylock_irqsave); -+ -+void -+__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held lock: -+ */ -+ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); -+ lockdep_init_map(&lock->dep_map, name, key, 0); -+#endif -+} -+EXPORT_SYMBOL(__rt_spin_lock_init); -+ -+#endif /* PREEMPT_RT_FULL */ -+ -+static inline int -+try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, -+ struct rt_mutex_waiter *waiter) -+{ -+ return __try_to_take_rt_mutex(lock, task, waiter, STEAL_NORMAL); -+} -+ - /* - * Task blocks on lock. - * -@@ -1039,6 +1365,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, - * Called with lock->wait_lock held and interrupts disabled. - */ - static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q, - struct rt_mutex *lock) - { - struct rt_mutex_waiter *waiter; -@@ -1078,7 +1405,10 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, - * Pairs with preempt_enable() in rt_mutex_postunlock(); - */ - preempt_disable(); -- wake_q_add(wake_q, waiter->task); -+ if (waiter->savestate) -+ wake_q_add_sleeper(wake_sleeper_q, waiter->task); -+ else -+ wake_q_add(wake_q, waiter->task); - raw_spin_unlock(¤t->pi_lock); - } - -@@ -1162,21 +1492,22 @@ void rt_mutex_adjust_pi(struct task_struct *task) - return; - } - next_lock = waiter->lock; -- raw_spin_unlock_irqrestore(&task->pi_lock, flags); - - /* gets dropped in rt_mutex_adjust_prio_chain()! */ - get_task_struct(task); - -+ raw_spin_unlock_irqrestore(&task->pi_lock, flags); - rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL, - next_lock, NULL, task); - } - --void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) -+void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate) - { - debug_rt_mutex_init_waiter(waiter); - RB_CLEAR_NODE(&waiter->pi_tree_entry); - RB_CLEAR_NODE(&waiter->tree_entry); - waiter->task = NULL; -+ waiter->savestate = savestate; - } - - /** -@@ -1293,7 +1624,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, - unsigned long flags; - int ret = 0; - -- rt_mutex_init_waiter(&waiter); -+ rt_mutex_init_waiter(&waiter, false); - - /* - * Technically we could use raw_spin_[un]lock_irq() here, but this can -@@ -1366,7 +1697,8 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) - * Return whether the current task needs to call rt_mutex_postunlock(). - */ - static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, -- struct wake_q_head *wake_q) -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q) - { - unsigned long flags; - -@@ -1420,7 +1752,7 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, - * - * Queue the next waiter for wakeup once we release the wait_lock. - */ -- mark_wakeup_next_waiter(wake_q, lock); -+ mark_wakeup_next_waiter(wake_q, wake_sleeper_q, lock); - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - - return true; /* call rt_mutex_postunlock() */ -@@ -1472,9 +1804,11 @@ rt_mutex_fasttrylock(struct rt_mutex *lock, - /* - * Performs the wakeup of the the top-waiter and re-enables preemption. - */ --void rt_mutex_postunlock(struct wake_q_head *wake_q) -+void rt_mutex_postunlock(struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q) - { - wake_up_q(wake_q); -+ wake_up_q_sleeper(wake_sleeper_q); - - /* Pairs with preempt_disable() in rt_mutex_slowunlock() */ - preempt_enable(); -@@ -1483,15 +1817,17 @@ void rt_mutex_postunlock(struct wake_q_head *wake_q) - static inline void - rt_mutex_fastunlock(struct rt_mutex *lock, - bool (*slowfn)(struct rt_mutex *lock, -- struct wake_q_head *wqh)) -+ struct wake_q_head *wqh, -+ struct wake_q_head *wq_sleeper)) - { - DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); - - if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) - return; - -- if (slowfn(lock, &wake_q)) -- rt_mutex_postunlock(&wake_q); -+ if (slowfn(lock, &wake_q, &wake_sleeper_q)) -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); - } - - int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) -@@ -1673,16 +2009,13 @@ void __sched __rt_mutex_unlock(struct rt_mutex *lock) - void __sched rt_mutex_unlock(struct rt_mutex *lock) - { - mutex_release(&lock->dep_map, 1, _RET_IP_); -- rt_mutex_fastunlock(lock, rt_mutex_slowunlock); -+ __rt_mutex_unlock(lock); - } - EXPORT_SYMBOL_GPL(rt_mutex_unlock); - --/** -- * Futex variant, that since futex variants do not use the fast-path, can be -- * simple and will not need to retry. -- */ --bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, -- struct wake_q_head *wake_q) -+static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wq_sleeper) - { - lockdep_assert_held(&lock->wait_lock); - -@@ -1699,23 +2032,35 @@ bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, - * avoid inversion prior to the wakeup. preempt_disable() - * therein pairs with rt_mutex_postunlock(). - */ -- mark_wakeup_next_waiter(wake_q, lock); -+ mark_wakeup_next_waiter(wake_q, wq_sleeper, lock); - - return true; /* call postunlock() */ - } - -+/** -+ * Futex variant, that since futex variants do not use the fast-path, can be -+ * simple and will not need to retry. -+ */ -+bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, -+ struct wake_q_head *wake_q, -+ struct wake_q_head *wq_sleeper) -+{ -+ return __rt_mutex_unlock_common(lock, wake_q, wq_sleeper); -+} -+ - void __sched rt_mutex_futex_unlock(struct rt_mutex *lock) - { - DEFINE_WAKE_Q(wake_q); -+ DEFINE_WAKE_Q(wake_sleeper_q); - unsigned long flags; - bool postunlock; - - raw_spin_lock_irqsave(&lock->wait_lock, flags); -- postunlock = __rt_mutex_futex_unlock(lock, &wake_q); -+ postunlock = __rt_mutex_futex_unlock(lock, &wake_q, &wake_sleeper_q); - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - - if (postunlock) -- rt_mutex_postunlock(&wake_q); -+ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); - } - - /** -@@ -1754,7 +2099,7 @@ void __rt_mutex_init(struct rt_mutex *lock, const char *name, - if (name && key) - debug_rt_mutex_init(lock, name, key); - } --EXPORT_SYMBOL_GPL(__rt_mutex_init); -+EXPORT_SYMBOL(__rt_mutex_init); - - /** - * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a -@@ -1949,6 +2294,7 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, - struct hrtimer_sleeper *to, - struct rt_mutex_waiter *waiter) - { -+ struct task_struct *tsk = current; - int ret; - - raw_spin_lock_irq(&lock->wait_lock); -@@ -1960,6 +2306,24 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, - * have to fix that up. - */ - fixup_rt_mutex_waiters(lock); -+ /* -+ * RT has a problem here when the wait got interrupted by a timeout -+ * or a signal. task->pi_blocked_on is still set. The task must -+ * acquire the hash bucket lock when returning from this function. -+ * -+ * If the hash bucket lock is contended then the -+ * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in -+ * task_blocks_on_rt_mutex() will trigger. This can be avoided by -+ * clearing task->pi_blocked_on which removes the task from the -+ * boosting chain of the rtmutex. That's correct because the task -+ * is not longer blocked on it. -+ */ -+ if (ret) { -+ raw_spin_lock(&tsk->pi_lock); -+ tsk->pi_blocked_on = NULL; -+ raw_spin_unlock(&tsk->pi_lock); -+ } -+ - raw_spin_unlock_irq(&lock->wait_lock); - - return ret; -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index 5955ad2aa2a8..6fcf0a3e180d 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -30,6 +30,7 @@ struct rt_mutex_waiter { - struct rb_node pi_tree_entry; - struct task_struct *task; - struct rt_mutex *lock; -+ bool savestate; - #ifdef CONFIG_DEBUG_RT_MUTEXES - unsigned long ip; - struct pid *deadlock_task_pid; -@@ -139,7 +140,7 @@ extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, - struct task_struct *proxy_owner); - extern void rt_mutex_proxy_unlock(struct rt_mutex *lock, - struct task_struct *proxy_owner); --extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter); -+extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savetate); - extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, - struct rt_mutex_waiter *waiter, - struct task_struct *task); -@@ -157,9 +158,12 @@ extern int __rt_mutex_futex_trylock(struct rt_mutex *l); - - extern void rt_mutex_futex_unlock(struct rt_mutex *lock); - extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, -- struct wake_q_head *wqh); -+ struct wake_q_head *wqh, -+ struct wake_q_head *wq_sleeper); -+ -+extern void rt_mutex_postunlock(struct wake_q_head *wake_q, -+ struct wake_q_head *wake_sleeper_q); - --extern void rt_mutex_postunlock(struct wake_q_head *wake_q); - /* RW semaphore special interface */ - - extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); -@@ -169,6 +173,10 @@ int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, - struct rt_mutex_waiter *waiter); -+void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, -+ struct rt_mutex_waiter *waiter, -+ unsigned long flags); -+void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock); - - #ifdef CONFIG_DEBUG_RT_MUTEXES - # include "rtmutex-debug.h" -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 42b42ebf52bc..6a0ccaea2b42 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -401,9 +401,15 @@ static bool set_nr_if_polling(struct task_struct *p) - #endif - #endif - --void wake_q_add(struct wake_q_head *head, struct task_struct *task) -+void __wake_q_add(struct wake_q_head *head, struct task_struct *task, -+ bool sleeper) - { -- struct wake_q_node *node = &task->wake_q; -+ struct wake_q_node *node; -+ -+ if (sleeper) -+ node = &task->wake_q_sleeper; -+ else -+ node = &task->wake_q; - - /* - * Atomically grab the task, if ->wake_q is !nil already it means -@@ -426,24 +432,32 @@ void wake_q_add(struct wake_q_head *head, struct task_struct *task) - head->lastp = &node->next; - } - --void wake_up_q(struct wake_q_head *head) -+void __wake_up_q(struct wake_q_head *head, bool sleeper) - { - struct wake_q_node *node = head->first; - - while (node != WAKE_Q_TAIL) { - struct task_struct *task; - -- task = container_of(node, struct task_struct, wake_q); -+ if (sleeper) -+ task = container_of(node, struct task_struct, wake_q_sleeper); -+ else -+ task = container_of(node, struct task_struct, wake_q); - BUG_ON(!task); - /* Task can safely be re-inserted now: */ - node = node->next; -- task->wake_q.next = NULL; -- -+ if (sleeper) -+ task->wake_q_sleeper.next = NULL; -+ else -+ task->wake_q.next = NULL; - /* - * wake_up_process() executes a full barrier, which pairs with - * the queueing in wake_q_add() so as not to miss wakeups. - */ -- wake_up_process(task); -+ if (sleeper) -+ wake_up_lock_sleeper(task); -+ else -+ wake_up_process(task); - put_task_struct(task); - } - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0144-rtmutex-add-mutex-implementation-based-on-rtmutex.patch linux-4.19.118/debian/patches-rt/0144-rtmutex-add-mutex-implementation-based-on-rtmutex.patch --- linux-4.19.98/debian/patches-rt/0144-rtmutex-add-mutex-implementation-based-on-rtmutex.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0144-rtmutex-add-mutex-implementation-based-on-rtmutex.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,383 +0,0 @@ -From 99c5293588e06d70bf0da65917ba3f7ab80dcf30 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:17:03 +0200 -Subject: [PATCH 144/290] rtmutex: add mutex implementation based on rtmutex -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/mutex_rt.h | 130 ++++++++++++++++++++++ - kernel/locking/mutex-rt.c | 223 ++++++++++++++++++++++++++++++++++++++ - 2 files changed, 353 insertions(+) - create mode 100644 include/linux/mutex_rt.h - create mode 100644 kernel/locking/mutex-rt.c - -diff --git a/include/linux/mutex_rt.h b/include/linux/mutex_rt.h -new file mode 100644 -index 000000000000..3fcb5edb1d2b ---- /dev/null -+++ b/include/linux/mutex_rt.h -@@ -0,0 +1,130 @@ -+#ifndef __LINUX_MUTEX_RT_H -+#define __LINUX_MUTEX_RT_H -+ -+#ifndef __LINUX_MUTEX_H -+#error "Please include mutex.h" -+#endif -+ -+#include -+ -+/* FIXME: Just for __lockfunc */ -+#include -+ -+struct mutex { -+ struct rt_mutex lock; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+}; -+ -+#define __MUTEX_INITIALIZER(mutexname) \ -+ { \ -+ .lock = __RT_MUTEX_INITIALIZER(mutexname.lock) \ -+ __DEP_MAP_MUTEX_INITIALIZER(mutexname) \ -+ } -+ -+#define DEFINE_MUTEX(mutexname) \ -+ struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) -+ -+extern void __mutex_do_init(struct mutex *lock, const char *name, struct lock_class_key *key); -+extern void __lockfunc _mutex_lock(struct mutex *lock); -+extern void __lockfunc _mutex_lock_io(struct mutex *lock); -+extern void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass); -+extern int __lockfunc _mutex_lock_interruptible(struct mutex *lock); -+extern int __lockfunc _mutex_lock_killable(struct mutex *lock); -+extern void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass); -+extern void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest_lock); -+extern int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass); -+extern int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass); -+extern int __lockfunc _mutex_trylock(struct mutex *lock); -+extern void __lockfunc _mutex_unlock(struct mutex *lock); -+ -+#define mutex_is_locked(l) rt_mutex_is_locked(&(l)->lock) -+#define mutex_lock(l) _mutex_lock(l) -+#define mutex_lock_interruptible(l) _mutex_lock_interruptible(l) -+#define mutex_lock_killable(l) _mutex_lock_killable(l) -+#define mutex_trylock(l) _mutex_trylock(l) -+#define mutex_unlock(l) _mutex_unlock(l) -+#define mutex_lock_io(l) _mutex_lock_io(l); -+ -+#define __mutex_owner(l) ((l)->lock.owner) -+ -+#ifdef CONFIG_DEBUG_MUTEXES -+#define mutex_destroy(l) rt_mutex_destroy(&(l)->lock) -+#else -+static inline void mutex_destroy(struct mutex *lock) {} -+#endif -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define mutex_lock_nested(l, s) _mutex_lock_nested(l, s) -+# define mutex_lock_interruptible_nested(l, s) \ -+ _mutex_lock_interruptible_nested(l, s) -+# define mutex_lock_killable_nested(l, s) \ -+ _mutex_lock_killable_nested(l, s) -+# define mutex_lock_io_nested(l, s) _mutex_lock_io_nested(l, s) -+ -+# define mutex_lock_nest_lock(lock, nest_lock) \ -+do { \ -+ typecheck(struct lockdep_map *, &(nest_lock)->dep_map); \ -+ _mutex_lock_nest_lock(lock, &(nest_lock)->dep_map); \ -+} while (0) -+ -+#else -+# define mutex_lock_nested(l, s) _mutex_lock(l) -+# define mutex_lock_interruptible_nested(l, s) \ -+ _mutex_lock_interruptible(l) -+# define mutex_lock_killable_nested(l, s) \ -+ _mutex_lock_killable(l) -+# define mutex_lock_nest_lock(lock, nest_lock) mutex_lock(lock) -+# define mutex_lock_io_nested(l, s) _mutex_lock_io(l) -+#endif -+ -+# define mutex_init(mutex) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ rt_mutex_init(&(mutex)->lock); \ -+ __mutex_do_init((mutex), #mutex, &__key); \ -+} while (0) -+ -+# define __mutex_init(mutex, name, key) \ -+do { \ -+ rt_mutex_init(&(mutex)->lock); \ -+ __mutex_do_init((mutex), name, key); \ -+} while (0) -+ -+/** -+ * These values are chosen such that FAIL and SUCCESS match the -+ * values of the regular mutex_trylock(). -+ */ -+enum mutex_trylock_recursive_enum { -+ MUTEX_TRYLOCK_FAILED = 0, -+ MUTEX_TRYLOCK_SUCCESS = 1, -+ MUTEX_TRYLOCK_RECURSIVE, -+}; -+/** -+ * mutex_trylock_recursive - trylock variant that allows recursive locking -+ * @lock: mutex to be locked -+ * -+ * This function should not be used, _ever_. It is purely for hysterical GEM -+ * raisins, and once those are gone this will be removed. -+ * -+ * Returns: -+ * MUTEX_TRYLOCK_FAILED - trylock failed, -+ * MUTEX_TRYLOCK_SUCCESS - lock acquired, -+ * MUTEX_TRYLOCK_RECURSIVE - we already owned the lock. -+ */ -+int __rt_mutex_owner_current(struct rt_mutex *lock); -+ -+static inline /* __deprecated */ __must_check enum mutex_trylock_recursive_enum -+mutex_trylock_recursive(struct mutex *lock) -+{ -+ if (unlikely(__rt_mutex_owner_current(&lock->lock))) -+ return MUTEX_TRYLOCK_RECURSIVE; -+ -+ return mutex_trylock(lock); -+} -+ -+extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); -+ -+#endif -diff --git a/kernel/locking/mutex-rt.c b/kernel/locking/mutex-rt.c -new file mode 100644 -index 000000000000..4f81595c0f52 ---- /dev/null -+++ b/kernel/locking/mutex-rt.c -@@ -0,0 +1,223 @@ -+/* -+ * kernel/rt.c -+ * -+ * Real-Time Preemption Support -+ * -+ * started by Ingo Molnar: -+ * -+ * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar -+ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner -+ * -+ * historic credit for proving that Linux spinlocks can be implemented via -+ * RT-aware mutexes goes to many people: The Pmutex project (Dirk Grambow -+ * and others) who prototyped it on 2.4 and did lots of comparative -+ * research and analysis; TimeSys, for proving that you can implement a -+ * fully preemptible kernel via the use of IRQ threading and mutexes; -+ * Bill Huey for persuasively arguing on lkml that the mutex model is the -+ * right one; and to MontaVista, who ported pmutexes to 2.6. -+ * -+ * This code is a from-scratch implementation and is not based on pmutexes, -+ * but the idea of converting spinlocks to mutexes is used here too. -+ * -+ * lock debugging, locking tree, deadlock detection: -+ * -+ * Copyright (C) 2004, LynuxWorks, Inc., Igor Manyilov, Bill Huey -+ * Released under the General Public License (GPL). -+ * -+ * Includes portions of the generic R/W semaphore implementation from: -+ * -+ * Copyright (c) 2001 David Howells (dhowells@redhat.com). -+ * - Derived partially from idea by Andrea Arcangeli -+ * - Derived also from comments by Linus -+ * -+ * Pending ownership of locks and ownership stealing: -+ * -+ * Copyright (C) 2005, Kihon Technologies Inc., Steven Rostedt -+ * -+ * (also by Steven Rostedt) -+ * - Converted single pi_lock to individual task locks. -+ * -+ * By Esben Nielsen: -+ * Doing priority inheritance with help of the scheduler. -+ * -+ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner -+ * - major rework based on Esben Nielsens initial patch -+ * - replaced thread_info references by task_struct refs -+ * - removed task->pending_owner dependency -+ * - BKL drop/reacquire for semaphore style locks to avoid deadlocks -+ * in the scheduler return path as discussed with Steven Rostedt -+ * -+ * Copyright (C) 2006, Kihon Technologies Inc. -+ * Steven Rostedt -+ * - debugged and patched Thomas Gleixner's rework. -+ * - added back the cmpxchg to the rework. -+ * - turned atomic require back on for SMP. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "rtmutex_common.h" -+ -+/* -+ * struct mutex functions -+ */ -+void __mutex_do_init(struct mutex *mutex, const char *name, -+ struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held lock: -+ */ -+ debug_check_no_locks_freed((void *)mutex, sizeof(*mutex)); -+ lockdep_init_map(&mutex->dep_map, name, key, 0); -+#endif -+ mutex->lock.save_state = 0; -+} -+EXPORT_SYMBOL(__mutex_do_init); -+ -+void __lockfunc _mutex_lock(struct mutex *lock) -+{ -+ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); -+} -+EXPORT_SYMBOL(_mutex_lock); -+ -+void __lockfunc _mutex_lock_io(struct mutex *lock) -+{ -+ int token; -+ -+ token = io_schedule_prepare(); -+ _mutex_lock(lock); -+ io_schedule_finish(token); -+} -+EXPORT_SYMBOL_GPL(_mutex_lock_io); -+ -+int __lockfunc _mutex_lock_interruptible(struct mutex *lock) -+{ -+ int ret; -+ -+ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE); -+ if (ret) -+ mutex_release(&lock->dep_map, 1, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_interruptible); -+ -+int __lockfunc _mutex_lock_killable(struct mutex *lock) -+{ -+ int ret; -+ -+ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); -+ ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE); -+ if (ret) -+ mutex_release(&lock->dep_map, 1, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_killable); -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass) -+{ -+ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); -+ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); -+} -+EXPORT_SYMBOL(_mutex_lock_nested); -+ -+void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass) -+{ -+ int token; -+ -+ token = io_schedule_prepare(); -+ -+ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); -+ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); -+ -+ io_schedule_finish(token); -+} -+EXPORT_SYMBOL_GPL(_mutex_lock_io_nested); -+ -+void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest) -+{ -+ mutex_acquire_nest(&lock->dep_map, 0, 0, nest, _RET_IP_); -+ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); -+} -+EXPORT_SYMBOL(_mutex_lock_nest_lock); -+ -+int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass) -+{ -+ int ret; -+ -+ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); -+ ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE); -+ if (ret) -+ mutex_release(&lock->dep_map, 1, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_interruptible_nested); -+ -+int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass) -+{ -+ int ret; -+ -+ mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); -+ ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE); -+ if (ret) -+ mutex_release(&lock->dep_map, 1, _RET_IP_); -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_lock_killable_nested); -+#endif -+ -+int __lockfunc _mutex_trylock(struct mutex *lock) -+{ -+ int ret = __rt_mutex_trylock(&lock->lock); -+ -+ if (ret) -+ mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); -+ -+ return ret; -+} -+EXPORT_SYMBOL(_mutex_trylock); -+ -+void __lockfunc _mutex_unlock(struct mutex *lock) -+{ -+ mutex_release(&lock->dep_map, 1, _RET_IP_); -+ __rt_mutex_unlock(&lock->lock); -+} -+EXPORT_SYMBOL(_mutex_unlock); -+ -+/** -+ * atomic_dec_and_mutex_lock - return holding mutex if we dec to 0 -+ * @cnt: the atomic which we are to dec -+ * @lock: the mutex to return holding if we dec to 0 -+ * -+ * return true and hold lock if we dec to 0, return false otherwise -+ */ -+int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock) -+{ -+ /* dec if we can't possibly hit 0 */ -+ if (atomic_add_unless(cnt, -1, 1)) -+ return 0; -+ /* we might hit 0, so take the lock */ -+ mutex_lock(lock); -+ if (!atomic_dec_and_test(cnt)) { -+ /* when we actually did the dec, we didn't hit 0 */ -+ mutex_unlock(lock); -+ return 0; -+ } -+ /* we hit 0, and we hold the lock */ -+ return 1; -+} -+EXPORT_SYMBOL(atomic_dec_and_mutex_lock); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0144-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch linux-4.19.118/debian/patches-rt/0144-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch --- linux-4.19.98/debian/patches-rt/0144-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0144-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,427 @@ +From fba892eef51771a402f94769548168cd62460a3a Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 12 Oct 2017 17:28:34 +0200 +Subject: [PATCH 144/325] rtmutex: add rwsem implementation based on rtmutex +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The RT specific R/W semaphore implementation restricts the number of readers +to one because a writer cannot block on multiple readers and inherit its +priority or budget. + +The single reader restricting is painful in various ways: + + - Performance bottleneck for multi-threaded applications in the page fault + path (mmap sem) + + - Progress blocker for drivers which are carefully crafted to avoid the + potential reader/writer deadlock in mainline. + +The analysis of the writer code pathes shows, that properly written RT tasks +should not take them. Syscalls like mmap(), file access which take mmap sem +write locked have unbound latencies which are completely unrelated to mmap +sem. Other R/W sem users like graphics drivers are not suitable for RT tasks +either. + +So there is little risk to hurt RT tasks when the RT rwsem implementation is +changed in the following way: + + - Allow concurrent readers + + - Make writers block until the last reader left the critical section. This + blocking is not subject to priority/budget inheritance. + + - Readers blocked on a writer inherit their priority/budget in the normal + way. + +There is a drawback with this scheme. R/W semaphores become writer unfair +though the applications which have triggered writer starvation (mostly on +mmap_sem) in the past are not really the typical workloads running on a RT +system. So while it's unlikely to hit writer starvation, it's possible. If +there are unexpected workloads on RT systems triggering it, we need to rethink +the approach. + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/rwsem_rt.h | 68 +++++++++ + kernel/locking/rwsem-rt.c | 293 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 361 insertions(+) + create mode 100644 include/linux/rwsem_rt.h + create mode 100644 kernel/locking/rwsem-rt.c + +diff --git a/include/linux/rwsem_rt.h b/include/linux/rwsem_rt.h +new file mode 100644 +index 000000000000..2018ff77904a +--- /dev/null ++++ b/include/linux/rwsem_rt.h +@@ -0,0 +1,68 @@ ++#ifndef _LINUX_RWSEM_RT_H ++#define _LINUX_RWSEM_RT_H ++ ++#ifndef _LINUX_RWSEM_H ++#error "Include rwsem.h" ++#endif ++ ++#include ++#include ++ ++#define READER_BIAS (1U << 31) ++#define WRITER_BIAS (1U << 30) ++ ++struct rw_semaphore { ++ atomic_t readers; ++ struct rt_mutex rtmutex; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++}; ++ ++#define __RWSEM_INITIALIZER(name) \ ++{ \ ++ .readers = ATOMIC_INIT(READER_BIAS), \ ++ .rtmutex = __RT_MUTEX_INITIALIZER(name.rtmutex), \ ++ RW_DEP_MAP_INIT(name) \ ++} ++ ++#define DECLARE_RWSEM(lockname) \ ++ struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname) ++ ++extern void __rwsem_init(struct rw_semaphore *rwsem, const char *name, ++ struct lock_class_key *key); ++ ++#define __init_rwsem(sem, name, key) \ ++do { \ ++ rt_mutex_init(&(sem)->rtmutex); \ ++ __rwsem_init((sem), (name), (key)); \ ++} while (0) ++ ++#define init_rwsem(sem) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ __init_rwsem((sem), #sem, &__key); \ ++} while (0) ++ ++static inline int rwsem_is_locked(struct rw_semaphore *sem) ++{ ++ return atomic_read(&sem->readers) != READER_BIAS; ++} ++ ++static inline int rwsem_is_contended(struct rw_semaphore *sem) ++{ ++ return atomic_read(&sem->readers) > 0; ++} ++ ++extern void __down_read(struct rw_semaphore *sem); ++extern int __down_read_killable(struct rw_semaphore *sem); ++extern int __down_read_trylock(struct rw_semaphore *sem); ++extern void __down_write(struct rw_semaphore *sem); ++extern int __must_check __down_write_killable(struct rw_semaphore *sem); ++extern int __down_write_trylock(struct rw_semaphore *sem); ++extern void __up_read(struct rw_semaphore *sem); ++extern void __up_write(struct rw_semaphore *sem); ++extern void __downgrade_write(struct rw_semaphore *sem); ++ ++#endif +diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c +new file mode 100644 +index 000000000000..7d3c5cf3d23d +--- /dev/null ++++ b/kernel/locking/rwsem-rt.c +@@ -0,0 +1,293 @@ ++/* ++ */ ++#include ++#include ++#include ++#include ++ ++#include "rtmutex_common.h" ++ ++/* ++ * RT-specific reader/writer semaphores ++ * ++ * down_write() ++ * 1) Lock sem->rtmutex ++ * 2) Remove the reader BIAS to force readers into the slow path ++ * 3) Wait until all readers have left the critical region ++ * 4) Mark it write locked ++ * ++ * up_write() ++ * 1) Remove the write locked marker ++ * 2) Set the reader BIAS so readers can use the fast path again ++ * 3) Unlock sem->rtmutex to release blocked readers ++ * ++ * down_read() ++ * 1) Try fast path acquisition (reader BIAS is set) ++ * 2) Take sem->rtmutex.wait_lock which protects the writelocked flag ++ * 3) If !writelocked, acquire it for read ++ * 4) If writelocked, block on sem->rtmutex ++ * 5) unlock sem->rtmutex, goto 1) ++ * ++ * up_read() ++ * 1) Try fast path release (reader count != 1) ++ * 2) Wake the writer waiting in down_write()#3 ++ * ++ * down_read()#3 has the consequence, that rw semaphores on RT are not writer ++ * fair, but writers, which should be avoided in RT tasks (think mmap_sem), ++ * are subject to the rtmutex priority/DL inheritance mechanism. ++ * ++ * It's possible to make the rw semaphores writer fair by keeping a list of ++ * active readers. A blocked writer would force all newly incoming readers to ++ * block on the rtmutex, but the rtmutex would have to be proxy locked for one ++ * reader after the other. We can't use multi-reader inheritance because there ++ * is no way to support that with SCHED_DEADLINE. Implementing the one by one ++ * reader boosting/handover mechanism is a major surgery for a very dubious ++ * value. ++ * ++ * The risk of writer starvation is there, but the pathological use cases ++ * which trigger it are not necessarily the typical RT workloads. ++ */ ++ ++void __rwsem_init(struct rw_semaphore *sem, const char *name, ++ struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held semaphore: ++ */ ++ debug_check_no_locks_freed((void *)sem, sizeof(*sem)); ++ lockdep_init_map(&sem->dep_map, name, key, 0); ++#endif ++ atomic_set(&sem->readers, READER_BIAS); ++} ++EXPORT_SYMBOL(__rwsem_init); ++ ++int __down_read_trylock(struct rw_semaphore *sem) ++{ ++ int r, old; ++ ++ /* ++ * Increment reader count, if sem->readers < 0, i.e. READER_BIAS is ++ * set. ++ */ ++ for (r = atomic_read(&sem->readers); r < 0;) { ++ old = atomic_cmpxchg(&sem->readers, r, r + 1); ++ if (likely(old == r)) ++ return 1; ++ r = old; ++ } ++ return 0; ++} ++ ++static int __sched __down_read_common(struct rw_semaphore *sem, int state) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ struct rt_mutex_waiter waiter; ++ int ret; ++ ++ if (__down_read_trylock(sem)) ++ return 0; ++ ++ might_sleep(); ++ raw_spin_lock_irq(&m->wait_lock); ++ /* ++ * Allow readers as long as the writer has not completely ++ * acquired the semaphore for write. ++ */ ++ if (atomic_read(&sem->readers) != WRITER_BIAS) { ++ atomic_inc(&sem->readers); ++ raw_spin_unlock_irq(&m->wait_lock); ++ return 0; ++ } ++ ++ /* ++ * Call into the slow lock path with the rtmutex->wait_lock ++ * held, so this can't result in the following race: ++ * ++ * Reader1 Reader2 Writer ++ * down_read() ++ * down_write() ++ * rtmutex_lock(m) ++ * swait() ++ * down_read() ++ * unlock(m->wait_lock) ++ * up_read() ++ * swake() ++ * lock(m->wait_lock) ++ * sem->writelocked=true ++ * unlock(m->wait_lock) ++ * ++ * up_write() ++ * sem->writelocked=false ++ * rtmutex_unlock(m) ++ * down_read() ++ * down_write() ++ * rtmutex_lock(m) ++ * swait() ++ * rtmutex_lock(m) ++ * ++ * That would put Reader1 behind the writer waiting on ++ * Reader2 to call up_read() which might be unbound. ++ */ ++ rt_mutex_init_waiter(&waiter, false); ++ ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, ++ &waiter); ++ /* ++ * The slowlock() above is guaranteed to return with the rtmutex (for ++ * ret = 0) is now held, so there can't be a writer active. Increment ++ * the reader count and immediately drop the rtmutex again. ++ * For ret != 0 we don't hold the rtmutex and need unlock the wait_lock. ++ * We don't own the lock then. ++ */ ++ if (!ret) ++ atomic_inc(&sem->readers); ++ raw_spin_unlock_irq(&m->wait_lock); ++ if (!ret) ++ __rt_mutex_unlock(m); ++ ++ debug_rt_mutex_free_waiter(&waiter); ++ return ret; ++} ++ ++void __down_read(struct rw_semaphore *sem) ++{ ++ int ret; ++ ++ ret = __down_read_common(sem, TASK_UNINTERRUPTIBLE); ++ WARN_ON_ONCE(ret); ++} ++ ++int __down_read_killable(struct rw_semaphore *sem) ++{ ++ int ret; ++ ++ ret = __down_read_common(sem, TASK_KILLABLE); ++ if (likely(!ret)) ++ return ret; ++ WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); ++ return -EINTR; ++} ++ ++void __up_read(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ struct task_struct *tsk; ++ ++ /* ++ * sem->readers can only hit 0 when a writer is waiting for the ++ * active readers to leave the critical region. ++ */ ++ if (!atomic_dec_and_test(&sem->readers)) ++ return; ++ ++ might_sleep(); ++ raw_spin_lock_irq(&m->wait_lock); ++ /* ++ * Wake the writer, i.e. the rtmutex owner. It might release the ++ * rtmutex concurrently in the fast path (due to a signal), but to ++ * clean up the rwsem it needs to acquire m->wait_lock. The worst ++ * case which can happen is a spurious wakeup. ++ */ ++ tsk = rt_mutex_owner(m); ++ if (tsk) ++ wake_up_process(tsk); ++ ++ raw_spin_unlock_irq(&m->wait_lock); ++} ++ ++static void __up_write_unlock(struct rw_semaphore *sem, int bias, ++ unsigned long flags) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ ++ atomic_add(READER_BIAS - bias, &sem->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ __rt_mutex_unlock(m); ++} ++ ++static int __sched __down_write_common(struct rw_semaphore *sem, int state) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ /* Take the rtmutex as a first step */ ++ if (__rt_mutex_lock_state(m, state)) ++ return -EINTR; ++ ++ /* Force readers into slow path */ ++ atomic_sub(READER_BIAS, &sem->readers); ++ might_sleep(); ++ ++ set_current_state(state); ++ for (;;) { ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ /* Have all readers left the critical region? */ ++ if (!atomic_read(&sem->readers)) { ++ atomic_set(&sem->readers, WRITER_BIAS); ++ __set_current_state(TASK_RUNNING); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return 0; ++ } ++ ++ if (signal_pending_state(state, current)) { ++ __set_current_state(TASK_RUNNING); ++ __up_write_unlock(sem, 0, flags); ++ return -EINTR; ++ } ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ ++ if (atomic_read(&sem->readers) != 0) { ++ schedule(); ++ set_current_state(state); ++ } ++ } ++} ++ ++void __sched __down_write(struct rw_semaphore *sem) ++{ ++ __down_write_common(sem, TASK_UNINTERRUPTIBLE); ++} ++ ++int __sched __down_write_killable(struct rw_semaphore *sem) ++{ ++ return __down_write_common(sem, TASK_KILLABLE); ++} ++ ++int __down_write_trylock(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ if (!__rt_mutex_trylock(m)) ++ return 0; ++ ++ atomic_sub(READER_BIAS, &sem->readers); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ if (!atomic_read(&sem->readers)) { ++ atomic_set(&sem->readers, WRITER_BIAS); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return 1; ++ } ++ __up_write_unlock(sem, 0, flags); ++ return 0; ++} ++ ++void __up_write(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ __up_write_unlock(sem, WRITER_BIAS, flags); ++} ++ ++void __downgrade_write(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ /* Release it and account current as reader */ ++ __up_write_unlock(sem, WRITER_BIAS - 1, flags); ++} +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0145-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch linux-4.19.118/debian/patches-rt/0145-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch --- linux-4.19.98/debian/patches-rt/0145-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0145-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,582 @@ +From 16054939724213811099f9fdf7071e4cfeb21265 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 12 Oct 2017 17:18:06 +0200 +Subject: [PATCH 145/325] rtmutex: add rwlock implementation based on rtmutex +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The implementation is bias-based, similar to the rwsem implementation. + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/rwlock_rt.h | 119 +++++++++++ + include/linux/rwlock_types_rt.h | 55 +++++ + kernel/locking/rwlock-rt.c | 368 ++++++++++++++++++++++++++++++++ + 3 files changed, 542 insertions(+) + create mode 100644 include/linux/rwlock_rt.h + create mode 100644 include/linux/rwlock_types_rt.h + create mode 100644 kernel/locking/rwlock-rt.c + +diff --git a/include/linux/rwlock_rt.h b/include/linux/rwlock_rt.h +new file mode 100644 +index 000000000000..a9c4c2ac4d1f +--- /dev/null ++++ b/include/linux/rwlock_rt.h +@@ -0,0 +1,119 @@ ++#ifndef __LINUX_RWLOCK_RT_H ++#define __LINUX_RWLOCK_RT_H ++ ++#ifndef __LINUX_SPINLOCK_H ++#error Do not include directly. Use spinlock.h ++#endif ++ ++extern void __lockfunc rt_write_lock(rwlock_t *rwlock); ++extern void __lockfunc rt_read_lock(rwlock_t *rwlock); ++extern int __lockfunc rt_write_trylock(rwlock_t *rwlock); ++extern int __lockfunc rt_read_trylock(rwlock_t *rwlock); ++extern void __lockfunc rt_write_unlock(rwlock_t *rwlock); ++extern void __lockfunc rt_read_unlock(rwlock_t *rwlock); ++extern int __lockfunc rt_read_can_lock(rwlock_t *rwlock); ++extern int __lockfunc rt_write_can_lock(rwlock_t *rwlock); ++extern void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key); ++ ++#define read_can_lock(rwlock) rt_read_can_lock(rwlock) ++#define write_can_lock(rwlock) rt_write_can_lock(rwlock) ++ ++#define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock)) ++#define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock)) ++ ++static inline int __write_trylock_rt_irqsave(rwlock_t *lock, unsigned long *flags) ++{ ++ /* XXX ARCH_IRQ_ENABLED */ ++ *flags = 0; ++ return rt_write_trylock(lock); ++} ++ ++#define write_trylock_irqsave(lock, flags) \ ++ __cond_lock(lock, __write_trylock_rt_irqsave(lock, &(flags))) ++ ++#define read_lock_irqsave(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ rt_read_lock(lock); \ ++ flags = 0; \ ++ } while (0) ++ ++#define write_lock_irqsave(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ rt_write_lock(lock); \ ++ flags = 0; \ ++ } while (0) ++ ++#define read_lock(lock) rt_read_lock(lock) ++ ++#define read_lock_bh(lock) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_read_lock(lock); \ ++ } while (0) ++ ++#define read_lock_irq(lock) read_lock(lock) ++ ++#define write_lock(lock) rt_write_lock(lock) ++ ++#define write_lock_bh(lock) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_write_lock(lock); \ ++ } while (0) ++ ++#define write_lock_irq(lock) write_lock(lock) ++ ++#define read_unlock(lock) rt_read_unlock(lock) ++ ++#define read_unlock_bh(lock) \ ++ do { \ ++ rt_read_unlock(lock); \ ++ local_bh_enable(); \ ++ } while (0) ++ ++#define read_unlock_irq(lock) read_unlock(lock) ++ ++#define write_unlock(lock) rt_write_unlock(lock) ++ ++#define write_unlock_bh(lock) \ ++ do { \ ++ rt_write_unlock(lock); \ ++ local_bh_enable(); \ ++ } while (0) ++ ++#define write_unlock_irq(lock) write_unlock(lock) ++ ++#define read_unlock_irqrestore(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ (void) flags; \ ++ rt_read_unlock(lock); \ ++ } while (0) ++ ++#define write_unlock_irqrestore(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ (void) flags; \ ++ rt_write_unlock(lock); \ ++ } while (0) ++ ++#define rwlock_init(rwl) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ __rt_rwlock_init(rwl, #rwl, &__key); \ ++} while (0) ++ ++/* ++ * Internal functions made global for CPU pinning ++ */ ++void __read_rt_lock(struct rt_rw_lock *lock); ++int __read_rt_trylock(struct rt_rw_lock *lock); ++void __write_rt_lock(struct rt_rw_lock *lock); ++int __write_rt_trylock(struct rt_rw_lock *lock); ++void __read_rt_unlock(struct rt_rw_lock *lock); ++void __write_rt_unlock(struct rt_rw_lock *lock); ++ ++#endif +diff --git a/include/linux/rwlock_types_rt.h b/include/linux/rwlock_types_rt.h +new file mode 100644 +index 000000000000..546a1f8f1274 +--- /dev/null ++++ b/include/linux/rwlock_types_rt.h +@@ -0,0 +1,55 @@ ++#ifndef __LINUX_RWLOCK_TYPES_RT_H ++#define __LINUX_RWLOCK_TYPES_RT_H ++ ++#ifndef __LINUX_SPINLOCK_TYPES_H ++#error "Do not include directly. Include spinlock_types.h instead" ++#endif ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } ++#else ++# define RW_DEP_MAP_INIT(lockname) ++#endif ++ ++typedef struct rt_rw_lock rwlock_t; ++ ++#define __RW_LOCK_UNLOCKED(name) __RWLOCK_RT_INITIALIZER(name) ++ ++#define DEFINE_RWLOCK(name) \ ++ rwlock_t name = __RW_LOCK_UNLOCKED(name) ++ ++/* ++ * A reader biased implementation primarily for CPU pinning. ++ * ++ * Can be selected as general replacement for the single reader RT rwlock ++ * variant ++ */ ++struct rt_rw_lock { ++ struct rt_mutex rtmutex; ++ atomic_t readers; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++}; ++ ++#define READER_BIAS (1U << 31) ++#define WRITER_BIAS (1U << 30) ++ ++#define __RWLOCK_RT_INITIALIZER(name) \ ++{ \ ++ .readers = ATOMIC_INIT(READER_BIAS), \ ++ .rtmutex = __RT_MUTEX_INITIALIZER_SAVE_STATE(name.rtmutex), \ ++ RW_DEP_MAP_INIT(name) \ ++} ++ ++void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, ++ struct lock_class_key *key); ++ ++#define rwlock_biased_rt_init(rwlock) \ ++ do { \ ++ static struct lock_class_key __key; \ ++ \ ++ __rwlock_biased_rt_init((rwlock), #rwlock, &__key); \ ++ } while (0) ++ ++#endif +diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c +new file mode 100644 +index 000000000000..aebb7ce25bc6 +--- /dev/null ++++ b/kernel/locking/rwlock-rt.c +@@ -0,0 +1,368 @@ ++/* ++ */ ++#include ++#include ++ ++#include "rtmutex_common.h" ++#include ++ ++/* ++ * RT-specific reader/writer locks ++ * ++ * write_lock() ++ * 1) Lock lock->rtmutex ++ * 2) Remove the reader BIAS to force readers into the slow path ++ * 3) Wait until all readers have left the critical region ++ * 4) Mark it write locked ++ * ++ * write_unlock() ++ * 1) Remove the write locked marker ++ * 2) Set the reader BIAS so readers can use the fast path again ++ * 3) Unlock lock->rtmutex to release blocked readers ++ * ++ * read_lock() ++ * 1) Try fast path acquisition (reader BIAS is set) ++ * 2) Take lock->rtmutex.wait_lock which protects the writelocked flag ++ * 3) If !writelocked, acquire it for read ++ * 4) If writelocked, block on lock->rtmutex ++ * 5) unlock lock->rtmutex, goto 1) ++ * ++ * read_unlock() ++ * 1) Try fast path release (reader count != 1) ++ * 2) Wake the writer waiting in write_lock()#3 ++ * ++ * read_lock()#3 has the consequence, that rw locks on RT are not writer ++ * fair, but writers, which should be avoided in RT tasks (think tasklist ++ * lock), are subject to the rtmutex priority/DL inheritance mechanism. ++ * ++ * It's possible to make the rw locks writer fair by keeping a list of ++ * active readers. A blocked writer would force all newly incoming readers ++ * to block on the rtmutex, but the rtmutex would have to be proxy locked ++ * for one reader after the other. We can't use multi-reader inheritance ++ * because there is no way to support that with ++ * SCHED_DEADLINE. Implementing the one by one reader boosting/handover ++ * mechanism is a major surgery for a very dubious value. ++ * ++ * The risk of writer starvation is there, but the pathological use cases ++ * which trigger it are not necessarily the typical RT workloads. ++ */ ++ ++void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, ++ struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held semaphore: ++ */ ++ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); ++ lockdep_init_map(&lock->dep_map, name, key, 0); ++#endif ++ atomic_set(&lock->readers, READER_BIAS); ++ rt_mutex_init(&lock->rtmutex); ++ lock->rtmutex.save_state = 1; ++} ++ ++int __read_rt_trylock(struct rt_rw_lock *lock) ++{ ++ int r, old; ++ ++ /* ++ * Increment reader count, if lock->readers < 0, i.e. READER_BIAS is ++ * set. ++ */ ++ for (r = atomic_read(&lock->readers); r < 0;) { ++ old = atomic_cmpxchg(&lock->readers, r, r + 1); ++ if (likely(old == r)) ++ return 1; ++ r = old; ++ } ++ return 0; ++} ++ ++void __sched __read_rt_lock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ struct rt_mutex_waiter waiter; ++ unsigned long flags; ++ ++ if (__read_rt_trylock(lock)) ++ return; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ /* ++ * Allow readers as long as the writer has not completely ++ * acquired the semaphore for write. ++ */ ++ if (atomic_read(&lock->readers) != WRITER_BIAS) { ++ atomic_inc(&lock->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return; ++ } ++ ++ /* ++ * Call into the slow lock path with the rtmutex->wait_lock ++ * held, so this can't result in the following race: ++ * ++ * Reader1 Reader2 Writer ++ * read_lock() ++ * write_lock() ++ * rtmutex_lock(m) ++ * swait() ++ * read_lock() ++ * unlock(m->wait_lock) ++ * read_unlock() ++ * swake() ++ * lock(m->wait_lock) ++ * lock->writelocked=true ++ * unlock(m->wait_lock) ++ * ++ * write_unlock() ++ * lock->writelocked=false ++ * rtmutex_unlock(m) ++ * read_lock() ++ * write_lock() ++ * rtmutex_lock(m) ++ * swait() ++ * rtmutex_lock(m) ++ * ++ * That would put Reader1 behind the writer waiting on ++ * Reader2 to call read_unlock() which might be unbound. ++ */ ++ rt_mutex_init_waiter(&waiter, false); ++ rt_spin_lock_slowlock_locked(m, &waiter, flags); ++ /* ++ * The slowlock() above is guaranteed to return with the rtmutex is ++ * now held, so there can't be a writer active. Increment the reader ++ * count and immediately drop the rtmutex again. ++ */ ++ atomic_inc(&lock->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ rt_spin_lock_slowunlock(m); ++ ++ debug_rt_mutex_free_waiter(&waiter); ++} ++ ++void __read_rt_unlock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ struct task_struct *tsk; ++ ++ /* ++ * sem->readers can only hit 0 when a writer is waiting for the ++ * active readers to leave the critical region. ++ */ ++ if (!atomic_dec_and_test(&lock->readers)) ++ return; ++ ++ raw_spin_lock_irq(&m->wait_lock); ++ /* ++ * Wake the writer, i.e. the rtmutex owner. It might release the ++ * rtmutex concurrently in the fast path, but to clean up the rw ++ * lock it needs to acquire m->wait_lock. The worst case which can ++ * happen is a spurious wakeup. ++ */ ++ tsk = rt_mutex_owner(m); ++ if (tsk) ++ wake_up_process(tsk); ++ ++ raw_spin_unlock_irq(&m->wait_lock); ++} ++ ++static void __write_unlock_common(struct rt_rw_lock *lock, int bias, ++ unsigned long flags) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ ++ atomic_add(READER_BIAS - bias, &lock->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ rt_spin_lock_slowunlock(m); ++} ++ ++void __sched __write_rt_lock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ struct task_struct *self = current; ++ unsigned long flags; ++ ++ /* Take the rtmutex as a first step */ ++ __rt_spin_lock(m); ++ ++ /* Force readers into slow path */ ++ atomic_sub(READER_BIAS, &lock->readers); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ ++ raw_spin_lock(&self->pi_lock); ++ self->saved_state = self->state; ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ ++ for (;;) { ++ /* Have all readers left the critical region? */ ++ if (!atomic_read(&lock->readers)) { ++ atomic_set(&lock->readers, WRITER_BIAS); ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(self->saved_state); ++ self->saved_state = TASK_RUNNING; ++ raw_spin_unlock(&self->pi_lock); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return; ++ } ++ ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ ++ if (atomic_read(&lock->readers) != 0) ++ schedule(); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ } ++} ++ ++int __write_rt_trylock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ unsigned long flags; ++ ++ if (!__rt_mutex_trylock(m)) ++ return 0; ++ ++ atomic_sub(READER_BIAS, &lock->readers); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ if (!atomic_read(&lock->readers)) { ++ atomic_set(&lock->readers, WRITER_BIAS); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return 1; ++ } ++ __write_unlock_common(lock, 0, flags); ++ return 0; ++} ++ ++void __write_rt_unlock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ __write_unlock_common(lock, WRITER_BIAS, flags); ++} ++ ++/* Map the reader biased implementation */ ++static inline int do_read_rt_trylock(rwlock_t *rwlock) ++{ ++ return __read_rt_trylock(rwlock); ++} ++ ++static inline int do_write_rt_trylock(rwlock_t *rwlock) ++{ ++ return __write_rt_trylock(rwlock); ++} ++ ++static inline void do_read_rt_lock(rwlock_t *rwlock) ++{ ++ __read_rt_lock(rwlock); ++} ++ ++static inline void do_write_rt_lock(rwlock_t *rwlock) ++{ ++ __write_rt_lock(rwlock); ++} ++ ++static inline void do_read_rt_unlock(rwlock_t *rwlock) ++{ ++ __read_rt_unlock(rwlock); ++} ++ ++static inline void do_write_rt_unlock(rwlock_t *rwlock) ++{ ++ __write_rt_unlock(rwlock); ++} ++ ++static inline void do_rwlock_rt_init(rwlock_t *rwlock, const char *name, ++ struct lock_class_key *key) ++{ ++ __rwlock_biased_rt_init(rwlock, name, key); ++} ++ ++int __lockfunc rt_read_can_lock(rwlock_t *rwlock) ++{ ++ return atomic_read(&rwlock->readers) < 0; ++} ++ ++int __lockfunc rt_write_can_lock(rwlock_t *rwlock) ++{ ++ return atomic_read(&rwlock->readers) == READER_BIAS; ++} ++ ++/* ++ * The common functions which get wrapped into the rwlock API. ++ */ ++int __lockfunc rt_read_trylock(rwlock_t *rwlock) ++{ ++ int ret; ++ ++ migrate_disable(); ++ ret = do_read_rt_trylock(rwlock); ++ if (ret) ++ rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); ++ else ++ migrate_enable(); ++ return ret; ++} ++EXPORT_SYMBOL(rt_read_trylock); ++ ++int __lockfunc rt_write_trylock(rwlock_t *rwlock) ++{ ++ int ret; ++ ++ migrate_disable(); ++ ret = do_write_rt_trylock(rwlock); ++ if (ret) ++ rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); ++ else ++ migrate_enable(); ++ return ret; ++} ++EXPORT_SYMBOL(rt_write_trylock); ++ ++void __lockfunc rt_read_lock(rwlock_t *rwlock) ++{ ++ migrate_disable(); ++ rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); ++ do_read_rt_lock(rwlock); ++} ++EXPORT_SYMBOL(rt_read_lock); ++ ++void __lockfunc rt_write_lock(rwlock_t *rwlock) ++{ ++ migrate_disable(); ++ rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); ++ do_write_rt_lock(rwlock); ++} ++EXPORT_SYMBOL(rt_write_lock); ++ ++void __lockfunc rt_read_unlock(rwlock_t *rwlock) ++{ ++ rwlock_release(&rwlock->dep_map, 1, _RET_IP_); ++ do_read_rt_unlock(rwlock); ++ migrate_enable(); ++} ++EXPORT_SYMBOL(rt_read_unlock); ++ ++void __lockfunc rt_write_unlock(rwlock_t *rwlock) ++{ ++ rwlock_release(&rwlock->dep_map, 1, _RET_IP_); ++ do_write_rt_unlock(rwlock); ++ migrate_enable(); ++} ++EXPORT_SYMBOL(rt_write_unlock); ++ ++void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key) ++{ ++ do_rwlock_rt_init(rwlock, name, key); ++} ++EXPORT_SYMBOL(__rt_rwlock_init); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0145-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch linux-4.19.118/debian/patches-rt/0145-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch --- linux-4.19.98/debian/patches-rt/0145-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0145-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,427 +0,0 @@ -From 45c0ef033d0844c47d08e2caf85dc92ab5143eb2 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:28:34 +0200 -Subject: [PATCH 145/290] rtmutex: add rwsem implementation based on rtmutex -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The RT specific R/W semaphore implementation restricts the number of readers -to one because a writer cannot block on multiple readers and inherit its -priority or budget. - -The single reader restricting is painful in various ways: - - - Performance bottleneck for multi-threaded applications in the page fault - path (mmap sem) - - - Progress blocker for drivers which are carefully crafted to avoid the - potential reader/writer deadlock in mainline. - -The analysis of the writer code pathes shows, that properly written RT tasks -should not take them. Syscalls like mmap(), file access which take mmap sem -write locked have unbound latencies which are completely unrelated to mmap -sem. Other R/W sem users like graphics drivers are not suitable for RT tasks -either. - -So there is little risk to hurt RT tasks when the RT rwsem implementation is -changed in the following way: - - - Allow concurrent readers - - - Make writers block until the last reader left the critical section. This - blocking is not subject to priority/budget inheritance. - - - Readers blocked on a writer inherit their priority/budget in the normal - way. - -There is a drawback with this scheme. R/W semaphores become writer unfair -though the applications which have triggered writer starvation (mostly on -mmap_sem) in the past are not really the typical workloads running on a RT -system. So while it's unlikely to hit writer starvation, it's possible. If -there are unexpected workloads on RT systems triggering it, we need to rethink -the approach. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rwsem_rt.h | 68 +++++++++ - kernel/locking/rwsem-rt.c | 293 ++++++++++++++++++++++++++++++++++++++ - 2 files changed, 361 insertions(+) - create mode 100644 include/linux/rwsem_rt.h - create mode 100644 kernel/locking/rwsem-rt.c - -diff --git a/include/linux/rwsem_rt.h b/include/linux/rwsem_rt.h -new file mode 100644 -index 000000000000..2018ff77904a ---- /dev/null -+++ b/include/linux/rwsem_rt.h -@@ -0,0 +1,68 @@ -+#ifndef _LINUX_RWSEM_RT_H -+#define _LINUX_RWSEM_RT_H -+ -+#ifndef _LINUX_RWSEM_H -+#error "Include rwsem.h" -+#endif -+ -+#include -+#include -+ -+#define READER_BIAS (1U << 31) -+#define WRITER_BIAS (1U << 30) -+ -+struct rw_semaphore { -+ atomic_t readers; -+ struct rt_mutex rtmutex; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+}; -+ -+#define __RWSEM_INITIALIZER(name) \ -+{ \ -+ .readers = ATOMIC_INIT(READER_BIAS), \ -+ .rtmutex = __RT_MUTEX_INITIALIZER(name.rtmutex), \ -+ RW_DEP_MAP_INIT(name) \ -+} -+ -+#define DECLARE_RWSEM(lockname) \ -+ struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname) -+ -+extern void __rwsem_init(struct rw_semaphore *rwsem, const char *name, -+ struct lock_class_key *key); -+ -+#define __init_rwsem(sem, name, key) \ -+do { \ -+ rt_mutex_init(&(sem)->rtmutex); \ -+ __rwsem_init((sem), (name), (key)); \ -+} while (0) -+ -+#define init_rwsem(sem) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ __init_rwsem((sem), #sem, &__key); \ -+} while (0) -+ -+static inline int rwsem_is_locked(struct rw_semaphore *sem) -+{ -+ return atomic_read(&sem->readers) != READER_BIAS; -+} -+ -+static inline int rwsem_is_contended(struct rw_semaphore *sem) -+{ -+ return atomic_read(&sem->readers) > 0; -+} -+ -+extern void __down_read(struct rw_semaphore *sem); -+extern int __down_read_killable(struct rw_semaphore *sem); -+extern int __down_read_trylock(struct rw_semaphore *sem); -+extern void __down_write(struct rw_semaphore *sem); -+extern int __must_check __down_write_killable(struct rw_semaphore *sem); -+extern int __down_write_trylock(struct rw_semaphore *sem); -+extern void __up_read(struct rw_semaphore *sem); -+extern void __up_write(struct rw_semaphore *sem); -+extern void __downgrade_write(struct rw_semaphore *sem); -+ -+#endif -diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c -new file mode 100644 -index 000000000000..7d3c5cf3d23d ---- /dev/null -+++ b/kernel/locking/rwsem-rt.c -@@ -0,0 +1,293 @@ -+/* -+ */ -+#include -+#include -+#include -+#include -+ -+#include "rtmutex_common.h" -+ -+/* -+ * RT-specific reader/writer semaphores -+ * -+ * down_write() -+ * 1) Lock sem->rtmutex -+ * 2) Remove the reader BIAS to force readers into the slow path -+ * 3) Wait until all readers have left the critical region -+ * 4) Mark it write locked -+ * -+ * up_write() -+ * 1) Remove the write locked marker -+ * 2) Set the reader BIAS so readers can use the fast path again -+ * 3) Unlock sem->rtmutex to release blocked readers -+ * -+ * down_read() -+ * 1) Try fast path acquisition (reader BIAS is set) -+ * 2) Take sem->rtmutex.wait_lock which protects the writelocked flag -+ * 3) If !writelocked, acquire it for read -+ * 4) If writelocked, block on sem->rtmutex -+ * 5) unlock sem->rtmutex, goto 1) -+ * -+ * up_read() -+ * 1) Try fast path release (reader count != 1) -+ * 2) Wake the writer waiting in down_write()#3 -+ * -+ * down_read()#3 has the consequence, that rw semaphores on RT are not writer -+ * fair, but writers, which should be avoided in RT tasks (think mmap_sem), -+ * are subject to the rtmutex priority/DL inheritance mechanism. -+ * -+ * It's possible to make the rw semaphores writer fair by keeping a list of -+ * active readers. A blocked writer would force all newly incoming readers to -+ * block on the rtmutex, but the rtmutex would have to be proxy locked for one -+ * reader after the other. We can't use multi-reader inheritance because there -+ * is no way to support that with SCHED_DEADLINE. Implementing the one by one -+ * reader boosting/handover mechanism is a major surgery for a very dubious -+ * value. -+ * -+ * The risk of writer starvation is there, but the pathological use cases -+ * which trigger it are not necessarily the typical RT workloads. -+ */ -+ -+void __rwsem_init(struct rw_semaphore *sem, const char *name, -+ struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held semaphore: -+ */ -+ debug_check_no_locks_freed((void *)sem, sizeof(*sem)); -+ lockdep_init_map(&sem->dep_map, name, key, 0); -+#endif -+ atomic_set(&sem->readers, READER_BIAS); -+} -+EXPORT_SYMBOL(__rwsem_init); -+ -+int __down_read_trylock(struct rw_semaphore *sem) -+{ -+ int r, old; -+ -+ /* -+ * Increment reader count, if sem->readers < 0, i.e. READER_BIAS is -+ * set. -+ */ -+ for (r = atomic_read(&sem->readers); r < 0;) { -+ old = atomic_cmpxchg(&sem->readers, r, r + 1); -+ if (likely(old == r)) -+ return 1; -+ r = old; -+ } -+ return 0; -+} -+ -+static int __sched __down_read_common(struct rw_semaphore *sem, int state) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ struct rt_mutex_waiter waiter; -+ int ret; -+ -+ if (__down_read_trylock(sem)) -+ return 0; -+ -+ might_sleep(); -+ raw_spin_lock_irq(&m->wait_lock); -+ /* -+ * Allow readers as long as the writer has not completely -+ * acquired the semaphore for write. -+ */ -+ if (atomic_read(&sem->readers) != WRITER_BIAS) { -+ atomic_inc(&sem->readers); -+ raw_spin_unlock_irq(&m->wait_lock); -+ return 0; -+ } -+ -+ /* -+ * Call into the slow lock path with the rtmutex->wait_lock -+ * held, so this can't result in the following race: -+ * -+ * Reader1 Reader2 Writer -+ * down_read() -+ * down_write() -+ * rtmutex_lock(m) -+ * swait() -+ * down_read() -+ * unlock(m->wait_lock) -+ * up_read() -+ * swake() -+ * lock(m->wait_lock) -+ * sem->writelocked=true -+ * unlock(m->wait_lock) -+ * -+ * up_write() -+ * sem->writelocked=false -+ * rtmutex_unlock(m) -+ * down_read() -+ * down_write() -+ * rtmutex_lock(m) -+ * swait() -+ * rtmutex_lock(m) -+ * -+ * That would put Reader1 behind the writer waiting on -+ * Reader2 to call up_read() which might be unbound. -+ */ -+ rt_mutex_init_waiter(&waiter, false); -+ ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, -+ &waiter); -+ /* -+ * The slowlock() above is guaranteed to return with the rtmutex (for -+ * ret = 0) is now held, so there can't be a writer active. Increment -+ * the reader count and immediately drop the rtmutex again. -+ * For ret != 0 we don't hold the rtmutex and need unlock the wait_lock. -+ * We don't own the lock then. -+ */ -+ if (!ret) -+ atomic_inc(&sem->readers); -+ raw_spin_unlock_irq(&m->wait_lock); -+ if (!ret) -+ __rt_mutex_unlock(m); -+ -+ debug_rt_mutex_free_waiter(&waiter); -+ return ret; -+} -+ -+void __down_read(struct rw_semaphore *sem) -+{ -+ int ret; -+ -+ ret = __down_read_common(sem, TASK_UNINTERRUPTIBLE); -+ WARN_ON_ONCE(ret); -+} -+ -+int __down_read_killable(struct rw_semaphore *sem) -+{ -+ int ret; -+ -+ ret = __down_read_common(sem, TASK_KILLABLE); -+ if (likely(!ret)) -+ return ret; -+ WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); -+ return -EINTR; -+} -+ -+void __up_read(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ struct task_struct *tsk; -+ -+ /* -+ * sem->readers can only hit 0 when a writer is waiting for the -+ * active readers to leave the critical region. -+ */ -+ if (!atomic_dec_and_test(&sem->readers)) -+ return; -+ -+ might_sleep(); -+ raw_spin_lock_irq(&m->wait_lock); -+ /* -+ * Wake the writer, i.e. the rtmutex owner. It might release the -+ * rtmutex concurrently in the fast path (due to a signal), but to -+ * clean up the rwsem it needs to acquire m->wait_lock. The worst -+ * case which can happen is a spurious wakeup. -+ */ -+ tsk = rt_mutex_owner(m); -+ if (tsk) -+ wake_up_process(tsk); -+ -+ raw_spin_unlock_irq(&m->wait_lock); -+} -+ -+static void __up_write_unlock(struct rw_semaphore *sem, int bias, -+ unsigned long flags) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ -+ atomic_add(READER_BIAS - bias, &sem->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ __rt_mutex_unlock(m); -+} -+ -+static int __sched __down_write_common(struct rw_semaphore *sem, int state) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ /* Take the rtmutex as a first step */ -+ if (__rt_mutex_lock_state(m, state)) -+ return -EINTR; -+ -+ /* Force readers into slow path */ -+ atomic_sub(READER_BIAS, &sem->readers); -+ might_sleep(); -+ -+ set_current_state(state); -+ for (;;) { -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ /* Have all readers left the critical region? */ -+ if (!atomic_read(&sem->readers)) { -+ atomic_set(&sem->readers, WRITER_BIAS); -+ __set_current_state(TASK_RUNNING); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return 0; -+ } -+ -+ if (signal_pending_state(state, current)) { -+ __set_current_state(TASK_RUNNING); -+ __up_write_unlock(sem, 0, flags); -+ return -EINTR; -+ } -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ -+ if (atomic_read(&sem->readers) != 0) { -+ schedule(); -+ set_current_state(state); -+ } -+ } -+} -+ -+void __sched __down_write(struct rw_semaphore *sem) -+{ -+ __down_write_common(sem, TASK_UNINTERRUPTIBLE); -+} -+ -+int __sched __down_write_killable(struct rw_semaphore *sem) -+{ -+ return __down_write_common(sem, TASK_KILLABLE); -+} -+ -+int __down_write_trylock(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ if (!__rt_mutex_trylock(m)) -+ return 0; -+ -+ atomic_sub(READER_BIAS, &sem->readers); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ if (!atomic_read(&sem->readers)) { -+ atomic_set(&sem->readers, WRITER_BIAS); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return 1; -+ } -+ __up_write_unlock(sem, 0, flags); -+ return 0; -+} -+ -+void __up_write(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ __up_write_unlock(sem, WRITER_BIAS, flags); -+} -+ -+void __downgrade_write(struct rw_semaphore *sem) -+{ -+ struct rt_mutex *m = &sem->rtmutex; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ /* Release it and account current as reader */ -+ __up_write_unlock(sem, WRITER_BIAS - 1, flags); -+} --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0146-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch linux-4.19.118/debian/patches-rt/0146-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch --- linux-4.19.98/debian/patches-rt/0146-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0146-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,582 +0,0 @@ -From 18ad344168ec1fcb667f20962bfe16c9a7c3e019 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:18:06 +0200 -Subject: [PATCH 146/290] rtmutex: add rwlock implementation based on rtmutex -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The implementation is bias-based, similar to the rwsem implementation. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/rwlock_rt.h | 119 +++++++++++ - include/linux/rwlock_types_rt.h | 55 +++++ - kernel/locking/rwlock-rt.c | 368 ++++++++++++++++++++++++++++++++ - 3 files changed, 542 insertions(+) - create mode 100644 include/linux/rwlock_rt.h - create mode 100644 include/linux/rwlock_types_rt.h - create mode 100644 kernel/locking/rwlock-rt.c - -diff --git a/include/linux/rwlock_rt.h b/include/linux/rwlock_rt.h -new file mode 100644 -index 000000000000..a9c4c2ac4d1f ---- /dev/null -+++ b/include/linux/rwlock_rt.h -@@ -0,0 +1,119 @@ -+#ifndef __LINUX_RWLOCK_RT_H -+#define __LINUX_RWLOCK_RT_H -+ -+#ifndef __LINUX_SPINLOCK_H -+#error Do not include directly. Use spinlock.h -+#endif -+ -+extern void __lockfunc rt_write_lock(rwlock_t *rwlock); -+extern void __lockfunc rt_read_lock(rwlock_t *rwlock); -+extern int __lockfunc rt_write_trylock(rwlock_t *rwlock); -+extern int __lockfunc rt_read_trylock(rwlock_t *rwlock); -+extern void __lockfunc rt_write_unlock(rwlock_t *rwlock); -+extern void __lockfunc rt_read_unlock(rwlock_t *rwlock); -+extern int __lockfunc rt_read_can_lock(rwlock_t *rwlock); -+extern int __lockfunc rt_write_can_lock(rwlock_t *rwlock); -+extern void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key); -+ -+#define read_can_lock(rwlock) rt_read_can_lock(rwlock) -+#define write_can_lock(rwlock) rt_write_can_lock(rwlock) -+ -+#define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock)) -+#define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock)) -+ -+static inline int __write_trylock_rt_irqsave(rwlock_t *lock, unsigned long *flags) -+{ -+ /* XXX ARCH_IRQ_ENABLED */ -+ *flags = 0; -+ return rt_write_trylock(lock); -+} -+ -+#define write_trylock_irqsave(lock, flags) \ -+ __cond_lock(lock, __write_trylock_rt_irqsave(lock, &(flags))) -+ -+#define read_lock_irqsave(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ rt_read_lock(lock); \ -+ flags = 0; \ -+ } while (0) -+ -+#define write_lock_irqsave(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ rt_write_lock(lock); \ -+ flags = 0; \ -+ } while (0) -+ -+#define read_lock(lock) rt_read_lock(lock) -+ -+#define read_lock_bh(lock) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_read_lock(lock); \ -+ } while (0) -+ -+#define read_lock_irq(lock) read_lock(lock) -+ -+#define write_lock(lock) rt_write_lock(lock) -+ -+#define write_lock_bh(lock) \ -+ do { \ -+ local_bh_disable(); \ -+ rt_write_lock(lock); \ -+ } while (0) -+ -+#define write_lock_irq(lock) write_lock(lock) -+ -+#define read_unlock(lock) rt_read_unlock(lock) -+ -+#define read_unlock_bh(lock) \ -+ do { \ -+ rt_read_unlock(lock); \ -+ local_bh_enable(); \ -+ } while (0) -+ -+#define read_unlock_irq(lock) read_unlock(lock) -+ -+#define write_unlock(lock) rt_write_unlock(lock) -+ -+#define write_unlock_bh(lock) \ -+ do { \ -+ rt_write_unlock(lock); \ -+ local_bh_enable(); \ -+ } while (0) -+ -+#define write_unlock_irq(lock) write_unlock(lock) -+ -+#define read_unlock_irqrestore(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ (void) flags; \ -+ rt_read_unlock(lock); \ -+ } while (0) -+ -+#define write_unlock_irqrestore(lock, flags) \ -+ do { \ -+ typecheck(unsigned long, flags); \ -+ (void) flags; \ -+ rt_write_unlock(lock); \ -+ } while (0) -+ -+#define rwlock_init(rwl) \ -+do { \ -+ static struct lock_class_key __key; \ -+ \ -+ __rt_rwlock_init(rwl, #rwl, &__key); \ -+} while (0) -+ -+/* -+ * Internal functions made global for CPU pinning -+ */ -+void __read_rt_lock(struct rt_rw_lock *lock); -+int __read_rt_trylock(struct rt_rw_lock *lock); -+void __write_rt_lock(struct rt_rw_lock *lock); -+int __write_rt_trylock(struct rt_rw_lock *lock); -+void __read_rt_unlock(struct rt_rw_lock *lock); -+void __write_rt_unlock(struct rt_rw_lock *lock); -+ -+#endif -diff --git a/include/linux/rwlock_types_rt.h b/include/linux/rwlock_types_rt.h -new file mode 100644 -index 000000000000..546a1f8f1274 ---- /dev/null -+++ b/include/linux/rwlock_types_rt.h -@@ -0,0 +1,55 @@ -+#ifndef __LINUX_RWLOCK_TYPES_RT_H -+#define __LINUX_RWLOCK_TYPES_RT_H -+ -+#ifndef __LINUX_SPINLOCK_TYPES_H -+#error "Do not include directly. Include spinlock_types.h instead" -+#endif -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } -+#else -+# define RW_DEP_MAP_INIT(lockname) -+#endif -+ -+typedef struct rt_rw_lock rwlock_t; -+ -+#define __RW_LOCK_UNLOCKED(name) __RWLOCK_RT_INITIALIZER(name) -+ -+#define DEFINE_RWLOCK(name) \ -+ rwlock_t name = __RW_LOCK_UNLOCKED(name) -+ -+/* -+ * A reader biased implementation primarily for CPU pinning. -+ * -+ * Can be selected as general replacement for the single reader RT rwlock -+ * variant -+ */ -+struct rt_rw_lock { -+ struct rt_mutex rtmutex; -+ atomic_t readers; -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ struct lockdep_map dep_map; -+#endif -+}; -+ -+#define READER_BIAS (1U << 31) -+#define WRITER_BIAS (1U << 30) -+ -+#define __RWLOCK_RT_INITIALIZER(name) \ -+{ \ -+ .readers = ATOMIC_INIT(READER_BIAS), \ -+ .rtmutex = __RT_MUTEX_INITIALIZER_SAVE_STATE(name.rtmutex), \ -+ RW_DEP_MAP_INIT(name) \ -+} -+ -+void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, -+ struct lock_class_key *key); -+ -+#define rwlock_biased_rt_init(rwlock) \ -+ do { \ -+ static struct lock_class_key __key; \ -+ \ -+ __rwlock_biased_rt_init((rwlock), #rwlock, &__key); \ -+ } while (0) -+ -+#endif -diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c -new file mode 100644 -index 000000000000..aebb7ce25bc6 ---- /dev/null -+++ b/kernel/locking/rwlock-rt.c -@@ -0,0 +1,368 @@ -+/* -+ */ -+#include -+#include -+ -+#include "rtmutex_common.h" -+#include -+ -+/* -+ * RT-specific reader/writer locks -+ * -+ * write_lock() -+ * 1) Lock lock->rtmutex -+ * 2) Remove the reader BIAS to force readers into the slow path -+ * 3) Wait until all readers have left the critical region -+ * 4) Mark it write locked -+ * -+ * write_unlock() -+ * 1) Remove the write locked marker -+ * 2) Set the reader BIAS so readers can use the fast path again -+ * 3) Unlock lock->rtmutex to release blocked readers -+ * -+ * read_lock() -+ * 1) Try fast path acquisition (reader BIAS is set) -+ * 2) Take lock->rtmutex.wait_lock which protects the writelocked flag -+ * 3) If !writelocked, acquire it for read -+ * 4) If writelocked, block on lock->rtmutex -+ * 5) unlock lock->rtmutex, goto 1) -+ * -+ * read_unlock() -+ * 1) Try fast path release (reader count != 1) -+ * 2) Wake the writer waiting in write_lock()#3 -+ * -+ * read_lock()#3 has the consequence, that rw locks on RT are not writer -+ * fair, but writers, which should be avoided in RT tasks (think tasklist -+ * lock), are subject to the rtmutex priority/DL inheritance mechanism. -+ * -+ * It's possible to make the rw locks writer fair by keeping a list of -+ * active readers. A blocked writer would force all newly incoming readers -+ * to block on the rtmutex, but the rtmutex would have to be proxy locked -+ * for one reader after the other. We can't use multi-reader inheritance -+ * because there is no way to support that with -+ * SCHED_DEADLINE. Implementing the one by one reader boosting/handover -+ * mechanism is a major surgery for a very dubious value. -+ * -+ * The risk of writer starvation is there, but the pathological use cases -+ * which trigger it are not necessarily the typical RT workloads. -+ */ -+ -+void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, -+ struct lock_class_key *key) -+{ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+ /* -+ * Make sure we are not reinitializing a held semaphore: -+ */ -+ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); -+ lockdep_init_map(&lock->dep_map, name, key, 0); -+#endif -+ atomic_set(&lock->readers, READER_BIAS); -+ rt_mutex_init(&lock->rtmutex); -+ lock->rtmutex.save_state = 1; -+} -+ -+int __read_rt_trylock(struct rt_rw_lock *lock) -+{ -+ int r, old; -+ -+ /* -+ * Increment reader count, if lock->readers < 0, i.e. READER_BIAS is -+ * set. -+ */ -+ for (r = atomic_read(&lock->readers); r < 0;) { -+ old = atomic_cmpxchg(&lock->readers, r, r + 1); -+ if (likely(old == r)) -+ return 1; -+ r = old; -+ } -+ return 0; -+} -+ -+void __sched __read_rt_lock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ struct rt_mutex_waiter waiter; -+ unsigned long flags; -+ -+ if (__read_rt_trylock(lock)) -+ return; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ /* -+ * Allow readers as long as the writer has not completely -+ * acquired the semaphore for write. -+ */ -+ if (atomic_read(&lock->readers) != WRITER_BIAS) { -+ atomic_inc(&lock->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return; -+ } -+ -+ /* -+ * Call into the slow lock path with the rtmutex->wait_lock -+ * held, so this can't result in the following race: -+ * -+ * Reader1 Reader2 Writer -+ * read_lock() -+ * write_lock() -+ * rtmutex_lock(m) -+ * swait() -+ * read_lock() -+ * unlock(m->wait_lock) -+ * read_unlock() -+ * swake() -+ * lock(m->wait_lock) -+ * lock->writelocked=true -+ * unlock(m->wait_lock) -+ * -+ * write_unlock() -+ * lock->writelocked=false -+ * rtmutex_unlock(m) -+ * read_lock() -+ * write_lock() -+ * rtmutex_lock(m) -+ * swait() -+ * rtmutex_lock(m) -+ * -+ * That would put Reader1 behind the writer waiting on -+ * Reader2 to call read_unlock() which might be unbound. -+ */ -+ rt_mutex_init_waiter(&waiter, false); -+ rt_spin_lock_slowlock_locked(m, &waiter, flags); -+ /* -+ * The slowlock() above is guaranteed to return with the rtmutex is -+ * now held, so there can't be a writer active. Increment the reader -+ * count and immediately drop the rtmutex again. -+ */ -+ atomic_inc(&lock->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ rt_spin_lock_slowunlock(m); -+ -+ debug_rt_mutex_free_waiter(&waiter); -+} -+ -+void __read_rt_unlock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ struct task_struct *tsk; -+ -+ /* -+ * sem->readers can only hit 0 when a writer is waiting for the -+ * active readers to leave the critical region. -+ */ -+ if (!atomic_dec_and_test(&lock->readers)) -+ return; -+ -+ raw_spin_lock_irq(&m->wait_lock); -+ /* -+ * Wake the writer, i.e. the rtmutex owner. It might release the -+ * rtmutex concurrently in the fast path, but to clean up the rw -+ * lock it needs to acquire m->wait_lock. The worst case which can -+ * happen is a spurious wakeup. -+ */ -+ tsk = rt_mutex_owner(m); -+ if (tsk) -+ wake_up_process(tsk); -+ -+ raw_spin_unlock_irq(&m->wait_lock); -+} -+ -+static void __write_unlock_common(struct rt_rw_lock *lock, int bias, -+ unsigned long flags) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ -+ atomic_add(READER_BIAS - bias, &lock->readers); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ rt_spin_lock_slowunlock(m); -+} -+ -+void __sched __write_rt_lock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ struct task_struct *self = current; -+ unsigned long flags; -+ -+ /* Take the rtmutex as a first step */ -+ __rt_spin_lock(m); -+ -+ /* Force readers into slow path */ -+ atomic_sub(READER_BIAS, &lock->readers); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ -+ raw_spin_lock(&self->pi_lock); -+ self->saved_state = self->state; -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ -+ for (;;) { -+ /* Have all readers left the critical region? */ -+ if (!atomic_read(&lock->readers)) { -+ atomic_set(&lock->readers, WRITER_BIAS); -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(self->saved_state); -+ self->saved_state = TASK_RUNNING; -+ raw_spin_unlock(&self->pi_lock); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return; -+ } -+ -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ -+ if (atomic_read(&lock->readers) != 0) -+ schedule(); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ -+ raw_spin_lock(&self->pi_lock); -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock(&self->pi_lock); -+ } -+} -+ -+int __write_rt_trylock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ unsigned long flags; -+ -+ if (!__rt_mutex_trylock(m)) -+ return 0; -+ -+ atomic_sub(READER_BIAS, &lock->readers); -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ if (!atomic_read(&lock->readers)) { -+ atomic_set(&lock->readers, WRITER_BIAS); -+ raw_spin_unlock_irqrestore(&m->wait_lock, flags); -+ return 1; -+ } -+ __write_unlock_common(lock, 0, flags); -+ return 0; -+} -+ -+void __write_rt_unlock(struct rt_rw_lock *lock) -+{ -+ struct rt_mutex *m = &lock->rtmutex; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&m->wait_lock, flags); -+ __write_unlock_common(lock, WRITER_BIAS, flags); -+} -+ -+/* Map the reader biased implementation */ -+static inline int do_read_rt_trylock(rwlock_t *rwlock) -+{ -+ return __read_rt_trylock(rwlock); -+} -+ -+static inline int do_write_rt_trylock(rwlock_t *rwlock) -+{ -+ return __write_rt_trylock(rwlock); -+} -+ -+static inline void do_read_rt_lock(rwlock_t *rwlock) -+{ -+ __read_rt_lock(rwlock); -+} -+ -+static inline void do_write_rt_lock(rwlock_t *rwlock) -+{ -+ __write_rt_lock(rwlock); -+} -+ -+static inline void do_read_rt_unlock(rwlock_t *rwlock) -+{ -+ __read_rt_unlock(rwlock); -+} -+ -+static inline void do_write_rt_unlock(rwlock_t *rwlock) -+{ -+ __write_rt_unlock(rwlock); -+} -+ -+static inline void do_rwlock_rt_init(rwlock_t *rwlock, const char *name, -+ struct lock_class_key *key) -+{ -+ __rwlock_biased_rt_init(rwlock, name, key); -+} -+ -+int __lockfunc rt_read_can_lock(rwlock_t *rwlock) -+{ -+ return atomic_read(&rwlock->readers) < 0; -+} -+ -+int __lockfunc rt_write_can_lock(rwlock_t *rwlock) -+{ -+ return atomic_read(&rwlock->readers) == READER_BIAS; -+} -+ -+/* -+ * The common functions which get wrapped into the rwlock API. -+ */ -+int __lockfunc rt_read_trylock(rwlock_t *rwlock) -+{ -+ int ret; -+ -+ migrate_disable(); -+ ret = do_read_rt_trylock(rwlock); -+ if (ret) -+ rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); -+ else -+ migrate_enable(); -+ return ret; -+} -+EXPORT_SYMBOL(rt_read_trylock); -+ -+int __lockfunc rt_write_trylock(rwlock_t *rwlock) -+{ -+ int ret; -+ -+ migrate_disable(); -+ ret = do_write_rt_trylock(rwlock); -+ if (ret) -+ rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); -+ else -+ migrate_enable(); -+ return ret; -+} -+EXPORT_SYMBOL(rt_write_trylock); -+ -+void __lockfunc rt_read_lock(rwlock_t *rwlock) -+{ -+ migrate_disable(); -+ rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); -+ do_read_rt_lock(rwlock); -+} -+EXPORT_SYMBOL(rt_read_lock); -+ -+void __lockfunc rt_write_lock(rwlock_t *rwlock) -+{ -+ migrate_disable(); -+ rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); -+ do_write_rt_lock(rwlock); -+} -+EXPORT_SYMBOL(rt_write_lock); -+ -+void __lockfunc rt_read_unlock(rwlock_t *rwlock) -+{ -+ rwlock_release(&rwlock->dep_map, 1, _RET_IP_); -+ do_read_rt_unlock(rwlock); -+ migrate_enable(); -+} -+EXPORT_SYMBOL(rt_read_unlock); -+ -+void __lockfunc rt_write_unlock(rwlock_t *rwlock) -+{ -+ rwlock_release(&rwlock->dep_map, 1, _RET_IP_); -+ do_write_rt_unlock(rwlock); -+ migrate_enable(); -+} -+EXPORT_SYMBOL(rt_write_unlock); -+ -+void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key) -+{ -+ do_rwlock_rt_init(rwlock, name, key); -+} -+EXPORT_SYMBOL(__rt_rwlock_init); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0146-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch linux-4.19.118/debian/patches-rt/0146-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch --- linux-4.19.98/debian/patches-rt/0146-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0146-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,33 @@ +From 227ec3934454027312da6d09e4d5a72ee1109cad Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 11 Jan 2019 21:16:31 +0100 +Subject: [PATCH 146/325] rtmutex/rwlock: preserve state like a sleeping lock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The rwlock is spinning while acquiring a lock. Therefore it must become +a sleeping lock on RT and preserve its task state while sleeping and +waiting for the lock to become available. + +Reported-by: Joe Korty +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rwlock-rt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c +index aebb7ce25bc6..8f90afe111ce 100644 +--- a/kernel/locking/rwlock-rt.c ++++ b/kernel/locking/rwlock-rt.c +@@ -128,7 +128,7 @@ void __sched __read_rt_lock(struct rt_rw_lock *lock) + * That would put Reader1 behind the writer waiting on + * Reader2 to call read_unlock() which might be unbound. + */ +- rt_mutex_init_waiter(&waiter, false); ++ rt_mutex_init_waiter(&waiter, true); + rt_spin_lock_slowlock_locked(m, &waiter, flags); + /* + * The slowlock() above is guaranteed to return with the rtmutex is +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0147-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch linux-4.19.118/debian/patches-rt/0147-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch --- linux-4.19.98/debian/patches-rt/0147-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0147-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -From c4a03078339c1b08038e82f98ad3db155663a23c Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 11 Jan 2019 21:16:31 +0100 -Subject: [PATCH 147/290] rtmutex/rwlock: preserve state like a sleeping lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The rwlock is spinning while acquiring a lock. Therefore it must become -a sleeping lock on RT and preserve its task state while sleeping and -waiting for the lock to become available. - -Reported-by: Joe Korty -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rwlock-rt.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c -index aebb7ce25bc6..8f90afe111ce 100644 ---- a/kernel/locking/rwlock-rt.c -+++ b/kernel/locking/rwlock-rt.c -@@ -128,7 +128,7 @@ void __sched __read_rt_lock(struct rt_rw_lock *lock) - * That would put Reader1 behind the writer waiting on - * Reader2 to call read_unlock() which might be unbound. - */ -- rt_mutex_init_waiter(&waiter, false); -+ rt_mutex_init_waiter(&waiter, true); - rt_spin_lock_slowlock_locked(m, &waiter, flags); - /* - * The slowlock() above is guaranteed to return with the rtmutex is --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0147-rtmutex-wire-up-RT-s-locking.patch linux-4.19.118/debian/patches-rt/0147-rtmutex-wire-up-RT-s-locking.patch --- linux-4.19.98/debian/patches-rt/0147-rtmutex-wire-up-RT-s-locking.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0147-rtmutex-wire-up-RT-s-locking.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,271 @@ +From 8c26ff848a29c8a09f12c1ce57133461f07ec3da Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 12 Oct 2017 17:31:14 +0200 +Subject: [PATCH 147/325] rtmutex: wire up RT's locking +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/mutex.h | 20 +++++++++++++------- + include/linux/rwsem.h | 11 +++++++++++ + include/linux/spinlock.h | 12 +++++++++++- + include/linux/spinlock_api_smp.h | 4 +++- + include/linux/spinlock_types.h | 11 ++++++++--- + kernel/locking/Makefile | 9 ++++++++- + kernel/locking/spinlock.c | 7 +++++++ + kernel/locking/spinlock_debug.c | 5 +++++ + 8 files changed, 66 insertions(+), 13 deletions(-) + +diff --git a/include/linux/mutex.h b/include/linux/mutex.h +index 3093dd162424..cad906f54d0a 100644 +--- a/include/linux/mutex.h ++++ b/include/linux/mutex.h +@@ -22,6 +22,17 @@ + + struct ww_acquire_ctx; + ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ ++ , .dep_map = { .name = #lockname } ++#else ++# define __DEP_MAP_MUTEX_INITIALIZER(lockname) ++#endif ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++# include ++#else ++ + /* + * Simple, straightforward mutexes with strict semantics: + * +@@ -118,13 +129,6 @@ do { \ + __mutex_init((mutex), #mutex, &__key); \ + } while (0) + +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +-# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ +- , .dep_map = { .name = #lockname } +-#else +-# define __DEP_MAP_MUTEX_INITIALIZER(lockname) +-#endif +- + #define __MUTEX_INITIALIZER(lockname) \ + { .owner = ATOMIC_LONG_INIT(0) \ + , .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \ +@@ -229,4 +233,6 @@ mutex_trylock_recursive(struct mutex *lock) + return mutex_trylock(lock); + } + ++#endif /* !PREEMPT_RT_FULL */ ++ + #endif /* __LINUX_MUTEX_H */ +diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h +index ab93b6eae696..b1e32373f44f 100644 +--- a/include/linux/rwsem.h ++++ b/include/linux/rwsem.h +@@ -20,6 +20,10 @@ + #include + #endif + ++#ifdef CONFIG_PREEMPT_RT_FULL ++#include ++#else /* PREEMPT_RT_FULL */ ++ + struct rw_semaphore; + + #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK +@@ -114,6 +118,13 @@ static inline int rwsem_is_contended(struct rw_semaphore *sem) + return !list_empty(&sem->wait_list); + } + ++#endif /* !PREEMPT_RT_FULL */ ++ ++/* ++ * The functions below are the same for all rwsem implementations including ++ * the RT specific variant. ++ */ ++ + /* + * lock for reading + */ +diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h +index e089157dcf97..5f5ad0630a26 100644 +--- a/include/linux/spinlock.h ++++ b/include/linux/spinlock.h +@@ -298,7 +298,11 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) + }) + + /* Include rwlock functions */ +-#include ++#ifdef CONFIG_PREEMPT_RT_FULL ++# include ++#else ++# include ++#endif + + /* + * Pull the _spin_*()/_read_*()/_write_*() functions/declarations: +@@ -309,6 +313,10 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) + # include + #endif + ++#ifdef CONFIG_PREEMPT_RT_FULL ++# include ++#else /* PREEMPT_RT_FULL */ ++ + /* + * Map the spin_lock functions to the raw variants for PREEMPT_RT=n + */ +@@ -429,6 +437,8 @@ static __always_inline int spin_is_contended(spinlock_t *lock) + + #define assert_spin_locked(lock) assert_raw_spin_locked(&(lock)->rlock) + ++#endif /* !PREEMPT_RT_FULL */ ++ + /* + * Pull the atomic_t declaration: + * (asm-mips/atomic.h needs above definitions) +diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h +index 42dfab89e740..29d99ae5a8ab 100644 +--- a/include/linux/spinlock_api_smp.h ++++ b/include/linux/spinlock_api_smp.h +@@ -187,6 +187,8 @@ static inline int __raw_spin_trylock_bh(raw_spinlock_t *lock) + return 0; + } + +-#include ++#ifndef CONFIG_PREEMPT_RT_FULL ++# include ++#endif + + #endif /* __LINUX_SPINLOCK_API_SMP_H */ +diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h +index 5c8664d57fb8..10bac715ea96 100644 +--- a/include/linux/spinlock_types.h ++++ b/include/linux/spinlock_types.h +@@ -11,8 +11,13 @@ + + #include + +-#include +- +-#include ++#ifndef CONFIG_PREEMPT_RT_FULL ++# include ++# include ++#else ++# include ++# include ++# include ++#endif + + #endif /* __LINUX_SPINLOCK_TYPES_H */ +diff --git a/kernel/locking/Makefile b/kernel/locking/Makefile +index 392c7f23af76..c0bf04b6b965 100644 +--- a/kernel/locking/Makefile ++++ b/kernel/locking/Makefile +@@ -3,7 +3,7 @@ + # and is generally not a function of system call inputs. + KCOV_INSTRUMENT := n + +-obj-y += mutex.o semaphore.o rwsem.o percpu-rwsem.o ++obj-y += semaphore.o percpu-rwsem.o + + ifdef CONFIG_FUNCTION_TRACER + CFLAGS_REMOVE_lockdep.o = $(CC_FLAGS_FTRACE) +@@ -12,7 +12,11 @@ CFLAGS_REMOVE_mutex-debug.o = $(CC_FLAGS_FTRACE) + CFLAGS_REMOVE_rtmutex-debug.o = $(CC_FLAGS_FTRACE) + endif + ++ifneq ($(CONFIG_PREEMPT_RT_FULL),y) ++obj-y += mutex.o + obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o ++endif ++obj-y += rwsem.o + obj-$(CONFIG_LOCKDEP) += lockdep.o + ifeq ($(CONFIG_PROC_FS),y) + obj-$(CONFIG_LOCKDEP) += lockdep_proc.o +@@ -25,8 +29,11 @@ obj-$(CONFIG_RT_MUTEXES) += rtmutex.o + obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o + obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o + obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o ++ifneq ($(CONFIG_PREEMPT_RT_FULL),y) + obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o + obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem-xadd.o ++endif ++obj-$(CONFIG_PREEMPT_RT_FULL) += mutex-rt.o rwsem-rt.o rwlock-rt.o + obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o + obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o + obj-$(CONFIG_WW_MUTEX_SELFTEST) += test-ww_mutex.o +diff --git a/kernel/locking/spinlock.c b/kernel/locking/spinlock.c +index 936f3d14dd6b..e89b70f474af 100644 +--- a/kernel/locking/spinlock.c ++++ b/kernel/locking/spinlock.c +@@ -117,8 +117,11 @@ void __lockfunc __raw_##op##_lock_bh(locktype##_t *lock) \ + * __[spin|read|write]_lock_bh() + */ + BUILD_LOCK_OPS(spin, raw_spinlock); ++ ++#ifndef CONFIG_PREEMPT_RT_FULL + BUILD_LOCK_OPS(read, rwlock); + BUILD_LOCK_OPS(write, rwlock); ++#endif + + #endif + +@@ -202,6 +205,8 @@ void __lockfunc _raw_spin_unlock_bh(raw_spinlock_t *lock) + EXPORT_SYMBOL(_raw_spin_unlock_bh); + #endif + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + #ifndef CONFIG_INLINE_READ_TRYLOCK + int __lockfunc _raw_read_trylock(rwlock_t *lock) + { +@@ -346,6 +351,8 @@ void __lockfunc _raw_write_unlock_bh(rwlock_t *lock) + EXPORT_SYMBOL(_raw_write_unlock_bh); + #endif + ++#endif /* !PREEMPT_RT_FULL */ ++ + #ifdef CONFIG_DEBUG_LOCK_ALLOC + + void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) +diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c +index 03595c29c566..d63df281b495 100644 +--- a/kernel/locking/spinlock_debug.c ++++ b/kernel/locking/spinlock_debug.c +@@ -31,6 +31,7 @@ void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name, + + EXPORT_SYMBOL(__raw_spin_lock_init); + ++#ifndef CONFIG_PREEMPT_RT_FULL + void __rwlock_init(rwlock_t *lock, const char *name, + struct lock_class_key *key) + { +@@ -48,6 +49,7 @@ void __rwlock_init(rwlock_t *lock, const char *name, + } + + EXPORT_SYMBOL(__rwlock_init); ++#endif + + static void spin_dump(raw_spinlock_t *lock, const char *msg) + { +@@ -135,6 +137,7 @@ void do_raw_spin_unlock(raw_spinlock_t *lock) + arch_spin_unlock(&lock->raw_lock); + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + static void rwlock_bug(rwlock_t *lock, const char *msg) + { + if (!debug_locks_off()) +@@ -224,3 +227,5 @@ void do_raw_write_unlock(rwlock_t *lock) + debug_write_unlock(lock); + arch_write_unlock(&lock->raw_lock); + } ++ ++#endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0148-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch linux-4.19.118/debian/patches-rt/0148-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch --- linux-4.19.98/debian/patches-rt/0148-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0148-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,445 @@ +From d6a9cbc956c42c07d71a11067efef3e29237f1e1 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 12 Oct 2017 17:34:38 +0200 +Subject: [PATCH 148/325] rtmutex: add ww_mutex addon for mutex-rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rtmutex.c | 271 ++++++++++++++++++++++++++++++-- + kernel/locking/rtmutex_common.h | 2 + + kernel/locking/rwsem-rt.c | 2 +- + 3 files changed, 261 insertions(+), 14 deletions(-) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 88df1ff7ca2d..1f2dc2dfe2e7 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + #include "rtmutex_common.h" + +@@ -1245,6 +1246,40 @@ EXPORT_SYMBOL(__rt_spin_lock_init); + + #endif /* PREEMPT_RT_FULL */ + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ static inline int __sched ++__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); ++ struct ww_acquire_ctx *hold_ctx = READ_ONCE(ww->ctx); ++ ++ if (!hold_ctx) ++ return 0; ++ ++ if (unlikely(ctx == hold_ctx)) ++ return -EALREADY; ++ ++ if (ctx->stamp - hold_ctx->stamp <= LONG_MAX && ++ (ctx->stamp != hold_ctx->stamp || ctx > hold_ctx)) { ++#ifdef CONFIG_DEBUG_MUTEXES ++ DEBUG_LOCKS_WARN_ON(ctx->contending_lock); ++ ctx->contending_lock = ww; ++#endif ++ return -EDEADLK; ++ } ++ ++ return 0; ++} ++#else ++ static inline int __sched ++__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ BUG(); ++ return 0; ++} ++ ++#endif ++ + static inline int + try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + struct rt_mutex_waiter *waiter) +@@ -1523,7 +1558,8 @@ void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate) + static int __sched + __rt_mutex_slowlock(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, +- struct rt_mutex_waiter *waiter) ++ struct rt_mutex_waiter *waiter, ++ struct ww_acquire_ctx *ww_ctx) + { + int ret = 0; + +@@ -1541,6 +1577,12 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state, + break; + } + ++ if (ww_ctx && ww_ctx->acquired > 0) { ++ ret = __mutex_lock_check_stamp(lock, ww_ctx); ++ if (ret) ++ break; ++ } ++ + raw_spin_unlock_irq(&lock->wait_lock); + + debug_rt_mutex_print_deadlock(waiter); +@@ -1575,16 +1617,106 @@ static void rt_mutex_handle_deadlock(int res, int detect_deadlock, + } + } + ++static __always_inline void ww_mutex_lock_acquired(struct ww_mutex *ww, ++ struct ww_acquire_ctx *ww_ctx) ++{ ++#ifdef CONFIG_DEBUG_MUTEXES ++ /* ++ * If this WARN_ON triggers, you used ww_mutex_lock to acquire, ++ * but released with a normal mutex_unlock in this call. ++ * ++ * This should never happen, always use ww_mutex_unlock. ++ */ ++ DEBUG_LOCKS_WARN_ON(ww->ctx); ++ ++ /* ++ * Not quite done after calling ww_acquire_done() ? ++ */ ++ DEBUG_LOCKS_WARN_ON(ww_ctx->done_acquire); ++ ++ if (ww_ctx->contending_lock) { ++ /* ++ * After -EDEADLK you tried to ++ * acquire a different ww_mutex? Bad! ++ */ ++ DEBUG_LOCKS_WARN_ON(ww_ctx->contending_lock != ww); ++ ++ /* ++ * You called ww_mutex_lock after receiving -EDEADLK, ++ * but 'forgot' to unlock everything else first? ++ */ ++ DEBUG_LOCKS_WARN_ON(ww_ctx->acquired > 0); ++ ww_ctx->contending_lock = NULL; ++ } ++ ++ /* ++ * Naughty, using a different class will lead to undefined behavior! ++ */ ++ DEBUG_LOCKS_WARN_ON(ww_ctx->ww_class != ww->ww_class); ++#endif ++ ww_ctx->acquired++; ++} ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++static void ww_mutex_account_lock(struct rt_mutex *lock, ++ struct ww_acquire_ctx *ww_ctx) ++{ ++ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); ++ struct rt_mutex_waiter *waiter, *n; ++ ++ /* ++ * This branch gets optimized out for the common case, ++ * and is only important for ww_mutex_lock. ++ */ ++ ww_mutex_lock_acquired(ww, ww_ctx); ++ ww->ctx = ww_ctx; ++ ++ /* ++ * Give any possible sleeping processes the chance to wake up, ++ * so they can recheck if they have to back off. ++ */ ++ rbtree_postorder_for_each_entry_safe(waiter, n, &lock->waiters.rb_root, ++ tree_entry) { ++ /* XXX debug rt mutex waiter wakeup */ ++ ++ BUG_ON(waiter->lock != lock); ++ rt_mutex_wake_waiter(waiter); ++ } ++} ++ ++#else ++ ++static void ww_mutex_account_lock(struct rt_mutex *lock, ++ struct ww_acquire_ctx *ww_ctx) ++{ ++ BUG(); ++} ++#endif ++ + int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, + enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx, + struct rt_mutex_waiter *waiter) + { + int ret; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (ww_ctx) { ++ struct ww_mutex *ww; ++ ++ ww = container_of(lock, struct ww_mutex, base.lock); ++ if (unlikely(ww_ctx == READ_ONCE(ww->ctx))) ++ return -EALREADY; ++ } ++#endif ++ + /* Try to acquire the lock again: */ +- if (try_to_take_rt_mutex(lock, current, NULL)) ++ if (try_to_take_rt_mutex(lock, current, NULL)) { ++ if (ww_ctx) ++ ww_mutex_account_lock(lock, ww_ctx); + return 0; ++ } + + set_current_state(state); + +@@ -1594,14 +1726,24 @@ int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + + ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); + +- if (likely(!ret)) ++ if (likely(!ret)) { + /* sleep on the mutex */ +- ret = __rt_mutex_slowlock(lock, state, timeout, waiter); ++ ret = __rt_mutex_slowlock(lock, state, timeout, waiter, ++ ww_ctx); ++ } else if (ww_ctx) { ++ /* ww_mutex received EDEADLK, let it become EALREADY */ ++ ret = __mutex_lock_check_stamp(lock, ww_ctx); ++ BUG_ON(!ret); ++ } + + if (unlikely(ret)) { + __set_current_state(TASK_RUNNING); + remove_waiter(lock, waiter); +- rt_mutex_handle_deadlock(ret, chwalk, waiter); ++ /* ww_mutex wants to report EDEADLK/EALREADY, let it */ ++ if (!ww_ctx) ++ rt_mutex_handle_deadlock(ret, chwalk, waiter); ++ } else if (ww_ctx) { ++ ww_mutex_account_lock(lock, ww_ctx); + } + + /* +@@ -1618,7 +1760,8 @@ int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + static int __sched + rt_mutex_slowlock(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk) ++ enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx) + { + struct rt_mutex_waiter waiter; + unsigned long flags; +@@ -1636,7 +1779,8 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, + */ + raw_spin_lock_irqsave(&lock->wait_lock, flags); + +- ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, &waiter); ++ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, ww_ctx, ++ &waiter); + + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + +@@ -1766,29 +1910,33 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, + */ + static inline int + rt_mutex_fastlock(struct rt_mutex *lock, int state, ++ struct ww_acquire_ctx *ww_ctx, + int (*slowfn)(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk)) ++ enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx)) + { + if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) + return 0; + +- return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK); ++ return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx); + } + + static inline int + rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, + enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx, + int (*slowfn)(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk)) ++ enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx)) + { + if (chwalk == RT_MUTEX_MIN_CHAINWALK && + likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) + return 0; + +- return slowfn(lock, state, timeout, chwalk); ++ return slowfn(lock, state, timeout, chwalk, ww_ctx); + } + + static inline int +@@ -1833,7 +1981,7 @@ rt_mutex_fastunlock(struct rt_mutex *lock, + int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) + { + might_sleep(); +- return rt_mutex_fastlock(lock, state, rt_mutex_slowlock); ++ return rt_mutex_fastlock(lock, state, NULL, rt_mutex_slowlock); + } + + /** +@@ -1953,6 +2101,7 @@ rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout) + mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); + ret = rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout, + RT_MUTEX_MIN_CHAINWALK, ++ NULL, + rt_mutex_slowlock); + if (ret) + mutex_release(&lock->dep_map, 1, _RET_IP_); +@@ -2300,7 +2449,7 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, + raw_spin_lock_irq(&lock->wait_lock); + /* sleep on the mutex */ + set_current_state(TASK_INTERRUPTIBLE); +- ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter); ++ ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter, NULL); + /* + * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might + * have to fix that up. +@@ -2385,3 +2534,99 @@ bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock, + + return cleanup; + } ++ ++static inline int ++ww_mutex_deadlock_injection(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH ++ unsigned tmp; ++ ++ if (ctx->deadlock_inject_countdown-- == 0) { ++ tmp = ctx->deadlock_inject_interval; ++ if (tmp > UINT_MAX/4) ++ tmp = UINT_MAX; ++ else ++ tmp = tmp*2 + tmp + tmp/2; ++ ++ ctx->deadlock_inject_interval = tmp; ++ ctx->deadlock_inject_countdown = tmp; ++ ctx->contending_lock = lock; ++ ++ ww_mutex_unlock(lock); ++ ++ return -EDEADLK; ++ } ++#endif ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++int __sched ++ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ int ret; ++ ++ might_sleep(); ++ ++ mutex_acquire_nest(&lock->base.dep_map, 0, 0, ++ ctx ? &ctx->dep_map : NULL, _RET_IP_); ++ ret = rt_mutex_slowlock(&lock->base.lock, TASK_INTERRUPTIBLE, NULL, 0, ++ ctx); ++ if (ret) ++ mutex_release(&lock->base.dep_map, 1, _RET_IP_); ++ else if (!ret && ctx && ctx->acquired > 1) ++ return ww_mutex_deadlock_injection(lock, ctx); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(ww_mutex_lock_interruptible); ++ ++int __sched ++ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ int ret; ++ ++ might_sleep(); ++ ++ mutex_acquire_nest(&lock->base.dep_map, 0, 0, ++ ctx ? &ctx->dep_map : NULL, _RET_IP_); ++ ret = rt_mutex_slowlock(&lock->base.lock, TASK_UNINTERRUPTIBLE, NULL, 0, ++ ctx); ++ if (ret) ++ mutex_release(&lock->base.dep_map, 1, _RET_IP_); ++ else if (!ret && ctx && ctx->acquired > 1) ++ return ww_mutex_deadlock_injection(lock, ctx); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(ww_mutex_lock); ++ ++void __sched ww_mutex_unlock(struct ww_mutex *lock) ++{ ++ int nest = !!lock->ctx; ++ ++ /* ++ * The unlocking fastpath is the 0->1 transition from 'locked' ++ * into 'unlocked' state: ++ */ ++ if (nest) { ++#ifdef CONFIG_DEBUG_MUTEXES ++ DEBUG_LOCKS_WARN_ON(!lock->ctx->acquired); ++#endif ++ if (lock->ctx->acquired > 0) ++ lock->ctx->acquired--; ++ lock->ctx = NULL; ++ } ++ ++ mutex_release(&lock->base.dep_map, nest, _RET_IP_); ++ __rt_mutex_unlock(&lock->base.lock); ++} ++EXPORT_SYMBOL(ww_mutex_unlock); ++ ++int __rt_mutex_owner_current(struct rt_mutex *lock) ++{ ++ return rt_mutex_owner(lock) == current; ++} ++EXPORT_SYMBOL(__rt_mutex_owner_current); ++#endif +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index 6fcf0a3e180d..546aaf058b9e 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -165,6 +165,7 @@ extern void rt_mutex_postunlock(struct wake_q_head *wake_q, + struct wake_q_head *wake_sleeper_q); + + /* RW semaphore special interface */ ++struct ww_acquire_ctx; + + extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); + extern int __rt_mutex_trylock(struct rt_mutex *lock); +@@ -172,6 +173,7 @@ extern void __rt_mutex_unlock(struct rt_mutex *lock); + int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, + enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx, + struct rt_mutex_waiter *waiter); + void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, + struct rt_mutex_waiter *waiter, +diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c +index 7d3c5cf3d23d..660e22caf709 100644 +--- a/kernel/locking/rwsem-rt.c ++++ b/kernel/locking/rwsem-rt.c +@@ -131,7 +131,7 @@ static int __sched __down_read_common(struct rw_semaphore *sem, int state) + */ + rt_mutex_init_waiter(&waiter, false); + ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, +- &waiter); ++ NULL, &waiter); + /* + * The slowlock() above is guaranteed to return with the rtmutex (for + * ret = 0) is now held, so there can't be a writer active. Increment +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0148-rtmutex-wire-up-RT-s-locking.patch linux-4.19.118/debian/patches-rt/0148-rtmutex-wire-up-RT-s-locking.patch --- linux-4.19.98/debian/patches-rt/0148-rtmutex-wire-up-RT-s-locking.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0148-rtmutex-wire-up-RT-s-locking.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,271 +0,0 @@ -From 9e87c4922c3ae6f3e073a0ecb1dc4b0665c4b4be Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 12 Oct 2017 17:31:14 +0200 -Subject: [PATCH 148/290] rtmutex: wire up RT's locking -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/mutex.h | 20 +++++++++++++------- - include/linux/rwsem.h | 11 +++++++++++ - include/linux/spinlock.h | 12 +++++++++++- - include/linux/spinlock_api_smp.h | 4 +++- - include/linux/spinlock_types.h | 11 ++++++++--- - kernel/locking/Makefile | 9 ++++++++- - kernel/locking/spinlock.c | 7 +++++++ - kernel/locking/spinlock_debug.c | 5 +++++ - 8 files changed, 66 insertions(+), 13 deletions(-) - -diff --git a/include/linux/mutex.h b/include/linux/mutex.h -index 3093dd162424..cad906f54d0a 100644 ---- a/include/linux/mutex.h -+++ b/include/linux/mutex.h -@@ -22,6 +22,17 @@ - - struct ww_acquire_ctx; - -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ -+ , .dep_map = { .name = #lockname } -+#else -+# define __DEP_MAP_MUTEX_INITIALIZER(lockname) -+#endif -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+# include -+#else -+ - /* - * Simple, straightforward mutexes with strict semantics: - * -@@ -118,13 +129,6 @@ do { \ - __mutex_init((mutex), #mutex, &__key); \ - } while (0) - --#ifdef CONFIG_DEBUG_LOCK_ALLOC --# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ -- , .dep_map = { .name = #lockname } --#else --# define __DEP_MAP_MUTEX_INITIALIZER(lockname) --#endif -- - #define __MUTEX_INITIALIZER(lockname) \ - { .owner = ATOMIC_LONG_INIT(0) \ - , .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \ -@@ -229,4 +233,6 @@ mutex_trylock_recursive(struct mutex *lock) - return mutex_trylock(lock); - } - -+#endif /* !PREEMPT_RT_FULL */ -+ - #endif /* __LINUX_MUTEX_H */ -diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h -index ab93b6eae696..b1e32373f44f 100644 ---- a/include/linux/rwsem.h -+++ b/include/linux/rwsem.h -@@ -20,6 +20,10 @@ - #include - #endif - -+#ifdef CONFIG_PREEMPT_RT_FULL -+#include -+#else /* PREEMPT_RT_FULL */ -+ - struct rw_semaphore; - - #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK -@@ -114,6 +118,13 @@ static inline int rwsem_is_contended(struct rw_semaphore *sem) - return !list_empty(&sem->wait_list); - } - -+#endif /* !PREEMPT_RT_FULL */ -+ -+/* -+ * The functions below are the same for all rwsem implementations including -+ * the RT specific variant. -+ */ -+ - /* - * lock for reading - */ -diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h -index e089157dcf97..5f5ad0630a26 100644 ---- a/include/linux/spinlock.h -+++ b/include/linux/spinlock.h -@@ -298,7 +298,11 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) - }) - - /* Include rwlock functions */ --#include -+#ifdef CONFIG_PREEMPT_RT_FULL -+# include -+#else -+# include -+#endif - - /* - * Pull the _spin_*()/_read_*()/_write_*() functions/declarations: -@@ -309,6 +313,10 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) - # include - #endif - -+#ifdef CONFIG_PREEMPT_RT_FULL -+# include -+#else /* PREEMPT_RT_FULL */ -+ - /* - * Map the spin_lock functions to the raw variants for PREEMPT_RT=n - */ -@@ -429,6 +437,8 @@ static __always_inline int spin_is_contended(spinlock_t *lock) - - #define assert_spin_locked(lock) assert_raw_spin_locked(&(lock)->rlock) - -+#endif /* !PREEMPT_RT_FULL */ -+ - /* - * Pull the atomic_t declaration: - * (asm-mips/atomic.h needs above definitions) -diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h -index 42dfab89e740..29d99ae5a8ab 100644 ---- a/include/linux/spinlock_api_smp.h -+++ b/include/linux/spinlock_api_smp.h -@@ -187,6 +187,8 @@ static inline int __raw_spin_trylock_bh(raw_spinlock_t *lock) - return 0; - } - --#include -+#ifndef CONFIG_PREEMPT_RT_FULL -+# include -+#endif - - #endif /* __LINUX_SPINLOCK_API_SMP_H */ -diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h -index 5c8664d57fb8..10bac715ea96 100644 ---- a/include/linux/spinlock_types.h -+++ b/include/linux/spinlock_types.h -@@ -11,8 +11,13 @@ - - #include - --#include -- --#include -+#ifndef CONFIG_PREEMPT_RT_FULL -+# include -+# include -+#else -+# include -+# include -+# include -+#endif - - #endif /* __LINUX_SPINLOCK_TYPES_H */ -diff --git a/kernel/locking/Makefile b/kernel/locking/Makefile -index 392c7f23af76..c0bf04b6b965 100644 ---- a/kernel/locking/Makefile -+++ b/kernel/locking/Makefile -@@ -3,7 +3,7 @@ - # and is generally not a function of system call inputs. - KCOV_INSTRUMENT := n - --obj-y += mutex.o semaphore.o rwsem.o percpu-rwsem.o -+obj-y += semaphore.o percpu-rwsem.o - - ifdef CONFIG_FUNCTION_TRACER - CFLAGS_REMOVE_lockdep.o = $(CC_FLAGS_FTRACE) -@@ -12,7 +12,11 @@ CFLAGS_REMOVE_mutex-debug.o = $(CC_FLAGS_FTRACE) - CFLAGS_REMOVE_rtmutex-debug.o = $(CC_FLAGS_FTRACE) - endif - -+ifneq ($(CONFIG_PREEMPT_RT_FULL),y) -+obj-y += mutex.o - obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o -+endif -+obj-y += rwsem.o - obj-$(CONFIG_LOCKDEP) += lockdep.o - ifeq ($(CONFIG_PROC_FS),y) - obj-$(CONFIG_LOCKDEP) += lockdep_proc.o -@@ -25,8 +29,11 @@ obj-$(CONFIG_RT_MUTEXES) += rtmutex.o - obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o - obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o - obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o -+ifneq ($(CONFIG_PREEMPT_RT_FULL),y) - obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o - obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem-xadd.o -+endif -+obj-$(CONFIG_PREEMPT_RT_FULL) += mutex-rt.o rwsem-rt.o rwlock-rt.o - obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o - obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o - obj-$(CONFIG_WW_MUTEX_SELFTEST) += test-ww_mutex.o -diff --git a/kernel/locking/spinlock.c b/kernel/locking/spinlock.c -index 936f3d14dd6b..e89b70f474af 100644 ---- a/kernel/locking/spinlock.c -+++ b/kernel/locking/spinlock.c -@@ -117,8 +117,11 @@ void __lockfunc __raw_##op##_lock_bh(locktype##_t *lock) \ - * __[spin|read|write]_lock_bh() - */ - BUILD_LOCK_OPS(spin, raw_spinlock); -+ -+#ifndef CONFIG_PREEMPT_RT_FULL - BUILD_LOCK_OPS(read, rwlock); - BUILD_LOCK_OPS(write, rwlock); -+#endif - - #endif - -@@ -202,6 +205,8 @@ void __lockfunc _raw_spin_unlock_bh(raw_spinlock_t *lock) - EXPORT_SYMBOL(_raw_spin_unlock_bh); - #endif - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - #ifndef CONFIG_INLINE_READ_TRYLOCK - int __lockfunc _raw_read_trylock(rwlock_t *lock) - { -@@ -346,6 +351,8 @@ void __lockfunc _raw_write_unlock_bh(rwlock_t *lock) - EXPORT_SYMBOL(_raw_write_unlock_bh); - #endif - -+#endif /* !PREEMPT_RT_FULL */ -+ - #ifdef CONFIG_DEBUG_LOCK_ALLOC - - void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) -diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c -index 9aa0fccd5d43..76d0b40d9193 100644 ---- a/kernel/locking/spinlock_debug.c -+++ b/kernel/locking/spinlock_debug.c -@@ -31,6 +31,7 @@ void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name, - - EXPORT_SYMBOL(__raw_spin_lock_init); - -+#ifndef CONFIG_PREEMPT_RT_FULL - void __rwlock_init(rwlock_t *lock, const char *name, - struct lock_class_key *key) - { -@@ -48,6 +49,7 @@ void __rwlock_init(rwlock_t *lock, const char *name, - } - - EXPORT_SYMBOL(__rwlock_init); -+#endif - - static void spin_dump(raw_spinlock_t *lock, const char *msg) - { -@@ -135,6 +137,7 @@ void do_raw_spin_unlock(raw_spinlock_t *lock) - arch_spin_unlock(&lock->raw_lock); - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - static void rwlock_bug(rwlock_t *lock, const char *msg) - { - if (!debug_locks_off()) -@@ -224,3 +227,5 @@ void do_raw_write_unlock(rwlock_t *lock) - debug_write_unlock(lock); - arch_write_unlock(&lock->raw_lock); - } -+ -+#endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0149-kconfig-Add-PREEMPT_RT_FULL.patch linux-4.19.118/debian/patches-rt/0149-kconfig-Add-PREEMPT_RT_FULL.patch --- linux-4.19.98/debian/patches-rt/0149-kconfig-Add-PREEMPT_RT_FULL.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0149-kconfig-Add-PREEMPT_RT_FULL.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,69 @@ +From 67573be98569ffc12244d2fa84decc676df9728a Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 29 Jun 2011 14:58:57 +0200 +Subject: [PATCH 149/325] kconfig: Add PREEMPT_RT_FULL +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Introduce the final symbol for PREEMPT_RT_FULL. + +Signed-off-by: Thomas Gleixner +--- + init/Makefile | 2 +- + kernel/Kconfig.preempt | 8 ++++++++ + scripts/mkcompile_h | 4 +++- + 3 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/init/Makefile b/init/Makefile +index a3e5ce2bcf08..7779232563ae 100644 +--- a/init/Makefile ++++ b/init/Makefile +@@ -34,4 +34,4 @@ silent_chk_compile.h = : + include/generated/compile.h: FORCE + @$($(quiet)chk_compile.h) + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ +- "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)" ++ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CONFIG_PREEMPT_RT_FULL)" "$(CC) $(KBUILD_CFLAGS)" +diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt +index 027db5976c2f..907d72b3ba95 100644 +--- a/kernel/Kconfig.preempt ++++ b/kernel/Kconfig.preempt +@@ -69,6 +69,14 @@ config PREEMPT_RTB + enables changes which are preliminary for the full preemptible + RT kernel. + ++config PREEMPT_RT_FULL ++ bool "Fully Preemptible Kernel (RT)" ++ depends on IRQ_FORCED_THREADING ++ select PREEMPT_RT_BASE ++ select PREEMPT_RCU ++ help ++ All and everything ++ + endchoice + + config PREEMPT_COUNT +diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h +index 87f1fc9801d7..f67b15236936 100755 +--- a/scripts/mkcompile_h ++++ b/scripts/mkcompile_h +@@ -5,7 +5,8 @@ TARGET=$1 + ARCH=$2 + SMP=$3 + PREEMPT=$4 +-CC=$5 ++RT=$5 ++CC=$6 + + vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } + +@@ -53,6 +54,7 @@ UTS_VERSION="#$VERSION" + CONFIG_FLAGS="" + if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi + if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi ++if [ -n "$RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS RT"; fi + UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP" + + # Truncate to maximum length +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0149-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch linux-4.19.118/debian/patches-rt/0149-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch --- linux-4.19.98/debian/patches-rt/0149-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0149-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,445 +0,0 @@ -From 64764668902a060fa582a410b499d57d0777b24c Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 12 Oct 2017 17:34:38 +0200 -Subject: [PATCH 149/290] rtmutex: add ww_mutex addon for mutex-rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 271 ++++++++++++++++++++++++++++++-- - kernel/locking/rtmutex_common.h | 2 + - kernel/locking/rwsem-rt.c | 2 +- - 3 files changed, 261 insertions(+), 14 deletions(-) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 88df1ff7ca2d..1f2dc2dfe2e7 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - - #include "rtmutex_common.h" - -@@ -1245,6 +1246,40 @@ EXPORT_SYMBOL(__rt_spin_lock_init); - - #endif /* PREEMPT_RT_FULL */ - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ static inline int __sched -+__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); -+ struct ww_acquire_ctx *hold_ctx = READ_ONCE(ww->ctx); -+ -+ if (!hold_ctx) -+ return 0; -+ -+ if (unlikely(ctx == hold_ctx)) -+ return -EALREADY; -+ -+ if (ctx->stamp - hold_ctx->stamp <= LONG_MAX && -+ (ctx->stamp != hold_ctx->stamp || ctx > hold_ctx)) { -+#ifdef CONFIG_DEBUG_MUTEXES -+ DEBUG_LOCKS_WARN_ON(ctx->contending_lock); -+ ctx->contending_lock = ww; -+#endif -+ return -EDEADLK; -+ } -+ -+ return 0; -+} -+#else -+ static inline int __sched -+__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ BUG(); -+ return 0; -+} -+ -+#endif -+ - static inline int - try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, - struct rt_mutex_waiter *waiter) -@@ -1523,7 +1558,8 @@ void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate) - static int __sched - __rt_mutex_slowlock(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, -- struct rt_mutex_waiter *waiter) -+ struct rt_mutex_waiter *waiter, -+ struct ww_acquire_ctx *ww_ctx) - { - int ret = 0; - -@@ -1541,6 +1577,12 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state, - break; - } - -+ if (ww_ctx && ww_ctx->acquired > 0) { -+ ret = __mutex_lock_check_stamp(lock, ww_ctx); -+ if (ret) -+ break; -+ } -+ - raw_spin_unlock_irq(&lock->wait_lock); - - debug_rt_mutex_print_deadlock(waiter); -@@ -1575,16 +1617,106 @@ static void rt_mutex_handle_deadlock(int res, int detect_deadlock, - } - } - -+static __always_inline void ww_mutex_lock_acquired(struct ww_mutex *ww, -+ struct ww_acquire_ctx *ww_ctx) -+{ -+#ifdef CONFIG_DEBUG_MUTEXES -+ /* -+ * If this WARN_ON triggers, you used ww_mutex_lock to acquire, -+ * but released with a normal mutex_unlock in this call. -+ * -+ * This should never happen, always use ww_mutex_unlock. -+ */ -+ DEBUG_LOCKS_WARN_ON(ww->ctx); -+ -+ /* -+ * Not quite done after calling ww_acquire_done() ? -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->done_acquire); -+ -+ if (ww_ctx->contending_lock) { -+ /* -+ * After -EDEADLK you tried to -+ * acquire a different ww_mutex? Bad! -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->contending_lock != ww); -+ -+ /* -+ * You called ww_mutex_lock after receiving -EDEADLK, -+ * but 'forgot' to unlock everything else first? -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->acquired > 0); -+ ww_ctx->contending_lock = NULL; -+ } -+ -+ /* -+ * Naughty, using a different class will lead to undefined behavior! -+ */ -+ DEBUG_LOCKS_WARN_ON(ww_ctx->ww_class != ww->ww_class); -+#endif -+ ww_ctx->acquired++; -+} -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+static void ww_mutex_account_lock(struct rt_mutex *lock, -+ struct ww_acquire_ctx *ww_ctx) -+{ -+ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); -+ struct rt_mutex_waiter *waiter, *n; -+ -+ /* -+ * This branch gets optimized out for the common case, -+ * and is only important for ww_mutex_lock. -+ */ -+ ww_mutex_lock_acquired(ww, ww_ctx); -+ ww->ctx = ww_ctx; -+ -+ /* -+ * Give any possible sleeping processes the chance to wake up, -+ * so they can recheck if they have to back off. -+ */ -+ rbtree_postorder_for_each_entry_safe(waiter, n, &lock->waiters.rb_root, -+ tree_entry) { -+ /* XXX debug rt mutex waiter wakeup */ -+ -+ BUG_ON(waiter->lock != lock); -+ rt_mutex_wake_waiter(waiter); -+ } -+} -+ -+#else -+ -+static void ww_mutex_account_lock(struct rt_mutex *lock, -+ struct ww_acquire_ctx *ww_ctx) -+{ -+ BUG(); -+} -+#endif -+ - int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx, - struct rt_mutex_waiter *waiter) - { - int ret; - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (ww_ctx) { -+ struct ww_mutex *ww; -+ -+ ww = container_of(lock, struct ww_mutex, base.lock); -+ if (unlikely(ww_ctx == READ_ONCE(ww->ctx))) -+ return -EALREADY; -+ } -+#endif -+ - /* Try to acquire the lock again: */ -- if (try_to_take_rt_mutex(lock, current, NULL)) -+ if (try_to_take_rt_mutex(lock, current, NULL)) { -+ if (ww_ctx) -+ ww_mutex_account_lock(lock, ww_ctx); - return 0; -+ } - - set_current_state(state); - -@@ -1594,14 +1726,24 @@ int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - - ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); - -- if (likely(!ret)) -+ if (likely(!ret)) { - /* sleep on the mutex */ -- ret = __rt_mutex_slowlock(lock, state, timeout, waiter); -+ ret = __rt_mutex_slowlock(lock, state, timeout, waiter, -+ ww_ctx); -+ } else if (ww_ctx) { -+ /* ww_mutex received EDEADLK, let it become EALREADY */ -+ ret = __mutex_lock_check_stamp(lock, ww_ctx); -+ BUG_ON(!ret); -+ } - - if (unlikely(ret)) { - __set_current_state(TASK_RUNNING); - remove_waiter(lock, waiter); -- rt_mutex_handle_deadlock(ret, chwalk, waiter); -+ /* ww_mutex wants to report EDEADLK/EALREADY, let it */ -+ if (!ww_ctx) -+ rt_mutex_handle_deadlock(ret, chwalk, waiter); -+ } else if (ww_ctx) { -+ ww_mutex_account_lock(lock, ww_ctx); - } - - /* -@@ -1618,7 +1760,8 @@ int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - static int __sched - rt_mutex_slowlock(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk) -+ enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx) - { - struct rt_mutex_waiter waiter; - unsigned long flags; -@@ -1636,7 +1779,8 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, - */ - raw_spin_lock_irqsave(&lock->wait_lock, flags); - -- ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, &waiter); -+ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, ww_ctx, -+ &waiter); - - raw_spin_unlock_irqrestore(&lock->wait_lock, flags); - -@@ -1766,29 +1910,33 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, - */ - static inline int - rt_mutex_fastlock(struct rt_mutex *lock, int state, -+ struct ww_acquire_ctx *ww_ctx, - int (*slowfn)(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk)) -+ enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx)) - { - if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) - return 0; - -- return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK); -+ return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx); - } - - static inline int - rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx, - int (*slowfn)(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, -- enum rtmutex_chainwalk chwalk)) -+ enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx)) - { - if (chwalk == RT_MUTEX_MIN_CHAINWALK && - likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) - return 0; - -- return slowfn(lock, state, timeout, chwalk); -+ return slowfn(lock, state, timeout, chwalk, ww_ctx); - } - - static inline int -@@ -1833,7 +1981,7 @@ rt_mutex_fastunlock(struct rt_mutex *lock, - int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) - { - might_sleep(); -- return rt_mutex_fastlock(lock, state, rt_mutex_slowlock); -+ return rt_mutex_fastlock(lock, state, NULL, rt_mutex_slowlock); - } - - /** -@@ -1953,6 +2101,7 @@ rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout) - mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); - ret = rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout, - RT_MUTEX_MIN_CHAINWALK, -+ NULL, - rt_mutex_slowlock); - if (ret) - mutex_release(&lock->dep_map, 1, _RET_IP_); -@@ -2300,7 +2449,7 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, - raw_spin_lock_irq(&lock->wait_lock); - /* sleep on the mutex */ - set_current_state(TASK_INTERRUPTIBLE); -- ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter); -+ ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter, NULL); - /* - * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might - * have to fix that up. -@@ -2385,3 +2534,99 @@ bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock, - - return cleanup; - } -+ -+static inline int -+ww_mutex_deadlock_injection(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH -+ unsigned tmp; -+ -+ if (ctx->deadlock_inject_countdown-- == 0) { -+ tmp = ctx->deadlock_inject_interval; -+ if (tmp > UINT_MAX/4) -+ tmp = UINT_MAX; -+ else -+ tmp = tmp*2 + tmp + tmp/2; -+ -+ ctx->deadlock_inject_interval = tmp; -+ ctx->deadlock_inject_countdown = tmp; -+ ctx->contending_lock = lock; -+ -+ ww_mutex_unlock(lock); -+ -+ return -EDEADLK; -+ } -+#endif -+ -+ return 0; -+} -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+int __sched -+ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ int ret; -+ -+ might_sleep(); -+ -+ mutex_acquire_nest(&lock->base.dep_map, 0, 0, -+ ctx ? &ctx->dep_map : NULL, _RET_IP_); -+ ret = rt_mutex_slowlock(&lock->base.lock, TASK_INTERRUPTIBLE, NULL, 0, -+ ctx); -+ if (ret) -+ mutex_release(&lock->base.dep_map, 1, _RET_IP_); -+ else if (!ret && ctx && ctx->acquired > 1) -+ return ww_mutex_deadlock_injection(lock, ctx); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(ww_mutex_lock_interruptible); -+ -+int __sched -+ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) -+{ -+ int ret; -+ -+ might_sleep(); -+ -+ mutex_acquire_nest(&lock->base.dep_map, 0, 0, -+ ctx ? &ctx->dep_map : NULL, _RET_IP_); -+ ret = rt_mutex_slowlock(&lock->base.lock, TASK_UNINTERRUPTIBLE, NULL, 0, -+ ctx); -+ if (ret) -+ mutex_release(&lock->base.dep_map, 1, _RET_IP_); -+ else if (!ret && ctx && ctx->acquired > 1) -+ return ww_mutex_deadlock_injection(lock, ctx); -+ -+ return ret; -+} -+EXPORT_SYMBOL_GPL(ww_mutex_lock); -+ -+void __sched ww_mutex_unlock(struct ww_mutex *lock) -+{ -+ int nest = !!lock->ctx; -+ -+ /* -+ * The unlocking fastpath is the 0->1 transition from 'locked' -+ * into 'unlocked' state: -+ */ -+ if (nest) { -+#ifdef CONFIG_DEBUG_MUTEXES -+ DEBUG_LOCKS_WARN_ON(!lock->ctx->acquired); -+#endif -+ if (lock->ctx->acquired > 0) -+ lock->ctx->acquired--; -+ lock->ctx = NULL; -+ } -+ -+ mutex_release(&lock->base.dep_map, nest, _RET_IP_); -+ __rt_mutex_unlock(&lock->base.lock); -+} -+EXPORT_SYMBOL(ww_mutex_unlock); -+ -+int __rt_mutex_owner_current(struct rt_mutex *lock) -+{ -+ return rt_mutex_owner(lock) == current; -+} -+EXPORT_SYMBOL(__rt_mutex_owner_current); -+#endif -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index 6fcf0a3e180d..546aaf058b9e 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -165,6 +165,7 @@ extern void rt_mutex_postunlock(struct wake_q_head *wake_q, - struct wake_q_head *wake_sleeper_q); - - /* RW semaphore special interface */ -+struct ww_acquire_ctx; - - extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); - extern int __rt_mutex_trylock(struct rt_mutex *lock); -@@ -172,6 +173,7 @@ extern void __rt_mutex_unlock(struct rt_mutex *lock); - int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, - struct hrtimer_sleeper *timeout, - enum rtmutex_chainwalk chwalk, -+ struct ww_acquire_ctx *ww_ctx, - struct rt_mutex_waiter *waiter); - void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, - struct rt_mutex_waiter *waiter, -diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c -index 7d3c5cf3d23d..660e22caf709 100644 ---- a/kernel/locking/rwsem-rt.c -+++ b/kernel/locking/rwsem-rt.c -@@ -131,7 +131,7 @@ static int __sched __down_read_common(struct rw_semaphore *sem, int state) - */ - rt_mutex_init_waiter(&waiter, false); - ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, -- &waiter); -+ NULL, &waiter); - /* - * The slowlock() above is guaranteed to return with the rtmutex (for - * ret = 0) is now held, so there can't be a writer active. Increment --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0150-kconfig-Add-PREEMPT_RT_FULL.patch linux-4.19.118/debian/patches-rt/0150-kconfig-Add-PREEMPT_RT_FULL.patch --- linux-4.19.98/debian/patches-rt/0150-kconfig-Add-PREEMPT_RT_FULL.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0150-kconfig-Add-PREEMPT_RT_FULL.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -From 3df2347f3344f0d953425b31f1bf75d408a4b872 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 29 Jun 2011 14:58:57 +0200 -Subject: [PATCH 150/290] kconfig: Add PREEMPT_RT_FULL -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Introduce the final symbol for PREEMPT_RT_FULL. - -Signed-off-by: Thomas Gleixner ---- - init/Makefile | 2 +- - kernel/Kconfig.preempt | 8 ++++++++ - scripts/mkcompile_h | 4 +++- - 3 files changed, 12 insertions(+), 2 deletions(-) - -diff --git a/init/Makefile b/init/Makefile -index a3e5ce2bcf08..7779232563ae 100644 ---- a/init/Makefile -+++ b/init/Makefile -@@ -34,4 +34,4 @@ silent_chk_compile.h = : - include/generated/compile.h: FORCE - @$($(quiet)chk_compile.h) - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \ -- "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CC) $(KBUILD_CFLAGS)" -+ "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CONFIG_PREEMPT_RT_FULL)" "$(CC) $(KBUILD_CFLAGS)" -diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt -index 027db5976c2f..907d72b3ba95 100644 ---- a/kernel/Kconfig.preempt -+++ b/kernel/Kconfig.preempt -@@ -69,6 +69,14 @@ config PREEMPT_RTB - enables changes which are preliminary for the full preemptible - RT kernel. - -+config PREEMPT_RT_FULL -+ bool "Fully Preemptible Kernel (RT)" -+ depends on IRQ_FORCED_THREADING -+ select PREEMPT_RT_BASE -+ select PREEMPT_RCU -+ help -+ All and everything -+ - endchoice - - config PREEMPT_COUNT -diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h -index 87f1fc9801d7..f67b15236936 100755 ---- a/scripts/mkcompile_h -+++ b/scripts/mkcompile_h -@@ -5,7 +5,8 @@ TARGET=$1 - ARCH=$2 - SMP=$3 - PREEMPT=$4 --CC=$5 -+RT=$5 -+CC=$6 - - vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } - -@@ -53,6 +54,7 @@ UTS_VERSION="#$VERSION" - CONFIG_FLAGS="" - if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi - if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi -+if [ -n "$RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS RT"; fi - UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP" - - # Truncate to maximum length --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0150-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch linux-4.19.118/debian/patches-rt/0150-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch --- linux-4.19.98/debian/patches-rt/0150-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0150-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,81 @@ +From 87d8613d1063e08541e25fc170d79d1a675580b8 Mon Sep 17 00:00:00 2001 +From: Mikulas Patocka +Date: Mon, 13 Nov 2017 12:56:53 -0500 +Subject: [PATCH 150/325] locking/rt-mutex: fix deadlock in device mapper / + block-IO +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +When some block device driver creates a bio and submits it to another +block device driver, the bio is added to current->bio_list (in order to +avoid unbounded recursion). + +However, this queuing of bios can cause deadlocks, in order to avoid them, +device mapper registers a function flush_current_bio_list. This function +is called when device mapper driver blocks. It redirects bios queued on +current->bio_list to helper workqueues, so that these bios can proceed +even if the driver is blocked. + +The problem with CONFIG_PREEMPT_RT_FULL is that when the device mapper +driver blocks, it won't call flush_current_bio_list (because +tsk_is_pi_blocked returns true in sched_submit_work), so deadlocks in +block device stack can happen. + +Note that we can't call blk_schedule_flush_plug if tsk_is_pi_blocked +returns true - that would cause +BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in +task_blocks_on_rt_mutex when flush_current_bio_list attempts to take a +spinlock. + +So the proper fix is to call blk_schedule_flush_plug in rt_mutex_fastlock, +when fast acquire failed and when the task is about to block. + +CC: stable-rt@vger.kernel.org +[bigeasy: The deadlock is not device-mapper specific, it can also occur + in plain EXT4] +Signed-off-by: Mikulas Patocka +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rtmutex.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 1f2dc2dfe2e7..b38c3a92dce8 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + + #include "rtmutex_common.h" + +@@ -1919,6 +1920,15 @@ rt_mutex_fastlock(struct rt_mutex *lock, int state, + if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) + return 0; + ++ /* ++ * If rt_mutex blocks, the function sched_submit_work will not call ++ * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true). ++ * We must call blk_schedule_flush_plug here, if we don't call it, ++ * a deadlock in I/O may happen. ++ */ ++ if (unlikely(blk_needs_flush_plug(current))) ++ blk_schedule_flush_plug(current); ++ + return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx); + } + +@@ -1936,6 +1946,9 @@ rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, + likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) + return 0; + ++ if (unlikely(blk_needs_flush_plug(current))) ++ blk_schedule_flush_plug(current); ++ + return slowfn(lock, state, timeout, chwalk, ww_ctx); + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch linux-4.19.118/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch --- linux-4.19.98/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,46 @@ +From 0ff5fd365065d431385afd38184b9555c870ce3b Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Fri, 4 Jan 2019 15:33:21 -0500 +Subject: [PATCH 151/325] locking/rt-mutex: Flush block plug on __down_read() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +__down_read() bypasses the rtmutex frontend to call +rt_mutex_slowlock_locked() directly, and thus it needs to call +blk_schedule_flush_flug() itself. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Scott Wood +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rwsem-rt.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c +index 660e22caf709..f518495bd6cc 100644 +--- a/kernel/locking/rwsem-rt.c ++++ b/kernel/locking/rwsem-rt.c +@@ -1,5 +1,6 @@ + /* + */ ++#include + #include + #include + #include +@@ -87,6 +88,14 @@ static int __sched __down_read_common(struct rw_semaphore *sem, int state) + + if (__down_read_trylock(sem)) + return 0; ++ /* ++ * If rt_mutex blocks, the function sched_submit_work will not call ++ * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true). ++ * We must call blk_schedule_flush_plug here, if we don't call it, ++ * a deadlock in I/O may happen. ++ */ ++ if (unlikely(blk_needs_flush_plug(current))) ++ blk_schedule_flush_plug(current); + + might_sleep(); + raw_spin_lock_irq(&m->wait_lock); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0151-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch linux-4.19.118/debian/patches-rt/0151-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch --- linux-4.19.98/debian/patches-rt/0151-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0151-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -From d195cae60a247824d8be07574d6fcc425b35d074 Mon Sep 17 00:00:00 2001 -From: Mikulas Patocka -Date: Mon, 13 Nov 2017 12:56:53 -0500 -Subject: [PATCH 151/290] locking/rt-mutex: fix deadlock in device mapper / - block-IO -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -When some block device driver creates a bio and submits it to another -block device driver, the bio is added to current->bio_list (in order to -avoid unbounded recursion). - -However, this queuing of bios can cause deadlocks, in order to avoid them, -device mapper registers a function flush_current_bio_list. This function -is called when device mapper driver blocks. It redirects bios queued on -current->bio_list to helper workqueues, so that these bios can proceed -even if the driver is blocked. - -The problem with CONFIG_PREEMPT_RT_FULL is that when the device mapper -driver blocks, it won't call flush_current_bio_list (because -tsk_is_pi_blocked returns true in sched_submit_work), so deadlocks in -block device stack can happen. - -Note that we can't call blk_schedule_flush_plug if tsk_is_pi_blocked -returns true - that would cause -BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in -task_blocks_on_rt_mutex when flush_current_bio_list attempts to take a -spinlock. - -So the proper fix is to call blk_schedule_flush_plug in rt_mutex_fastlock, -when fast acquire failed and when the task is about to block. - -CC: stable-rt@vger.kernel.org -[bigeasy: The deadlock is not device-mapper specific, it can also occur - in plain EXT4] -Signed-off-by: Mikulas Patocka -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 1f2dc2dfe2e7..b38c3a92dce8 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - - #include "rtmutex_common.h" - -@@ -1919,6 +1920,15 @@ rt_mutex_fastlock(struct rt_mutex *lock, int state, - if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) - return 0; - -+ /* -+ * If rt_mutex blocks, the function sched_submit_work will not call -+ * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true). -+ * We must call blk_schedule_flush_plug here, if we don't call it, -+ * a deadlock in I/O may happen. -+ */ -+ if (unlikely(blk_needs_flush_plug(current))) -+ blk_schedule_flush_plug(current); -+ - return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx); - } - -@@ -1936,6 +1946,9 @@ rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, - likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) - return 0; - -+ if (unlikely(blk_needs_flush_plug(current))) -+ blk_schedule_flush_plug(current); -+ - return slowfn(lock, state, timeout, chwalk, ww_ctx); - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0152-locking-rt-mutex-Flush-block-plug-on-__down_read.patch linux-4.19.118/debian/patches-rt/0152-locking-rt-mutex-Flush-block-plug-on-__down_read.patch --- linux-4.19.98/debian/patches-rt/0152-locking-rt-mutex-Flush-block-plug-on-__down_read.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0152-locking-rt-mutex-Flush-block-plug-on-__down_read.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -From d501d64d4060f7957c5e2d38cb3b200cf3558c49 Mon Sep 17 00:00:00 2001 -From: Scott Wood -Date: Fri, 4 Jan 2019 15:33:21 -0500 -Subject: [PATCH 152/290] locking/rt-mutex: Flush block plug on __down_read() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -__down_read() bypasses the rtmutex frontend to call -rt_mutex_slowlock_locked() directly, and thus it needs to call -blk_schedule_flush_flug() itself. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Scott Wood -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rwsem-rt.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c -index 660e22caf709..f518495bd6cc 100644 ---- a/kernel/locking/rwsem-rt.c -+++ b/kernel/locking/rwsem-rt.c -@@ -1,5 +1,6 @@ - /* - */ -+#include - #include - #include - #include -@@ -87,6 +88,14 @@ static int __sched __down_read_common(struct rw_semaphore *sem, int state) - - if (__down_read_trylock(sem)) - return 0; -+ /* -+ * If rt_mutex blocks, the function sched_submit_work will not call -+ * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true). -+ * We must call blk_schedule_flush_plug here, if we don't call it, -+ * a deadlock in I/O may happen. -+ */ -+ if (unlikely(blk_needs_flush_plug(current))) -+ blk_schedule_flush_plug(current); - - might_sleep(); - raw_spin_lock_irq(&m->wait_lock); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0152-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch linux-4.19.118/debian/patches-rt/0152-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch --- linux-4.19.98/debian/patches-rt/0152-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0152-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,39 @@ +From ae27c05c699a2836bb476966ecbea706b7f36ea1 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 16 Nov 2017 16:48:48 +0100 +Subject: [PATCH 152/325] locking/rtmutex: re-init the wait_lock in + rt_mutex_init_proxy_locked() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +We could provide a key-class for the lockdep (and fixup all callers) or +move the init to all callers (like it was) in order to avoid lockdep +seeing a double-lock of the wait_lock. + +Reported-by: Fernando Lopez-Lezcano +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/locking/rtmutex.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index b38c3a92dce8..94788662b2f2 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -2281,6 +2281,14 @@ void rt_mutex_init_proxy_locked(struct rt_mutex *lock, + struct task_struct *proxy_owner) + { + __rt_mutex_init(lock, NULL, NULL); ++#ifdef CONFIG_DEBUG_SPINLOCK ++ /* ++ * get another key class for the wait_lock. LOCK_PI and UNLOCK_PI is ++ * holding the ->wait_lock of the proxy_lock while unlocking a sleeping ++ * lock. ++ */ ++ raw_spin_lock_init(&lock->wait_lock); ++#endif + debug_rt_mutex_proxy_lock(lock, proxy_owner); + rt_mutex_set_owner(lock, proxy_owner); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0153-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch linux-4.19.118/debian/patches-rt/0153-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch --- linux-4.19.98/debian/patches-rt/0153-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0153-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -From d0199e56eaa78d4c3026051cb0281d3a810d1ae3 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 16 Nov 2017 16:48:48 +0100 -Subject: [PATCH 153/290] locking/rtmutex: re-init the wait_lock in - rt_mutex_init_proxy_locked() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -We could provide a key-class for the lockdep (and fixup all callers) or -move the init to all callers (like it was) in order to avoid lockdep -seeing a double-lock of the wait_lock. - -Reported-by: Fernando Lopez-Lezcano -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/locking/rtmutex.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index b38c3a92dce8..94788662b2f2 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -2281,6 +2281,14 @@ void rt_mutex_init_proxy_locked(struct rt_mutex *lock, - struct task_struct *proxy_owner) - { - __rt_mutex_init(lock, NULL, NULL); -+#ifdef CONFIG_DEBUG_SPINLOCK -+ /* -+ * get another key class for the wait_lock. LOCK_PI and UNLOCK_PI is -+ * holding the ->wait_lock of the proxy_lock while unlocking a sleeping -+ * lock. -+ */ -+ raw_spin_lock_init(&lock->wait_lock); -+#endif - debug_rt_mutex_proxy_lock(lock, proxy_owner); - rt_mutex_set_owner(lock, proxy_owner); - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0153-ptrace-fix-ptrace-vs-tasklist_lock-race.patch linux-4.19.118/debian/patches-rt/0153-ptrace-fix-ptrace-vs-tasklist_lock-race.patch --- linux-4.19.98/debian/patches-rt/0153-ptrace-fix-ptrace-vs-tasklist_lock-race.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0153-ptrace-fix-ptrace-vs-tasklist_lock-race.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,166 @@ +From 57eb5afab9ba00a923ba2db4e350e9f5a8c64140 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 29 Aug 2013 18:21:04 +0200 +Subject: [PATCH 153/325] ptrace: fix ptrace vs tasklist_lock race +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +As explained by Alexander Fyodorov : + +|read_lock(&tasklist_lock) in ptrace_stop() is converted to mutex on RT kernel, +|and it can remove __TASK_TRACED from task->state (by moving it to +|task->saved_state). If parent does wait() on child followed by a sys_ptrace +|call, the following race can happen: +| +|- child sets __TASK_TRACED in ptrace_stop() +|- parent does wait() which eventually calls wait_task_stopped() and returns +| child's pid +|- child blocks on read_lock(&tasklist_lock) in ptrace_stop() and moves +| __TASK_TRACED flag to saved_state +|- parent calls sys_ptrace, which calls ptrace_check_attach() and wait_task_inactive() + +The patch is based on his initial patch where an additional check is +added in case the __TASK_TRACED moved to ->saved_state. The pi_lock is +taken in case the caller is interrupted between looking into ->state and +->saved_state. + +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/sched.h | 49 +++++++++++++++++++++++++++++++++++++++---- + kernel/ptrace.c | 9 +++++++- + kernel/sched/core.c | 17 +++++++++++++-- + 3 files changed, 68 insertions(+), 7 deletions(-) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 527d04f9163e..dd47fd913997 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -101,12 +101,8 @@ struct task_group; + __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \ + TASK_PARKED) + +-#define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) +- + #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) + +-#define task_is_stopped_or_traced(task) ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) +- + #define task_contributes_to_load(task) ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ + (task->flags & PF_FROZEN) == 0 && \ + (task->state & TASK_NOLOAD) == 0) +@@ -1717,6 +1713,51 @@ static inline int test_tsk_need_resched(struct task_struct *tsk) + return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); + } + ++static inline bool __task_is_stopped_or_traced(struct task_struct *task) ++{ ++ if (task->state & (__TASK_STOPPED | __TASK_TRACED)) ++ return true; ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (task->saved_state & (__TASK_STOPPED | __TASK_TRACED)) ++ return true; ++#endif ++ return false; ++} ++ ++static inline bool task_is_stopped_or_traced(struct task_struct *task) ++{ ++ bool traced_stopped; ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&task->pi_lock, flags); ++ traced_stopped = __task_is_stopped_or_traced(task); ++ raw_spin_unlock_irqrestore(&task->pi_lock, flags); ++#else ++ traced_stopped = __task_is_stopped_or_traced(task); ++#endif ++ return traced_stopped; ++} ++ ++static inline bool task_is_traced(struct task_struct *task) ++{ ++ bool traced = false; ++ ++ if (task->state & __TASK_TRACED) ++ return true; ++#ifdef CONFIG_PREEMPT_RT_FULL ++ /* in case the task is sleeping on tasklist_lock */ ++ raw_spin_lock_irq(&task->pi_lock); ++ if (task->state & __TASK_TRACED) ++ traced = true; ++ else if (task->saved_state & __TASK_TRACED) ++ traced = true; ++ raw_spin_unlock_irq(&task->pi_lock); ++#endif ++ return traced; ++} ++ + /* + * cond_resched() and cond_resched_lock(): latency reduction via + * explicit rescheduling in places that are safe. The return +diff --git a/kernel/ptrace.c b/kernel/ptrace.c +index b93eb4eaf7ac..a38b304fb9fd 100644 +--- a/kernel/ptrace.c ++++ b/kernel/ptrace.c +@@ -174,7 +174,14 @@ static bool ptrace_freeze_traced(struct task_struct *task) + + spin_lock_irq(&task->sighand->siglock); + if (task_is_traced(task) && !__fatal_signal_pending(task)) { +- task->state = __TASK_TRACED; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&task->pi_lock, flags); ++ if (task->state & __TASK_TRACED) ++ task->state = __TASK_TRACED; ++ else ++ task->saved_state = __TASK_TRACED; ++ raw_spin_unlock_irqrestore(&task->pi_lock, flags); + ret = true; + } + spin_unlock_irq(&task->sighand->siglock); +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 6a0ccaea2b42..6bab30347081 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1349,6 +1349,18 @@ int migrate_swap(struct task_struct *cur, struct task_struct *p, + } + #endif /* CONFIG_NUMA_BALANCING */ + ++static bool check_task_state(struct task_struct *p, long match_state) ++{ ++ bool match = false; ++ ++ raw_spin_lock_irq(&p->pi_lock); ++ if (p->state == match_state || p->saved_state == match_state) ++ match = true; ++ raw_spin_unlock_irq(&p->pi_lock); ++ ++ return match; ++} ++ + /* + * wait_task_inactive - wait for a thread to unschedule. + * +@@ -1393,7 +1405,7 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) + * is actually now running somewhere else! + */ + while (task_running(rq, p)) { +- if (match_state && unlikely(p->state != match_state)) ++ if (match_state && !check_task_state(p, match_state)) + return 0; + cpu_relax(); + } +@@ -1408,7 +1420,8 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) + running = task_running(rq, p); + queued = task_on_rq_queued(p); + ncsw = 0; +- if (!match_state || p->state == match_state) ++ if (!match_state || p->state == match_state || ++ p->saved_state == match_state) + ncsw = p->nvcsw | LONG_MIN; /* sets MSB */ + task_rq_unlock(rq, p, &rf); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0154-ptrace-fix-ptrace-vs-tasklist_lock-race.patch linux-4.19.118/debian/patches-rt/0154-ptrace-fix-ptrace-vs-tasklist_lock-race.patch --- linux-4.19.98/debian/patches-rt/0154-ptrace-fix-ptrace-vs-tasklist_lock-race.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0154-ptrace-fix-ptrace-vs-tasklist_lock-race.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,166 +0,0 @@ -From e7e712a633a103d1d141dba845f847dcf20a9f47 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 29 Aug 2013 18:21:04 +0200 -Subject: [PATCH 154/290] ptrace: fix ptrace vs tasklist_lock race -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -As explained by Alexander Fyodorov : - -|read_lock(&tasklist_lock) in ptrace_stop() is converted to mutex on RT kernel, -|and it can remove __TASK_TRACED from task->state (by moving it to -|task->saved_state). If parent does wait() on child followed by a sys_ptrace -|call, the following race can happen: -| -|- child sets __TASK_TRACED in ptrace_stop() -|- parent does wait() which eventually calls wait_task_stopped() and returns -| child's pid -|- child blocks on read_lock(&tasklist_lock) in ptrace_stop() and moves -| __TASK_TRACED flag to saved_state -|- parent calls sys_ptrace, which calls ptrace_check_attach() and wait_task_inactive() - -The patch is based on his initial patch where an additional check is -added in case the __TASK_TRACED moved to ->saved_state. The pi_lock is -taken in case the caller is interrupted between looking into ->state and -->saved_state. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/sched.h | 49 +++++++++++++++++++++++++++++++++++++++---- - kernel/ptrace.c | 9 +++++++- - kernel/sched/core.c | 17 +++++++++++++-- - 3 files changed, 68 insertions(+), 7 deletions(-) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index f25c9566ee92..32a9ca5dff59 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -101,12 +101,8 @@ struct task_group; - __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \ - TASK_PARKED) - --#define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) -- - #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) - --#define task_is_stopped_or_traced(task) ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) -- - #define task_contributes_to_load(task) ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ - (task->flags & PF_FROZEN) == 0 && \ - (task->state & TASK_NOLOAD) == 0) -@@ -1717,6 +1713,51 @@ static inline int test_tsk_need_resched(struct task_struct *tsk) - return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); - } - -+static inline bool __task_is_stopped_or_traced(struct task_struct *task) -+{ -+ if (task->state & (__TASK_STOPPED | __TASK_TRACED)) -+ return true; -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (task->saved_state & (__TASK_STOPPED | __TASK_TRACED)) -+ return true; -+#endif -+ return false; -+} -+ -+static inline bool task_is_stopped_or_traced(struct task_struct *task) -+{ -+ bool traced_stopped; -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&task->pi_lock, flags); -+ traced_stopped = __task_is_stopped_or_traced(task); -+ raw_spin_unlock_irqrestore(&task->pi_lock, flags); -+#else -+ traced_stopped = __task_is_stopped_or_traced(task); -+#endif -+ return traced_stopped; -+} -+ -+static inline bool task_is_traced(struct task_struct *task) -+{ -+ bool traced = false; -+ -+ if (task->state & __TASK_TRACED) -+ return true; -+#ifdef CONFIG_PREEMPT_RT_FULL -+ /* in case the task is sleeping on tasklist_lock */ -+ raw_spin_lock_irq(&task->pi_lock); -+ if (task->state & __TASK_TRACED) -+ traced = true; -+ else if (task->saved_state & __TASK_TRACED) -+ traced = true; -+ raw_spin_unlock_irq(&task->pi_lock); -+#endif -+ return traced; -+} -+ - /* - * cond_resched() and cond_resched_lock(): latency reduction via - * explicit rescheduling in places that are safe. The return -diff --git a/kernel/ptrace.c b/kernel/ptrace.c -index fed682a01a75..ace2839323de 100644 ---- a/kernel/ptrace.c -+++ b/kernel/ptrace.c -@@ -174,7 +174,14 @@ static bool ptrace_freeze_traced(struct task_struct *task) - - spin_lock_irq(&task->sighand->siglock); - if (task_is_traced(task) && !__fatal_signal_pending(task)) { -- task->state = __TASK_TRACED; -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&task->pi_lock, flags); -+ if (task->state & __TASK_TRACED) -+ task->state = __TASK_TRACED; -+ else -+ task->saved_state = __TASK_TRACED; -+ raw_spin_unlock_irqrestore(&task->pi_lock, flags); - ret = true; - } - spin_unlock_irq(&task->sighand->siglock); -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 6a0ccaea2b42..6bab30347081 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1349,6 +1349,18 @@ int migrate_swap(struct task_struct *cur, struct task_struct *p, - } - #endif /* CONFIG_NUMA_BALANCING */ - -+static bool check_task_state(struct task_struct *p, long match_state) -+{ -+ bool match = false; -+ -+ raw_spin_lock_irq(&p->pi_lock); -+ if (p->state == match_state || p->saved_state == match_state) -+ match = true; -+ raw_spin_unlock_irq(&p->pi_lock); -+ -+ return match; -+} -+ - /* - * wait_task_inactive - wait for a thread to unschedule. - * -@@ -1393,7 +1405,7 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) - * is actually now running somewhere else! - */ - while (task_running(rq, p)) { -- if (match_state && unlikely(p->state != match_state)) -+ if (match_state && !check_task_state(p, match_state)) - return 0; - cpu_relax(); - } -@@ -1408,7 +1420,8 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) - running = task_running(rq, p); - queued = task_on_rq_queued(p); - ncsw = 0; -- if (!match_state || p->state == match_state) -+ if (!match_state || p->state == match_state || -+ p->saved_state == match_state) - ncsw = p->nvcsw | LONG_MIN; /* sets MSB */ - task_rq_unlock(rq, p, &rf); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0154-rtmutex-annotate-sleeping-lock-context.patch linux-4.19.118/debian/patches-rt/0154-rtmutex-annotate-sleeping-lock-context.patch --- linux-4.19.98/debian/patches-rt/0154-rtmutex-annotate-sleeping-lock-context.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0154-rtmutex-annotate-sleeping-lock-context.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,308 @@ +From ead5e97d57b7b8fc9db9448d08de66e482329271 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 21 Sep 2017 14:25:13 +0200 +Subject: [PATCH 154/325] rtmutex: annotate sleeping lock context +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The RCU code complains on schedule() within a rcu_readlock() section. +The valid scenario on -RT is if a sleeping is held. In order to suppress +the warning the mirgrate_disable counter was used to identify the +invocation of schedule() due to lock contention. + +Grygorii Strashko report that during CPU hotplug we might see the +warning via + rt_spin_lock() -> migrate_disable() -> pin_current_cpu() -> __read_rt_lock() + +because the counter is not yet set. +It is also possible to trigger the warning from cpu_chill() +(seen on a kblockd_mod_delayed_work_on() caller). + +To address this RCU warning I annotate the sleeping lock context. The +counter is incremented before migrate_disable() so the warning Grygorii +should not trigger anymore. Additionally I use that counter in +cpu_chill() to avoid the RCU warning from there. + +Reported-by: Grygorii Strashko +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/preempt.h | 9 ++++++++ + include/linux/sched.h | 26 ++++++++++++++++++++++ + kernel/locking/rtmutex.c | 12 ++++++++-- + kernel/locking/rwlock-rt.c | 18 +++++++++++---- + kernel/rcu/tree_plugin.h | 6 ++++- + kernel/sched/core.c | 45 ++++++++++++++++++++++++++++++++++++++ + 6 files changed, 109 insertions(+), 7 deletions(-) + +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index 27c3176d88d2..9eafc34898b4 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -211,6 +211,15 @@ extern void migrate_enable(void); + + int __migrate_disabled(struct task_struct *p); + ++#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) ++ ++extern void migrate_disable(void); ++extern void migrate_enable(void); ++static inline int __migrate_disabled(struct task_struct *p) ++{ ++ return 0; ++} ++ + #else + #define migrate_disable() barrier() + #define migrate_enable() barrier() +diff --git a/include/linux/sched.h b/include/linux/sched.h +index dd47fd913997..682cf84a7e1b 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -673,6 +673,15 @@ struct task_struct { + # ifdef CONFIG_SCHED_DEBUG + int migrate_disable_atomic; + # endif ++ ++#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) ++ int migrate_disable; ++# ifdef CONFIG_SCHED_DEBUG ++ int migrate_disable_atomic; ++# endif ++#endif ++#ifdef CONFIG_PREEMPT_RT_FULL ++ int sleeping_lock; + #endif + + #ifdef CONFIG_PREEMPT_RCU +@@ -1810,6 +1819,23 @@ static __always_inline bool need_resched(void) + return unlikely(tif_need_resched()); + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++static inline void sleeping_lock_inc(void) ++{ ++ current->sleeping_lock++; ++} ++ ++static inline void sleeping_lock_dec(void) ++{ ++ current->sleeping_lock--; ++} ++ ++#else ++ ++static inline void sleeping_lock_inc(void) { } ++static inline void sleeping_lock_dec(void) { } ++#endif ++ + /* + * Wrappers for p->thread_info->cpu access. No-op on UP. + */ +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 94788662b2f2..2a9bf2443acc 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1141,6 +1141,7 @@ void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) + + void __lockfunc rt_spin_lock(spinlock_t *lock) + { ++ sleeping_lock_inc(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); +@@ -1155,6 +1156,7 @@ void __lockfunc __rt_spin_lock(struct rt_mutex *lock) + #ifdef CONFIG_DEBUG_LOCK_ALLOC + void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) + { ++ sleeping_lock_inc(); + migrate_disable(); + spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); +@@ -1168,6 +1170,7 @@ void __lockfunc rt_spin_unlock(spinlock_t *lock) + spin_release(&lock->dep_map, 1, _RET_IP_); + rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); + migrate_enable(); ++ sleeping_lock_dec(); + } + EXPORT_SYMBOL(rt_spin_unlock); + +@@ -1193,12 +1196,15 @@ int __lockfunc rt_spin_trylock(spinlock_t *lock) + { + int ret; + ++ sleeping_lock_inc(); + migrate_disable(); + ret = __rt_mutex_trylock(&lock->lock); +- if (ret) ++ if (ret) { + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); +- else ++ } else { + migrate_enable(); ++ sleeping_lock_dec(); ++ } + return ret; + } + EXPORT_SYMBOL(rt_spin_trylock); +@@ -1210,6 +1216,7 @@ int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) + local_bh_disable(); + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { ++ sleeping_lock_inc(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); + } else +@@ -1225,6 +1232,7 @@ int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags) + *flags = 0; + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { ++ sleeping_lock_inc(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); + } +diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c +index 8f90afe111ce..c3b91205161c 100644 +--- a/kernel/locking/rwlock-rt.c ++++ b/kernel/locking/rwlock-rt.c +@@ -305,12 +305,15 @@ int __lockfunc rt_read_trylock(rwlock_t *rwlock) + { + int ret; + ++ sleeping_lock_inc(); + migrate_disable(); + ret = do_read_rt_trylock(rwlock); +- if (ret) ++ if (ret) { + rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); +- else ++ } else { + migrate_enable(); ++ sleeping_lock_dec(); ++ } + return ret; + } + EXPORT_SYMBOL(rt_read_trylock); +@@ -319,18 +322,22 @@ int __lockfunc rt_write_trylock(rwlock_t *rwlock) + { + int ret; + ++ sleeping_lock_inc(); + migrate_disable(); + ret = do_write_rt_trylock(rwlock); +- if (ret) ++ if (ret) { + rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); +- else ++ } else { + migrate_enable(); ++ sleeping_lock_dec(); ++ } + return ret; + } + EXPORT_SYMBOL(rt_write_trylock); + + void __lockfunc rt_read_lock(rwlock_t *rwlock) + { ++ sleeping_lock_inc(); + migrate_disable(); + rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); + do_read_rt_lock(rwlock); +@@ -339,6 +346,7 @@ EXPORT_SYMBOL(rt_read_lock); + + void __lockfunc rt_write_lock(rwlock_t *rwlock) + { ++ sleeping_lock_inc(); + migrate_disable(); + rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); + do_write_rt_lock(rwlock); +@@ -350,6 +358,7 @@ void __lockfunc rt_read_unlock(rwlock_t *rwlock) + rwlock_release(&rwlock->dep_map, 1, _RET_IP_); + do_read_rt_unlock(rwlock); + migrate_enable(); ++ sleeping_lock_dec(); + } + EXPORT_SYMBOL(rt_read_unlock); + +@@ -358,6 +367,7 @@ void __lockfunc rt_write_unlock(rwlock_t *rwlock) + rwlock_release(&rwlock->dep_map, 1, _RET_IP_); + do_write_rt_unlock(rwlock); + migrate_enable(); ++ sleeping_lock_dec(); + } + EXPORT_SYMBOL(rt_write_unlock); + +diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h +index 5f6de49dc78e..35f3552b7463 100644 +--- a/kernel/rcu/tree_plugin.h ++++ b/kernel/rcu/tree_plugin.h +@@ -337,9 +337,13 @@ static void rcu_preempt_note_context_switch(bool preempt) + struct task_struct *t = current; + struct rcu_data *rdp; + struct rcu_node *rnp; ++ int sleeping_l = 0; + + lockdep_assert_irqs_disabled(); +- WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0); ++#if defined(CONFIG_PREEMPT_RT_FULL) ++ sleeping_l = t->sleeping_lock; ++#endif ++ WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0 && !sleeping_l); + if (t->rcu_read_lock_nesting > 0 && + !t->rcu_read_unlock_special.b.blocked) { + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 6bab30347081..d49580cb0eb2 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7354,4 +7354,49 @@ void migrate_enable(void) + preempt_enable(); + } + EXPORT_SYMBOL(migrate_enable); ++ ++#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) ++void migrate_disable(void) ++{ ++ struct task_struct *p = current; ++ ++ if (in_atomic() || irqs_disabled()) { ++#ifdef CONFIG_SCHED_DEBUG ++ p->migrate_disable_atomic++; ++#endif ++ return; ++ } ++#ifdef CONFIG_SCHED_DEBUG ++ if (unlikely(p->migrate_disable_atomic)) { ++ tracing_off(); ++ WARN_ON_ONCE(1); ++ } ++#endif ++ ++ p->migrate_disable++; ++} ++EXPORT_SYMBOL(migrate_disable); ++ ++void migrate_enable(void) ++{ ++ struct task_struct *p = current; ++ ++ if (in_atomic() || irqs_disabled()) { ++#ifdef CONFIG_SCHED_DEBUG ++ p->migrate_disable_atomic--; ++#endif ++ return; ++ } ++ ++#ifdef CONFIG_SCHED_DEBUG ++ if (unlikely(p->migrate_disable_atomic)) { ++ tracing_off(); ++ WARN_ON_ONCE(1); ++ } ++#endif ++ ++ WARN_ON_ONCE(p->migrate_disable <= 0); ++ p->migrate_disable--; ++} ++EXPORT_SYMBOL(migrate_enable); + #endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0155-rtmutex-annotate-sleeping-lock-context.patch linux-4.19.118/debian/patches-rt/0155-rtmutex-annotate-sleeping-lock-context.patch --- linux-4.19.98/debian/patches-rt/0155-rtmutex-annotate-sleeping-lock-context.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0155-rtmutex-annotate-sleeping-lock-context.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,308 +0,0 @@ -From 73e797275adecb403374a97cd6d6737f6a6f8671 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 21 Sep 2017 14:25:13 +0200 -Subject: [PATCH 155/290] rtmutex: annotate sleeping lock context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The RCU code complains on schedule() within a rcu_readlock() section. -The valid scenario on -RT is if a sleeping is held. In order to suppress -the warning the mirgrate_disable counter was used to identify the -invocation of schedule() due to lock contention. - -Grygorii Strashko report that during CPU hotplug we might see the -warning via - rt_spin_lock() -> migrate_disable() -> pin_current_cpu() -> __read_rt_lock() - -because the counter is not yet set. -It is also possible to trigger the warning from cpu_chill() -(seen on a kblockd_mod_delayed_work_on() caller). - -To address this RCU warning I annotate the sleeping lock context. The -counter is incremented before migrate_disable() so the warning Grygorii -should not trigger anymore. Additionally I use that counter in -cpu_chill() to avoid the RCU warning from there. - -Reported-by: Grygorii Strashko -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/preempt.h | 9 ++++++++ - include/linux/sched.h | 26 ++++++++++++++++++++++ - kernel/locking/rtmutex.c | 12 ++++++++-- - kernel/locking/rwlock-rt.c | 18 +++++++++++---- - kernel/rcu/tree_plugin.h | 6 ++++- - kernel/sched/core.c | 45 ++++++++++++++++++++++++++++++++++++++ - 6 files changed, 109 insertions(+), 7 deletions(-) - -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index 27c3176d88d2..9eafc34898b4 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -211,6 +211,15 @@ extern void migrate_enable(void); - - int __migrate_disabled(struct task_struct *p); - -+#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) -+ -+extern void migrate_disable(void); -+extern void migrate_enable(void); -+static inline int __migrate_disabled(struct task_struct *p) -+{ -+ return 0; -+} -+ - #else - #define migrate_disable() barrier() - #define migrate_enable() barrier() -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 32a9ca5dff59..c5f050afff18 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -673,6 +673,15 @@ struct task_struct { - # ifdef CONFIG_SCHED_DEBUG - int migrate_disable_atomic; - # endif -+ -+#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) -+ int migrate_disable; -+# ifdef CONFIG_SCHED_DEBUG -+ int migrate_disable_atomic; -+# endif -+#endif -+#ifdef CONFIG_PREEMPT_RT_FULL -+ int sleeping_lock; - #endif - - #ifdef CONFIG_PREEMPT_RCU -@@ -1810,6 +1819,23 @@ static __always_inline bool need_resched(void) - return unlikely(tif_need_resched()); - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+static inline void sleeping_lock_inc(void) -+{ -+ current->sleeping_lock++; -+} -+ -+static inline void sleeping_lock_dec(void) -+{ -+ current->sleeping_lock--; -+} -+ -+#else -+ -+static inline void sleeping_lock_inc(void) { } -+static inline void sleeping_lock_dec(void) { } -+#endif -+ - /* - * Wrappers for p->thread_info->cpu access. No-op on UP. - */ -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 94788662b2f2..2a9bf2443acc 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -1141,6 +1141,7 @@ void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) - - void __lockfunc rt_spin_lock(spinlock_t *lock) - { -+ sleeping_lock_inc(); - migrate_disable(); - spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); - rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -@@ -1155,6 +1156,7 @@ void __lockfunc __rt_spin_lock(struct rt_mutex *lock) - #ifdef CONFIG_DEBUG_LOCK_ALLOC - void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) - { -+ sleeping_lock_inc(); - migrate_disable(); - spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); - rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); -@@ -1168,6 +1170,7 @@ void __lockfunc rt_spin_unlock(spinlock_t *lock) - spin_release(&lock->dep_map, 1, _RET_IP_); - rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); - migrate_enable(); -+ sleeping_lock_dec(); - } - EXPORT_SYMBOL(rt_spin_unlock); - -@@ -1193,12 +1196,15 @@ int __lockfunc rt_spin_trylock(spinlock_t *lock) - { - int ret; - -+ sleeping_lock_inc(); - migrate_disable(); - ret = __rt_mutex_trylock(&lock->lock); -- if (ret) -+ if (ret) { - spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); -- else -+ } else { - migrate_enable(); -+ sleeping_lock_dec(); -+ } - return ret; - } - EXPORT_SYMBOL(rt_spin_trylock); -@@ -1210,6 +1216,7 @@ int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) - local_bh_disable(); - ret = __rt_mutex_trylock(&lock->lock); - if (ret) { -+ sleeping_lock_inc(); - migrate_disable(); - spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); - } else -@@ -1225,6 +1232,7 @@ int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags) - *flags = 0; - ret = __rt_mutex_trylock(&lock->lock); - if (ret) { -+ sleeping_lock_inc(); - migrate_disable(); - spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); - } -diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c -index 8f90afe111ce..c3b91205161c 100644 ---- a/kernel/locking/rwlock-rt.c -+++ b/kernel/locking/rwlock-rt.c -@@ -305,12 +305,15 @@ int __lockfunc rt_read_trylock(rwlock_t *rwlock) - { - int ret; - -+ sleeping_lock_inc(); - migrate_disable(); - ret = do_read_rt_trylock(rwlock); -- if (ret) -+ if (ret) { - rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); -- else -+ } else { - migrate_enable(); -+ sleeping_lock_dec(); -+ } - return ret; - } - EXPORT_SYMBOL(rt_read_trylock); -@@ -319,18 +322,22 @@ int __lockfunc rt_write_trylock(rwlock_t *rwlock) - { - int ret; - -+ sleeping_lock_inc(); - migrate_disable(); - ret = do_write_rt_trylock(rwlock); -- if (ret) -+ if (ret) { - rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); -- else -+ } else { - migrate_enable(); -+ sleeping_lock_dec(); -+ } - return ret; - } - EXPORT_SYMBOL(rt_write_trylock); - - void __lockfunc rt_read_lock(rwlock_t *rwlock) - { -+ sleeping_lock_inc(); - migrate_disable(); - rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); - do_read_rt_lock(rwlock); -@@ -339,6 +346,7 @@ EXPORT_SYMBOL(rt_read_lock); - - void __lockfunc rt_write_lock(rwlock_t *rwlock) - { -+ sleeping_lock_inc(); - migrate_disable(); - rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); - do_write_rt_lock(rwlock); -@@ -350,6 +358,7 @@ void __lockfunc rt_read_unlock(rwlock_t *rwlock) - rwlock_release(&rwlock->dep_map, 1, _RET_IP_); - do_read_rt_unlock(rwlock); - migrate_enable(); -+ sleeping_lock_dec(); - } - EXPORT_SYMBOL(rt_read_unlock); - -@@ -358,6 +367,7 @@ void __lockfunc rt_write_unlock(rwlock_t *rwlock) - rwlock_release(&rwlock->dep_map, 1, _RET_IP_); - do_write_rt_unlock(rwlock); - migrate_enable(); -+ sleeping_lock_dec(); - } - EXPORT_SYMBOL(rt_write_unlock); - -diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h -index a97c20ea9bce..564e3927e7b0 100644 ---- a/kernel/rcu/tree_plugin.h -+++ b/kernel/rcu/tree_plugin.h -@@ -337,9 +337,13 @@ static void rcu_preempt_note_context_switch(bool preempt) - struct task_struct *t = current; - struct rcu_data *rdp; - struct rcu_node *rnp; -+ int sleeping_l = 0; - - lockdep_assert_irqs_disabled(); -- WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0); -+#if defined(CONFIG_PREEMPT_RT_FULL) -+ sleeping_l = t->sleeping_lock; -+#endif -+ WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0 && !sleeping_l); - if (t->rcu_read_lock_nesting > 0 && - !t->rcu_read_unlock_special.b.blocked) { - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 6bab30347081..d49580cb0eb2 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -7354,4 +7354,49 @@ void migrate_enable(void) - preempt_enable(); - } - EXPORT_SYMBOL(migrate_enable); -+ -+#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) -+void migrate_disable(void) -+{ -+ struct task_struct *p = current; -+ -+ if (in_atomic() || irqs_disabled()) { -+#ifdef CONFIG_SCHED_DEBUG -+ p->migrate_disable_atomic++; -+#endif -+ return; -+ } -+#ifdef CONFIG_SCHED_DEBUG -+ if (unlikely(p->migrate_disable_atomic)) { -+ tracing_off(); -+ WARN_ON_ONCE(1); -+ } -+#endif -+ -+ p->migrate_disable++; -+} -+EXPORT_SYMBOL(migrate_disable); -+ -+void migrate_enable(void) -+{ -+ struct task_struct *p = current; -+ -+ if (in_atomic() || irqs_disabled()) { -+#ifdef CONFIG_SCHED_DEBUG -+ p->migrate_disable_atomic--; -+#endif -+ return; -+ } -+ -+#ifdef CONFIG_SCHED_DEBUG -+ if (unlikely(p->migrate_disable_atomic)) { -+ tracing_off(); -+ WARN_ON_ONCE(1); -+ } -+#endif -+ -+ WARN_ON_ONCE(p->migrate_disable <= 0); -+ p->migrate_disable--; -+} -+EXPORT_SYMBOL(migrate_enable); - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0155-sched-migrate_disable-fallback-to-preempt_disable-in.patch linux-4.19.118/debian/patches-rt/0155-sched-migrate_disable-fallback-to-preempt_disable-in.patch --- linux-4.19.98/debian/patches-rt/0155-sched-migrate_disable-fallback-to-preempt_disable-in.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0155-sched-migrate_disable-fallback-to-preempt_disable-in.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,204 @@ +From 3e776ffb2eb0413bfae8ab630436d01fc9850ab9 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 5 Jul 2018 14:44:51 +0200 +Subject: [PATCH 155/325] sched/migrate_disable: fallback to preempt_disable() + instead barrier() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On SMP + !RT migrate_disable() is still around. It is not part of spin_lock() +anymore so it has almost no users. However the futex code has a workaround for +the !in_atomic() part of migrate disable which fails because the matching +migrade_disable() is no longer part of spin_lock(). + +On !SMP + !RT migrate_disable() is reduced to barrier(). This is not optimal +because we few spots where a "preempt_disable()" statement was replaced with +"migrate_disable()". + +We also used the migration_disable counter to figure out if a sleeping lock is +acquired so RCU does not complain about schedule() during rcu_read_lock() while +a sleeping lock is held. This changed, we no longer use it, we have now a +sleeping_lock counter for the RCU purpose. + +This means we can now: +- for SMP + RT_BASE + full migration program, nothing changes here + +- for !SMP + RT_BASE + the migration counting is no longer required. It used to ensure that the task + is not migrated to another CPU and that this CPU remains online. !SMP ensures + that already. + Move it to CONFIG_SCHED_DEBUG so the counting is done for debugging purpose + only. + +- for all other cases including !RT + fallback to preempt_disable(). The only remaining users of migrate_disable() + are those which were converted from preempt_disable() and the futex + workaround which is already in the preempt_disable() section due to the + spin_lock that is held. + +Cc: stable-rt@vger.kernel.org +Reported-by: joe.korty@concurrent-rt.com +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/preempt.h | 6 +++--- + include/linux/sched.h | 4 ++-- + kernel/sched/core.c | 23 +++++++++++------------ + kernel/sched/debug.c | 2 +- + 4 files changed, 17 insertions(+), 18 deletions(-) + +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index 9eafc34898b4..ed8413e7140f 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -204,7 +204,7 @@ do { \ + + #define preemptible() (preempt_count() == 0 && !irqs_disabled()) + +-#ifdef CONFIG_SMP ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + + extern void migrate_disable(void); + extern void migrate_enable(void); +@@ -221,8 +221,8 @@ static inline int __migrate_disabled(struct task_struct *p) + } + + #else +-#define migrate_disable() barrier() +-#define migrate_enable() barrier() ++#define migrate_disable() preempt_disable() ++#define migrate_enable() preempt_enable() + static inline int __migrate_disabled(struct task_struct *p) + { + return 0; +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 682cf84a7e1b..a38a2c2a8fe4 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -667,7 +667,7 @@ struct task_struct { + int nr_cpus_allowed; + const cpumask_t *cpus_ptr; + cpumask_t cpus_mask; +-#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + int migrate_disable; + int migrate_disable_update; + # ifdef CONFIG_SCHED_DEBUG +@@ -675,8 +675,8 @@ struct task_struct { + # endif + + #elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +- int migrate_disable; + # ifdef CONFIG_SCHED_DEBUG ++ int migrate_disable; + int migrate_disable_atomic; + # endif + #endif +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index d49580cb0eb2..3b2664e691de 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1031,7 +1031,7 @@ void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_ma + p->nr_cpus_allowed = cpumask_weight(new_mask); + } + +-#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + int __migrate_disabled(struct task_struct *p) + { + return p->migrate_disable; +@@ -1071,7 +1071,7 @@ static void __do_set_cpus_allowed_tail(struct task_struct *p, + + void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) + { +-#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + if (__migrate_disabled(p)) { + lockdep_assert_held(&p->pi_lock); + +@@ -1145,7 +1145,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + if (cpumask_test_cpu(task_cpu(p), new_mask) || __migrate_disabled(p)) + goto out; + +-#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + if (__migrate_disabled(p)) { + p->migrate_disable_update = 1; + goto out; +@@ -7210,7 +7210,7 @@ const u32 sched_prio_to_wmult[40] = { + + #undef CREATE_TRACE_POINTS + +-#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + + static inline void + update_nr_migratory(struct task_struct *p, long delta) +@@ -7358,45 +7358,44 @@ EXPORT_SYMBOL(migrate_enable); + #elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + void migrate_disable(void) + { ++#ifdef CONFIG_SCHED_DEBUG + struct task_struct *p = current; + + if (in_atomic() || irqs_disabled()) { +-#ifdef CONFIG_SCHED_DEBUG + p->migrate_disable_atomic++; +-#endif + return; + } +-#ifdef CONFIG_SCHED_DEBUG ++ + if (unlikely(p->migrate_disable_atomic)) { + tracing_off(); + WARN_ON_ONCE(1); + } +-#endif + + p->migrate_disable++; ++#endif ++ barrier(); + } + EXPORT_SYMBOL(migrate_disable); + + void migrate_enable(void) + { ++#ifdef CONFIG_SCHED_DEBUG + struct task_struct *p = current; + + if (in_atomic() || irqs_disabled()) { +-#ifdef CONFIG_SCHED_DEBUG + p->migrate_disable_atomic--; +-#endif + return; + } + +-#ifdef CONFIG_SCHED_DEBUG + if (unlikely(p->migrate_disable_atomic)) { + tracing_off(); + WARN_ON_ONCE(1); + } +-#endif + + WARN_ON_ONCE(p->migrate_disable <= 0); + p->migrate_disable--; ++#endif ++ barrier(); + } + EXPORT_SYMBOL(migrate_enable); + #endif +diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c +index 5027158d3908..dd6c364d6f01 100644 +--- a/kernel/sched/debug.c ++++ b/kernel/sched/debug.c +@@ -982,7 +982,7 @@ void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, + P(dl.runtime); + P(dl.deadline); + } +-#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + P(migrate_disable); + #endif + P(nr_cpus_allowed); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0156-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch linux-4.19.118/debian/patches-rt/0156-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch --- linux-4.19.98/debian/patches-rt/0156-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0156-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,182 @@ +From d11583485bae0e2a7be62d10429e905bcb85966c Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 4 Aug 2017 17:40:42 +0200 +Subject: [PATCH 156/325] locking: don't check for __LINUX_SPINLOCK_TYPES_H on + -RT archs +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Upstream uses arch_spinlock_t within spinlock_t and requests that +spinlock_types.h header file is included first. +On -RT we have the rt_mutex with its raw_lock wait_lock which needs +architectures' spinlock_types.h header file for its definition. However +we need rt_mutex first because it is used to build the spinlock_t so +that check does not work for us. +Therefore I am dropping that check. + +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/alpha/include/asm/spinlock_types.h | 4 ---- + arch/arm/include/asm/spinlock_types.h | 4 ---- + arch/arm64/include/asm/spinlock_types.h | 4 ---- + arch/hexagon/include/asm/spinlock_types.h | 4 ---- + arch/ia64/include/asm/spinlock_types.h | 4 ---- + arch/powerpc/include/asm/spinlock_types.h | 4 ---- + arch/s390/include/asm/spinlock_types.h | 4 ---- + arch/sh/include/asm/spinlock_types.h | 4 ---- + arch/xtensa/include/asm/spinlock_types.h | 4 ---- + include/linux/spinlock_types_up.h | 4 ---- + 10 files changed, 40 deletions(-) + +diff --git a/arch/alpha/include/asm/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h +index 1d5716bc060b..6883bc952d22 100644 +--- a/arch/alpha/include/asm/spinlock_types.h ++++ b/arch/alpha/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef _ALPHA_SPINLOCK_TYPES_H + #define _ALPHA_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/arm/include/asm/spinlock_types.h b/arch/arm/include/asm/spinlock_types.h +index 5976958647fe..a37c0803954b 100644 +--- a/arch/arm/include/asm/spinlock_types.h ++++ b/arch/arm/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + #define TICKET_SHIFT 16 + + typedef struct { +diff --git a/arch/arm64/include/asm/spinlock_types.h b/arch/arm64/include/asm/spinlock_types.h +index a157ff465e27..f952fdda8346 100644 +--- a/arch/arm64/include/asm/spinlock_types.h ++++ b/arch/arm64/include/asm/spinlock_types.h +@@ -16,10 +16,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H) +-# error "please don't include this file directly" +-#endif +- + #include + #include + +diff --git a/arch/hexagon/include/asm/spinlock_types.h b/arch/hexagon/include/asm/spinlock_types.h +index 7a906b5214a4..d8f596fec022 100644 +--- a/arch/hexagon/include/asm/spinlock_types.h ++++ b/arch/hexagon/include/asm/spinlock_types.h +@@ -21,10 +21,6 @@ + #ifndef _ASM_SPINLOCK_TYPES_H + #define _ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/ia64/include/asm/spinlock_types.h b/arch/ia64/include/asm/spinlock_types.h +index 6e345fefcdca..681408d6816f 100644 +--- a/arch/ia64/include/asm/spinlock_types.h ++++ b/arch/ia64/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef _ASM_IA64_SPINLOCK_TYPES_H + #define _ASM_IA64_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/powerpc/include/asm/spinlock_types.h b/arch/powerpc/include/asm/spinlock_types.h +index 87adaf13b7e8..7305cb6a53e4 100644 +--- a/arch/powerpc/include/asm/spinlock_types.h ++++ b/arch/powerpc/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef _ASM_POWERPC_SPINLOCK_TYPES_H + #define _ASM_POWERPC_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int slock; + } arch_spinlock_t; +diff --git a/arch/s390/include/asm/spinlock_types.h b/arch/s390/include/asm/spinlock_types.h +index cfed272e4fd5..8e28e8176ec8 100644 +--- a/arch/s390/include/asm/spinlock_types.h ++++ b/arch/s390/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + int lock; + } __attribute__ ((aligned (4))) arch_spinlock_t; +diff --git a/arch/sh/include/asm/spinlock_types.h b/arch/sh/include/asm/spinlock_types.h +index e82369f286a2..22ca9a98bbb8 100644 +--- a/arch/sh/include/asm/spinlock_types.h ++++ b/arch/sh/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SH_SPINLOCK_TYPES_H + #define __ASM_SH_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/xtensa/include/asm/spinlock_types.h b/arch/xtensa/include/asm/spinlock_types.h +index bb1fe6c1816e..8a22f1e7b6c9 100644 +--- a/arch/xtensa/include/asm/spinlock_types.h ++++ b/arch/xtensa/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int slock; + } arch_spinlock_t; +diff --git a/include/linux/spinlock_types_up.h b/include/linux/spinlock_types_up.h +index c09b6407ae1b..b0243ba07fb7 100644 +--- a/include/linux/spinlock_types_up.h ++++ b/include/linux/spinlock_types_up.h +@@ -1,10 +1,6 @@ + #ifndef __LINUX_SPINLOCK_TYPES_UP_H + #define __LINUX_SPINLOCK_TYPES_UP_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + /* + * include/linux/spinlock_types_up.h - spinlock type definitions for UP + * +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0156-sched-migrate_disable-fallback-to-preempt_disable-in.patch linux-4.19.118/debian/patches-rt/0156-sched-migrate_disable-fallback-to-preempt_disable-in.patch --- linux-4.19.98/debian/patches-rt/0156-sched-migrate_disable-fallback-to-preempt_disable-in.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0156-sched-migrate_disable-fallback-to-preempt_disable-in.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,204 +0,0 @@ -From 65a47d500d54261e050d9f73a554a1ad527ea6d7 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 5 Jul 2018 14:44:51 +0200 -Subject: [PATCH 156/290] sched/migrate_disable: fallback to preempt_disable() - instead barrier() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On SMP + !RT migrate_disable() is still around. It is not part of spin_lock() -anymore so it has almost no users. However the futex code has a workaround for -the !in_atomic() part of migrate disable which fails because the matching -migrade_disable() is no longer part of spin_lock(). - -On !SMP + !RT migrate_disable() is reduced to barrier(). This is not optimal -because we few spots where a "preempt_disable()" statement was replaced with -"migrate_disable()". - -We also used the migration_disable counter to figure out if a sleeping lock is -acquired so RCU does not complain about schedule() during rcu_read_lock() while -a sleeping lock is held. This changed, we no longer use it, we have now a -sleeping_lock counter for the RCU purpose. - -This means we can now: -- for SMP + RT_BASE - full migration program, nothing changes here - -- for !SMP + RT_BASE - the migration counting is no longer required. It used to ensure that the task - is not migrated to another CPU and that this CPU remains online. !SMP ensures - that already. - Move it to CONFIG_SCHED_DEBUG so the counting is done for debugging purpose - only. - -- for all other cases including !RT - fallback to preempt_disable(). The only remaining users of migrate_disable() - are those which were converted from preempt_disable() and the futex - workaround which is already in the preempt_disable() section due to the - spin_lock that is held. - -Cc: stable-rt@vger.kernel.org -Reported-by: joe.korty@concurrent-rt.com -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/preempt.h | 6 +++--- - include/linux/sched.h | 4 ++-- - kernel/sched/core.c | 23 +++++++++++------------ - kernel/sched/debug.c | 2 +- - 4 files changed, 17 insertions(+), 18 deletions(-) - -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index 9eafc34898b4..ed8413e7140f 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -204,7 +204,7 @@ do { \ - - #define preemptible() (preempt_count() == 0 && !irqs_disabled()) - --#ifdef CONFIG_SMP -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - - extern void migrate_disable(void); - extern void migrate_enable(void); -@@ -221,8 +221,8 @@ static inline int __migrate_disabled(struct task_struct *p) - } - - #else --#define migrate_disable() barrier() --#define migrate_enable() barrier() -+#define migrate_disable() preempt_disable() -+#define migrate_enable() preempt_enable() - static inline int __migrate_disabled(struct task_struct *p) - { - return 0; -diff --git a/include/linux/sched.h b/include/linux/sched.h -index c5f050afff18..53d92153700b 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -667,7 +667,7 @@ struct task_struct { - int nr_cpus_allowed; - const cpumask_t *cpus_ptr; - cpumask_t cpus_mask; --#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - int migrate_disable; - int migrate_disable_update; - # ifdef CONFIG_SCHED_DEBUG -@@ -675,8 +675,8 @@ struct task_struct { - # endif - - #elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) -- int migrate_disable; - # ifdef CONFIG_SCHED_DEBUG -+ int migrate_disable; - int migrate_disable_atomic; - # endif - #endif -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index d49580cb0eb2..3b2664e691de 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1031,7 +1031,7 @@ void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_ma - p->nr_cpus_allowed = cpumask_weight(new_mask); - } - --#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - int __migrate_disabled(struct task_struct *p) - { - return p->migrate_disable; -@@ -1071,7 +1071,7 @@ static void __do_set_cpus_allowed_tail(struct task_struct *p, - - void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) - { --#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - if (__migrate_disabled(p)) { - lockdep_assert_held(&p->pi_lock); - -@@ -1145,7 +1145,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, - if (cpumask_test_cpu(task_cpu(p), new_mask) || __migrate_disabled(p)) - goto out; - --#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - if (__migrate_disabled(p)) { - p->migrate_disable_update = 1; - goto out; -@@ -7210,7 +7210,7 @@ const u32 sched_prio_to_wmult[40] = { - - #undef CREATE_TRACE_POINTS - --#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - - static inline void - update_nr_migratory(struct task_struct *p, long delta) -@@ -7358,45 +7358,44 @@ EXPORT_SYMBOL(migrate_enable); - #elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - void migrate_disable(void) - { -+#ifdef CONFIG_SCHED_DEBUG - struct task_struct *p = current; - - if (in_atomic() || irqs_disabled()) { --#ifdef CONFIG_SCHED_DEBUG - p->migrate_disable_atomic++; --#endif - return; - } --#ifdef CONFIG_SCHED_DEBUG -+ - if (unlikely(p->migrate_disable_atomic)) { - tracing_off(); - WARN_ON_ONCE(1); - } --#endif - - p->migrate_disable++; -+#endif -+ barrier(); - } - EXPORT_SYMBOL(migrate_disable); - - void migrate_enable(void) - { -+#ifdef CONFIG_SCHED_DEBUG - struct task_struct *p = current; - - if (in_atomic() || irqs_disabled()) { --#ifdef CONFIG_SCHED_DEBUG - p->migrate_disable_atomic--; --#endif - return; - } - --#ifdef CONFIG_SCHED_DEBUG - if (unlikely(p->migrate_disable_atomic)) { - tracing_off(); - WARN_ON_ONCE(1); - } --#endif - - WARN_ON_ONCE(p->migrate_disable <= 0); - p->migrate_disable--; -+#endif -+ barrier(); - } - EXPORT_SYMBOL(migrate_enable); - #endif -diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c -index 5027158d3908..dd6c364d6f01 100644 ---- a/kernel/sched/debug.c -+++ b/kernel/sched/debug.c -@@ -982,7 +982,7 @@ void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, - P(dl.runtime); - P(dl.deadline); - } --#if defined(CONFIG_PREEMPT_COUNT) && defined(CONFIG_SMP) -+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - P(migrate_disable); - #endif - P(nr_cpus_allowed); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0157-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch linux-4.19.118/debian/patches-rt/0157-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch --- linux-4.19.98/debian/patches-rt/0157-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0157-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ -From 5b55069e90dd13bbd2376868c9ae8dab6a2e72d1 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 4 Aug 2017 17:40:42 +0200 -Subject: [PATCH 157/290] locking: don't check for __LINUX_SPINLOCK_TYPES_H on - -RT archs -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Upstream uses arch_spinlock_t within spinlock_t and requests that -spinlock_types.h header file is included first. -On -RT we have the rt_mutex with its raw_lock wait_lock which needs -architectures' spinlock_types.h header file for its definition. However -we need rt_mutex first because it is used to build the spinlock_t so -that check does not work for us. -Therefore I am dropping that check. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/alpha/include/asm/spinlock_types.h | 4 ---- - arch/arm/include/asm/spinlock_types.h | 4 ---- - arch/arm64/include/asm/spinlock_types.h | 4 ---- - arch/hexagon/include/asm/spinlock_types.h | 4 ---- - arch/ia64/include/asm/spinlock_types.h | 4 ---- - arch/powerpc/include/asm/spinlock_types.h | 4 ---- - arch/s390/include/asm/spinlock_types.h | 4 ---- - arch/sh/include/asm/spinlock_types.h | 4 ---- - arch/xtensa/include/asm/spinlock_types.h | 4 ---- - include/linux/spinlock_types_up.h | 4 ---- - 10 files changed, 40 deletions(-) - -diff --git a/arch/alpha/include/asm/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h -index 1d5716bc060b..6883bc952d22 100644 ---- a/arch/alpha/include/asm/spinlock_types.h -+++ b/arch/alpha/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef _ALPHA_SPINLOCK_TYPES_H - #define _ALPHA_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; -diff --git a/arch/arm/include/asm/spinlock_types.h b/arch/arm/include/asm/spinlock_types.h -index 5976958647fe..a37c0803954b 100644 ---- a/arch/arm/include/asm/spinlock_types.h -+++ b/arch/arm/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - #define TICKET_SHIFT 16 - - typedef struct { -diff --git a/arch/arm64/include/asm/spinlock_types.h b/arch/arm64/include/asm/spinlock_types.h -index a157ff465e27..f952fdda8346 100644 ---- a/arch/arm64/include/asm/spinlock_types.h -+++ b/arch/arm64/include/asm/spinlock_types.h -@@ -16,10 +16,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H) --# error "please don't include this file directly" --#endif -- - #include - #include - -diff --git a/arch/hexagon/include/asm/spinlock_types.h b/arch/hexagon/include/asm/spinlock_types.h -index 7a906b5214a4..d8f596fec022 100644 ---- a/arch/hexagon/include/asm/spinlock_types.h -+++ b/arch/hexagon/include/asm/spinlock_types.h -@@ -21,10 +21,6 @@ - #ifndef _ASM_SPINLOCK_TYPES_H - #define _ASM_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; -diff --git a/arch/ia64/include/asm/spinlock_types.h b/arch/ia64/include/asm/spinlock_types.h -index 6e345fefcdca..681408d6816f 100644 ---- a/arch/ia64/include/asm/spinlock_types.h -+++ b/arch/ia64/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef _ASM_IA64_SPINLOCK_TYPES_H - #define _ASM_IA64_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; -diff --git a/arch/powerpc/include/asm/spinlock_types.h b/arch/powerpc/include/asm/spinlock_types.h -index 87adaf13b7e8..7305cb6a53e4 100644 ---- a/arch/powerpc/include/asm/spinlock_types.h -+++ b/arch/powerpc/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef _ASM_POWERPC_SPINLOCK_TYPES_H - #define _ASM_POWERPC_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int slock; - } arch_spinlock_t; -diff --git a/arch/s390/include/asm/spinlock_types.h b/arch/s390/include/asm/spinlock_types.h -index cfed272e4fd5..8e28e8176ec8 100644 ---- a/arch/s390/include/asm/spinlock_types.h -+++ b/arch/s390/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - int lock; - } __attribute__ ((aligned (4))) arch_spinlock_t; -diff --git a/arch/sh/include/asm/spinlock_types.h b/arch/sh/include/asm/spinlock_types.h -index e82369f286a2..22ca9a98bbb8 100644 ---- a/arch/sh/include/asm/spinlock_types.h -+++ b/arch/sh/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SH_SPINLOCK_TYPES_H - #define __ASM_SH_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int lock; - } arch_spinlock_t; -diff --git a/arch/xtensa/include/asm/spinlock_types.h b/arch/xtensa/include/asm/spinlock_types.h -index bb1fe6c1816e..8a22f1e7b6c9 100644 ---- a/arch/xtensa/include/asm/spinlock_types.h -+++ b/arch/xtensa/include/asm/spinlock_types.h -@@ -2,10 +2,6 @@ - #ifndef __ASM_SPINLOCK_TYPES_H - #define __ASM_SPINLOCK_TYPES_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - typedef struct { - volatile unsigned int slock; - } arch_spinlock_t; -diff --git a/include/linux/spinlock_types_up.h b/include/linux/spinlock_types_up.h -index c09b6407ae1b..b0243ba07fb7 100644 ---- a/include/linux/spinlock_types_up.h -+++ b/include/linux/spinlock_types_up.h -@@ -1,10 +1,6 @@ - #ifndef __LINUX_SPINLOCK_TYPES_UP_H - #define __LINUX_SPINLOCK_TYPES_UP_H - --#ifndef __LINUX_SPINLOCK_TYPES_H --# error "please don't include this file directly" --#endif -- - /* - * include/linux/spinlock_types_up.h - spinlock type definitions for UP - * --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0157-rcu-Frob-softirq-test.patch linux-4.19.118/debian/patches-rt/0157-rcu-Frob-softirq-test.patch --- linux-4.19.98/debian/patches-rt/0157-rcu-Frob-softirq-test.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0157-rcu-Frob-softirq-test.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,173 @@ +From eb9534a80ffa9abca0340289245a1bdc70bd51b4 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Sat, 13 Aug 2011 00:23:17 +0200 +Subject: [PATCH 157/325] rcu: Frob softirq test +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +With RT_FULL we get the below wreckage: + +[ 126.060484] ======================================================= +[ 126.060486] [ INFO: possible circular locking dependency detected ] +[ 126.060489] 3.0.1-rt10+ #30 +[ 126.060490] ------------------------------------------------------- +[ 126.060492] irq/24-eth0/1235 is trying to acquire lock: +[ 126.060495] (&(lock)->wait_lock#2){+.+...}, at: [] rt_mutex_slowunlock+0x16/0x55 +[ 126.060503] +[ 126.060504] but task is already holding lock: +[ 126.060506] (&p->pi_lock){-...-.}, at: [] try_to_wake_up+0x35/0x429 +[ 126.060511] +[ 126.060511] which lock already depends on the new lock. +[ 126.060513] +[ 126.060514] +[ 126.060514] the existing dependency chain (in reverse order) is: +[ 126.060516] +[ 126.060516] -> #1 (&p->pi_lock){-...-.}: +[ 126.060519] [] lock_acquire+0x145/0x18a +[ 126.060524] [] _raw_spin_lock_irqsave+0x4b/0x85 +[ 126.060527] [] task_blocks_on_rt_mutex+0x36/0x20f +[ 126.060531] [] rt_mutex_slowlock+0xd1/0x15a +[ 126.060534] [] rt_mutex_lock+0x2d/0x2f +[ 126.060537] [] rcu_boost+0xad/0xde +[ 126.060541] [] rcu_boost_kthread+0x7d/0x9b +[ 126.060544] [] kthread+0x99/0xa1 +[ 126.060547] [] kernel_thread_helper+0x4/0x10 +[ 126.060551] +[ 126.060552] -> #0 (&(lock)->wait_lock#2){+.+...}: +[ 126.060555] [] __lock_acquire+0x1157/0x1816 +[ 126.060558] [] lock_acquire+0x145/0x18a +[ 126.060561] [] _raw_spin_lock+0x40/0x73 +[ 126.060564] [] rt_mutex_slowunlock+0x16/0x55 +[ 126.060566] [] rt_mutex_unlock+0x27/0x29 +[ 126.060569] [] rcu_read_unlock_special+0x17e/0x1c4 +[ 126.060573] [] __rcu_read_unlock+0x48/0x89 +[ 126.060576] [] select_task_rq_rt+0xc7/0xd5 +[ 126.060580] [] try_to_wake_up+0x175/0x429 +[ 126.060583] [] wake_up_process+0x15/0x17 +[ 126.060585] [] wakeup_softirqd+0x24/0x26 +[ 126.060590] [] irq_exit+0x49/0x55 +[ 126.060593] [] smp_apic_timer_interrupt+0x8a/0x98 +[ 126.060597] [] apic_timer_interrupt+0x13/0x20 +[ 126.060600] [] irq_forced_thread_fn+0x1b/0x44 +[ 126.060603] [] irq_thread+0xde/0x1af +[ 126.060606] [] kthread+0x99/0xa1 +[ 126.060608] [] kernel_thread_helper+0x4/0x10 +[ 126.060611] +[ 126.060612] other info that might help us debug this: +[ 126.060614] +[ 126.060615] Possible unsafe locking scenario: +[ 126.060616] +[ 126.060617] CPU0 CPU1 +[ 126.060619] ---- ---- +[ 126.060620] lock(&p->pi_lock); +[ 126.060623] lock(&(lock)->wait_lock); +[ 126.060625] lock(&p->pi_lock); +[ 126.060627] lock(&(lock)->wait_lock); +[ 126.060629] +[ 126.060629] *** DEADLOCK *** +[ 126.060630] +[ 126.060632] 1 lock held by irq/24-eth0/1235: +[ 126.060633] #0: (&p->pi_lock){-...-.}, at: [] try_to_wake_up+0x35/0x429 +[ 126.060638] +[ 126.060638] stack backtrace: +[ 126.060641] Pid: 1235, comm: irq/24-eth0 Not tainted 3.0.1-rt10+ #30 +[ 126.060643] Call Trace: +[ 126.060644] [] print_circular_bug+0x289/0x29a +[ 126.060651] [] __lock_acquire+0x1157/0x1816 +[ 126.060655] [] ? trace_hardirqs_off_caller+0x1f/0x99 +[ 126.060658] [] ? rt_mutex_slowunlock+0x16/0x55 +[ 126.060661] [] lock_acquire+0x145/0x18a +[ 126.060664] [] ? rt_mutex_slowunlock+0x16/0x55 +[ 126.060668] [] _raw_spin_lock+0x40/0x73 +[ 126.060671] [] ? rt_mutex_slowunlock+0x16/0x55 +[ 126.060674] [] ? rcu_report_qs_rsp+0x87/0x8c +[ 126.060677] [] rt_mutex_slowunlock+0x16/0x55 +[ 126.060680] [] ? rcu_read_unlock_special+0x9b/0x1c4 +[ 126.060683] [] rt_mutex_unlock+0x27/0x29 +[ 126.060687] [] rcu_read_unlock_special+0x17e/0x1c4 +[ 126.060690] [] __rcu_read_unlock+0x48/0x89 +[ 126.060693] [] select_task_rq_rt+0xc7/0xd5 +[ 126.060696] [] ? select_task_rq_rt+0x27/0xd5 +[ 126.060701] [] ? clockevents_program_event+0x8e/0x90 +[ 126.060704] [] try_to_wake_up+0x175/0x429 +[ 126.060708] [] ? tick_program_event+0x1f/0x21 +[ 126.060711] [] wake_up_process+0x15/0x17 +[ 126.060715] [] wakeup_softirqd+0x24/0x26 +[ 126.060718] [] irq_exit+0x49/0x55 +[ 126.060721] [] smp_apic_timer_interrupt+0x8a/0x98 +[ 126.060724] [] apic_timer_interrupt+0x13/0x20 +[ 126.060726] [] ? migrate_disable+0x75/0x12d +[ 126.060733] [] ? local_bh_disable+0xe/0x1f +[ 126.060736] [] ? local_bh_disable+0x1d/0x1f +[ 126.060739] [] irq_forced_thread_fn+0x1b/0x44 +[ 126.060742] [] ? _raw_spin_unlock_irq+0x3b/0x59 +[ 126.060745] [] irq_thread+0xde/0x1af +[ 126.060748] [] ? irq_thread_fn+0x3a/0x3a +[ 126.060751] [] ? irq_finalize_oneshot+0xd1/0xd1 +[ 126.060754] [] ? irq_finalize_oneshot+0xd1/0xd1 +[ 126.060757] [] kthread+0x99/0xa1 +[ 126.060761] [] kernel_thread_helper+0x4/0x10 +[ 126.060764] [] ? finish_task_switch+0x87/0x10a +[ 126.060768] [] ? retint_restore_args+0xe/0xe +[ 126.060771] [] ? __init_kthread_worker+0x8c/0x8c +[ 126.060774] [] ? gs_change+0xb/0xb + +Because irq_exit() does: + +void irq_exit(void) +{ + account_system_vtime(current); + trace_hardirq_exit(); + sub_preempt_count(IRQ_EXIT_OFFSET); + if (!in_interrupt() && local_softirq_pending()) + invoke_softirq(); + + ... +} + +Which triggers a wakeup, which uses RCU, now if the interrupted task has +t->rcu_read_unlock_special set, the rcu usage from the wakeup will end +up in rcu_read_unlock_special(). rcu_read_unlock_special() will test +for in_irq(), which will fail as we just decremented preempt_count +with IRQ_EXIT_OFFSET, and in_sering_softirq(), which for +PREEMPT_RT_FULL reads: + +int in_serving_softirq(void) +{ + int res; + + preempt_disable(); + res = __get_cpu_var(local_softirq_runner) == current; + preempt_enable(); + return res; +} + +Which will thus also fail, resulting in the above wreckage. + +The 'somewhat' ugly solution is to open-code the preempt_count() test +in rcu_read_unlock_special(). + +Also, we're not at all sure how ->rcu_read_unlock_special gets set +here... so this is very likely a bandaid and more thought is required. + +Cc: Paul E. McKenney +Signed-off-by: Peter Zijlstra +--- + kernel/rcu/tree_plugin.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h +index 35f3552b7463..e9ce51e19e87 100644 +--- a/kernel/rcu/tree_plugin.h ++++ b/kernel/rcu/tree_plugin.h +@@ -524,7 +524,7 @@ static void rcu_read_unlock_special(struct task_struct *t) + } + + /* Hardware IRQ handlers cannot block, complain if they get here. */ +- if (in_irq() || in_serving_softirq()) { ++ if (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_OFFSET)) { + lockdep_rcu_suspicious(__FILE__, __LINE__, + "rcu_read_unlock() from irq or softirq with blocking in critical section!!!\n"); + pr_alert("->rcu_read_unlock_special: %#x (b: %d, enq: %d nq: %d)\n", +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0158-rcu-Frob-softirq-test.patch linux-4.19.118/debian/patches-rt/0158-rcu-Frob-softirq-test.patch --- linux-4.19.98/debian/patches-rt/0158-rcu-Frob-softirq-test.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0158-rcu-Frob-softirq-test.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ -From 9baac22c59df91638ab1dacfebd3290c5bfd73ca Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Sat, 13 Aug 2011 00:23:17 +0200 -Subject: [PATCH 158/290] rcu: Frob softirq test -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -With RT_FULL we get the below wreckage: - -[ 126.060484] ======================================================= -[ 126.060486] [ INFO: possible circular locking dependency detected ] -[ 126.060489] 3.0.1-rt10+ #30 -[ 126.060490] ------------------------------------------------------- -[ 126.060492] irq/24-eth0/1235 is trying to acquire lock: -[ 126.060495] (&(lock)->wait_lock#2){+.+...}, at: [] rt_mutex_slowunlock+0x16/0x55 -[ 126.060503] -[ 126.060504] but task is already holding lock: -[ 126.060506] (&p->pi_lock){-...-.}, at: [] try_to_wake_up+0x35/0x429 -[ 126.060511] -[ 126.060511] which lock already depends on the new lock. -[ 126.060513] -[ 126.060514] -[ 126.060514] the existing dependency chain (in reverse order) is: -[ 126.060516] -[ 126.060516] -> #1 (&p->pi_lock){-...-.}: -[ 126.060519] [] lock_acquire+0x145/0x18a -[ 126.060524] [] _raw_spin_lock_irqsave+0x4b/0x85 -[ 126.060527] [] task_blocks_on_rt_mutex+0x36/0x20f -[ 126.060531] [] rt_mutex_slowlock+0xd1/0x15a -[ 126.060534] [] rt_mutex_lock+0x2d/0x2f -[ 126.060537] [] rcu_boost+0xad/0xde -[ 126.060541] [] rcu_boost_kthread+0x7d/0x9b -[ 126.060544] [] kthread+0x99/0xa1 -[ 126.060547] [] kernel_thread_helper+0x4/0x10 -[ 126.060551] -[ 126.060552] -> #0 (&(lock)->wait_lock#2){+.+...}: -[ 126.060555] [] __lock_acquire+0x1157/0x1816 -[ 126.060558] [] lock_acquire+0x145/0x18a -[ 126.060561] [] _raw_spin_lock+0x40/0x73 -[ 126.060564] [] rt_mutex_slowunlock+0x16/0x55 -[ 126.060566] [] rt_mutex_unlock+0x27/0x29 -[ 126.060569] [] rcu_read_unlock_special+0x17e/0x1c4 -[ 126.060573] [] __rcu_read_unlock+0x48/0x89 -[ 126.060576] [] select_task_rq_rt+0xc7/0xd5 -[ 126.060580] [] try_to_wake_up+0x175/0x429 -[ 126.060583] [] wake_up_process+0x15/0x17 -[ 126.060585] [] wakeup_softirqd+0x24/0x26 -[ 126.060590] [] irq_exit+0x49/0x55 -[ 126.060593] [] smp_apic_timer_interrupt+0x8a/0x98 -[ 126.060597] [] apic_timer_interrupt+0x13/0x20 -[ 126.060600] [] irq_forced_thread_fn+0x1b/0x44 -[ 126.060603] [] irq_thread+0xde/0x1af -[ 126.060606] [] kthread+0x99/0xa1 -[ 126.060608] [] kernel_thread_helper+0x4/0x10 -[ 126.060611] -[ 126.060612] other info that might help us debug this: -[ 126.060614] -[ 126.060615] Possible unsafe locking scenario: -[ 126.060616] -[ 126.060617] CPU0 CPU1 -[ 126.060619] ---- ---- -[ 126.060620] lock(&p->pi_lock); -[ 126.060623] lock(&(lock)->wait_lock); -[ 126.060625] lock(&p->pi_lock); -[ 126.060627] lock(&(lock)->wait_lock); -[ 126.060629] -[ 126.060629] *** DEADLOCK *** -[ 126.060630] -[ 126.060632] 1 lock held by irq/24-eth0/1235: -[ 126.060633] #0: (&p->pi_lock){-...-.}, at: [] try_to_wake_up+0x35/0x429 -[ 126.060638] -[ 126.060638] stack backtrace: -[ 126.060641] Pid: 1235, comm: irq/24-eth0 Not tainted 3.0.1-rt10+ #30 -[ 126.060643] Call Trace: -[ 126.060644] [] print_circular_bug+0x289/0x29a -[ 126.060651] [] __lock_acquire+0x1157/0x1816 -[ 126.060655] [] ? trace_hardirqs_off_caller+0x1f/0x99 -[ 126.060658] [] ? rt_mutex_slowunlock+0x16/0x55 -[ 126.060661] [] lock_acquire+0x145/0x18a -[ 126.060664] [] ? rt_mutex_slowunlock+0x16/0x55 -[ 126.060668] [] _raw_spin_lock+0x40/0x73 -[ 126.060671] [] ? rt_mutex_slowunlock+0x16/0x55 -[ 126.060674] [] ? rcu_report_qs_rsp+0x87/0x8c -[ 126.060677] [] rt_mutex_slowunlock+0x16/0x55 -[ 126.060680] [] ? rcu_read_unlock_special+0x9b/0x1c4 -[ 126.060683] [] rt_mutex_unlock+0x27/0x29 -[ 126.060687] [] rcu_read_unlock_special+0x17e/0x1c4 -[ 126.060690] [] __rcu_read_unlock+0x48/0x89 -[ 126.060693] [] select_task_rq_rt+0xc7/0xd5 -[ 126.060696] [] ? select_task_rq_rt+0x27/0xd5 -[ 126.060701] [] ? clockevents_program_event+0x8e/0x90 -[ 126.060704] [] try_to_wake_up+0x175/0x429 -[ 126.060708] [] ? tick_program_event+0x1f/0x21 -[ 126.060711] [] wake_up_process+0x15/0x17 -[ 126.060715] [] wakeup_softirqd+0x24/0x26 -[ 126.060718] [] irq_exit+0x49/0x55 -[ 126.060721] [] smp_apic_timer_interrupt+0x8a/0x98 -[ 126.060724] [] apic_timer_interrupt+0x13/0x20 -[ 126.060726] [] ? migrate_disable+0x75/0x12d -[ 126.060733] [] ? local_bh_disable+0xe/0x1f -[ 126.060736] [] ? local_bh_disable+0x1d/0x1f -[ 126.060739] [] irq_forced_thread_fn+0x1b/0x44 -[ 126.060742] [] ? _raw_spin_unlock_irq+0x3b/0x59 -[ 126.060745] [] irq_thread+0xde/0x1af -[ 126.060748] [] ? irq_thread_fn+0x3a/0x3a -[ 126.060751] [] ? irq_finalize_oneshot+0xd1/0xd1 -[ 126.060754] [] ? irq_finalize_oneshot+0xd1/0xd1 -[ 126.060757] [] kthread+0x99/0xa1 -[ 126.060761] [] kernel_thread_helper+0x4/0x10 -[ 126.060764] [] ? finish_task_switch+0x87/0x10a -[ 126.060768] [] ? retint_restore_args+0xe/0xe -[ 126.060771] [] ? __init_kthread_worker+0x8c/0x8c -[ 126.060774] [] ? gs_change+0xb/0xb - -Because irq_exit() does: - -void irq_exit(void) -{ - account_system_vtime(current); - trace_hardirq_exit(); - sub_preempt_count(IRQ_EXIT_OFFSET); - if (!in_interrupt() && local_softirq_pending()) - invoke_softirq(); - - ... -} - -Which triggers a wakeup, which uses RCU, now if the interrupted task has -t->rcu_read_unlock_special set, the rcu usage from the wakeup will end -up in rcu_read_unlock_special(). rcu_read_unlock_special() will test -for in_irq(), which will fail as we just decremented preempt_count -with IRQ_EXIT_OFFSET, and in_sering_softirq(), which for -PREEMPT_RT_FULL reads: - -int in_serving_softirq(void) -{ - int res; - - preempt_disable(); - res = __get_cpu_var(local_softirq_runner) == current; - preempt_enable(); - return res; -} - -Which will thus also fail, resulting in the above wreckage. - -The 'somewhat' ugly solution is to open-code the preempt_count() test -in rcu_read_unlock_special(). - -Also, we're not at all sure how ->rcu_read_unlock_special gets set -here... so this is very likely a bandaid and more thought is required. - -Cc: Paul E. McKenney -Signed-off-by: Peter Zijlstra ---- - kernel/rcu/tree_plugin.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h -index 564e3927e7b0..429a2f144e19 100644 ---- a/kernel/rcu/tree_plugin.h -+++ b/kernel/rcu/tree_plugin.h -@@ -524,7 +524,7 @@ static void rcu_read_unlock_special(struct task_struct *t) - } - - /* Hardware IRQ handlers cannot block, complain if they get here. */ -- if (in_irq() || in_serving_softirq()) { -+ if (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_OFFSET)) { - lockdep_rcu_suspicious(__FILE__, __LINE__, - "rcu_read_unlock() from irq or softirq with blocking in critical section!!!\n"); - pr_alert("->rcu_read_unlock_special: %#x (b: %d, enq: %d nq: %d)\n", --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0158-rcu-Merge-RCU-bh-into-RCU-preempt.patch linux-4.19.118/debian/patches-rt/0158-rcu-Merge-RCU-bh-into-RCU-preempt.patch --- linux-4.19.98/debian/patches-rt/0158-rcu-Merge-RCU-bh-into-RCU-preempt.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0158-rcu-Merge-RCU-bh-into-RCU-preempt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,351 @@ +From 7089cd551063f82f4d753d5ad0b89ce41b44168a Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 5 Oct 2011 11:59:38 -0700 +Subject: [PATCH 158/325] rcu: Merge RCU-bh into RCU-preempt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The Linux kernel has long RCU-bh read-side critical sections that +intolerably increase scheduling latency under mainline's RCU-bh rules, +which include RCU-bh read-side critical sections being non-preemptible. +This patch therefore arranges for RCU-bh to be implemented in terms of +RCU-preempt for CONFIG_PREEMPT_RT_FULL=y. + +This has the downside of defeating the purpose of RCU-bh, namely, +handling the case where the system is subjected to a network-based +denial-of-service attack that keeps at least one CPU doing full-time +softirq processing. This issue will be fixed by a later commit. + +The current commit will need some work to make it appropriate for +mainline use, for example, it needs to be extended to cover Tiny RCU. + +[ paulmck: Added a useful changelog ] + +Signed-off-by: Thomas Gleixner +Signed-off-by: Paul E. McKenney +Link: http://lkml.kernel.org/r/20111005185938.GA20403@linux.vnet.ibm.com +Signed-off-by: Thomas Gleixner +--- + include/linux/rcupdate.h | 19 +++++++++++++++++++ + include/linux/rcutree.h | 8 ++++++++ + kernel/rcu/rcu.h | 11 +++++++++-- + kernel/rcu/rcutorture.c | 7 +++++++ + kernel/rcu/tree.c | 26 ++++++++++++++++++++++++++ + kernel/rcu/tree.h | 2 ++ + kernel/rcu/update.c | 2 ++ + 7 files changed, 73 insertions(+), 2 deletions(-) + +diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h +index e6733d7911e9..08d64e5713fc 100644 +--- a/include/linux/rcupdate.h ++++ b/include/linux/rcupdate.h +@@ -56,7 +56,11 @@ void call_rcu(struct rcu_head *head, rcu_callback_t func); + #define call_rcu call_rcu_sched + #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ + ++#ifdef CONFIG_PREEMPT_RT_FULL ++#define call_rcu_bh call_rcu ++#else + void call_rcu_bh(struct rcu_head *head, rcu_callback_t func); ++#endif + void call_rcu_sched(struct rcu_head *head, rcu_callback_t func); + void synchronize_sched(void); + void rcu_barrier_tasks(void); +@@ -261,7 +265,14 @@ extern struct lockdep_map rcu_sched_lock_map; + extern struct lockdep_map rcu_callback_map; + int debug_lockdep_rcu_enabled(void); + int rcu_read_lock_held(void); ++#ifdef CONFIG_PREEMPT_RT_FULL ++static inline int rcu_read_lock_bh_held(void) ++{ ++ return rcu_read_lock_held(); ++} ++#else + int rcu_read_lock_bh_held(void); ++#endif + int rcu_read_lock_sched_held(void); + + #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ +@@ -661,10 +672,14 @@ static inline void rcu_read_unlock(void) + static inline void rcu_read_lock_bh(void) + { + local_bh_disable(); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ rcu_read_lock(); ++#else + __acquire(RCU_BH); + rcu_lock_acquire(&rcu_bh_lock_map); + RCU_LOCKDEP_WARN(!rcu_is_watching(), + "rcu_read_lock_bh() used illegally while idle"); ++#endif + } + + /* +@@ -674,10 +689,14 @@ static inline void rcu_read_lock_bh(void) + */ + static inline void rcu_read_unlock_bh(void) + { ++#ifdef CONFIG_PREEMPT_RT_FULL ++ rcu_read_unlock(); ++#else + RCU_LOCKDEP_WARN(!rcu_is_watching(), + "rcu_read_unlock_bh() used illegally while idle"); + rcu_lock_release(&rcu_bh_lock_map); + __release(RCU_BH); ++#endif + local_bh_enable(); + } + +diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h +index 914655848ef6..462ce061bac7 100644 +--- a/include/linux/rcutree.h ++++ b/include/linux/rcutree.h +@@ -44,7 +44,11 @@ static inline void rcu_virt_note_context_switch(int cpu) + rcu_note_context_switch(false); + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++# define synchronize_rcu_bh synchronize_rcu ++#else + void synchronize_rcu_bh(void); ++#endif + void synchronize_sched_expedited(void); + void synchronize_rcu_expedited(void); + +@@ -72,7 +76,11 @@ static inline void synchronize_rcu_bh_expedited(void) + } + + void rcu_barrier(void); ++#ifdef CONFIG_PREEMPT_RT_FULL ++# define rcu_barrier_bh rcu_barrier ++#else + void rcu_barrier_bh(void); ++#endif + void rcu_barrier_sched(void); + bool rcu_eqs_special_set(int cpu); + unsigned long get_state_synchronize_rcu(void); +diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h +index 4d04683c31b2..808cce9a5d43 100644 +--- a/kernel/rcu/rcu.h ++++ b/kernel/rcu/rcu.h +@@ -528,7 +528,6 @@ static inline void show_rcu_gp_kthreads(void) { } + static inline int rcu_get_gp_kthreads_prio(void) { return 0; } + #else /* #ifdef CONFIG_TINY_RCU */ + unsigned long rcu_get_gp_seq(void); +-unsigned long rcu_bh_get_gp_seq(void); + unsigned long rcu_sched_get_gp_seq(void); + unsigned long rcu_exp_batches_completed(void); + unsigned long rcu_exp_batches_completed_sched(void); +@@ -536,10 +535,18 @@ unsigned long srcu_batches_completed(struct srcu_struct *sp); + void show_rcu_gp_kthreads(void); + int rcu_get_gp_kthreads_prio(void); + void rcu_force_quiescent_state(void); +-void rcu_bh_force_quiescent_state(void); + void rcu_sched_force_quiescent_state(void); + extern struct workqueue_struct *rcu_gp_wq; + extern struct workqueue_struct *rcu_par_gp_wq; ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++#define rcu_bh_get_gp_seq rcu_get_gp_seq ++#define rcu_bh_force_quiescent_state rcu_force_quiescent_state ++#else ++unsigned long rcu_bh_get_gp_seq(void); ++void rcu_bh_force_quiescent_state(void); ++#endif ++ + #endif /* #else #ifdef CONFIG_TINY_RCU */ + + #ifdef CONFIG_RCU_NOCB_CPU +diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c +index 0b7af7e2bcbb..e95d121efc80 100644 +--- a/kernel/rcu/rcutorture.c ++++ b/kernel/rcu/rcutorture.c +@@ -434,6 +434,7 @@ static struct rcu_torture_ops rcu_ops = { + .name = "rcu" + }; + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * Definitions for rcu_bh torture testing. + */ +@@ -475,6 +476,12 @@ static struct rcu_torture_ops rcu_bh_ops = { + .name = "rcu_bh" + }; + ++#else ++static struct rcu_torture_ops rcu_bh_ops = { ++ .ttype = INVALID_RCU_FLAVOR, ++}; ++#endif ++ + /* + * Don't even think about trying any of these in real life!!! + * The names includes "busted", and they really means it! +diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c +index f7e89c989df7..1456a3d97971 100644 +--- a/kernel/rcu/tree.c ++++ b/kernel/rcu/tree.c +@@ -244,6 +244,7 @@ void rcu_sched_qs(void) + this_cpu_ptr(&rcu_sched_data), true); + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + void rcu_bh_qs(void) + { + RCU_LOCKDEP_WARN(preemptible(), "rcu_bh_qs() invoked with preemption enabled!!!"); +@@ -254,6 +255,11 @@ void rcu_bh_qs(void) + __this_cpu_write(rcu_bh_data.cpu_no_qs.b.norm, false); + } + } ++#else ++void rcu_bh_qs(void) ++{ ++} ++#endif + + /* + * Steal a bit from the bottom of ->dynticks for idle entry/exit +@@ -568,6 +574,7 @@ unsigned long rcu_sched_get_gp_seq(void) + } + EXPORT_SYMBOL_GPL(rcu_sched_get_gp_seq); + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * Return the number of RCU-bh GPs completed thus far for debug & stats. + */ +@@ -576,6 +583,7 @@ unsigned long rcu_bh_get_gp_seq(void) + return READ_ONCE(rcu_bh_state.gp_seq); + } + EXPORT_SYMBOL_GPL(rcu_bh_get_gp_seq); ++#endif + + /* + * Return the number of RCU expedited batches completed thus far for +@@ -599,6 +607,7 @@ unsigned long rcu_exp_batches_completed_sched(void) + } + EXPORT_SYMBOL_GPL(rcu_exp_batches_completed_sched); + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * Force a quiescent state. + */ +@@ -617,6 +626,13 @@ void rcu_bh_force_quiescent_state(void) + } + EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state); + ++#else ++void rcu_force_quiescent_state(void) ++{ ++} ++EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); ++#endif ++ + /* + * Force a quiescent state for RCU-sched. + */ +@@ -674,9 +690,11 @@ void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags, + case RCU_FLAVOR: + rsp = rcu_state_p; + break; ++#ifndef CONFIG_PREEMPT_RT_FULL + case RCU_BH_FLAVOR: + rsp = &rcu_bh_state; + break; ++#endif + case RCU_SCHED_FLAVOR: + rsp = &rcu_sched_state; + break; +@@ -3057,6 +3075,7 @@ void call_rcu_sched(struct rcu_head *head, rcu_callback_t func) + } + EXPORT_SYMBOL_GPL(call_rcu_sched); + ++#ifndef CONFIG_PREEMPT_RT_FULL + /** + * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. + * @head: structure to be used for queueing the RCU updates. +@@ -3084,6 +3103,7 @@ void call_rcu_bh(struct rcu_head *head, rcu_callback_t func) + __call_rcu(head, func, &rcu_bh_state, -1, 0); + } + EXPORT_SYMBOL_GPL(call_rcu_bh); ++#endif + + /* + * Queue an RCU callback for lazy invocation after a grace period. +@@ -3169,6 +3189,7 @@ void synchronize_sched(void) + } + EXPORT_SYMBOL_GPL(synchronize_sched); + ++#ifndef CONFIG_PREEMPT_RT_FULL + /** + * synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed. + * +@@ -3195,6 +3216,7 @@ void synchronize_rcu_bh(void) + wait_rcu_gp(call_rcu_bh); + } + EXPORT_SYMBOL_GPL(synchronize_rcu_bh); ++#endif + + /** + * get_state_synchronize_rcu - Snapshot current RCU state +@@ -3502,6 +3524,7 @@ static void _rcu_barrier(struct rcu_state *rsp) + mutex_unlock(&rsp->barrier_mutex); + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + /** + * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete. + */ +@@ -3510,6 +3533,7 @@ void rcu_barrier_bh(void) + _rcu_barrier(&rcu_bh_state); + } + EXPORT_SYMBOL_GPL(rcu_barrier_bh); ++#endif + + /** + * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks. +@@ -4157,7 +4181,9 @@ void __init rcu_init(void) + + rcu_bootup_announce(); + rcu_init_geometry(); ++#ifndef CONFIG_PREEMPT_RT_FULL + rcu_init_one(&rcu_bh_state); ++#endif + rcu_init_one(&rcu_sched_state); + if (dump_tree) + rcu_dump_rcu_node_tree(&rcu_sched_state); +diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h +index 4e74df768c57..fbbff7c21148 100644 +--- a/kernel/rcu/tree.h ++++ b/kernel/rcu/tree.h +@@ -413,7 +413,9 @@ extern struct list_head rcu_struct_flavors; + */ + extern struct rcu_state rcu_sched_state; + ++#ifndef CONFIG_PREEMPT_RT_FULL + extern struct rcu_state rcu_bh_state; ++#endif + + #ifdef CONFIG_PREEMPT_RCU + extern struct rcu_state rcu_preempt_state; +diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c +index 81688a133552..6ffafb1b1584 100644 +--- a/kernel/rcu/update.c ++++ b/kernel/rcu/update.c +@@ -288,6 +288,7 @@ int rcu_read_lock_held(void) + } + EXPORT_SYMBOL_GPL(rcu_read_lock_held); + ++#ifndef CONFIG_PREEMPT_RT_FULL + /** + * rcu_read_lock_bh_held() - might we be in RCU-bh read-side critical section? + * +@@ -314,6 +315,7 @@ int rcu_read_lock_bh_held(void) + return in_softirq() || irqs_disabled(); + } + EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held); ++#endif + + #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0159-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch linux-4.19.118/debian/patches-rt/0159-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch --- linux-4.19.98/debian/patches-rt/0159-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0159-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,117 @@ +From 64023a5804af7927d9662f817f6949774889b17c Mon Sep 17 00:00:00 2001 +From: "Paul E. McKenney" +Date: Wed, 5 Oct 2011 11:45:18 -0700 +Subject: [PATCH 159/325] rcu: Make ksoftirqd do RCU quiescent states +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Implementing RCU-bh in terms of RCU-preempt makes the system vulnerable +to network-based denial-of-service attacks. This patch therefore +makes __do_softirq() invoke rcu_bh_qs(), but only when __do_softirq() +is running in ksoftirqd context. A wrapper layer in interposed so that +other calls to __do_softirq() avoid invoking rcu_bh_qs(). The underlying +function __do_softirq_common() does the actual work. + +The reason that rcu_bh_qs() is bad in these non-ksoftirqd contexts is +that there might be a local_bh_enable() inside an RCU-preempt read-side +critical section. This local_bh_enable() can invoke __do_softirq() +directly, so if __do_softirq() were to invoke rcu_bh_qs() (which just +calls rcu_preempt_qs() in the PREEMPT_RT_FULL case), there would be +an illegal RCU-preempt quiescent state in the middle of an RCU-preempt +read-side critical section. Therefore, quiescent states can only happen +in cases where __do_softirq() is invoked directly from ksoftirqd. + +Signed-off-by: Paul E. McKenney +Link: http://lkml.kernel.org/r/20111005184518.GA21601@linux.vnet.ibm.com +Signed-off-by: Thomas Gleixner +--- + kernel/rcu/tree.c | 18 +++++++++++++----- + kernel/rcu/tree_plugin.h | 8 +++++++- + 2 files changed, 20 insertions(+), 6 deletions(-) + +diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c +index 1456a3d97971..1a40e3d44cb8 100644 +--- a/kernel/rcu/tree.c ++++ b/kernel/rcu/tree.c +@@ -244,7 +244,19 @@ void rcu_sched_qs(void) + this_cpu_ptr(&rcu_sched_data), true); + } + +-#ifndef CONFIG_PREEMPT_RT_FULL ++#ifdef CONFIG_PREEMPT_RT_FULL ++static void rcu_preempt_qs(void); ++ ++void rcu_bh_qs(void) ++{ ++ unsigned long flags; ++ ++ /* Callers to this function, rcu_preempt_qs(), must disable irqs. */ ++ local_irq_save(flags); ++ rcu_preempt_qs(); ++ local_irq_restore(flags); ++} ++#else + void rcu_bh_qs(void) + { + RCU_LOCKDEP_WARN(preemptible(), "rcu_bh_qs() invoked with preemption enabled!!!"); +@@ -255,10 +267,6 @@ void rcu_bh_qs(void) + __this_cpu_write(rcu_bh_data.cpu_no_qs.b.norm, false); + } + } +-#else +-void rcu_bh_qs(void) +-{ +-} + #endif + + /* +diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h +index e9ce51e19e87..938e64c69d18 100644 +--- a/kernel/rcu/tree_plugin.h ++++ b/kernel/rcu/tree_plugin.h +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + #include "../time/tick-internal.h" +@@ -1408,7 +1409,7 @@ static void rcu_prepare_kthreads(int cpu) + + #endif /* #else #ifdef CONFIG_RCU_BOOST */ + +-#if !defined(CONFIG_RCU_FAST_NO_HZ) ++#if !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) + + /* + * Check to see if any future RCU-related work will need to be done +@@ -1424,7 +1425,9 @@ int rcu_needs_cpu(u64 basemono, u64 *nextevt) + *nextevt = KTIME_MAX; + return rcu_cpu_has_callbacks(NULL); + } ++#endif /* !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) */ + ++#if !defined(CONFIG_RCU_FAST_NO_HZ) + /* + * Because we do not have RCU_FAST_NO_HZ, don't bother cleaning up + * after it. +@@ -1521,6 +1524,8 @@ static bool __maybe_unused rcu_try_advance_all_cbs(void) + return cbs_ready; + } + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + /* + * Allow the CPU to enter dyntick-idle mode unless it has callbacks ready + * to invoke. If the CPU has callbacks, try to advance them. Tell the +@@ -1563,6 +1568,7 @@ int rcu_needs_cpu(u64 basemono, u64 *nextevt) + *nextevt = basemono + dj * TICK_NSEC; + return 0; + } ++#endif /* #ifndef CONFIG_PREEMPT_RT_FULL */ + + /* + * Prepare a CPU for idle from an RCU perspective. The first major task +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0159-rcu-Merge-RCU-bh-into-RCU-preempt.patch linux-4.19.118/debian/patches-rt/0159-rcu-Merge-RCU-bh-into-RCU-preempt.patch --- linux-4.19.98/debian/patches-rt/0159-rcu-Merge-RCU-bh-into-RCU-preempt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0159-rcu-Merge-RCU-bh-into-RCU-preempt.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,351 +0,0 @@ -From 901bc5821a73d1fc6bbfe65cf07194fd04845366 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 5 Oct 2011 11:59:38 -0700 -Subject: [PATCH 159/290] rcu: Merge RCU-bh into RCU-preempt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The Linux kernel has long RCU-bh read-side critical sections that -intolerably increase scheduling latency under mainline's RCU-bh rules, -which include RCU-bh read-side critical sections being non-preemptible. -This patch therefore arranges for RCU-bh to be implemented in terms of -RCU-preempt for CONFIG_PREEMPT_RT_FULL=y. - -This has the downside of defeating the purpose of RCU-bh, namely, -handling the case where the system is subjected to a network-based -denial-of-service attack that keeps at least one CPU doing full-time -softirq processing. This issue will be fixed by a later commit. - -The current commit will need some work to make it appropriate for -mainline use, for example, it needs to be extended to cover Tiny RCU. - -[ paulmck: Added a useful changelog ] - -Signed-off-by: Thomas Gleixner -Signed-off-by: Paul E. McKenney -Link: http://lkml.kernel.org/r/20111005185938.GA20403@linux.vnet.ibm.com -Signed-off-by: Thomas Gleixner ---- - include/linux/rcupdate.h | 19 +++++++++++++++++++ - include/linux/rcutree.h | 8 ++++++++ - kernel/rcu/rcu.h | 11 +++++++++-- - kernel/rcu/rcutorture.c | 7 +++++++ - kernel/rcu/tree.c | 26 ++++++++++++++++++++++++++ - kernel/rcu/tree.h | 2 ++ - kernel/rcu/update.c | 2 ++ - 7 files changed, 73 insertions(+), 2 deletions(-) - -diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h -index e6733d7911e9..08d64e5713fc 100644 ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -56,7 +56,11 @@ void call_rcu(struct rcu_head *head, rcu_callback_t func); - #define call_rcu call_rcu_sched - #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ - -+#ifdef CONFIG_PREEMPT_RT_FULL -+#define call_rcu_bh call_rcu -+#else - void call_rcu_bh(struct rcu_head *head, rcu_callback_t func); -+#endif - void call_rcu_sched(struct rcu_head *head, rcu_callback_t func); - void synchronize_sched(void); - void rcu_barrier_tasks(void); -@@ -261,7 +265,14 @@ extern struct lockdep_map rcu_sched_lock_map; - extern struct lockdep_map rcu_callback_map; - int debug_lockdep_rcu_enabled(void); - int rcu_read_lock_held(void); -+#ifdef CONFIG_PREEMPT_RT_FULL -+static inline int rcu_read_lock_bh_held(void) -+{ -+ return rcu_read_lock_held(); -+} -+#else - int rcu_read_lock_bh_held(void); -+#endif - int rcu_read_lock_sched_held(void); - - #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ -@@ -661,10 +672,14 @@ static inline void rcu_read_unlock(void) - static inline void rcu_read_lock_bh(void) - { - local_bh_disable(); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ rcu_read_lock(); -+#else - __acquire(RCU_BH); - rcu_lock_acquire(&rcu_bh_lock_map); - RCU_LOCKDEP_WARN(!rcu_is_watching(), - "rcu_read_lock_bh() used illegally while idle"); -+#endif - } - - /* -@@ -674,10 +689,14 @@ static inline void rcu_read_lock_bh(void) - */ - static inline void rcu_read_unlock_bh(void) - { -+#ifdef CONFIG_PREEMPT_RT_FULL -+ rcu_read_unlock(); -+#else - RCU_LOCKDEP_WARN(!rcu_is_watching(), - "rcu_read_unlock_bh() used illegally while idle"); - rcu_lock_release(&rcu_bh_lock_map); - __release(RCU_BH); -+#endif - local_bh_enable(); - } - -diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h -index 914655848ef6..462ce061bac7 100644 ---- a/include/linux/rcutree.h -+++ b/include/linux/rcutree.h -@@ -44,7 +44,11 @@ static inline void rcu_virt_note_context_switch(int cpu) - rcu_note_context_switch(false); - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+# define synchronize_rcu_bh synchronize_rcu -+#else - void synchronize_rcu_bh(void); -+#endif - void synchronize_sched_expedited(void); - void synchronize_rcu_expedited(void); - -@@ -72,7 +76,11 @@ static inline void synchronize_rcu_bh_expedited(void) - } - - void rcu_barrier(void); -+#ifdef CONFIG_PREEMPT_RT_FULL -+# define rcu_barrier_bh rcu_barrier -+#else - void rcu_barrier_bh(void); -+#endif - void rcu_barrier_sched(void); - bool rcu_eqs_special_set(int cpu); - unsigned long get_state_synchronize_rcu(void); -diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h -index 4d04683c31b2..808cce9a5d43 100644 ---- a/kernel/rcu/rcu.h -+++ b/kernel/rcu/rcu.h -@@ -528,7 +528,6 @@ static inline void show_rcu_gp_kthreads(void) { } - static inline int rcu_get_gp_kthreads_prio(void) { return 0; } - #else /* #ifdef CONFIG_TINY_RCU */ - unsigned long rcu_get_gp_seq(void); --unsigned long rcu_bh_get_gp_seq(void); - unsigned long rcu_sched_get_gp_seq(void); - unsigned long rcu_exp_batches_completed(void); - unsigned long rcu_exp_batches_completed_sched(void); -@@ -536,10 +535,18 @@ unsigned long srcu_batches_completed(struct srcu_struct *sp); - void show_rcu_gp_kthreads(void); - int rcu_get_gp_kthreads_prio(void); - void rcu_force_quiescent_state(void); --void rcu_bh_force_quiescent_state(void); - void rcu_sched_force_quiescent_state(void); - extern struct workqueue_struct *rcu_gp_wq; - extern struct workqueue_struct *rcu_par_gp_wq; -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+#define rcu_bh_get_gp_seq rcu_get_gp_seq -+#define rcu_bh_force_quiescent_state rcu_force_quiescent_state -+#else -+unsigned long rcu_bh_get_gp_seq(void); -+void rcu_bh_force_quiescent_state(void); -+#endif -+ - #endif /* #else #ifdef CONFIG_TINY_RCU */ - - #ifdef CONFIG_RCU_NOCB_CPU -diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c -index 0b7af7e2bcbb..e95d121efc80 100644 ---- a/kernel/rcu/rcutorture.c -+++ b/kernel/rcu/rcutorture.c -@@ -434,6 +434,7 @@ static struct rcu_torture_ops rcu_ops = { - .name = "rcu" - }; - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * Definitions for rcu_bh torture testing. - */ -@@ -475,6 +476,12 @@ static struct rcu_torture_ops rcu_bh_ops = { - .name = "rcu_bh" - }; - -+#else -+static struct rcu_torture_ops rcu_bh_ops = { -+ .ttype = INVALID_RCU_FLAVOR, -+}; -+#endif -+ - /* - * Don't even think about trying any of these in real life!!! - * The names includes "busted", and they really means it! -diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c -index f7e89c989df7..1456a3d97971 100644 ---- a/kernel/rcu/tree.c -+++ b/kernel/rcu/tree.c -@@ -244,6 +244,7 @@ void rcu_sched_qs(void) - this_cpu_ptr(&rcu_sched_data), true); - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - void rcu_bh_qs(void) - { - RCU_LOCKDEP_WARN(preemptible(), "rcu_bh_qs() invoked with preemption enabled!!!"); -@@ -254,6 +255,11 @@ void rcu_bh_qs(void) - __this_cpu_write(rcu_bh_data.cpu_no_qs.b.norm, false); - } - } -+#else -+void rcu_bh_qs(void) -+{ -+} -+#endif - - /* - * Steal a bit from the bottom of ->dynticks for idle entry/exit -@@ -568,6 +574,7 @@ unsigned long rcu_sched_get_gp_seq(void) - } - EXPORT_SYMBOL_GPL(rcu_sched_get_gp_seq); - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * Return the number of RCU-bh GPs completed thus far for debug & stats. - */ -@@ -576,6 +583,7 @@ unsigned long rcu_bh_get_gp_seq(void) - return READ_ONCE(rcu_bh_state.gp_seq); - } - EXPORT_SYMBOL_GPL(rcu_bh_get_gp_seq); -+#endif - - /* - * Return the number of RCU expedited batches completed thus far for -@@ -599,6 +607,7 @@ unsigned long rcu_exp_batches_completed_sched(void) - } - EXPORT_SYMBOL_GPL(rcu_exp_batches_completed_sched); - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * Force a quiescent state. - */ -@@ -617,6 +626,13 @@ void rcu_bh_force_quiescent_state(void) - } - EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state); - -+#else -+void rcu_force_quiescent_state(void) -+{ -+} -+EXPORT_SYMBOL_GPL(rcu_force_quiescent_state); -+#endif -+ - /* - * Force a quiescent state for RCU-sched. - */ -@@ -674,9 +690,11 @@ void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags, - case RCU_FLAVOR: - rsp = rcu_state_p; - break; -+#ifndef CONFIG_PREEMPT_RT_FULL - case RCU_BH_FLAVOR: - rsp = &rcu_bh_state; - break; -+#endif - case RCU_SCHED_FLAVOR: - rsp = &rcu_sched_state; - break; -@@ -3057,6 +3075,7 @@ void call_rcu_sched(struct rcu_head *head, rcu_callback_t func) - } - EXPORT_SYMBOL_GPL(call_rcu_sched); - -+#ifndef CONFIG_PREEMPT_RT_FULL - /** - * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period. - * @head: structure to be used for queueing the RCU updates. -@@ -3084,6 +3103,7 @@ void call_rcu_bh(struct rcu_head *head, rcu_callback_t func) - __call_rcu(head, func, &rcu_bh_state, -1, 0); - } - EXPORT_SYMBOL_GPL(call_rcu_bh); -+#endif - - /* - * Queue an RCU callback for lazy invocation after a grace period. -@@ -3169,6 +3189,7 @@ void synchronize_sched(void) - } - EXPORT_SYMBOL_GPL(synchronize_sched); - -+#ifndef CONFIG_PREEMPT_RT_FULL - /** - * synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed. - * -@@ -3195,6 +3216,7 @@ void synchronize_rcu_bh(void) - wait_rcu_gp(call_rcu_bh); - } - EXPORT_SYMBOL_GPL(synchronize_rcu_bh); -+#endif - - /** - * get_state_synchronize_rcu - Snapshot current RCU state -@@ -3502,6 +3524,7 @@ static void _rcu_barrier(struct rcu_state *rsp) - mutex_unlock(&rsp->barrier_mutex); - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - /** - * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete. - */ -@@ -3510,6 +3533,7 @@ void rcu_barrier_bh(void) - _rcu_barrier(&rcu_bh_state); - } - EXPORT_SYMBOL_GPL(rcu_barrier_bh); -+#endif - - /** - * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks. -@@ -4157,7 +4181,9 @@ void __init rcu_init(void) - - rcu_bootup_announce(); - rcu_init_geometry(); -+#ifndef CONFIG_PREEMPT_RT_FULL - rcu_init_one(&rcu_bh_state); -+#endif - rcu_init_one(&rcu_sched_state); - if (dump_tree) - rcu_dump_rcu_node_tree(&rcu_sched_state); -diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h -index 4e74df768c57..fbbff7c21148 100644 ---- a/kernel/rcu/tree.h -+++ b/kernel/rcu/tree.h -@@ -413,7 +413,9 @@ extern struct list_head rcu_struct_flavors; - */ - extern struct rcu_state rcu_sched_state; - -+#ifndef CONFIG_PREEMPT_RT_FULL - extern struct rcu_state rcu_bh_state; -+#endif - - #ifdef CONFIG_PREEMPT_RCU - extern struct rcu_state rcu_preempt_state; -diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c -index 81688a133552..6ffafb1b1584 100644 ---- a/kernel/rcu/update.c -+++ b/kernel/rcu/update.c -@@ -288,6 +288,7 @@ int rcu_read_lock_held(void) - } - EXPORT_SYMBOL_GPL(rcu_read_lock_held); - -+#ifndef CONFIG_PREEMPT_RT_FULL - /** - * rcu_read_lock_bh_held() - might we be in RCU-bh read-side critical section? - * -@@ -314,6 +315,7 @@ int rcu_read_lock_bh_held(void) - return in_softirq() || irqs_disabled(); - } - EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held); -+#endif - - #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0160-rcu-Eliminate-softirq-processing-from-rcutree.patch linux-4.19.118/debian/patches-rt/0160-rcu-Eliminate-softirq-processing-from-rcutree.patch --- linux-4.19.98/debian/patches-rt/0160-rcu-Eliminate-softirq-processing-from-rcutree.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0160-rcu-Eliminate-softirq-processing-from-rcutree.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,423 @@ +From b9089e43759b0d547ad1aefab567bf622e41b560 Mon Sep 17 00:00:00 2001 +From: "Paul E. McKenney" +Date: Mon, 4 Nov 2013 13:21:10 -0800 +Subject: [PATCH 160/325] rcu: Eliminate softirq processing from rcutree +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Running RCU out of softirq is a problem for some workloads that would +like to manage RCU core processing independently of other softirq work, +for example, setting kthread priority. This commit therefore moves the +RCU core work from softirq to a per-CPU/per-flavor SCHED_OTHER kthread +named rcuc. The SCHED_OTHER approach avoids the scalability problems +that appeared with the earlier attempt to move RCU core processing to +from softirq to kthreads. That said, kernels built with RCU_BOOST=y +will run the rcuc kthreads at the RCU-boosting priority. + +Reported-by: Thomas Gleixner +Tested-by: Mike Galbraith +Signed-off-by: Paul E. McKenney +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/rcu/tree.c | 114 ++++++++++++++++++++++++++++--- + kernel/rcu/tree.h | 4 +- + kernel/rcu/tree_plugin.h | 142 +++------------------------------------ + 3 files changed, 115 insertions(+), 145 deletions(-) + +diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c +index 1a40e3d44cb8..ae716ca783bc 100644 +--- a/kernel/rcu/tree.c ++++ b/kernel/rcu/tree.c +@@ -61,6 +61,13 @@ + #include + #include + #include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "../time/tick-internal.h" + + #include "tree.h" + #include "rcu.h" +@@ -2896,18 +2903,17 @@ __rcu_process_callbacks(struct rcu_state *rsp) + /* + * Do RCU core processing for the current CPU. + */ +-static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused) ++static __latent_entropy void rcu_process_callbacks(void) + { + struct rcu_state *rsp; + + if (cpu_is_offline(smp_processor_id())) + return; +- trace_rcu_utilization(TPS("Start RCU core")); + for_each_rcu_flavor(rsp) + __rcu_process_callbacks(rsp); +- trace_rcu_utilization(TPS("End RCU core")); + } + ++static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task); + /* + * Schedule RCU callback invocation. If the specified type of RCU + * does not support RCU priority boosting, just do a direct call, +@@ -2919,18 +2925,105 @@ static void invoke_rcu_callbacks(struct rcu_state *rsp, struct rcu_data *rdp) + { + if (unlikely(!READ_ONCE(rcu_scheduler_fully_active))) + return; +- if (likely(!rsp->boost)) { +- rcu_do_batch(rsp, rdp); +- return; +- } +- invoke_rcu_callbacks_kthread(); ++ rcu_do_batch(rsp, rdp); ++} ++ ++static void rcu_wake_cond(struct task_struct *t, int status) ++{ ++ /* ++ * If the thread is yielding, only wake it when this ++ * is invoked from idle ++ */ ++ if (t && (status != RCU_KTHREAD_YIELDING || is_idle_task(current))) ++ wake_up_process(t); + } + ++/* ++ * Wake up this CPU's rcuc kthread to do RCU core processing. ++ */ + static void invoke_rcu_core(void) + { +- if (cpu_online(smp_processor_id())) +- raise_softirq(RCU_SOFTIRQ); ++ unsigned long flags; ++ struct task_struct *t; ++ ++ if (!cpu_online(smp_processor_id())) ++ return; ++ local_irq_save(flags); ++ __this_cpu_write(rcu_cpu_has_work, 1); ++ t = __this_cpu_read(rcu_cpu_kthread_task); ++ if (t != NULL && current != t) ++ rcu_wake_cond(t, __this_cpu_read(rcu_cpu_kthread_status)); ++ local_irq_restore(flags); ++} ++ ++static void rcu_cpu_kthread_park(unsigned int cpu) ++{ ++ per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU; ++} ++ ++static int rcu_cpu_kthread_should_run(unsigned int cpu) ++{ ++ return __this_cpu_read(rcu_cpu_has_work); ++} ++ ++/* ++ * Per-CPU kernel thread that invokes RCU callbacks. This replaces the ++ * RCU softirq used in flavors and configurations of RCU that do not ++ * support RCU priority boosting. ++ */ ++static void rcu_cpu_kthread(unsigned int cpu) ++{ ++ unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status); ++ char work, *workp = this_cpu_ptr(&rcu_cpu_has_work); ++ int spincnt; ++ ++ for (spincnt = 0; spincnt < 10; spincnt++) { ++ trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait")); ++ local_bh_disable(); ++ *statusp = RCU_KTHREAD_RUNNING; ++ this_cpu_inc(rcu_cpu_kthread_loops); ++ local_irq_disable(); ++ work = *workp; ++ *workp = 0; ++ local_irq_enable(); ++ if (work) ++ rcu_process_callbacks(); ++ local_bh_enable(); ++ if (*workp == 0) { ++ trace_rcu_utilization(TPS("End CPU kthread@rcu_wait")); ++ *statusp = RCU_KTHREAD_WAITING; ++ return; ++ } ++ } ++ *statusp = RCU_KTHREAD_YIELDING; ++ trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield")); ++ schedule_timeout_interruptible(2); ++ trace_rcu_utilization(TPS("End CPU kthread@rcu_yield")); ++ *statusp = RCU_KTHREAD_WAITING; ++} ++ ++static struct smp_hotplug_thread rcu_cpu_thread_spec = { ++ .store = &rcu_cpu_kthread_task, ++ .thread_should_run = rcu_cpu_kthread_should_run, ++ .thread_fn = rcu_cpu_kthread, ++ .thread_comm = "rcuc/%u", ++ .setup = rcu_cpu_kthread_setup, ++ .park = rcu_cpu_kthread_park, ++}; ++ ++/* ++ * Spawn per-CPU RCU core processing kthreads. ++ */ ++static int __init rcu_spawn_core_kthreads(void) ++{ ++ int cpu; ++ ++ for_each_possible_cpu(cpu) ++ per_cpu(rcu_cpu_has_work, cpu) = 0; ++ BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); ++ return 0; + } ++early_initcall(rcu_spawn_core_kthreads); + + /* + * Handle any core-RCU processing required by a call_rcu() invocation. +@@ -4196,7 +4289,6 @@ void __init rcu_init(void) + if (dump_tree) + rcu_dump_rcu_node_tree(&rcu_sched_state); + __rcu_init_preempt(); +- open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); + + /* + * We don't need protection against CPU-hotplug here because +diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h +index fbbff7c21148..98257d20feb2 100644 +--- a/kernel/rcu/tree.h ++++ b/kernel/rcu/tree.h +@@ -423,12 +423,10 @@ extern struct rcu_state rcu_preempt_state; + + int rcu_dynticks_snap(struct rcu_dynticks *rdtp); + +-#ifdef CONFIG_RCU_BOOST + DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status); + DECLARE_PER_CPU(int, rcu_cpu_kthread_cpu); + DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); + DECLARE_PER_CPU(char, rcu_cpu_has_work); +-#endif /* #ifdef CONFIG_RCU_BOOST */ + + #ifndef RCU_TREE_NONCORE + +@@ -451,8 +449,8 @@ static void dump_blkd_tasks(struct rcu_state *rsp, struct rcu_node *rnp, + int ncheck); + static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags); + static void rcu_preempt_boost_start_gp(struct rcu_node *rnp); +-static void invoke_rcu_callbacks_kthread(void); + static bool rcu_is_callbacks_kthread(void); ++static void rcu_cpu_kthread_setup(unsigned int cpu); + #ifdef CONFIG_RCU_BOOST + static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp, + struct rcu_node *rnp); +diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h +index 938e64c69d18..56639c8ed550 100644 +--- a/kernel/rcu/tree_plugin.h ++++ b/kernel/rcu/tree_plugin.h +@@ -24,42 +24,16 @@ + * Paul E. McKenney + */ + +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include "../time/tick-internal.h" +- +-#ifdef CONFIG_RCU_BOOST +- + #include "../locking/rtmutex_common.h" + + /* + * Control variables for per-CPU and per-rcu_node kthreads. These + * handle all flavors of RCU. + */ +-static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task); + DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status); + DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); + DEFINE_PER_CPU(char, rcu_cpu_has_work); + +-#else /* #ifdef CONFIG_RCU_BOOST */ +- +-/* +- * Some architectures do not define rt_mutexes, but if !CONFIG_RCU_BOOST, +- * all uses are in dead code. Provide a definition to keep the compiler +- * happy, but add WARN_ON_ONCE() to complain if used in the wrong place. +- * This probably needs to be excluded from -rt builds. +- */ +-#define rt_mutex_owner(a) ({ WARN_ON_ONCE(1); NULL; }) +-#define rt_mutex_futex_unlock(x) WARN_ON_ONCE(1) +- +-#endif /* #else #ifdef CONFIG_RCU_BOOST */ +- + #ifdef CONFIG_RCU_NOCB_CPU + static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */ + static bool __read_mostly rcu_nocb_poll; /* Offload kthread are to poll. */ +@@ -1028,18 +1002,21 @@ dump_blkd_tasks(struct rcu_state *rsp, struct rcu_node *rnp, int ncheck) + + #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ + ++/* ++ * If boosting, set rcuc kthreads to realtime priority. ++ */ ++static void rcu_cpu_kthread_setup(unsigned int cpu) ++{ + #ifdef CONFIG_RCU_BOOST ++ struct sched_param sp; + +-static void rcu_wake_cond(struct task_struct *t, int status) +-{ +- /* +- * If the thread is yielding, only wake it when this +- * is invoked from idle +- */ +- if (status != RCU_KTHREAD_YIELDING || is_idle_task(current)) +- wake_up_process(t); ++ sp.sched_priority = kthread_prio; ++ sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); ++#endif /* #ifdef CONFIG_RCU_BOOST */ + } + ++#ifdef CONFIG_RCU_BOOST ++ + /* + * Carry out RCU priority boosting on the task indicated by ->exp_tasks + * or ->boost_tasks, advancing the pointer to the next task in the +@@ -1177,23 +1154,6 @@ static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags) + } + } + +-/* +- * Wake up the per-CPU kthread to invoke RCU callbacks. +- */ +-static void invoke_rcu_callbacks_kthread(void) +-{ +- unsigned long flags; +- +- local_irq_save(flags); +- __this_cpu_write(rcu_cpu_has_work, 1); +- if (__this_cpu_read(rcu_cpu_kthread_task) != NULL && +- current != __this_cpu_read(rcu_cpu_kthread_task)) { +- rcu_wake_cond(__this_cpu_read(rcu_cpu_kthread_task), +- __this_cpu_read(rcu_cpu_kthread_status)); +- } +- local_irq_restore(flags); +-} +- + /* + * Is the current CPU running the RCU-callbacks kthread? + * Caller must have preemption disabled. +@@ -1248,67 +1208,6 @@ static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp, + return 0; + } + +-static void rcu_kthread_do_work(void) +-{ +- rcu_do_batch(&rcu_sched_state, this_cpu_ptr(&rcu_sched_data)); +- rcu_do_batch(&rcu_bh_state, this_cpu_ptr(&rcu_bh_data)); +- rcu_do_batch(&rcu_preempt_state, this_cpu_ptr(&rcu_preempt_data)); +-} +- +-static void rcu_cpu_kthread_setup(unsigned int cpu) +-{ +- struct sched_param sp; +- +- sp.sched_priority = kthread_prio; +- sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); +-} +- +-static void rcu_cpu_kthread_park(unsigned int cpu) +-{ +- per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU; +-} +- +-static int rcu_cpu_kthread_should_run(unsigned int cpu) +-{ +- return __this_cpu_read(rcu_cpu_has_work); +-} +- +-/* +- * Per-CPU kernel thread that invokes RCU callbacks. This replaces the +- * RCU softirq used in flavors and configurations of RCU that do not +- * support RCU priority boosting. +- */ +-static void rcu_cpu_kthread(unsigned int cpu) +-{ +- unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status); +- char work, *workp = this_cpu_ptr(&rcu_cpu_has_work); +- int spincnt; +- +- for (spincnt = 0; spincnt < 10; spincnt++) { +- trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait")); +- local_bh_disable(); +- *statusp = RCU_KTHREAD_RUNNING; +- this_cpu_inc(rcu_cpu_kthread_loops); +- local_irq_disable(); +- work = *workp; +- *workp = 0; +- local_irq_enable(); +- if (work) +- rcu_kthread_do_work(); +- local_bh_enable(); +- if (*workp == 0) { +- trace_rcu_utilization(TPS("End CPU kthread@rcu_wait")); +- *statusp = RCU_KTHREAD_WAITING; +- return; +- } +- } +- *statusp = RCU_KTHREAD_YIELDING; +- trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield")); +- schedule_timeout_interruptible(2); +- trace_rcu_utilization(TPS("End CPU kthread@rcu_yield")); +- *statusp = RCU_KTHREAD_WAITING; +-} +- + /* + * Set the per-rcu_node kthread's affinity to cover all CPUs that are + * served by the rcu_node in question. The CPU hotplug lock is still +@@ -1339,26 +1238,12 @@ static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu) + free_cpumask_var(cm); + } + +-static struct smp_hotplug_thread rcu_cpu_thread_spec = { +- .store = &rcu_cpu_kthread_task, +- .thread_should_run = rcu_cpu_kthread_should_run, +- .thread_fn = rcu_cpu_kthread, +- .thread_comm = "rcuc/%u", +- .setup = rcu_cpu_kthread_setup, +- .park = rcu_cpu_kthread_park, +-}; +- + /* + * Spawn boost kthreads -- called as soon as the scheduler is running. + */ + static void __init rcu_spawn_boost_kthreads(void) + { + struct rcu_node *rnp; +- int cpu; +- +- for_each_possible_cpu(cpu) +- per_cpu(rcu_cpu_has_work, cpu) = 0; +- BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); + rcu_for_each_leaf_node(rcu_state_p, rnp) + (void)rcu_spawn_one_boost_kthread(rcu_state_p, rnp); + } +@@ -1381,11 +1266,6 @@ static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags) + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + } + +-static void invoke_rcu_callbacks_kthread(void) +-{ +- WARN_ON_ONCE(1); +-} +- + static bool rcu_is_callbacks_kthread(void) + { + return false; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0160-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch linux-4.19.118/debian/patches-rt/0160-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch --- linux-4.19.98/debian/patches-rt/0160-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0160-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -From 8a484b91ae77a0557e92b9e07f3fe82b7ff735cb Mon Sep 17 00:00:00 2001 -From: "Paul E. McKenney" -Date: Wed, 5 Oct 2011 11:45:18 -0700 -Subject: [PATCH 160/290] rcu: Make ksoftirqd do RCU quiescent states -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Implementing RCU-bh in terms of RCU-preempt makes the system vulnerable -to network-based denial-of-service attacks. This patch therefore -makes __do_softirq() invoke rcu_bh_qs(), but only when __do_softirq() -is running in ksoftirqd context. A wrapper layer in interposed so that -other calls to __do_softirq() avoid invoking rcu_bh_qs(). The underlying -function __do_softirq_common() does the actual work. - -The reason that rcu_bh_qs() is bad in these non-ksoftirqd contexts is -that there might be a local_bh_enable() inside an RCU-preempt read-side -critical section. This local_bh_enable() can invoke __do_softirq() -directly, so if __do_softirq() were to invoke rcu_bh_qs() (which just -calls rcu_preempt_qs() in the PREEMPT_RT_FULL case), there would be -an illegal RCU-preempt quiescent state in the middle of an RCU-preempt -read-side critical section. Therefore, quiescent states can only happen -in cases where __do_softirq() is invoked directly from ksoftirqd. - -Signed-off-by: Paul E. McKenney -Link: http://lkml.kernel.org/r/20111005184518.GA21601@linux.vnet.ibm.com -Signed-off-by: Thomas Gleixner ---- - kernel/rcu/tree.c | 18 +++++++++++++----- - kernel/rcu/tree_plugin.h | 8 +++++++- - 2 files changed, 20 insertions(+), 6 deletions(-) - -diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c -index 1456a3d97971..1a40e3d44cb8 100644 ---- a/kernel/rcu/tree.c -+++ b/kernel/rcu/tree.c -@@ -244,7 +244,19 @@ void rcu_sched_qs(void) - this_cpu_ptr(&rcu_sched_data), true); - } - --#ifndef CONFIG_PREEMPT_RT_FULL -+#ifdef CONFIG_PREEMPT_RT_FULL -+static void rcu_preempt_qs(void); -+ -+void rcu_bh_qs(void) -+{ -+ unsigned long flags; -+ -+ /* Callers to this function, rcu_preempt_qs(), must disable irqs. */ -+ local_irq_save(flags); -+ rcu_preempt_qs(); -+ local_irq_restore(flags); -+} -+#else - void rcu_bh_qs(void) - { - RCU_LOCKDEP_WARN(preemptible(), "rcu_bh_qs() invoked with preemption enabled!!!"); -@@ -255,10 +267,6 @@ void rcu_bh_qs(void) - __this_cpu_write(rcu_bh_data.cpu_no_qs.b.norm, false); - } - } --#else --void rcu_bh_qs(void) --{ --} - #endif - - /* -diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h -index 429a2f144e19..bee9bffeb0ce 100644 ---- a/kernel/rcu/tree_plugin.h -+++ b/kernel/rcu/tree_plugin.h -@@ -29,6 +29,7 @@ - #include - #include - #include -+#include - #include - #include - #include "../time/tick-internal.h" -@@ -1407,7 +1408,7 @@ static void rcu_prepare_kthreads(int cpu) - - #endif /* #else #ifdef CONFIG_RCU_BOOST */ - --#if !defined(CONFIG_RCU_FAST_NO_HZ) -+#if !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) - - /* - * Check to see if any future RCU-related work will need to be done -@@ -1423,7 +1424,9 @@ int rcu_needs_cpu(u64 basemono, u64 *nextevt) - *nextevt = KTIME_MAX; - return rcu_cpu_has_callbacks(NULL); - } -+#endif /* !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) */ - -+#if !defined(CONFIG_RCU_FAST_NO_HZ) - /* - * Because we do not have RCU_FAST_NO_HZ, don't bother cleaning up - * after it. -@@ -1520,6 +1523,8 @@ static bool __maybe_unused rcu_try_advance_all_cbs(void) - return cbs_ready; - } - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - /* - * Allow the CPU to enter dyntick-idle mode unless it has callbacks ready - * to invoke. If the CPU has callbacks, try to advance them. Tell the -@@ -1562,6 +1567,7 @@ int rcu_needs_cpu(u64 basemono, u64 *nextevt) - *nextevt = basemono + dj * TICK_NSEC; - return 0; - } -+#endif /* #ifndef CONFIG_PREEMPT_RT_FULL */ - - /* - * Prepare a CPU for idle from an RCU perspective. The first major task --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0161-rcu-Eliminate-softirq-processing-from-rcutree.patch linux-4.19.118/debian/patches-rt/0161-rcu-Eliminate-softirq-processing-from-rcutree.patch --- linux-4.19.98/debian/patches-rt/0161-rcu-Eliminate-softirq-processing-from-rcutree.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0161-rcu-Eliminate-softirq-processing-from-rcutree.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,423 +0,0 @@ -From 5c4e32e88d430654b1f529185331235d5b745a0d Mon Sep 17 00:00:00 2001 -From: "Paul E. McKenney" -Date: Mon, 4 Nov 2013 13:21:10 -0800 -Subject: [PATCH 161/290] rcu: Eliminate softirq processing from rcutree -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Running RCU out of softirq is a problem for some workloads that would -like to manage RCU core processing independently of other softirq work, -for example, setting kthread priority. This commit therefore moves the -RCU core work from softirq to a per-CPU/per-flavor SCHED_OTHER kthread -named rcuc. The SCHED_OTHER approach avoids the scalability problems -that appeared with the earlier attempt to move RCU core processing to -from softirq to kthreads. That said, kernels built with RCU_BOOST=y -will run the rcuc kthreads at the RCU-boosting priority. - -Reported-by: Thomas Gleixner -Tested-by: Mike Galbraith -Signed-off-by: Paul E. McKenney -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/rcu/tree.c | 114 ++++++++++++++++++++++++++++--- - kernel/rcu/tree.h | 4 +- - kernel/rcu/tree_plugin.h | 142 +++------------------------------------ - 3 files changed, 115 insertions(+), 145 deletions(-) - -diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c -index 1a40e3d44cb8..ae716ca783bc 100644 ---- a/kernel/rcu/tree.c -+++ b/kernel/rcu/tree.c -@@ -61,6 +61,13 @@ - #include - #include - #include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "../time/tick-internal.h" - - #include "tree.h" - #include "rcu.h" -@@ -2896,18 +2903,17 @@ __rcu_process_callbacks(struct rcu_state *rsp) - /* - * Do RCU core processing for the current CPU. - */ --static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused) -+static __latent_entropy void rcu_process_callbacks(void) - { - struct rcu_state *rsp; - - if (cpu_is_offline(smp_processor_id())) - return; -- trace_rcu_utilization(TPS("Start RCU core")); - for_each_rcu_flavor(rsp) - __rcu_process_callbacks(rsp); -- trace_rcu_utilization(TPS("End RCU core")); - } - -+static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task); - /* - * Schedule RCU callback invocation. If the specified type of RCU - * does not support RCU priority boosting, just do a direct call, -@@ -2919,18 +2925,105 @@ static void invoke_rcu_callbacks(struct rcu_state *rsp, struct rcu_data *rdp) - { - if (unlikely(!READ_ONCE(rcu_scheduler_fully_active))) - return; -- if (likely(!rsp->boost)) { -- rcu_do_batch(rsp, rdp); -- return; -- } -- invoke_rcu_callbacks_kthread(); -+ rcu_do_batch(rsp, rdp); -+} -+ -+static void rcu_wake_cond(struct task_struct *t, int status) -+{ -+ /* -+ * If the thread is yielding, only wake it when this -+ * is invoked from idle -+ */ -+ if (t && (status != RCU_KTHREAD_YIELDING || is_idle_task(current))) -+ wake_up_process(t); - } - -+/* -+ * Wake up this CPU's rcuc kthread to do RCU core processing. -+ */ - static void invoke_rcu_core(void) - { -- if (cpu_online(smp_processor_id())) -- raise_softirq(RCU_SOFTIRQ); -+ unsigned long flags; -+ struct task_struct *t; -+ -+ if (!cpu_online(smp_processor_id())) -+ return; -+ local_irq_save(flags); -+ __this_cpu_write(rcu_cpu_has_work, 1); -+ t = __this_cpu_read(rcu_cpu_kthread_task); -+ if (t != NULL && current != t) -+ rcu_wake_cond(t, __this_cpu_read(rcu_cpu_kthread_status)); -+ local_irq_restore(flags); -+} -+ -+static void rcu_cpu_kthread_park(unsigned int cpu) -+{ -+ per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU; -+} -+ -+static int rcu_cpu_kthread_should_run(unsigned int cpu) -+{ -+ return __this_cpu_read(rcu_cpu_has_work); -+} -+ -+/* -+ * Per-CPU kernel thread that invokes RCU callbacks. This replaces the -+ * RCU softirq used in flavors and configurations of RCU that do not -+ * support RCU priority boosting. -+ */ -+static void rcu_cpu_kthread(unsigned int cpu) -+{ -+ unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status); -+ char work, *workp = this_cpu_ptr(&rcu_cpu_has_work); -+ int spincnt; -+ -+ for (spincnt = 0; spincnt < 10; spincnt++) { -+ trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait")); -+ local_bh_disable(); -+ *statusp = RCU_KTHREAD_RUNNING; -+ this_cpu_inc(rcu_cpu_kthread_loops); -+ local_irq_disable(); -+ work = *workp; -+ *workp = 0; -+ local_irq_enable(); -+ if (work) -+ rcu_process_callbacks(); -+ local_bh_enable(); -+ if (*workp == 0) { -+ trace_rcu_utilization(TPS("End CPU kthread@rcu_wait")); -+ *statusp = RCU_KTHREAD_WAITING; -+ return; -+ } -+ } -+ *statusp = RCU_KTHREAD_YIELDING; -+ trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield")); -+ schedule_timeout_interruptible(2); -+ trace_rcu_utilization(TPS("End CPU kthread@rcu_yield")); -+ *statusp = RCU_KTHREAD_WAITING; -+} -+ -+static struct smp_hotplug_thread rcu_cpu_thread_spec = { -+ .store = &rcu_cpu_kthread_task, -+ .thread_should_run = rcu_cpu_kthread_should_run, -+ .thread_fn = rcu_cpu_kthread, -+ .thread_comm = "rcuc/%u", -+ .setup = rcu_cpu_kthread_setup, -+ .park = rcu_cpu_kthread_park, -+}; -+ -+/* -+ * Spawn per-CPU RCU core processing kthreads. -+ */ -+static int __init rcu_spawn_core_kthreads(void) -+{ -+ int cpu; -+ -+ for_each_possible_cpu(cpu) -+ per_cpu(rcu_cpu_has_work, cpu) = 0; -+ BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); -+ return 0; - } -+early_initcall(rcu_spawn_core_kthreads); - - /* - * Handle any core-RCU processing required by a call_rcu() invocation. -@@ -4196,7 +4289,6 @@ void __init rcu_init(void) - if (dump_tree) - rcu_dump_rcu_node_tree(&rcu_sched_state); - __rcu_init_preempt(); -- open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); - - /* - * We don't need protection against CPU-hotplug here because -diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h -index fbbff7c21148..98257d20feb2 100644 ---- a/kernel/rcu/tree.h -+++ b/kernel/rcu/tree.h -@@ -423,12 +423,10 @@ extern struct rcu_state rcu_preempt_state; - - int rcu_dynticks_snap(struct rcu_dynticks *rdtp); - --#ifdef CONFIG_RCU_BOOST - DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status); - DECLARE_PER_CPU(int, rcu_cpu_kthread_cpu); - DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); - DECLARE_PER_CPU(char, rcu_cpu_has_work); --#endif /* #ifdef CONFIG_RCU_BOOST */ - - #ifndef RCU_TREE_NONCORE - -@@ -451,8 +449,8 @@ static void dump_blkd_tasks(struct rcu_state *rsp, struct rcu_node *rnp, - int ncheck); - static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags); - static void rcu_preempt_boost_start_gp(struct rcu_node *rnp); --static void invoke_rcu_callbacks_kthread(void); - static bool rcu_is_callbacks_kthread(void); -+static void rcu_cpu_kthread_setup(unsigned int cpu); - #ifdef CONFIG_RCU_BOOST - static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp, - struct rcu_node *rnp); -diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h -index bee9bffeb0ce..2e8737f1010f 100644 ---- a/kernel/rcu/tree_plugin.h -+++ b/kernel/rcu/tree_plugin.h -@@ -24,42 +24,16 @@ - * Paul E. McKenney - */ - --#include --#include --#include --#include --#include --#include --#include --#include --#include "../time/tick-internal.h" -- --#ifdef CONFIG_RCU_BOOST -- - #include "../locking/rtmutex_common.h" - - /* - * Control variables for per-CPU and per-rcu_node kthreads. These - * handle all flavors of RCU. - */ --static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task); - DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status); - DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops); - DEFINE_PER_CPU(char, rcu_cpu_has_work); - --#else /* #ifdef CONFIG_RCU_BOOST */ -- --/* -- * Some architectures do not define rt_mutexes, but if !CONFIG_RCU_BOOST, -- * all uses are in dead code. Provide a definition to keep the compiler -- * happy, but add WARN_ON_ONCE() to complain if used in the wrong place. -- * This probably needs to be excluded from -rt builds. -- */ --#define rt_mutex_owner(a) ({ WARN_ON_ONCE(1); NULL; }) --#define rt_mutex_futex_unlock(x) WARN_ON_ONCE(1) -- --#endif /* #else #ifdef CONFIG_RCU_BOOST */ -- - #ifdef CONFIG_RCU_NOCB_CPU - static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */ - static bool __read_mostly rcu_nocb_poll; /* Offload kthread are to poll. */ -@@ -1027,18 +1001,21 @@ dump_blkd_tasks(struct rcu_state *rsp, struct rcu_node *rnp, int ncheck) - - #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ - -+/* -+ * If boosting, set rcuc kthreads to realtime priority. -+ */ -+static void rcu_cpu_kthread_setup(unsigned int cpu) -+{ - #ifdef CONFIG_RCU_BOOST -+ struct sched_param sp; - --static void rcu_wake_cond(struct task_struct *t, int status) --{ -- /* -- * If the thread is yielding, only wake it when this -- * is invoked from idle -- */ -- if (status != RCU_KTHREAD_YIELDING || is_idle_task(current)) -- wake_up_process(t); -+ sp.sched_priority = kthread_prio; -+ sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); -+#endif /* #ifdef CONFIG_RCU_BOOST */ - } - -+#ifdef CONFIG_RCU_BOOST -+ - /* - * Carry out RCU priority boosting on the task indicated by ->exp_tasks - * or ->boost_tasks, advancing the pointer to the next task in the -@@ -1176,23 +1153,6 @@ static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags) - } - } - --/* -- * Wake up the per-CPU kthread to invoke RCU callbacks. -- */ --static void invoke_rcu_callbacks_kthread(void) --{ -- unsigned long flags; -- -- local_irq_save(flags); -- __this_cpu_write(rcu_cpu_has_work, 1); -- if (__this_cpu_read(rcu_cpu_kthread_task) != NULL && -- current != __this_cpu_read(rcu_cpu_kthread_task)) { -- rcu_wake_cond(__this_cpu_read(rcu_cpu_kthread_task), -- __this_cpu_read(rcu_cpu_kthread_status)); -- } -- local_irq_restore(flags); --} -- - /* - * Is the current CPU running the RCU-callbacks kthread? - * Caller must have preemption disabled. -@@ -1247,67 +1207,6 @@ static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp, - return 0; - } - --static void rcu_kthread_do_work(void) --{ -- rcu_do_batch(&rcu_sched_state, this_cpu_ptr(&rcu_sched_data)); -- rcu_do_batch(&rcu_bh_state, this_cpu_ptr(&rcu_bh_data)); -- rcu_do_batch(&rcu_preempt_state, this_cpu_ptr(&rcu_preempt_data)); --} -- --static void rcu_cpu_kthread_setup(unsigned int cpu) --{ -- struct sched_param sp; -- -- sp.sched_priority = kthread_prio; -- sched_setscheduler_nocheck(current, SCHED_FIFO, &sp); --} -- --static void rcu_cpu_kthread_park(unsigned int cpu) --{ -- per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU; --} -- --static int rcu_cpu_kthread_should_run(unsigned int cpu) --{ -- return __this_cpu_read(rcu_cpu_has_work); --} -- --/* -- * Per-CPU kernel thread that invokes RCU callbacks. This replaces the -- * RCU softirq used in flavors and configurations of RCU that do not -- * support RCU priority boosting. -- */ --static void rcu_cpu_kthread(unsigned int cpu) --{ -- unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status); -- char work, *workp = this_cpu_ptr(&rcu_cpu_has_work); -- int spincnt; -- -- for (spincnt = 0; spincnt < 10; spincnt++) { -- trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait")); -- local_bh_disable(); -- *statusp = RCU_KTHREAD_RUNNING; -- this_cpu_inc(rcu_cpu_kthread_loops); -- local_irq_disable(); -- work = *workp; -- *workp = 0; -- local_irq_enable(); -- if (work) -- rcu_kthread_do_work(); -- local_bh_enable(); -- if (*workp == 0) { -- trace_rcu_utilization(TPS("End CPU kthread@rcu_wait")); -- *statusp = RCU_KTHREAD_WAITING; -- return; -- } -- } -- *statusp = RCU_KTHREAD_YIELDING; -- trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield")); -- schedule_timeout_interruptible(2); -- trace_rcu_utilization(TPS("End CPU kthread@rcu_yield")); -- *statusp = RCU_KTHREAD_WAITING; --} -- - /* - * Set the per-rcu_node kthread's affinity to cover all CPUs that are - * served by the rcu_node in question. The CPU hotplug lock is still -@@ -1338,26 +1237,12 @@ static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu) - free_cpumask_var(cm); - } - --static struct smp_hotplug_thread rcu_cpu_thread_spec = { -- .store = &rcu_cpu_kthread_task, -- .thread_should_run = rcu_cpu_kthread_should_run, -- .thread_fn = rcu_cpu_kthread, -- .thread_comm = "rcuc/%u", -- .setup = rcu_cpu_kthread_setup, -- .park = rcu_cpu_kthread_park, --}; -- - /* - * Spawn boost kthreads -- called as soon as the scheduler is running. - */ - static void __init rcu_spawn_boost_kthreads(void) - { - struct rcu_node *rnp; -- int cpu; -- -- for_each_possible_cpu(cpu) -- per_cpu(rcu_cpu_has_work, cpu) = 0; -- BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec)); - rcu_for_each_leaf_node(rcu_state_p, rnp) - (void)rcu_spawn_one_boost_kthread(rcu_state_p, rnp); - } -@@ -1380,11 +1265,6 @@ static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags) - raw_spin_unlock_irqrestore_rcu_node(rnp, flags); - } - --static void invoke_rcu_callbacks_kthread(void) --{ -- WARN_ON_ONCE(1); --} -- - static bool rcu_is_callbacks_kthread(void) - { - return false; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0161-srcu-use-cpu_online-instead-custom-check.patch linux-4.19.118/debian/patches-rt/0161-srcu-use-cpu_online-instead-custom-check.patch --- linux-4.19.98/debian/patches-rt/0161-srcu-use-cpu_online-instead-custom-check.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0161-srcu-use-cpu_online-instead-custom-check.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,96 @@ +From 3202d22e4b6ad35fbe7b617efd78bf1a9a727c5a Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 13 Sep 2017 14:43:41 +0200 +Subject: [PATCH 161/325] srcu: use cpu_online() instead custom check +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The current check via srcu_online is slightly racy because after looking +at srcu_online there could be an interrupt that interrupted us long +enough until the CPU we checked against went offline. +An alternative would be to hold the hotplug rwsem (so the CPUs don't +change their state) and then check based on cpu_online() if we queue it +on a specific CPU or not. queue_work_on() itself can handle if something +is enqueued on an offline CPU but a timer which is enqueued on an offline +CPU won't fire until the CPU is back online. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/rcu/srcutree.c | 22 ++++------------------ + kernel/rcu/tree.c | 4 ---- + 2 files changed, 4 insertions(+), 22 deletions(-) + +diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c +index 1ff17e297f0c..df0375453ba1 100644 +--- a/kernel/rcu/srcutree.c ++++ b/kernel/rcu/srcutree.c +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + + #include "rcu.h" + #include "rcu_segcblist.h" +@@ -460,21 +461,6 @@ static void srcu_gp_start(struct srcu_struct *sp) + WARN_ON_ONCE(state != SRCU_STATE_SCAN1); + } + +-/* +- * Track online CPUs to guide callback workqueue placement. +- */ +-DEFINE_PER_CPU(bool, srcu_online); +- +-void srcu_online_cpu(unsigned int cpu) +-{ +- WRITE_ONCE(per_cpu(srcu_online, cpu), true); +-} +- +-void srcu_offline_cpu(unsigned int cpu) +-{ +- WRITE_ONCE(per_cpu(srcu_online, cpu), false); +-} +- + /* + * Place the workqueue handler on the specified CPU if online, otherwise + * just run it whereever. This is useful for placing workqueue handlers +@@ -486,12 +472,12 @@ static bool srcu_queue_delayed_work_on(int cpu, struct workqueue_struct *wq, + { + bool ret; + +- preempt_disable(); +- if (READ_ONCE(per_cpu(srcu_online, cpu))) ++ cpus_read_lock(); ++ if (cpu_online(cpu)) + ret = queue_delayed_work_on(cpu, wq, dwork, delay); + else + ret = queue_delayed_work(wq, dwork, delay); +- preempt_enable(); ++ cpus_read_unlock(); + return ret; + } + +diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c +index ae716ca783bc..f162a4f54b05 100644 +--- a/kernel/rcu/tree.c ++++ b/kernel/rcu/tree.c +@@ -3784,8 +3784,6 @@ int rcutree_online_cpu(unsigned int cpu) + rnp->ffmask |= rdp->grpmask; + raw_spin_unlock_irqrestore_rcu_node(rnp, flags); + } +- if (IS_ENABLED(CONFIG_TREE_SRCU)) +- srcu_online_cpu(cpu); + if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE) + return 0; /* Too early in boot for scheduler work. */ + sync_sched_exp_online_cleanup(cpu); +@@ -3813,8 +3811,6 @@ int rcutree_offline_cpu(unsigned int cpu) + } + + rcutree_affinity_setting(cpu, cpu); +- if (IS_ENABLED(CONFIG_TREE_SRCU)) +- srcu_offline_cpu(cpu); + return 0; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0162-srcu-replace-local_irqsave-with-a-locallock.patch linux-4.19.118/debian/patches-rt/0162-srcu-replace-local_irqsave-with-a-locallock.patch --- linux-4.19.98/debian/patches-rt/0162-srcu-replace-local_irqsave-with-a-locallock.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0162-srcu-replace-local_irqsave-with-a-locallock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,77 @@ +From 67e5a1751b9315d556d99ae3a44140d126f2609f Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 12 Oct 2017 18:37:12 +0200 +Subject: [PATCH 162/325] srcu: replace local_irqsave() with a locallock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +There are two instances which disable interrupts in order to become a +stable this_cpu_ptr() pointer. The restore part is coupled with +spin_unlock_irqrestore() which does not work on RT. +Replace the local_irq_save() call with the appropriate local_lock() +version of it. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/rcu/srcutree.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c +index df0375453ba1..0f09a1a9e17c 100644 +--- a/kernel/rcu/srcutree.c ++++ b/kernel/rcu/srcutree.c +@@ -39,6 +39,7 @@ + #include + #include + #include ++#include + + #include "rcu.h" + #include "rcu_segcblist.h" +@@ -760,6 +761,8 @@ static void srcu_flip(struct srcu_struct *sp) + * negligible when amoritized over that time period, and the extra latency + * of a needlessly non-expedited grace period is similarly negligible. + */ ++static DEFINE_LOCAL_IRQ_LOCK(sp_llock); ++ + static bool srcu_might_be_idle(struct srcu_struct *sp) + { + unsigned long curseq; +@@ -768,13 +771,13 @@ static bool srcu_might_be_idle(struct srcu_struct *sp) + unsigned long t; + + /* If the local srcu_data structure has callbacks, not idle. */ +- local_irq_save(flags); ++ local_lock_irqsave(sp_llock, flags); + sdp = this_cpu_ptr(sp->sda); + if (rcu_segcblist_pend_cbs(&sdp->srcu_cblist)) { +- local_irq_restore(flags); ++ local_unlock_irqrestore(sp_llock, flags); + return false; /* Callbacks already present, so not idle. */ + } +- local_irq_restore(flags); ++ local_unlock_irqrestore(sp_llock, flags); + + /* + * No local callbacks, so probabalistically probe global state. +@@ -852,7 +855,7 @@ void __call_srcu(struct srcu_struct *sp, struct rcu_head *rhp, + return; + } + rhp->func = func; +- local_irq_save(flags); ++ local_lock_irqsave(sp_llock, flags); + sdp = this_cpu_ptr(sp->sda); + spin_lock_rcu_node(sdp); + rcu_segcblist_enqueue(&sdp->srcu_cblist, rhp, false); +@@ -868,7 +871,8 @@ void __call_srcu(struct srcu_struct *sp, struct rcu_head *rhp, + sdp->srcu_gp_seq_needed_exp = s; + needexp = true; + } +- spin_unlock_irqrestore_rcu_node(sdp, flags); ++ spin_unlock_rcu_node(sdp); ++ local_unlock_irqrestore(sp_llock, flags); + if (needgp) + srcu_funnel_gp_start(sp, sdp, s, do_norm); + else if (needexp) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0162-srcu-use-cpu_online-instead-custom-check.patch linux-4.19.118/debian/patches-rt/0162-srcu-use-cpu_online-instead-custom-check.patch --- linux-4.19.98/debian/patches-rt/0162-srcu-use-cpu_online-instead-custom-check.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0162-srcu-use-cpu_online-instead-custom-check.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -From 68c6703bb92019392658036dcf0a667b1388a3b0 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 13 Sep 2017 14:43:41 +0200 -Subject: [PATCH 162/290] srcu: use cpu_online() instead custom check -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The current check via srcu_online is slightly racy because after looking -at srcu_online there could be an interrupt that interrupted us long -enough until the CPU we checked against went offline. -An alternative would be to hold the hotplug rwsem (so the CPUs don't -change their state) and then check based on cpu_online() if we queue it -on a specific CPU or not. queue_work_on() itself can handle if something -is enqueued on an offline CPU but a timer which is enqueued on an offline -CPU won't fire until the CPU is back online. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/rcu/srcutree.c | 22 ++++------------------ - kernel/rcu/tree.c | 4 ---- - 2 files changed, 4 insertions(+), 22 deletions(-) - -diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c -index 1ff17e297f0c..df0375453ba1 100644 ---- a/kernel/rcu/srcutree.c -+++ b/kernel/rcu/srcutree.c -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - - #include "rcu.h" - #include "rcu_segcblist.h" -@@ -460,21 +461,6 @@ static void srcu_gp_start(struct srcu_struct *sp) - WARN_ON_ONCE(state != SRCU_STATE_SCAN1); - } - --/* -- * Track online CPUs to guide callback workqueue placement. -- */ --DEFINE_PER_CPU(bool, srcu_online); -- --void srcu_online_cpu(unsigned int cpu) --{ -- WRITE_ONCE(per_cpu(srcu_online, cpu), true); --} -- --void srcu_offline_cpu(unsigned int cpu) --{ -- WRITE_ONCE(per_cpu(srcu_online, cpu), false); --} -- - /* - * Place the workqueue handler on the specified CPU if online, otherwise - * just run it whereever. This is useful for placing workqueue handlers -@@ -486,12 +472,12 @@ static bool srcu_queue_delayed_work_on(int cpu, struct workqueue_struct *wq, - { - bool ret; - -- preempt_disable(); -- if (READ_ONCE(per_cpu(srcu_online, cpu))) -+ cpus_read_lock(); -+ if (cpu_online(cpu)) - ret = queue_delayed_work_on(cpu, wq, dwork, delay); - else - ret = queue_delayed_work(wq, dwork, delay); -- preempt_enable(); -+ cpus_read_unlock(); - return ret; - } - -diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c -index ae716ca783bc..f162a4f54b05 100644 ---- a/kernel/rcu/tree.c -+++ b/kernel/rcu/tree.c -@@ -3784,8 +3784,6 @@ int rcutree_online_cpu(unsigned int cpu) - rnp->ffmask |= rdp->grpmask; - raw_spin_unlock_irqrestore_rcu_node(rnp, flags); - } -- if (IS_ENABLED(CONFIG_TREE_SRCU)) -- srcu_online_cpu(cpu); - if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE) - return 0; /* Too early in boot for scheduler work. */ - sync_sched_exp_online_cleanup(cpu); -@@ -3813,8 +3811,6 @@ int rcutree_offline_cpu(unsigned int cpu) - } - - rcutree_affinity_setting(cpu, cpu); -- if (IS_ENABLED(CONFIG_TREE_SRCU)) -- srcu_offline_cpu(cpu); - return 0; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0163-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch linux-4.19.118/debian/patches-rt/0163-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch --- linux-4.19.98/debian/patches-rt/0163-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0163-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,37 @@ +From 724541a3012567e4851d44a94795c42ce9fbc8ab Mon Sep 17 00:00:00 2001 +From: Julia Cartwright +Date: Wed, 12 Oct 2016 11:21:14 -0500 +Subject: [PATCH 163/325] rcu: enable rcu_normal_after_boot by default for RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The forcing of an expedited grace period is an expensive and very +RT-application unfriendly operation, as it forcibly preempts all running +tasks on CPUs which are preventing the gp from expiring. + +By default, as a policy decision, disable the expediting of grace +periods (after boot) on configurations which enable PREEMPT_RT_FULL. + +Suggested-by: Luiz Capitulino +Acked-by: Paul E. McKenney +Signed-off-by: Julia Cartwright +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/rcu/update.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c +index 6ffafb1b1584..16d8dba23329 100644 +--- a/kernel/rcu/update.c ++++ b/kernel/rcu/update.c +@@ -68,7 +68,7 @@ extern int rcu_expedited; /* from sysctl */ + module_param(rcu_expedited, int, 0); + extern int rcu_normal; /* from sysctl */ + module_param(rcu_normal, int, 0); +-static int rcu_normal_after_boot; ++static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); + module_param(rcu_normal_after_boot, int, 0); + #endif /* #ifndef CONFIG_TINY_RCU */ + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0163-srcu-replace-local_irqsave-with-a-locallock.patch linux-4.19.118/debian/patches-rt/0163-srcu-replace-local_irqsave-with-a-locallock.patch --- linux-4.19.98/debian/patches-rt/0163-srcu-replace-local_irqsave-with-a-locallock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0163-srcu-replace-local_irqsave-with-a-locallock.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -From 5bc56052951df498807fec250c48debf7cc3a55b Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 12 Oct 2017 18:37:12 +0200 -Subject: [PATCH 163/290] srcu: replace local_irqsave() with a locallock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -There are two instances which disable interrupts in order to become a -stable this_cpu_ptr() pointer. The restore part is coupled with -spin_unlock_irqrestore() which does not work on RT. -Replace the local_irq_save() call with the appropriate local_lock() -version of it. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/rcu/srcutree.c | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c -index df0375453ba1..0f09a1a9e17c 100644 ---- a/kernel/rcu/srcutree.c -+++ b/kernel/rcu/srcutree.c -@@ -39,6 +39,7 @@ - #include - #include - #include -+#include - - #include "rcu.h" - #include "rcu_segcblist.h" -@@ -760,6 +761,8 @@ static void srcu_flip(struct srcu_struct *sp) - * negligible when amoritized over that time period, and the extra latency - * of a needlessly non-expedited grace period is similarly negligible. - */ -+static DEFINE_LOCAL_IRQ_LOCK(sp_llock); -+ - static bool srcu_might_be_idle(struct srcu_struct *sp) - { - unsigned long curseq; -@@ -768,13 +771,13 @@ static bool srcu_might_be_idle(struct srcu_struct *sp) - unsigned long t; - - /* If the local srcu_data structure has callbacks, not idle. */ -- local_irq_save(flags); -+ local_lock_irqsave(sp_llock, flags); - sdp = this_cpu_ptr(sp->sda); - if (rcu_segcblist_pend_cbs(&sdp->srcu_cblist)) { -- local_irq_restore(flags); -+ local_unlock_irqrestore(sp_llock, flags); - return false; /* Callbacks already present, so not idle. */ - } -- local_irq_restore(flags); -+ local_unlock_irqrestore(sp_llock, flags); - - /* - * No local callbacks, so probabalistically probe global state. -@@ -852,7 +855,7 @@ void __call_srcu(struct srcu_struct *sp, struct rcu_head *rhp, - return; - } - rhp->func = func; -- local_irq_save(flags); -+ local_lock_irqsave(sp_llock, flags); - sdp = this_cpu_ptr(sp->sda); - spin_lock_rcu_node(sdp); - rcu_segcblist_enqueue(&sdp->srcu_cblist, rhp, false); -@@ -868,7 +871,8 @@ void __call_srcu(struct srcu_struct *sp, struct rcu_head *rhp, - sdp->srcu_gp_seq_needed_exp = s; - needexp = true; - } -- spin_unlock_irqrestore_rcu_node(sdp, flags); -+ spin_unlock_rcu_node(sdp); -+ local_unlock_irqrestore(sp_llock, flags); - if (needgp) - srcu_funnel_gp_start(sp, sdp, s, do_norm); - else if (needexp) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0164-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch linux-4.19.118/debian/patches-rt/0164-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch --- linux-4.19.98/debian/patches-rt/0164-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0164-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -From 72d24a41a24c422c75947391b6fb8419bce49da3 Mon Sep 17 00:00:00 2001 -From: Julia Cartwright -Date: Wed, 12 Oct 2016 11:21:14 -0500 -Subject: [PATCH 164/290] rcu: enable rcu_normal_after_boot by default for RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The forcing of an expedited grace period is an expensive and very -RT-application unfriendly operation, as it forcibly preempts all running -tasks on CPUs which are preventing the gp from expiring. - -By default, as a policy decision, disable the expediting of grace -periods (after boot) on configurations which enable PREEMPT_RT_FULL. - -Suggested-by: Luiz Capitulino -Acked-by: Paul E. McKenney -Signed-off-by: Julia Cartwright -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/rcu/update.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c -index 6ffafb1b1584..16d8dba23329 100644 ---- a/kernel/rcu/update.c -+++ b/kernel/rcu/update.c -@@ -68,7 +68,7 @@ extern int rcu_expedited; /* from sysctl */ - module_param(rcu_expedited, int, 0); - extern int rcu_normal; /* from sysctl */ - module_param(rcu_normal, int, 0); --static int rcu_normal_after_boot; -+static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); - module_param(rcu_normal_after_boot, int, 0); - #endif /* #ifndef CONFIG_TINY_RCU */ - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0164-tty-serial-omap-Make-the-locking-RT-aware.patch linux-4.19.118/debian/patches-rt/0164-tty-serial-omap-Make-the-locking-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0164-tty-serial-omap-Make-the-locking-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0164-tty-serial-omap-Make-the-locking-RT-aware.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,49 @@ +From 903fb20864016a06c02befdf5331596064256d18 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 28 Jul 2011 13:32:57 +0200 +Subject: [PATCH 164/325] tty/serial/omap: Make the locking RT aware +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The lock is a sleeping lock and local_irq_save() is not the +optimsation we are looking for. Redo it to make it work on -RT and +non-RT. + +Signed-off-by: Thomas Gleixner +--- + drivers/tty/serial/omap-serial.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c +index 6420ae581a80..0f4f41ed9ffa 100644 +--- a/drivers/tty/serial/omap-serial.c ++++ b/drivers/tty/serial/omap-serial.c +@@ -1307,13 +1307,10 @@ serial_omap_console_write(struct console *co, const char *s, + + pm_runtime_get_sync(up->dev); + +- local_irq_save(flags); +- if (up->port.sysrq) +- locked = 0; +- else if (oops_in_progress) +- locked = spin_trylock(&up->port.lock); ++ if (up->port.sysrq || oops_in_progress) ++ locked = spin_trylock_irqsave(&up->port.lock, flags); + else +- spin_lock(&up->port.lock); ++ spin_lock_irqsave(&up->port.lock, flags); + + /* + * First save the IER then disable the interrupts +@@ -1342,8 +1339,7 @@ serial_omap_console_write(struct console *co, const char *s, + pm_runtime_mark_last_busy(up->dev); + pm_runtime_put_autosuspend(up->dev); + if (locked) +- spin_unlock(&up->port.lock); +- local_irq_restore(flags); ++ spin_unlock_irqrestore(&up->port.lock, flags); + } + + static int __init +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0165-tty-serial-omap-Make-the-locking-RT-aware.patch linux-4.19.118/debian/patches-rt/0165-tty-serial-omap-Make-the-locking-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0165-tty-serial-omap-Make-the-locking-RT-aware.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0165-tty-serial-omap-Make-the-locking-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -From d23352f4c6e06f5629a0d48714ac071a78b7669d Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 28 Jul 2011 13:32:57 +0200 -Subject: [PATCH 165/290] tty/serial/omap: Make the locking RT aware -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The lock is a sleeping lock and local_irq_save() is not the -optimsation we are looking for. Redo it to make it work on -RT and -non-RT. - -Signed-off-by: Thomas Gleixner ---- - drivers/tty/serial/omap-serial.c | 12 ++++-------- - 1 file changed, 4 insertions(+), 8 deletions(-) - -diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c -index 6420ae581a80..0f4f41ed9ffa 100644 ---- a/drivers/tty/serial/omap-serial.c -+++ b/drivers/tty/serial/omap-serial.c -@@ -1307,13 +1307,10 @@ serial_omap_console_write(struct console *co, const char *s, - - pm_runtime_get_sync(up->dev); - -- local_irq_save(flags); -- if (up->port.sysrq) -- locked = 0; -- else if (oops_in_progress) -- locked = spin_trylock(&up->port.lock); -+ if (up->port.sysrq || oops_in_progress) -+ locked = spin_trylock_irqsave(&up->port.lock, flags); - else -- spin_lock(&up->port.lock); -+ spin_lock_irqsave(&up->port.lock, flags); - - /* - * First save the IER then disable the interrupts -@@ -1342,8 +1339,7 @@ serial_omap_console_write(struct console *co, const char *s, - pm_runtime_mark_last_busy(up->dev); - pm_runtime_put_autosuspend(up->dev); - if (locked) -- spin_unlock(&up->port.lock); -- local_irq_restore(flags); -+ spin_unlock_irqrestore(&up->port.lock, flags); - } - - static int __init --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0165-tty-serial-pl011-Make-the-locking-work-on-RT.patch linux-4.19.118/debian/patches-rt/0165-tty-serial-pl011-Make-the-locking-work-on-RT.patch --- linux-4.19.98/debian/patches-rt/0165-tty-serial-pl011-Make-the-locking-work-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0165-tty-serial-pl011-Make-the-locking-work-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,54 @@ +From 201d2b147cff7ff5557a2b4a60d7b3f609c62b33 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 8 Jan 2013 21:36:51 +0100 +Subject: [PATCH 165/325] tty/serial/pl011: Make the locking work on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The lock is a sleeping lock and local_irq_save() is not the optimsation +we are looking for. Redo it to make it work on -RT and non-RT. + +Signed-off-by: Thomas Gleixner +--- + drivers/tty/serial/amba-pl011.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c +index af21122dfade..183e8b731d6a 100644 +--- a/drivers/tty/serial/amba-pl011.c ++++ b/drivers/tty/serial/amba-pl011.c +@@ -2214,13 +2214,19 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) + + clk_enable(uap->clk); + +- local_irq_save(flags); ++ /* ++ * local_irq_save(flags); ++ * ++ * This local_irq_save() is nonsense. If we come in via sysrq ++ * handling then interrupts are already disabled. Aside of ++ * that the port.sysrq check is racy on SMP regardless. ++ */ + if (uap->port.sysrq) + locked = 0; + else if (oops_in_progress) +- locked = spin_trylock(&uap->port.lock); ++ locked = spin_trylock_irqsave(&uap->port.lock, flags); + else +- spin_lock(&uap->port.lock); ++ spin_lock_irqsave(&uap->port.lock, flags); + + /* + * First save the CR then disable the interrupts +@@ -2246,8 +2252,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) + pl011_write(old_cr, uap, REG_CR); + + if (locked) +- spin_unlock(&uap->port.lock); +- local_irq_restore(flags); ++ spin_unlock_irqrestore(&uap->port.lock, flags); + + clk_disable(uap->clk); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0166-tty-serial-pl011-Make-the-locking-work-on-RT.patch linux-4.19.118/debian/patches-rt/0166-tty-serial-pl011-Make-the-locking-work-on-RT.patch --- linux-4.19.98/debian/patches-rt/0166-tty-serial-pl011-Make-the-locking-work-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0166-tty-serial-pl011-Make-the-locking-work-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -From e98f40187d6c4ce468ae727682ccccff520ad931 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 8 Jan 2013 21:36:51 +0100 -Subject: [PATCH 166/290] tty/serial/pl011: Make the locking work on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The lock is a sleeping lock and local_irq_save() is not the optimsation -we are looking for. Redo it to make it work on -RT and non-RT. - -Signed-off-by: Thomas Gleixner ---- - drivers/tty/serial/amba-pl011.c | 15 ++++++++++----- - 1 file changed, 10 insertions(+), 5 deletions(-) - -diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c -index af21122dfade..183e8b731d6a 100644 ---- a/drivers/tty/serial/amba-pl011.c -+++ b/drivers/tty/serial/amba-pl011.c -@@ -2214,13 +2214,19 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) - - clk_enable(uap->clk); - -- local_irq_save(flags); -+ /* -+ * local_irq_save(flags); -+ * -+ * This local_irq_save() is nonsense. If we come in via sysrq -+ * handling then interrupts are already disabled. Aside of -+ * that the port.sysrq check is racy on SMP regardless. -+ */ - if (uap->port.sysrq) - locked = 0; - else if (oops_in_progress) -- locked = spin_trylock(&uap->port.lock); -+ locked = spin_trylock_irqsave(&uap->port.lock, flags); - else -- spin_lock(&uap->port.lock); -+ spin_lock_irqsave(&uap->port.lock, flags); - - /* - * First save the CR then disable the interrupts -@@ -2246,8 +2252,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) - pl011_write(old_cr, uap, REG_CR); - - if (locked) -- spin_unlock(&uap->port.lock); -- local_irq_restore(flags); -+ spin_unlock_irqrestore(&uap->port.lock, flags); - - clk_disable(uap->clk); - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0166-tty-serial-pl011-explicitly-initialize-the-flags-var.patch linux-4.19.118/debian/patches-rt/0166-tty-serial-pl011-explicitly-initialize-the-flags-var.patch --- linux-4.19.98/debian/patches-rt/0166-tty-serial-pl011-explicitly-initialize-the-flags-var.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0166-tty-serial-pl011-explicitly-initialize-the-flags-var.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,45 @@ +From f6bc04fdefa31a35588c0b33de38fd26a8640e38 Mon Sep 17 00:00:00 2001 +From: Kurt Kanzenbach +Date: Mon, 24 Sep 2018 10:29:01 +0200 +Subject: [PATCH 166/325] tty: serial: pl011: explicitly initialize the flags + variable +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Silence the following gcc warning: + +drivers/tty/serial/amba-pl011.c: In function ‘pl011_console_write’: +./include/linux/spinlock.h:260:3: warning: ‘flags’ may be used uninitialized in this function [-Wmaybe-uninitialized] + _raw_spin_unlock_irqrestore(lock, flags); \ + ^~~~~~~~~~~~~~~~~~~~~~~~~~~ +drivers/tty/serial/amba-pl011.c:2214:16: note: ‘flags’ was declared here + unsigned long flags; + ^~~~~ + +The code is correct. Thus, initializing flags to zero doesn't change the +behavior and resolves the warning. + +Signed-off-by: Kurt Kanzenbach +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/tty/serial/amba-pl011.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c +index 183e8b731d6a..2cc6b24bc88d 100644 +--- a/drivers/tty/serial/amba-pl011.c ++++ b/drivers/tty/serial/amba-pl011.c +@@ -2209,7 +2209,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) + { + struct uart_amba_port *uap = amba_ports[co->index]; + unsigned int old_cr = 0, new_cr; +- unsigned long flags; ++ unsigned long flags = 0; + int locked = 1; + + clk_enable(uap->clk); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0167-rt-Improve-the-serial-console-PASS_LIMIT.patch linux-4.19.118/debian/patches-rt/0167-rt-Improve-the-serial-console-PASS_LIMIT.patch --- linux-4.19.98/debian/patches-rt/0167-rt-Improve-the-serial-console-PASS_LIMIT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0167-rt-Improve-the-serial-console-PASS_LIMIT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,47 @@ +From b0190da75ae735211f213cfb75ce6fae2ca7af9b Mon Sep 17 00:00:00 2001 +From: Ingo Molnar +Date: Wed, 14 Dec 2011 13:05:54 +0100 +Subject: [PATCH 167/325] rt: Improve the serial console PASS_LIMIT +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Beyond the warning: + + drivers/tty/serial/8250/8250.c:1613:6: warning: unused variable ‘pass_counter’ [-Wunused-variable] + +the solution of just looping infinitely was ugly - up it to 1 million to +give it a chance to continue in some really ugly situation. + +Signed-off-by: Ingo Molnar +Signed-off-by: Thomas Gleixner +--- + drivers/tty/serial/8250/8250_core.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c +index b9567ef843fc..155ee2a54e25 100644 +--- a/drivers/tty/serial/8250/8250_core.c ++++ b/drivers/tty/serial/8250/8250_core.c +@@ -54,7 +54,16 @@ static struct uart_driver serial8250_reg; + + static unsigned int skip_txen_test; /* force skip of txen test at init time */ + +-#define PASS_LIMIT 512 ++/* ++ * On -rt we can have a more delays, and legitimately ++ * so - so don't drop work spuriously and spam the ++ * syslog: ++ */ ++#ifdef CONFIG_PREEMPT_RT_FULL ++# define PASS_LIMIT 1000000 ++#else ++# define PASS_LIMIT 512 ++#endif + + #include + /* +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0167-tty-serial-pl011-explicitly-initialize-the-flags-var.patch linux-4.19.118/debian/patches-rt/0167-tty-serial-pl011-explicitly-initialize-the-flags-var.patch --- linux-4.19.98/debian/patches-rt/0167-tty-serial-pl011-explicitly-initialize-the-flags-var.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0167-tty-serial-pl011-explicitly-initialize-the-flags-var.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -From af3d56abb15953cb66d7ab6ec70e7289699c06b3 Mon Sep 17 00:00:00 2001 -From: Kurt Kanzenbach -Date: Mon, 24 Sep 2018 10:29:01 +0200 -Subject: [PATCH 167/290] tty: serial: pl011: explicitly initialize the flags - variable -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Silence the following gcc warning: - -drivers/tty/serial/amba-pl011.c: In function ‘pl011_console_write’: -./include/linux/spinlock.h:260:3: warning: ‘flags’ may be used uninitialized in this function [-Wmaybe-uninitialized] - _raw_spin_unlock_irqrestore(lock, flags); \ - ^~~~~~~~~~~~~~~~~~~~~~~~~~~ -drivers/tty/serial/amba-pl011.c:2214:16: note: ‘flags’ was declared here - unsigned long flags; - ^~~~~ - -The code is correct. Thus, initializing flags to zero doesn't change the -behavior and resolves the warning. - -Signed-off-by: Kurt Kanzenbach -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/tty/serial/amba-pl011.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c -index 183e8b731d6a..2cc6b24bc88d 100644 ---- a/drivers/tty/serial/amba-pl011.c -+++ b/drivers/tty/serial/amba-pl011.c -@@ -2209,7 +2209,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) - { - struct uart_amba_port *uap = amba_ports[co->index]; - unsigned int old_cr = 0, new_cr; -- unsigned long flags; -+ unsigned long flags = 0; - int locked = 1; - - clk_enable(uap->clk); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0168-rt-Improve-the-serial-console-PASS_LIMIT.patch linux-4.19.118/debian/patches-rt/0168-rt-Improve-the-serial-console-PASS_LIMIT.patch --- linux-4.19.98/debian/patches-rt/0168-rt-Improve-the-serial-console-PASS_LIMIT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0168-rt-Improve-the-serial-console-PASS_LIMIT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -From 8a62565dce3fc35c4f8409e5b790505c56d7488a Mon Sep 17 00:00:00 2001 -From: Ingo Molnar -Date: Wed, 14 Dec 2011 13:05:54 +0100 -Subject: [PATCH 168/290] rt: Improve the serial console PASS_LIMIT -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Beyond the warning: - - drivers/tty/serial/8250/8250.c:1613:6: warning: unused variable ‘pass_counter’ [-Wunused-variable] - -the solution of just looping infinitely was ugly - up it to 1 million to -give it a chance to continue in some really ugly situation. - -Signed-off-by: Ingo Molnar -Signed-off-by: Thomas Gleixner ---- - drivers/tty/serial/8250/8250_core.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c -index 69aaee5d7fe1..cf88317a95fc 100644 ---- a/drivers/tty/serial/8250/8250_core.c -+++ b/drivers/tty/serial/8250/8250_core.c -@@ -54,7 +54,16 @@ static struct uart_driver serial8250_reg; - - static unsigned int skip_txen_test; /* force skip of txen test at init time */ - --#define PASS_LIMIT 512 -+/* -+ * On -rt we can have a more delays, and legitimately -+ * so - so don't drop work spuriously and spam the -+ * syslog: -+ */ -+#ifdef CONFIG_PREEMPT_RT_FULL -+# define PASS_LIMIT 1000000 -+#else -+# define PASS_LIMIT 512 -+#endif - - #include - /* --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0168-tty-serial-8250-don-t-take-the-trylock-during-oops.patch linux-4.19.118/debian/patches-rt/0168-tty-serial-8250-don-t-take-the-trylock-during-oops.patch --- linux-4.19.98/debian/patches-rt/0168-tty-serial-8250-don-t-take-the-trylock-during-oops.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0168-tty-serial-8250-don-t-take-the-trylock-during-oops.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,35 @@ +From 135e815b481b01484f140a639e2482570daa238d Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 11 Apr 2016 16:55:02 +0200 +Subject: [PATCH 168/325] tty: serial: 8250: don't take the trylock during oops +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +An oops with irqs off (panic() from irqsafe hrtimer like the watchdog +timer) will lead to a lockdep warning on each invocation and as such +never completes. +Therefore we skip the trylock in the oops case. + +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/tty/serial/8250/8250_port.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index 5a04d4ddca73..79e509468161 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -3243,10 +3243,8 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, + + serial8250_rpm_get(up); + +- if (port->sysrq) ++ if (port->sysrq || oops_in_progress) + locked = 0; +- else if (oops_in_progress) +- locked = spin_trylock_irqsave(&port->lock, flags); + else + spin_lock_irqsave(&port->lock, flags); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch linux-4.19.118/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch --- linux-4.19.98/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,226 @@ +From 9c36e91215b7ab35c244cc03986637031183c797 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Wed, 23 Nov 2016 16:29:32 +0100 +Subject: [PATCH 169/325] locking/percpu-rwsem: Remove preempt_disable variants +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Effective revert commit: + + 87709e28dc7c ("fs/locks: Use percpu_down_read_preempt_disable()") + +This is causing major pain for PREEMPT_RT and is only a very small +performance issue for PREEMPT=y. + +Signed-off-by: Peter Zijlstra (Intel) +--- + fs/locks.c | 32 ++++++++++++++++---------------- + include/linux/percpu-rwsem.h | 24 ++++-------------------- + 2 files changed, 20 insertions(+), 36 deletions(-) + +diff --git a/fs/locks.c b/fs/locks.c +index 28270e74be34..552476d6f6bb 100644 +--- a/fs/locks.c ++++ b/fs/locks.c +@@ -936,7 +936,7 @@ static int flock_lock_inode(struct inode *inode, struct file_lock *request) + return -ENOMEM; + } + +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + if (request->fl_flags & FL_ACCESS) + goto find_conflict; +@@ -977,7 +977,7 @@ static int flock_lock_inode(struct inode *inode, struct file_lock *request) + + out: + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + if (new_fl) + locks_free_lock(new_fl); + locks_dispose_list(&dispose); +@@ -1015,7 +1015,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request, + new_fl2 = locks_alloc_lock(); + } + +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + /* + * New lock request. Walk all POSIX locks and look for conflicts. If +@@ -1187,7 +1187,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request, + } + out: + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + /* + * Free any unused locks. + */ +@@ -1462,7 +1462,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) + return error; + } + +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + + time_out_leases(inode, &dispose); +@@ -1514,13 +1514,13 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) + locks_insert_block(fl, new_fl); + trace_break_lease_block(inode, new_fl); + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + + locks_dispose_list(&dispose); + error = wait_event_interruptible_timeout(new_fl->fl_wait, + !new_fl->fl_next, break_time); + +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + trace_break_lease_unblock(inode, new_fl); + locks_delete_block(new_fl); +@@ -1537,7 +1537,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) + } + out: + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + locks_dispose_list(&dispose); + locks_free_lock(new_fl); + return error; +@@ -1609,7 +1609,7 @@ int fcntl_getlease(struct file *filp) + + ctx = smp_load_acquire(&inode->i_flctx); + if (ctx && !list_empty_careful(&ctx->flc_lease)) { +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + time_out_leases(inode, &dispose); + list_for_each_entry(fl, &ctx->flc_lease, fl_list) { +@@ -1619,7 +1619,7 @@ int fcntl_getlease(struct file *filp) + break; + } + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + + locks_dispose_list(&dispose); + } +@@ -1693,7 +1693,7 @@ generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **pr + return -EINVAL; + } + +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + time_out_leases(inode, &dispose); + error = check_conflicting_open(dentry, arg, lease->fl_flags); +@@ -1764,7 +1764,7 @@ generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **pr + lease->fl_lmops->lm_setup(lease, priv); + out: + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + locks_dispose_list(&dispose); + if (is_deleg) + inode_unlock(inode); +@@ -1787,7 +1787,7 @@ static int generic_delete_lease(struct file *filp, void *owner) + return error; + } + +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + list_for_each_entry(fl, &ctx->flc_lease, fl_list) { + if (fl->fl_file == filp && +@@ -1800,7 +1800,7 @@ static int generic_delete_lease(struct file *filp, void *owner) + if (victim) + error = fl->fl_lmops->lm_change(victim, F_UNLCK, &dispose); + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + locks_dispose_list(&dispose); + return error; + } +@@ -2531,13 +2531,13 @@ locks_remove_lease(struct file *filp, struct file_lock_context *ctx) + if (list_empty(&ctx->flc_lease)) + return; + +- percpu_down_read_preempt_disable(&file_rwsem); ++ percpu_down_read(&file_rwsem); + spin_lock(&ctx->flc_lock); + list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list) + if (filp == fl->fl_file) + lease_modify(fl, F_UNLCK, &dispose); + spin_unlock(&ctx->flc_lock); +- percpu_up_read_preempt_enable(&file_rwsem); ++ percpu_up_read(&file_rwsem); + + locks_dispose_list(&dispose); + } +diff --git a/include/linux/percpu-rwsem.h b/include/linux/percpu-rwsem.h +index 79b99d653e03..fb44e237316d 100644 +--- a/include/linux/percpu-rwsem.h ++++ b/include/linux/percpu-rwsem.h +@@ -29,7 +29,7 @@ static struct percpu_rw_semaphore name = { \ + extern int __percpu_down_read(struct percpu_rw_semaphore *, int); + extern void __percpu_up_read(struct percpu_rw_semaphore *); + +-static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore *sem) ++static inline void percpu_down_read(struct percpu_rw_semaphore *sem) + { + might_sleep(); + +@@ -47,16 +47,10 @@ static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore * + __this_cpu_inc(*sem->read_count); + if (unlikely(!rcu_sync_is_idle(&sem->rss))) + __percpu_down_read(sem, false); /* Unconditional memory barrier */ +- barrier(); + /* +- * The barrier() prevents the compiler from ++ * The preempt_enable() prevents the compiler from + * bleeding the critical section out. + */ +-} +- +-static inline void percpu_down_read(struct percpu_rw_semaphore *sem) +-{ +- percpu_down_read_preempt_disable(sem); + preempt_enable(); + } + +@@ -83,13 +77,9 @@ static inline int percpu_down_read_trylock(struct percpu_rw_semaphore *sem) + return ret; + } + +-static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem) ++static inline void percpu_up_read(struct percpu_rw_semaphore *sem) + { +- /* +- * The barrier() prevents the compiler from +- * bleeding the critical section out. +- */ +- barrier(); ++ preempt_disable(); + /* + * Same as in percpu_down_read(). + */ +@@ -102,12 +92,6 @@ static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem + rwsem_release(&sem->rw_sem.dep_map, 1, _RET_IP_); + } + +-static inline void percpu_up_read(struct percpu_rw_semaphore *sem) +-{ +- preempt_disable(); +- percpu_up_read_preempt_enable(sem); +-} +- + extern void percpu_down_write(struct percpu_rw_semaphore *); + extern void percpu_up_write(struct percpu_rw_semaphore *); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0169-tty-serial-8250-don-t-take-the-trylock-during-oops.patch linux-4.19.118/debian/patches-rt/0169-tty-serial-8250-don-t-take-the-trylock-during-oops.patch --- linux-4.19.98/debian/patches-rt/0169-tty-serial-8250-don-t-take-the-trylock-during-oops.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0169-tty-serial-8250-don-t-take-the-trylock-during-oops.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -From cfdff0a4d70b2b13d7088037e29e4795d031a127 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 11 Apr 2016 16:55:02 +0200 -Subject: [PATCH 169/290] tty: serial: 8250: don't take the trylock during oops -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -An oops with irqs off (panic() from irqsafe hrtimer like the watchdog -timer) will lead to a lockdep warning on each invocation and as such -never completes. -Therefore we skip the trylock in the oops case. - -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/tty/serial/8250/8250_port.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c -index aa4de6907f77..6b1d46c1df3b 100644 ---- a/drivers/tty/serial/8250/8250_port.c -+++ b/drivers/tty/serial/8250/8250_port.c -@@ -3239,10 +3239,8 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, - - serial8250_rpm_get(up); - -- if (port->sysrq) -+ if (port->sysrq || oops_in_progress) - locked = 0; -- else if (oops_in_progress) -- locked = spin_trylock_irqsave(&port->lock, flags); - else - spin_lock_irqsave(&port->lock, flags); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0170-locking-percpu-rwsem-Remove-preempt_disable-variants.patch linux-4.19.118/debian/patches-rt/0170-locking-percpu-rwsem-Remove-preempt_disable-variants.patch --- linux-4.19.98/debian/patches-rt/0170-locking-percpu-rwsem-Remove-preempt_disable-variants.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0170-locking-percpu-rwsem-Remove-preempt_disable-variants.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,226 +0,0 @@ -From 5e95b56124341d5c51f1b53b804367a02c4b706b Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Wed, 23 Nov 2016 16:29:32 +0100 -Subject: [PATCH 170/290] locking/percpu-rwsem: Remove preempt_disable variants -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Effective revert commit: - - 87709e28dc7c ("fs/locks: Use percpu_down_read_preempt_disable()") - -This is causing major pain for PREEMPT_RT and is only a very small -performance issue for PREEMPT=y. - -Signed-off-by: Peter Zijlstra (Intel) ---- - fs/locks.c | 32 ++++++++++++++++---------------- - include/linux/percpu-rwsem.h | 24 ++++-------------------- - 2 files changed, 20 insertions(+), 36 deletions(-) - -diff --git a/fs/locks.c b/fs/locks.c -index 28270e74be34..552476d6f6bb 100644 ---- a/fs/locks.c -+++ b/fs/locks.c -@@ -936,7 +936,7 @@ static int flock_lock_inode(struct inode *inode, struct file_lock *request) - return -ENOMEM; - } - -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - if (request->fl_flags & FL_ACCESS) - goto find_conflict; -@@ -977,7 +977,7 @@ static int flock_lock_inode(struct inode *inode, struct file_lock *request) - - out: - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - if (new_fl) - locks_free_lock(new_fl); - locks_dispose_list(&dispose); -@@ -1015,7 +1015,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request, - new_fl2 = locks_alloc_lock(); - } - -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - /* - * New lock request. Walk all POSIX locks and look for conflicts. If -@@ -1187,7 +1187,7 @@ static int posix_lock_inode(struct inode *inode, struct file_lock *request, - } - out: - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - /* - * Free any unused locks. - */ -@@ -1462,7 +1462,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) - return error; - } - -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - - time_out_leases(inode, &dispose); -@@ -1514,13 +1514,13 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) - locks_insert_block(fl, new_fl); - trace_break_lease_block(inode, new_fl); - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - - locks_dispose_list(&dispose); - error = wait_event_interruptible_timeout(new_fl->fl_wait, - !new_fl->fl_next, break_time); - -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - trace_break_lease_unblock(inode, new_fl); - locks_delete_block(new_fl); -@@ -1537,7 +1537,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) - } - out: - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - locks_dispose_list(&dispose); - locks_free_lock(new_fl); - return error; -@@ -1609,7 +1609,7 @@ int fcntl_getlease(struct file *filp) - - ctx = smp_load_acquire(&inode->i_flctx); - if (ctx && !list_empty_careful(&ctx->flc_lease)) { -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - time_out_leases(inode, &dispose); - list_for_each_entry(fl, &ctx->flc_lease, fl_list) { -@@ -1619,7 +1619,7 @@ int fcntl_getlease(struct file *filp) - break; - } - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - - locks_dispose_list(&dispose); - } -@@ -1693,7 +1693,7 @@ generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **pr - return -EINVAL; - } - -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - time_out_leases(inode, &dispose); - error = check_conflicting_open(dentry, arg, lease->fl_flags); -@@ -1764,7 +1764,7 @@ generic_add_lease(struct file *filp, long arg, struct file_lock **flp, void **pr - lease->fl_lmops->lm_setup(lease, priv); - out: - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - locks_dispose_list(&dispose); - if (is_deleg) - inode_unlock(inode); -@@ -1787,7 +1787,7 @@ static int generic_delete_lease(struct file *filp, void *owner) - return error; - } - -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - list_for_each_entry(fl, &ctx->flc_lease, fl_list) { - if (fl->fl_file == filp && -@@ -1800,7 +1800,7 @@ static int generic_delete_lease(struct file *filp, void *owner) - if (victim) - error = fl->fl_lmops->lm_change(victim, F_UNLCK, &dispose); - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - locks_dispose_list(&dispose); - return error; - } -@@ -2531,13 +2531,13 @@ locks_remove_lease(struct file *filp, struct file_lock_context *ctx) - if (list_empty(&ctx->flc_lease)) - return; - -- percpu_down_read_preempt_disable(&file_rwsem); -+ percpu_down_read(&file_rwsem); - spin_lock(&ctx->flc_lock); - list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list) - if (filp == fl->fl_file) - lease_modify(fl, F_UNLCK, &dispose); - spin_unlock(&ctx->flc_lock); -- percpu_up_read_preempt_enable(&file_rwsem); -+ percpu_up_read(&file_rwsem); - - locks_dispose_list(&dispose); - } -diff --git a/include/linux/percpu-rwsem.h b/include/linux/percpu-rwsem.h -index 79b99d653e03..fb44e237316d 100644 ---- a/include/linux/percpu-rwsem.h -+++ b/include/linux/percpu-rwsem.h -@@ -29,7 +29,7 @@ static struct percpu_rw_semaphore name = { \ - extern int __percpu_down_read(struct percpu_rw_semaphore *, int); - extern void __percpu_up_read(struct percpu_rw_semaphore *); - --static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore *sem) -+static inline void percpu_down_read(struct percpu_rw_semaphore *sem) - { - might_sleep(); - -@@ -47,16 +47,10 @@ static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore * - __this_cpu_inc(*sem->read_count); - if (unlikely(!rcu_sync_is_idle(&sem->rss))) - __percpu_down_read(sem, false); /* Unconditional memory barrier */ -- barrier(); - /* -- * The barrier() prevents the compiler from -+ * The preempt_enable() prevents the compiler from - * bleeding the critical section out. - */ --} -- --static inline void percpu_down_read(struct percpu_rw_semaphore *sem) --{ -- percpu_down_read_preempt_disable(sem); - preempt_enable(); - } - -@@ -83,13 +77,9 @@ static inline int percpu_down_read_trylock(struct percpu_rw_semaphore *sem) - return ret; - } - --static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem) -+static inline void percpu_up_read(struct percpu_rw_semaphore *sem) - { -- /* -- * The barrier() prevents the compiler from -- * bleeding the critical section out. -- */ -- barrier(); -+ preempt_disable(); - /* - * Same as in percpu_down_read(). - */ -@@ -102,12 +92,6 @@ static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem - rwsem_release(&sem->rw_sem.dep_map, 1, _RET_IP_); - } - --static inline void percpu_up_read(struct percpu_rw_semaphore *sem) --{ -- preempt_disable(); -- percpu_up_read_preempt_enable(sem); --} -- - extern void percpu_down_write(struct percpu_rw_semaphore *); - extern void percpu_up_write(struct percpu_rw_semaphore *); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0170-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch linux-4.19.118/debian/patches-rt/0170-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch --- linux-4.19.98/debian/patches-rt/0170-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0170-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,81 @@ +From 4c71d9e6382c1cf6d65629f46dc51039b5c5ca51 Mon Sep 17 00:00:00 2001 +From: Yong Zhang +Date: Tue, 15 May 2012 13:53:56 +0800 +Subject: [PATCH 170/325] mm: Protect activate_mm() by + preempt_[disable&enable]_rt() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +User preempt_*_rt instead of local_irq_*_rt or otherwise there will be +warning on ARM like below: + +WARNING: at build/linux/kernel/smp.c:459 smp_call_function_many+0x98/0x264() +Modules linked in: +[] (unwind_backtrace+0x0/0xe4) from [] (warn_slowpath_common+0x4c/0x64) +[] (warn_slowpath_common+0x4c/0x64) from [] (warn_slowpath_null+0x18/0x1c) +[] (warn_slowpath_null+0x18/0x1c) from [](smp_call_function_many+0x98/0x264) +[] (smp_call_function_many+0x98/0x264) from [] (smp_call_function+0x44/0x6c) +[] (smp_call_function+0x44/0x6c) from [] (__new_context+0xbc/0x124) +[] (__new_context+0xbc/0x124) from [] (flush_old_exec+0x460/0x5e4) +[] (flush_old_exec+0x460/0x5e4) from [] (load_elf_binary+0x2e0/0x11ac) +[] (load_elf_binary+0x2e0/0x11ac) from [] (search_binary_handler+0x94/0x2a4) +[] (search_binary_handler+0x94/0x2a4) from [] (do_execve+0x254/0x364) +[] (do_execve+0x254/0x364) from [] (sys_execve+0x34/0x54) +[] (sys_execve+0x34/0x54) from [] (ret_fast_syscall+0x0/0x30) +---[ end trace 0000000000000002 ]--- + +The reason is that ARM need irq enabled when doing activate_mm(). +According to mm-protect-activate-switch-mm.patch, actually +preempt_[disable|enable]_rt() is sufficient. + +Inspired-by: Steven Rostedt +Signed-off-by: Yong Zhang +Cc: Steven Rostedt +Link: http://lkml.kernel.org/r/1337061236-1766-1-git-send-email-yong.zhang0@gmail.com +Signed-off-by: Thomas Gleixner +--- + fs/exec.c | 2 ++ + mm/mmu_context.c | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/fs/exec.c b/fs/exec.c +index 561ea64829ec..0d95c6349fb1 100644 +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -1028,12 +1028,14 @@ static int exec_mmap(struct mm_struct *mm) + } + } + task_lock(tsk); ++ preempt_disable_rt(); + active_mm = tsk->active_mm; + tsk->mm = mm; + tsk->active_mm = mm; + activate_mm(active_mm, mm); + tsk->mm->vmacache_seqnum = 0; + vmacache_flush(tsk); ++ preempt_enable_rt(); + task_unlock(tsk); + if (old_mm) { + up_read(&old_mm->mmap_sem); +diff --git a/mm/mmu_context.c b/mm/mmu_context.c +index 3e612ae748e9..d0ccc070979f 100644 +--- a/mm/mmu_context.c ++++ b/mm/mmu_context.c +@@ -25,6 +25,7 @@ void use_mm(struct mm_struct *mm) + struct task_struct *tsk = current; + + task_lock(tsk); ++ preempt_disable_rt(); + active_mm = tsk->active_mm; + if (active_mm != mm) { + mmgrab(mm); +@@ -32,6 +33,7 @@ void use_mm(struct mm_struct *mm) + } + tsk->mm = mm; + switch_mm(active_mm, mm, tsk); ++ preempt_enable_rt(); + task_unlock(tsk); + #ifdef finish_arch_post_lock_switch + finish_arch_post_lock_switch(); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0171-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch linux-4.19.118/debian/patches-rt/0171-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch --- linux-4.19.98/debian/patches-rt/0171-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0171-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,61 @@ +From 239c338e19c640a7bbbf54f0d65532dbdff1c655 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 13 Sep 2017 12:32:34 +0200 +Subject: [PATCH 171/325] fs/dcache: bring back explicit INIT_HLIST_BL_HEAD + init +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Commit 3d375d78593c ("mm: update callers to use HASH_ZERO flag") removed +INIT_HLIST_BL_HEAD and uses the ZERO flag instead for the init. However +on RT we have also a spinlock which needs an init call so we can't use +that. + +Signed-off-by: Sebastian Andrzej Siewior +--- + fs/dcache.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/fs/dcache.c b/fs/dcache.c +index 6e0022326afe..10225a9135fb 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -3060,6 +3060,8 @@ __setup("dhash_entries=", set_dhash_entries); + + static void __init dcache_init_early(void) + { ++ unsigned int loop; ++ + /* If hashes are distributed across NUMA nodes, defer + * hash allocation until vmalloc space is available. + */ +@@ -3076,11 +3078,16 @@ static void __init dcache_init_early(void) + NULL, + 0, + 0); ++ ++ for (loop = 0; loop < (1U << d_hash_shift); loop++) ++ INIT_HLIST_BL_HEAD(dentry_hashtable + loop); ++ + d_hash_shift = 32 - d_hash_shift; + } + + static void __init dcache_init(void) + { ++ unsigned int loop; + /* + * A constructor could be added for stable state like the lists, + * but it is probably not worth it because of the cache nature +@@ -3104,6 +3111,10 @@ static void __init dcache_init(void) + NULL, + 0, + 0); ++ ++ for (loop = 0; loop < (1U << d_hash_shift); loop++) ++ INIT_HLIST_BL_HEAD(dentry_hashtable + loop); ++ + d_hash_shift = 32 - d_hash_shift; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0171-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch linux-4.19.118/debian/patches-rt/0171-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch --- linux-4.19.98/debian/patches-rt/0171-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0171-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -From f321beb42f46e0be7912e2d8cc67f922477c4787 Mon Sep 17 00:00:00 2001 -From: Yong Zhang -Date: Tue, 15 May 2012 13:53:56 +0800 -Subject: [PATCH 171/290] mm: Protect activate_mm() by - preempt_[disable&enable]_rt() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -User preempt_*_rt instead of local_irq_*_rt or otherwise there will be -warning on ARM like below: - -WARNING: at build/linux/kernel/smp.c:459 smp_call_function_many+0x98/0x264() -Modules linked in: -[] (unwind_backtrace+0x0/0xe4) from [] (warn_slowpath_common+0x4c/0x64) -[] (warn_slowpath_common+0x4c/0x64) from [] (warn_slowpath_null+0x18/0x1c) -[] (warn_slowpath_null+0x18/0x1c) from [](smp_call_function_many+0x98/0x264) -[] (smp_call_function_many+0x98/0x264) from [] (smp_call_function+0x44/0x6c) -[] (smp_call_function+0x44/0x6c) from [] (__new_context+0xbc/0x124) -[] (__new_context+0xbc/0x124) from [] (flush_old_exec+0x460/0x5e4) -[] (flush_old_exec+0x460/0x5e4) from [] (load_elf_binary+0x2e0/0x11ac) -[] (load_elf_binary+0x2e0/0x11ac) from [] (search_binary_handler+0x94/0x2a4) -[] (search_binary_handler+0x94/0x2a4) from [] (do_execve+0x254/0x364) -[] (do_execve+0x254/0x364) from [] (sys_execve+0x34/0x54) -[] (sys_execve+0x34/0x54) from [] (ret_fast_syscall+0x0/0x30) ----[ end trace 0000000000000002 ]--- - -The reason is that ARM need irq enabled when doing activate_mm(). -According to mm-protect-activate-switch-mm.patch, actually -preempt_[disable|enable]_rt() is sufficient. - -Inspired-by: Steven Rostedt -Signed-off-by: Yong Zhang -Cc: Steven Rostedt -Link: http://lkml.kernel.org/r/1337061236-1766-1-git-send-email-yong.zhang0@gmail.com -Signed-off-by: Thomas Gleixner ---- - fs/exec.c | 2 ++ - mm/mmu_context.c | 2 ++ - 2 files changed, 4 insertions(+) - -diff --git a/fs/exec.c b/fs/exec.c -index 561ea64829ec..0d95c6349fb1 100644 ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -1028,12 +1028,14 @@ static int exec_mmap(struct mm_struct *mm) - } - } - task_lock(tsk); -+ preempt_disable_rt(); - active_mm = tsk->active_mm; - tsk->mm = mm; - tsk->active_mm = mm; - activate_mm(active_mm, mm); - tsk->mm->vmacache_seqnum = 0; - vmacache_flush(tsk); -+ preempt_enable_rt(); - task_unlock(tsk); - if (old_mm) { - up_read(&old_mm->mmap_sem); -diff --git a/mm/mmu_context.c b/mm/mmu_context.c -index 3e612ae748e9..d0ccc070979f 100644 ---- a/mm/mmu_context.c -+++ b/mm/mmu_context.c -@@ -25,6 +25,7 @@ void use_mm(struct mm_struct *mm) - struct task_struct *tsk = current; - - task_lock(tsk); -+ preempt_disable_rt(); - active_mm = tsk->active_mm; - if (active_mm != mm) { - mmgrab(mm); -@@ -32,6 +33,7 @@ void use_mm(struct mm_struct *mm) - } - tsk->mm = mm; - switch_mm(active_mm, mm, tsk); -+ preempt_enable_rt(); - task_unlock(tsk); - #ifdef finish_arch_post_lock_switch - finish_arch_post_lock_switch(); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0172-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch linux-4.19.118/debian/patches-rt/0172-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch --- linux-4.19.98/debian/patches-rt/0172-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0172-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -From 6657c7f6ea61fd3fea378532fcae38776afc9fc1 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 13 Sep 2017 12:32:34 +0200 -Subject: [PATCH 172/290] fs/dcache: bring back explicit INIT_HLIST_BL_HEAD - init -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Commit 3d375d78593c ("mm: update callers to use HASH_ZERO flag") removed -INIT_HLIST_BL_HEAD and uses the ZERO flag instead for the init. However -on RT we have also a spinlock which needs an init call so we can't use -that. - -Signed-off-by: Sebastian Andrzej Siewior ---- - fs/dcache.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/fs/dcache.c b/fs/dcache.c -index 6e0022326afe..10225a9135fb 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -3060,6 +3060,8 @@ __setup("dhash_entries=", set_dhash_entries); - - static void __init dcache_init_early(void) - { -+ unsigned int loop; -+ - /* If hashes are distributed across NUMA nodes, defer - * hash allocation until vmalloc space is available. - */ -@@ -3076,11 +3078,16 @@ static void __init dcache_init_early(void) - NULL, - 0, - 0); -+ -+ for (loop = 0; loop < (1U << d_hash_shift); loop++) -+ INIT_HLIST_BL_HEAD(dentry_hashtable + loop); -+ - d_hash_shift = 32 - d_hash_shift; - } - - static void __init dcache_init(void) - { -+ unsigned int loop; - /* - * A constructor could be added for stable state like the lists, - * but it is probably not worth it because of the cache nature -@@ -3104,6 +3111,10 @@ static void __init dcache_init(void) - NULL, - 0, - 0); -+ -+ for (loop = 0; loop < (1U << d_hash_shift); loop++) -+ INIT_HLIST_BL_HEAD(dentry_hashtable + loop); -+ - d_hash_shift = 32 - d_hash_shift; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0172-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch linux-4.19.118/debian/patches-rt/0172-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch --- linux-4.19.98/debian/patches-rt/0172-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0172-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,99 @@ +From 955db274e65b67831555ae3be55e08c31a431803 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 20 Oct 2017 11:29:53 +0200 +Subject: [PATCH 172/325] fs/dcache: disable preemption on i_dir_seq's write + side +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +i_dir_seq is an opencoded seqcounter. Based on the code it looks like we +could have two writers in parallel despite the fact that the d_lock is +held. The problem is that during the write process on RT the preemption +is still enabled and if this process is interrupted by a reader with RT +priority then we lock up. +To avoid that lock up I am disabling the preemption during the update. +The rename of i_dir_seq is here to ensure to catch new write sides in +future. + +Cc: stable-rt@vger.kernel.org +Reported-by: Oleg.Karfich@wago.com +Signed-off-by: Sebastian Andrzej Siewior +--- + fs/dcache.c | 12 +++++++----- + fs/inode.c | 2 +- + include/linux/fs.h | 2 +- + 3 files changed, 9 insertions(+), 7 deletions(-) + +diff --git a/fs/dcache.c b/fs/dcache.c +index 10225a9135fb..dcde8ffe384c 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -2404,9 +2404,10 @@ EXPORT_SYMBOL(d_rehash); + static inline unsigned start_dir_add(struct inode *dir) + { + ++ preempt_disable_rt(); + for (;;) { +- unsigned n = dir->i_dir_seq; +- if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) ++ unsigned n = dir->__i_dir_seq; ++ if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n) + return n; + cpu_relax(); + } +@@ -2414,7 +2415,8 @@ static inline unsigned start_dir_add(struct inode *dir) + + static inline void end_dir_add(struct inode *dir, unsigned n) + { +- smp_store_release(&dir->i_dir_seq, n + 2); ++ smp_store_release(&dir->__i_dir_seq, n + 2); ++ preempt_enable_rt(); + } + + static void d_wait_lookup(struct dentry *dentry) +@@ -2447,7 +2449,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, + + retry: + rcu_read_lock(); +- seq = smp_load_acquire(&parent->d_inode->i_dir_seq); ++ seq = smp_load_acquire(&parent->d_inode->__i_dir_seq); + r_seq = read_seqbegin(&rename_lock); + dentry = __d_lookup_rcu(parent, name, &d_seq); + if (unlikely(dentry)) { +@@ -2475,7 +2477,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, + } + + hlist_bl_lock(b); +- if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { ++ if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) { + hlist_bl_unlock(b); + rcu_read_unlock(); + goto retry; +diff --git a/fs/inode.c b/fs/inode.c +index c9eb5041ffae..e1fb0b743c96 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -156,7 +156,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) + inode->i_bdev = NULL; + inode->i_cdev = NULL; + inode->i_link = NULL; +- inode->i_dir_seq = 0; ++ inode->__i_dir_seq = 0; + inode->i_rdev = 0; + inode->dirtied_when = 0; + +diff --git a/include/linux/fs.h b/include/linux/fs.h +index 15b8e02880c3..d27634022105 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -679,7 +679,7 @@ struct inode { + struct block_device *i_bdev; + struct cdev *i_cdev; + char *i_link; +- unsigned i_dir_seq; ++ unsigned __i_dir_seq; + }; + + __u32 i_generation; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0173-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch linux-4.19.118/debian/patches-rt/0173-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch --- linux-4.19.98/debian/patches-rt/0173-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0173-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -From f7fc6eb795b824aba9a02869fb2f399bb51a880c Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 20 Oct 2017 11:29:53 +0200 -Subject: [PATCH 173/290] fs/dcache: disable preemption on i_dir_seq's write - side -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -i_dir_seq is an opencoded seqcounter. Based on the code it looks like we -could have two writers in parallel despite the fact that the d_lock is -held. The problem is that during the write process on RT the preemption -is still enabled and if this process is interrupted by a reader with RT -priority then we lock up. -To avoid that lock up I am disabling the preemption during the update. -The rename of i_dir_seq is here to ensure to catch new write sides in -future. - -Cc: stable-rt@vger.kernel.org -Reported-by: Oleg.Karfich@wago.com -Signed-off-by: Sebastian Andrzej Siewior ---- - fs/dcache.c | 12 +++++++----- - fs/inode.c | 2 +- - include/linux/fs.h | 2 +- - 3 files changed, 9 insertions(+), 7 deletions(-) - -diff --git a/fs/dcache.c b/fs/dcache.c -index 10225a9135fb..dcde8ffe384c 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -2404,9 +2404,10 @@ EXPORT_SYMBOL(d_rehash); - static inline unsigned start_dir_add(struct inode *dir) - { - -+ preempt_disable_rt(); - for (;;) { -- unsigned n = dir->i_dir_seq; -- if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) -+ unsigned n = dir->__i_dir_seq; -+ if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n) - return n; - cpu_relax(); - } -@@ -2414,7 +2415,8 @@ static inline unsigned start_dir_add(struct inode *dir) - - static inline void end_dir_add(struct inode *dir, unsigned n) - { -- smp_store_release(&dir->i_dir_seq, n + 2); -+ smp_store_release(&dir->__i_dir_seq, n + 2); -+ preempt_enable_rt(); - } - - static void d_wait_lookup(struct dentry *dentry) -@@ -2447,7 +2449,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, - - retry: - rcu_read_lock(); -- seq = smp_load_acquire(&parent->d_inode->i_dir_seq); -+ seq = smp_load_acquire(&parent->d_inode->__i_dir_seq); - r_seq = read_seqbegin(&rename_lock); - dentry = __d_lookup_rcu(parent, name, &d_seq); - if (unlikely(dentry)) { -@@ -2475,7 +2477,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, - } - - hlist_bl_lock(b); -- if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { -+ if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) { - hlist_bl_unlock(b); - rcu_read_unlock(); - goto retry; -diff --git a/fs/inode.c b/fs/inode.c -index 5c63693326bb..c3e17dcbb558 100644 ---- a/fs/inode.c -+++ b/fs/inode.c -@@ -155,7 +155,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) - inode->i_bdev = NULL; - inode->i_cdev = NULL; - inode->i_link = NULL; -- inode->i_dir_seq = 0; -+ inode->__i_dir_seq = 0; - inode->i_rdev = 0; - inode->dirtied_when = 0; - -diff --git a/include/linux/fs.h b/include/linux/fs.h -index 92420009b9bc..9b2b707e9112 100644 ---- a/include/linux/fs.h -+++ b/include/linux/fs.h -@@ -678,7 +678,7 @@ struct inode { - struct block_device *i_bdev; - struct cdev *i_cdev; - char *i_link; -- unsigned i_dir_seq; -+ unsigned __i_dir_seq; - }; - - __u32 i_generation; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0173-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch linux-4.19.118/debian/patches-rt/0173-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch --- linux-4.19.98/debian/patches-rt/0173-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0173-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,72 @@ +From faaeaed6663b746f33b73dce36402da1043f70e6 Mon Sep 17 00:00:00 2001 +From: Julia Cartwright +Date: Mon, 7 May 2018 08:58:57 -0500 +Subject: [PATCH 173/325] squashfs: make use of local lock in multi_cpu + decompressor +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Currently, the squashfs multi_cpu decompressor makes use of +get_cpu_ptr()/put_cpu_ptr(), which unconditionally disable preemption +during decompression. + +Because the workload is distributed across CPUs, all CPUs can observe a +very high wakeup latency, which has been seen to be as much as 8000us. + +Convert this decompressor to make use of a local lock, which will allow +execution of the decompressor with preemption-enabled, but also ensure +concurrent accesses to the percpu compressor data on the local CPU will +be serialized. + +Cc: stable-rt@vger.kernel.org +Reported-by: Alexander Stein +Tested-by: Alexander Stein +Signed-off-by: Julia Cartwright +Signed-off-by: Sebastian Andrzej Siewior +--- + fs/squashfs/decompressor_multi_percpu.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +diff --git a/fs/squashfs/decompressor_multi_percpu.c b/fs/squashfs/decompressor_multi_percpu.c +index 23a9c28ad8ea..6a73c4fa88e7 100644 +--- a/fs/squashfs/decompressor_multi_percpu.c ++++ b/fs/squashfs/decompressor_multi_percpu.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + #include "squashfs_fs.h" + #include "squashfs_fs_sb.h" +@@ -25,6 +26,8 @@ struct squashfs_stream { + void *stream; + }; + ++static DEFINE_LOCAL_IRQ_LOCK(stream_lock); ++ + void *squashfs_decompressor_create(struct squashfs_sb_info *msblk, + void *comp_opts) + { +@@ -79,10 +82,15 @@ int squashfs_decompress(struct squashfs_sb_info *msblk, struct buffer_head **bh, + { + struct squashfs_stream __percpu *percpu = + (struct squashfs_stream __percpu *) msblk->stream; +- struct squashfs_stream *stream = get_cpu_ptr(percpu); +- int res = msblk->decompressor->decompress(msblk, stream->stream, bh, b, +- offset, length, output); +- put_cpu_ptr(stream); ++ struct squashfs_stream *stream; ++ int res; ++ ++ stream = get_locked_ptr(stream_lock, percpu); ++ ++ res = msblk->decompressor->decompress(msblk, stream->stream, bh, b, ++ offset, length, output); ++ ++ put_locked_ptr(stream_lock, stream); + + if (res < 0) + ERROR("%s decompression failed, data probably corrupt\n", +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0174-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch linux-4.19.118/debian/patches-rt/0174-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch --- linux-4.19.98/debian/patches-rt/0174-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0174-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -From cd5771603fe1942769706821fac18040226fec7c Mon Sep 17 00:00:00 2001 -From: Julia Cartwright -Date: Mon, 7 May 2018 08:58:57 -0500 -Subject: [PATCH 174/290] squashfs: make use of local lock in multi_cpu - decompressor -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Currently, the squashfs multi_cpu decompressor makes use of -get_cpu_ptr()/put_cpu_ptr(), which unconditionally disable preemption -during decompression. - -Because the workload is distributed across CPUs, all CPUs can observe a -very high wakeup latency, which has been seen to be as much as 8000us. - -Convert this decompressor to make use of a local lock, which will allow -execution of the decompressor with preemption-enabled, but also ensure -concurrent accesses to the percpu compressor data on the local CPU will -be serialized. - -Cc: stable-rt@vger.kernel.org -Reported-by: Alexander Stein -Tested-by: Alexander Stein -Signed-off-by: Julia Cartwright -Signed-off-by: Sebastian Andrzej Siewior ---- - fs/squashfs/decompressor_multi_percpu.c | 16 ++++++++++++---- - 1 file changed, 12 insertions(+), 4 deletions(-) - -diff --git a/fs/squashfs/decompressor_multi_percpu.c b/fs/squashfs/decompressor_multi_percpu.c -index 23a9c28ad8ea..6a73c4fa88e7 100644 ---- a/fs/squashfs/decompressor_multi_percpu.c -+++ b/fs/squashfs/decompressor_multi_percpu.c -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - - #include "squashfs_fs.h" - #include "squashfs_fs_sb.h" -@@ -25,6 +26,8 @@ struct squashfs_stream { - void *stream; - }; - -+static DEFINE_LOCAL_IRQ_LOCK(stream_lock); -+ - void *squashfs_decompressor_create(struct squashfs_sb_info *msblk, - void *comp_opts) - { -@@ -79,10 +82,15 @@ int squashfs_decompress(struct squashfs_sb_info *msblk, struct buffer_head **bh, - { - struct squashfs_stream __percpu *percpu = - (struct squashfs_stream __percpu *) msblk->stream; -- struct squashfs_stream *stream = get_cpu_ptr(percpu); -- int res = msblk->decompressor->decompress(msblk, stream->stream, bh, b, -- offset, length, output); -- put_cpu_ptr(stream); -+ struct squashfs_stream *stream; -+ int res; -+ -+ stream = get_locked_ptr(stream_lock, percpu); -+ -+ res = msblk->decompressor->decompress(msblk, stream->stream, bh, b, -+ offset, length, output); -+ -+ put_locked_ptr(stream_lock, stream); - - if (res < 0) - ERROR("%s decompression failed, data probably corrupt\n", --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0174-thermal-Defer-thermal-wakups-to-threads.patch linux-4.19.118/debian/patches-rt/0174-thermal-Defer-thermal-wakups-to-threads.patch --- linux-4.19.98/debian/patches-rt/0174-thermal-Defer-thermal-wakups-to-threads.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0174-thermal-Defer-thermal-wakups-to-threads.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,137 @@ +From 6ec6280a8291a12175fe85469e7cd591b3b6aba3 Mon Sep 17 00:00:00 2001 +From: Daniel Wagner +Date: Tue, 17 Feb 2015 09:37:44 +0100 +Subject: [PATCH 174/325] thermal: Defer thermal wakups to threads +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On RT the spin lock in pkg_temp_thermal_platfrom_thermal_notify will +call schedule while we run in irq context. + +[] dump_stack+0x4e/0x8f +[] __schedule_bug+0xa6/0xb4 +[] __schedule+0x5b4/0x700 +[] schedule+0x2a/0x90 +[] rt_spin_lock_slowlock+0xe5/0x2d0 +[] rt_spin_lock+0x25/0x30 +[] pkg_temp_thermal_platform_thermal_notify+0x45/0x134 [x86_pkg_temp_thermal] +[] ? therm_throt_process+0x1b/0x160 +[] intel_thermal_interrupt+0x211/0x250 +[] smp_thermal_interrupt+0x21/0x40 +[] thermal_interrupt+0x6d/0x80 + +Let's defer the work to a kthread. + +Signed-off-by: Daniel Wagner +[bigeasy: reoder init/denit position. TODO: flush swork on exit] +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/thermal/x86_pkg_temp_thermal.c | 52 ++++++++++++++++++++++++-- + 1 file changed, 49 insertions(+), 3 deletions(-) + +diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c +index 1ef937d799e4..a5991cbb408f 100644 +--- a/drivers/thermal/x86_pkg_temp_thermal.c ++++ b/drivers/thermal/x86_pkg_temp_thermal.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -329,7 +330,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) + schedule_delayed_work_on(cpu, work, ms); + } + +-static int pkg_thermal_notify(u64 msr_val) ++static void pkg_thermal_notify_work(struct swork_event *event) + { + int cpu = smp_processor_id(); + struct pkg_device *pkgdev; +@@ -348,9 +349,47 @@ static int pkg_thermal_notify(u64 msr_val) + } + + spin_unlock_irqrestore(&pkg_temp_lock, flags); ++} ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++static struct swork_event notify_work; ++ ++static int pkg_thermal_notify_work_init(void) ++{ ++ int err; ++ ++ err = swork_get(); ++ if (err) ++ return err; ++ ++ INIT_SWORK(¬ify_work, pkg_thermal_notify_work); + return 0; + } + ++static void pkg_thermal_notify_work_cleanup(void) ++{ ++ swork_put(); ++} ++ ++static int pkg_thermal_notify(u64 msr_val) ++{ ++ swork_queue(¬ify_work); ++ return 0; ++} ++ ++#else /* !CONFIG_PREEMPT_RT_FULL */ ++ ++static int pkg_thermal_notify_work_init(void) { return 0; } ++ ++static void pkg_thermal_notify_work_cleanup(void) { } ++ ++static int pkg_thermal_notify(u64 msr_val) ++{ ++ pkg_thermal_notify_work(NULL); ++ return 0; ++} ++#endif /* CONFIG_PREEMPT_RT_FULL */ ++ + static int pkg_temp_thermal_device_add(unsigned int cpu) + { + int pkgid = topology_logical_package_id(cpu); +@@ -515,11 +554,16 @@ static int __init pkg_temp_thermal_init(void) + if (!x86_match_cpu(pkg_temp_thermal_ids)) + return -ENODEV; + ++ if (!pkg_thermal_notify_work_init()) ++ return -ENODEV; ++ + max_packages = topology_max_packages(); + packages = kcalloc(max_packages, sizeof(struct pkg_device *), + GFP_KERNEL); +- if (!packages) +- return -ENOMEM; ++ if (!packages) { ++ ret = -ENOMEM; ++ goto err; ++ } + + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "thermal/x86_pkg:online", + pkg_thermal_cpu_online, pkg_thermal_cpu_offline); +@@ -537,6 +581,7 @@ static int __init pkg_temp_thermal_init(void) + return 0; + + err: ++ pkg_thermal_notify_work_cleanup(); + kfree(packages); + return ret; + } +@@ -550,6 +595,7 @@ static void __exit pkg_temp_thermal_exit(void) + cpuhp_remove_state(pkg_thermal_hp_state); + debugfs_remove_recursive(debugfs); + kfree(packages); ++ pkg_thermal_notify_work_cleanup(); + } + module_exit(pkg_temp_thermal_exit) + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0175-thermal-Defer-thermal-wakups-to-threads.patch linux-4.19.118/debian/patches-rt/0175-thermal-Defer-thermal-wakups-to-threads.patch --- linux-4.19.98/debian/patches-rt/0175-thermal-Defer-thermal-wakups-to-threads.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0175-thermal-Defer-thermal-wakups-to-threads.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,137 +0,0 @@ -From 902a47642519ca8ebec20cd12baa43b7985d5d5e Mon Sep 17 00:00:00 2001 -From: Daniel Wagner -Date: Tue, 17 Feb 2015 09:37:44 +0100 -Subject: [PATCH 175/290] thermal: Defer thermal wakups to threads -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On RT the spin lock in pkg_temp_thermal_platfrom_thermal_notify will -call schedule while we run in irq context. - -[] dump_stack+0x4e/0x8f -[] __schedule_bug+0xa6/0xb4 -[] __schedule+0x5b4/0x700 -[] schedule+0x2a/0x90 -[] rt_spin_lock_slowlock+0xe5/0x2d0 -[] rt_spin_lock+0x25/0x30 -[] pkg_temp_thermal_platform_thermal_notify+0x45/0x134 [x86_pkg_temp_thermal] -[] ? therm_throt_process+0x1b/0x160 -[] intel_thermal_interrupt+0x211/0x250 -[] smp_thermal_interrupt+0x21/0x40 -[] thermal_interrupt+0x6d/0x80 - -Let's defer the work to a kthread. - -Signed-off-by: Daniel Wagner -[bigeasy: reoder init/denit position. TODO: flush swork on exit] -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/thermal/x86_pkg_temp_thermal.c | 52 ++++++++++++++++++++++++-- - 1 file changed, 49 insertions(+), 3 deletions(-) - -diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c -index 1ef937d799e4..a5991cbb408f 100644 ---- a/drivers/thermal/x86_pkg_temp_thermal.c -+++ b/drivers/thermal/x86_pkg_temp_thermal.c -@@ -29,6 +29,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -329,7 +330,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) - schedule_delayed_work_on(cpu, work, ms); - } - --static int pkg_thermal_notify(u64 msr_val) -+static void pkg_thermal_notify_work(struct swork_event *event) - { - int cpu = smp_processor_id(); - struct pkg_device *pkgdev; -@@ -348,9 +349,47 @@ static int pkg_thermal_notify(u64 msr_val) - } - - spin_unlock_irqrestore(&pkg_temp_lock, flags); -+} -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+static struct swork_event notify_work; -+ -+static int pkg_thermal_notify_work_init(void) -+{ -+ int err; -+ -+ err = swork_get(); -+ if (err) -+ return err; -+ -+ INIT_SWORK(¬ify_work, pkg_thermal_notify_work); - return 0; - } - -+static void pkg_thermal_notify_work_cleanup(void) -+{ -+ swork_put(); -+} -+ -+static int pkg_thermal_notify(u64 msr_val) -+{ -+ swork_queue(¬ify_work); -+ return 0; -+} -+ -+#else /* !CONFIG_PREEMPT_RT_FULL */ -+ -+static int pkg_thermal_notify_work_init(void) { return 0; } -+ -+static void pkg_thermal_notify_work_cleanup(void) { } -+ -+static int pkg_thermal_notify(u64 msr_val) -+{ -+ pkg_thermal_notify_work(NULL); -+ return 0; -+} -+#endif /* CONFIG_PREEMPT_RT_FULL */ -+ - static int pkg_temp_thermal_device_add(unsigned int cpu) - { - int pkgid = topology_logical_package_id(cpu); -@@ -515,11 +554,16 @@ static int __init pkg_temp_thermal_init(void) - if (!x86_match_cpu(pkg_temp_thermal_ids)) - return -ENODEV; - -+ if (!pkg_thermal_notify_work_init()) -+ return -ENODEV; -+ - max_packages = topology_max_packages(); - packages = kcalloc(max_packages, sizeof(struct pkg_device *), - GFP_KERNEL); -- if (!packages) -- return -ENOMEM; -+ if (!packages) { -+ ret = -ENOMEM; -+ goto err; -+ } - - ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "thermal/x86_pkg:online", - pkg_thermal_cpu_online, pkg_thermal_cpu_offline); -@@ -537,6 +581,7 @@ static int __init pkg_temp_thermal_init(void) - return 0; - - err: -+ pkg_thermal_notify_work_cleanup(); - kfree(packages); - return ret; - } -@@ -550,6 +595,7 @@ static void __exit pkg_temp_thermal_exit(void) - cpuhp_remove_state(pkg_thermal_hp_state); - debugfs_remove_recursive(debugfs); - kfree(packages); -+ pkg_thermal_notify_work_cleanup(); - } - module_exit(pkg_temp_thermal_exit) - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0175-x86-fpu-Disable-preemption-around-local_bh_disable.patch linux-4.19.118/debian/patches-rt/0175-x86-fpu-Disable-preemption-around-local_bh_disable.patch --- linux-4.19.98/debian/patches-rt/0175-x86-fpu-Disable-preemption-around-local_bh_disable.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0175-x86-fpu-Disable-preemption-around-local_bh_disable.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,38 @@ +From 51bb97b3e2faccf5e5237a0e4df2b31b2d965a37 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 11 Dec 2018 15:10:33 +0100 +Subject: [PATCH 175/325] x86/fpu: Disable preemption around local_bh_disable() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +__fpu__restore_sig() restores the content of the FPU state in the CPUs +and in order to avoid concurency it disbles BH. On !RT it also disables +preemption but on RT we can get preempted in BH. + +Add preempt_disable() while the FPU state is restored. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/x86/kernel/fpu/signal.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c +index d99a8ee9e185..5e0274a94133 100644 +--- a/arch/x86/kernel/fpu/signal.c ++++ b/arch/x86/kernel/fpu/signal.c +@@ -344,10 +344,12 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size) + sanitize_restored_xstate(tsk, &env, xfeatures, fx_only); + } + ++ preempt_disable(); + local_bh_disable(); + fpu->initialized = 1; + fpu__restore(fpu); + local_bh_enable(); ++ preempt_enable(); + + return err; + } else { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0176-fs-epoll-Do-not-disable-preemption-on-RT.patch linux-4.19.118/debian/patches-rt/0176-fs-epoll-Do-not-disable-preemption-on-RT.patch --- linux-4.19.98/debian/patches-rt/0176-fs-epoll-Do-not-disable-preemption-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0176-fs-epoll-Do-not-disable-preemption-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,37 @@ +From b5ef225587d776634052edf167298ad29b091b67 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 8 Jul 2011 16:35:35 +0200 +Subject: [PATCH 176/325] fs/epoll: Do not disable preemption on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +ep_call_nested() takes a sleeping lock so we can't disable preemption. +The light version is enough since ep_call_nested() doesn't mind beeing +invoked twice on the same CPU. + +Signed-off-by: Thomas Gleixner +--- + fs/eventpoll.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/fs/eventpoll.c b/fs/eventpoll.c +index 58f48ea0db23..a41120a34e6d 100644 +--- a/fs/eventpoll.c ++++ b/fs/eventpoll.c +@@ -571,12 +571,12 @@ static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests) + + static void ep_poll_safewake(wait_queue_head_t *wq) + { +- int this_cpu = get_cpu(); ++ int this_cpu = get_cpu_light(); + + ep_call_nested(&poll_safewake_ncalls, EP_MAX_NESTS, + ep_poll_wakeup_proc, NULL, wq, (void *) (long) this_cpu); + +- put_cpu(); ++ put_cpu_light(); + } + + #else +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0176-x86-fpu-Disable-preemption-around-local_bh_disable.patch linux-4.19.118/debian/patches-rt/0176-x86-fpu-Disable-preemption-around-local_bh_disable.patch --- linux-4.19.98/debian/patches-rt/0176-x86-fpu-Disable-preemption-around-local_bh_disable.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0176-x86-fpu-Disable-preemption-around-local_bh_disable.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -From b2c28ae019437b1f5b43bb57a2898cfb0c03397c Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 11 Dec 2018 15:10:33 +0100 -Subject: [PATCH 176/290] x86/fpu: Disable preemption around local_bh_disable() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -__fpu__restore_sig() restores the content of the FPU state in the CPUs -and in order to avoid concurency it disbles BH. On !RT it also disables -preemption but on RT we can get preempted in BH. - -Add preempt_disable() while the FPU state is restored. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/kernel/fpu/signal.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c -index d99a8ee9e185..5e0274a94133 100644 ---- a/arch/x86/kernel/fpu/signal.c -+++ b/arch/x86/kernel/fpu/signal.c -@@ -344,10 +344,12 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size) - sanitize_restored_xstate(tsk, &env, xfeatures, fx_only); - } - -+ preempt_disable(); - local_bh_disable(); - fpu->initialized = 1; - fpu__restore(fpu); - local_bh_enable(); -+ preempt_enable(); - - return err; - } else { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0177-fs-epoll-Do-not-disable-preemption-on-RT.patch linux-4.19.118/debian/patches-rt/0177-fs-epoll-Do-not-disable-preemption-on-RT.patch --- linux-4.19.98/debian/patches-rt/0177-fs-epoll-Do-not-disable-preemption-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0177-fs-epoll-Do-not-disable-preemption-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -From 5916e5218923335c20252ab8309a16d071a54a80 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 8 Jul 2011 16:35:35 +0200 -Subject: [PATCH 177/290] fs/epoll: Do not disable preemption on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -ep_call_nested() takes a sleeping lock so we can't disable preemption. -The light version is enough since ep_call_nested() doesn't mind beeing -invoked twice on the same CPU. - -Signed-off-by: Thomas Gleixner ---- - fs/eventpoll.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/fs/eventpoll.c b/fs/eventpoll.c -index 58f48ea0db23..a41120a34e6d 100644 ---- a/fs/eventpoll.c -+++ b/fs/eventpoll.c -@@ -571,12 +571,12 @@ static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests) - - static void ep_poll_safewake(wait_queue_head_t *wq) - { -- int this_cpu = get_cpu(); -+ int this_cpu = get_cpu_light(); - - ep_call_nested(&poll_safewake_ncalls, EP_MAX_NESTS, - ep_poll_wakeup_proc, NULL, wq, (void *) (long) this_cpu); - -- put_cpu(); -+ put_cpu_light(); - } - - #else --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0177-mm-vmalloc-Another-preempt-disable-region-which-suck.patch linux-4.19.118/debian/patches-rt/0177-mm-vmalloc-Another-preempt-disable-region-which-suck.patch --- linux-4.19.98/debian/patches-rt/0177-mm-vmalloc-Another-preempt-disable-region-which-suck.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0177-mm-vmalloc-Another-preempt-disable-region-which-suck.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,73 @@ +From a36f97c1ca6e441ddb3d47465c137d01138549ed Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 12 Jul 2011 11:39:36 +0200 +Subject: [PATCH 177/325] mm/vmalloc: Another preempt disable region which + sucks +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Avoid the preempt disable version of get_cpu_var(). The inner-lock should +provide enough serialisation. + +Signed-off-by: Thomas Gleixner +--- + mm/vmalloc.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/mm/vmalloc.c b/mm/vmalloc.c +index 958d6ba9ee2d..ff471d6c350d 100644 +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -852,7 +852,7 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) + struct vmap_block *vb; + struct vmap_area *va; + unsigned long vb_idx; +- int node, err; ++ int node, err, cpu; + void *vaddr; + + node = numa_node_id(); +@@ -895,11 +895,12 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) + BUG_ON(err); + radix_tree_preload_end(); + +- vbq = &get_cpu_var(vmap_block_queue); ++ cpu = get_cpu_light(); ++ vbq = this_cpu_ptr(&vmap_block_queue); + spin_lock(&vbq->lock); + list_add_tail_rcu(&vb->free_list, &vbq->free); + spin_unlock(&vbq->lock); +- put_cpu_var(vmap_block_queue); ++ put_cpu_light(); + + return vaddr; + } +@@ -968,6 +969,7 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) + struct vmap_block *vb; + void *vaddr = NULL; + unsigned int order; ++ int cpu; + + BUG_ON(offset_in_page(size)); + BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); +@@ -982,7 +984,8 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) + order = get_order(size); + + rcu_read_lock(); +- vbq = &get_cpu_var(vmap_block_queue); ++ cpu = get_cpu_light(); ++ vbq = this_cpu_ptr(&vmap_block_queue); + list_for_each_entry_rcu(vb, &vbq->free, free_list) { + unsigned long pages_off; + +@@ -1005,7 +1008,7 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) + break; + } + +- put_cpu_var(vmap_block_queue); ++ put_cpu_light(); + rcu_read_unlock(); + + /* Allocate new block if nothing was found */ +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0178-block-mq-use-cpu_light.patch linux-4.19.118/debian/patches-rt/0178-block-mq-use-cpu_light.patch --- linux-4.19.98/debian/patches-rt/0178-block-mq-use-cpu_light.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0178-block-mq-use-cpu_light.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,36 @@ +From 48d0958dd08195a8ff4e6b24f5a6107b8664f8b9 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 9 Apr 2014 10:37:23 +0200 +Subject: [PATCH 178/325] block: mq: use cpu_light() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +there is a might sleep splat because get_cpu() disables preemption and +later we grab a lock. As a workaround for this we use get_cpu_light(). + +Signed-off-by: Sebastian Andrzej Siewior +--- + block/blk-mq.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/block/blk-mq.h b/block/blk-mq.h +index 5ad9251627f8..5a96c97991b6 100644 +--- a/block/blk-mq.h ++++ b/block/blk-mq.h +@@ -113,12 +113,12 @@ static inline struct blk_mq_ctx *__blk_mq_get_ctx(struct request_queue *q, + */ + static inline struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q) + { +- return __blk_mq_get_ctx(q, get_cpu()); ++ return __blk_mq_get_ctx(q, get_cpu_light()); + } + + static inline void blk_mq_put_ctx(struct blk_mq_ctx *ctx) + { +- put_cpu(); ++ put_cpu_light(); + } + + struct blk_mq_alloc_data { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0178-mm-vmalloc-Another-preempt-disable-region-which-suck.patch linux-4.19.118/debian/patches-rt/0178-mm-vmalloc-Another-preempt-disable-region-which-suck.patch --- linux-4.19.98/debian/patches-rt/0178-mm-vmalloc-Another-preempt-disable-region-which-suck.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0178-mm-vmalloc-Another-preempt-disable-region-which-suck.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -From 4b23a47feeb6d6b93de283f0502e0ba095173d0d Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 12 Jul 2011 11:39:36 +0200 -Subject: [PATCH 178/290] mm/vmalloc: Another preempt disable region which - sucks -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Avoid the preempt disable version of get_cpu_var(). The inner-lock should -provide enough serialisation. - -Signed-off-by: Thomas Gleixner ---- - mm/vmalloc.c | 13 ++++++++----- - 1 file changed, 8 insertions(+), 5 deletions(-) - -diff --git a/mm/vmalloc.c b/mm/vmalloc.c -index d8e877365f9f..9b7cf993cada 100644 ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -852,7 +852,7 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) - struct vmap_block *vb; - struct vmap_area *va; - unsigned long vb_idx; -- int node, err; -+ int node, err, cpu; - void *vaddr; - - node = numa_node_id(); -@@ -895,11 +895,12 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) - BUG_ON(err); - radix_tree_preload_end(); - -- vbq = &get_cpu_var(vmap_block_queue); -+ cpu = get_cpu_light(); -+ vbq = this_cpu_ptr(&vmap_block_queue); - spin_lock(&vbq->lock); - list_add_tail_rcu(&vb->free_list, &vbq->free); - spin_unlock(&vbq->lock); -- put_cpu_var(vmap_block_queue); -+ put_cpu_light(); - - return vaddr; - } -@@ -968,6 +969,7 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) - struct vmap_block *vb; - void *vaddr = NULL; - unsigned int order; -+ int cpu; - - BUG_ON(offset_in_page(size)); - BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); -@@ -982,7 +984,8 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) - order = get_order(size); - - rcu_read_lock(); -- vbq = &get_cpu_var(vmap_block_queue); -+ cpu = get_cpu_light(); -+ vbq = this_cpu_ptr(&vmap_block_queue); - list_for_each_entry_rcu(vb, &vbq->free, free_list) { - unsigned long pages_off; - -@@ -1005,7 +1008,7 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) - break; - } - -- put_cpu_var(vmap_block_queue); -+ put_cpu_light(); - rcu_read_unlock(); - - /* Allocate new block if nothing was found */ --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0179-block-mq-do-not-invoke-preempt_disable.patch linux-4.19.118/debian/patches-rt/0179-block-mq-do-not-invoke-preempt_disable.patch --- linux-4.19.98/debian/patches-rt/0179-block-mq-do-not-invoke-preempt_disable.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0179-block-mq-do-not-invoke-preempt_disable.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,58 @@ +From 47b9729b86adf61e40b4576d3533ae11a283af2f Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 14 Jul 2015 14:26:34 +0200 +Subject: [PATCH 179/325] block/mq: do not invoke preempt_disable() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +preempt_disable() and get_cpu() don't play well together with the sleeping +locks it tries to allocate later. +It seems to be enough to replace it with get_cpu_light() and migrate_disable(). + +Signed-off-by: Sebastian Andrzej Siewior +--- + block/blk-mq.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/block/blk-mq.c b/block/blk-mq.c +index 4aa3284874f6..376fb90de054 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -570,7 +570,7 @@ static void __blk_mq_complete_request(struct request *rq) + return; + } + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + if (!test_bit(QUEUE_FLAG_SAME_FORCE, &rq->q->queue_flags)) + shared = cpus_share_cache(cpu, ctx->cpu); + +@@ -582,7 +582,7 @@ static void __blk_mq_complete_request(struct request *rq) + } else { + rq->q->softirq_done_fn(rq); + } +- put_cpu(); ++ put_cpu_light(); + } + + static void hctx_unlock(struct blk_mq_hw_ctx *hctx, int srcu_idx) +@@ -1371,14 +1371,14 @@ static void __blk_mq_delay_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async, + return; + + if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) { +- int cpu = get_cpu(); ++ int cpu = get_cpu_light(); + if (cpumask_test_cpu(cpu, hctx->cpumask)) { + __blk_mq_run_hw_queue(hctx); +- put_cpu(); ++ put_cpu_light(); + return; + } + +- put_cpu(); ++ put_cpu_light(); + } + + kblockd_mod_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work, +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0179-block-mq-use-cpu_light.patch linux-4.19.118/debian/patches-rt/0179-block-mq-use-cpu_light.patch --- linux-4.19.98/debian/patches-rt/0179-block-mq-use-cpu_light.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0179-block-mq-use-cpu_light.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -From 687c233b2f57dfd618d45830dc9af37e3147e81b Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 9 Apr 2014 10:37:23 +0200 -Subject: [PATCH 179/290] block: mq: use cpu_light() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -there is a might sleep splat because get_cpu() disables preemption and -later we grab a lock. As a workaround for this we use get_cpu_light(). - -Signed-off-by: Sebastian Andrzej Siewior ---- - block/blk-mq.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/block/blk-mq.h b/block/blk-mq.h -index 5ad9251627f8..5a96c97991b6 100644 ---- a/block/blk-mq.h -+++ b/block/blk-mq.h -@@ -113,12 +113,12 @@ static inline struct blk_mq_ctx *__blk_mq_get_ctx(struct request_queue *q, - */ - static inline struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q) - { -- return __blk_mq_get_ctx(q, get_cpu()); -+ return __blk_mq_get_ctx(q, get_cpu_light()); - } - - static inline void blk_mq_put_ctx(struct blk_mq_ctx *ctx) - { -- put_cpu(); -+ put_cpu_light(); - } - - struct blk_mq_alloc_data { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0180-block-mq-do-not-invoke-preempt_disable.patch linux-4.19.118/debian/patches-rt/0180-block-mq-do-not-invoke-preempt_disable.patch --- linux-4.19.98/debian/patches-rt/0180-block-mq-do-not-invoke-preempt_disable.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0180-block-mq-do-not-invoke-preempt_disable.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -From 4038b2ec5798b7386eb67a895fda6b5c4febfc36 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: [PATCH 180/290] block/mq: do not invoke preempt_disable() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -preempt_disable() and get_cpu() don't play well together with the sleeping -locks it tries to allocate later. -It seems to be enough to replace it with get_cpu_light() and migrate_disable(). - -Signed-off-by: Sebastian Andrzej Siewior ---- - block/blk-mq.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/block/blk-mq.c b/block/blk-mq.c -index 4aa3284874f6..376fb90de054 100644 ---- a/block/blk-mq.c -+++ b/block/blk-mq.c -@@ -570,7 +570,7 @@ static void __blk_mq_complete_request(struct request *rq) - return; - } - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - if (!test_bit(QUEUE_FLAG_SAME_FORCE, &rq->q->queue_flags)) - shared = cpus_share_cache(cpu, ctx->cpu); - -@@ -582,7 +582,7 @@ static void __blk_mq_complete_request(struct request *rq) - } else { - rq->q->softirq_done_fn(rq); - } -- put_cpu(); -+ put_cpu_light(); - } - - static void hctx_unlock(struct blk_mq_hw_ctx *hctx, int srcu_idx) -@@ -1371,14 +1371,14 @@ static void __blk_mq_delay_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async, - return; - - if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) { -- int cpu = get_cpu(); -+ int cpu = get_cpu_light(); - if (cpumask_test_cpu(cpu, hctx->cpumask)) { - __blk_mq_run_hw_queue(hctx); -- put_cpu(); -+ put_cpu_light(); - return; - } - -- put_cpu(); -+ put_cpu_light(); - } - - kblockd_mod_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work, --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0180-block-mq-don-t-complete-requests-via-IPI.patch linux-4.19.118/debian/patches-rt/0180-block-mq-don-t-complete-requests-via-IPI.patch --- linux-4.19.98/debian/patches-rt/0180-block-mq-don-t-complete-requests-via-IPI.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0180-block-mq-don-t-complete-requests-via-IPI.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,119 @@ +From 7a66ae4854f27f371c06de734ea7541a9e9ec3b6 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 29 Jan 2015 15:10:08 +0100 +Subject: [PATCH 180/325] block/mq: don't complete requests via IPI +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The IPI runs in hardirq context and there are sleeping locks. This patch +moves the completion into a workqueue. + +Signed-off-by: Sebastian Andrzej Siewior +--- + block/blk-core.c | 3 +++ + block/blk-mq.c | 23 +++++++++++++++++++++++ + include/linux/blk-mq.h | 2 +- + include/linux/blkdev.h | 3 +++ + 4 files changed, 30 insertions(+), 1 deletion(-) + +diff --git a/block/blk-core.c b/block/blk-core.c +index ea33d6abdcfc..4860cd26cd5a 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -189,6 +189,9 @@ void blk_rq_init(struct request_queue *q, struct request *rq) + + INIT_LIST_HEAD(&rq->queuelist); + INIT_LIST_HEAD(&rq->timeout_list); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work); ++#endif + rq->cpu = -1; + rq->q = q; + rq->__sector = (sector_t) -1; +diff --git a/block/blk-mq.c b/block/blk-mq.c +index 376fb90de054..5808446e4758 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -320,6 +320,9 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, + rq->extra_len = 0; + rq->__deadline = 0; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work); ++#endif + INIT_LIST_HEAD(&rq->timeout_list); + rq->timeout = 0; + +@@ -547,12 +550,24 @@ void blk_mq_end_request(struct request *rq, blk_status_t error) + } + EXPORT_SYMBOL(blk_mq_end_request); + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ ++void __blk_mq_complete_request_remote_work(struct work_struct *work) ++{ ++ struct request *rq = container_of(work, struct request, work); ++ ++ rq->q->softirq_done_fn(rq); ++} ++ ++#else ++ + static void __blk_mq_complete_request_remote(void *data) + { + struct request *rq = data; + + rq->q->softirq_done_fn(rq); + } ++#endif + + static void __blk_mq_complete_request(struct request *rq) + { +@@ -575,10 +590,18 @@ static void __blk_mq_complete_request(struct request *rq) + shared = cpus_share_cache(cpu, ctx->cpu); + + if (cpu != ctx->cpu && !shared && cpu_online(ctx->cpu)) { ++#ifdef CONFIG_PREEMPT_RT_FULL ++ /* ++ * We could force QUEUE_FLAG_SAME_FORCE then we would not get in ++ * here. But we could try to invoke it one the CPU like this. ++ */ ++ schedule_work_on(ctx->cpu, &rq->work); ++#else + rq->csd.func = __blk_mq_complete_request_remote; + rq->csd.info = rq; + rq->csd.flags = 0; + smp_call_function_single_async(ctx->cpu, &rq->csd); ++#endif + } else { + rq->q->softirq_done_fn(rq); + } +diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h +index 2885dce1ad49..8dbb9ecf9993 100644 +--- a/include/linux/blk-mq.h ++++ b/include/linux/blk-mq.h +@@ -256,7 +256,7 @@ static inline u16 blk_mq_unique_tag_to_tag(u32 unique_tag) + return unique_tag & BLK_MQ_UNIQUE_TAG_MASK; + } + +- ++void __blk_mq_complete_request_remote_work(struct work_struct *work); + int blk_mq_request_started(struct request *rq); + void blk_mq_start_request(struct request *rq); + void blk_mq_end_request(struct request *rq, blk_status_t error); +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 6e67aeb56928..111ab4209797 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -149,6 +149,9 @@ enum mq_rq_state { + */ + struct request { + struct request_queue *q; ++#ifdef CONFIG_PREEMPT_RT_FULL ++ struct work_struct work; ++#endif + struct blk_mq_ctx *mq_ctx; + + int cpu; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0181-block-mq-don-t-complete-requests-via-IPI.patch linux-4.19.118/debian/patches-rt/0181-block-mq-don-t-complete-requests-via-IPI.patch --- linux-4.19.98/debian/patches-rt/0181-block-mq-don-t-complete-requests-via-IPI.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0181-block-mq-don-t-complete-requests-via-IPI.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,119 +0,0 @@ -From 1e4579941a4ae775b14ca02ef717a5bea1608853 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 29 Jan 2015 15:10:08 +0100 -Subject: [PATCH 181/290] block/mq: don't complete requests via IPI -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The IPI runs in hardirq context and there are sleeping locks. This patch -moves the completion into a workqueue. - -Signed-off-by: Sebastian Andrzej Siewior ---- - block/blk-core.c | 3 +++ - block/blk-mq.c | 23 +++++++++++++++++++++++ - include/linux/blk-mq.h | 2 +- - include/linux/blkdev.h | 3 +++ - 4 files changed, 30 insertions(+), 1 deletion(-) - -diff --git a/block/blk-core.c b/block/blk-core.c -index ea33d6abdcfc..4860cd26cd5a 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -189,6 +189,9 @@ void blk_rq_init(struct request_queue *q, struct request *rq) - - INIT_LIST_HEAD(&rq->queuelist); - INIT_LIST_HEAD(&rq->timeout_list); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work); -+#endif - rq->cpu = -1; - rq->q = q; - rq->__sector = (sector_t) -1; -diff --git a/block/blk-mq.c b/block/blk-mq.c -index 376fb90de054..5808446e4758 100644 ---- a/block/blk-mq.c -+++ b/block/blk-mq.c -@@ -320,6 +320,9 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, - rq->extra_len = 0; - rq->__deadline = 0; - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work); -+#endif - INIT_LIST_HEAD(&rq->timeout_list); - rq->timeout = 0; - -@@ -547,12 +550,24 @@ void blk_mq_end_request(struct request *rq, blk_status_t error) - } - EXPORT_SYMBOL(blk_mq_end_request); - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ -+void __blk_mq_complete_request_remote_work(struct work_struct *work) -+{ -+ struct request *rq = container_of(work, struct request, work); -+ -+ rq->q->softirq_done_fn(rq); -+} -+ -+#else -+ - static void __blk_mq_complete_request_remote(void *data) - { - struct request *rq = data; - - rq->q->softirq_done_fn(rq); - } -+#endif - - static void __blk_mq_complete_request(struct request *rq) - { -@@ -575,10 +590,18 @@ static void __blk_mq_complete_request(struct request *rq) - shared = cpus_share_cache(cpu, ctx->cpu); - - if (cpu != ctx->cpu && !shared && cpu_online(ctx->cpu)) { -+#ifdef CONFIG_PREEMPT_RT_FULL -+ /* -+ * We could force QUEUE_FLAG_SAME_FORCE then we would not get in -+ * here. But we could try to invoke it one the CPU like this. -+ */ -+ schedule_work_on(ctx->cpu, &rq->work); -+#else - rq->csd.func = __blk_mq_complete_request_remote; - rq->csd.info = rq; - rq->csd.flags = 0; - smp_call_function_single_async(ctx->cpu, &rq->csd); -+#endif - } else { - rq->q->softirq_done_fn(rq); - } -diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h -index 2885dce1ad49..8dbb9ecf9993 100644 ---- a/include/linux/blk-mq.h -+++ b/include/linux/blk-mq.h -@@ -256,7 +256,7 @@ static inline u16 blk_mq_unique_tag_to_tag(u32 unique_tag) - return unique_tag & BLK_MQ_UNIQUE_TAG_MASK; - } - -- -+void __blk_mq_complete_request_remote_work(struct work_struct *work); - int blk_mq_request_started(struct request *rq); - void blk_mq_start_request(struct request *rq); - void blk_mq_end_request(struct request *rq, blk_status_t error); -diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h -index d51e10f50e75..f1960add94df 100644 ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -149,6 +149,9 @@ enum mq_rq_state { - */ - struct request { - struct request_queue *q; -+#ifdef CONFIG_PREEMPT_RT_FULL -+ struct work_struct work; -+#endif - struct blk_mq_ctx *mq_ctx; - - int cpu; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0181-md-raid5-Make-raid5_percpu-handling-RT-aware.patch linux-4.19.118/debian/patches-rt/0181-md-raid5-Make-raid5_percpu-handling-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0181-md-raid5-Make-raid5_percpu-handling-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0181-md-raid5-Make-raid5_percpu-handling-RT-aware.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,77 @@ +From f157b0b46278489f11209a4147370fc584b2b99d Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 6 Apr 2010 16:51:31 +0200 +Subject: [PATCH 181/325] md: raid5: Make raid5_percpu handling RT aware +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +__raid_run_ops() disables preemption with get_cpu() around the access +to the raid5_percpu variables. That causes scheduling while atomic +spews on RT. + +Serialize the access to the percpu data with a lock and keep the code +preemptible. + +Reported-by: Udo van den Heuvel +Signed-off-by: Thomas Gleixner +Tested-by: Udo van den Heuvel +--- + drivers/md/raid5.c | 8 +++++--- + drivers/md/raid5.h | 1 + + 2 files changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c +index 01021382131b..379ce2f57512 100644 +--- a/drivers/md/raid5.c ++++ b/drivers/md/raid5.c +@@ -2069,8 +2069,9 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) + struct raid5_percpu *percpu; + unsigned long cpu; + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + percpu = per_cpu_ptr(conf->percpu, cpu); ++ spin_lock(&percpu->lock); + if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) { + ops_run_biofill(sh); + overlap_clear++; +@@ -2129,7 +2130,8 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) + if (test_and_clear_bit(R5_Overlap, &dev->flags)) + wake_up(&sh->raid_conf->wait_for_overlap); + } +- put_cpu(); ++ spin_unlock(&percpu->lock); ++ put_cpu_light(); + } + + static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh) +@@ -6815,6 +6817,7 @@ static int raid456_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) + __func__, cpu); + return -ENOMEM; + } ++ spin_lock_init(&per_cpu_ptr(conf->percpu, cpu)->lock); + return 0; + } + +@@ -6825,7 +6828,6 @@ static int raid5_alloc_percpu(struct r5conf *conf) + conf->percpu = alloc_percpu(struct raid5_percpu); + if (!conf->percpu) + return -ENOMEM; +- + err = cpuhp_state_add_instance(CPUHP_MD_RAID5_PREPARE, &conf->node); + if (!err) { + conf->scribble_disks = max(conf->raid_disks, +diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h +index 8474c224127b..a3bf907ab2af 100644 +--- a/drivers/md/raid5.h ++++ b/drivers/md/raid5.h +@@ -637,6 +637,7 @@ struct r5conf { + int recovery_disabled; + /* per cpu variables */ + struct raid5_percpu { ++ spinlock_t lock; /* Protection for -RT */ + struct page *spare_page; /* Used when checking P/Q in raid6 */ + struct flex_array *scribble; /* space for constructing buffer + * lists and performing address +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0182-md-raid5-Make-raid5_percpu-handling-RT-aware.patch linux-4.19.118/debian/patches-rt/0182-md-raid5-Make-raid5_percpu-handling-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0182-md-raid5-Make-raid5_percpu-handling-RT-aware.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0182-md-raid5-Make-raid5_percpu-handling-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -From ea655a0576aff0709c19ff2f8634ac9cb783f0ad Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 6 Apr 2010 16:51:31 +0200 -Subject: [PATCH 182/290] md: raid5: Make raid5_percpu handling RT aware -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -__raid_run_ops() disables preemption with get_cpu() around the access -to the raid5_percpu variables. That causes scheduling while atomic -spews on RT. - -Serialize the access to the percpu data with a lock and keep the code -preemptible. - -Reported-by: Udo van den Heuvel -Signed-off-by: Thomas Gleixner -Tested-by: Udo van den Heuvel ---- - drivers/md/raid5.c | 8 +++++--- - drivers/md/raid5.h | 1 + - 2 files changed, 6 insertions(+), 3 deletions(-) - -diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c -index 01021382131b..379ce2f57512 100644 ---- a/drivers/md/raid5.c -+++ b/drivers/md/raid5.c -@@ -2069,8 +2069,9 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) - struct raid5_percpu *percpu; - unsigned long cpu; - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - percpu = per_cpu_ptr(conf->percpu, cpu); -+ spin_lock(&percpu->lock); - if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) { - ops_run_biofill(sh); - overlap_clear++; -@@ -2129,7 +2130,8 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) - if (test_and_clear_bit(R5_Overlap, &dev->flags)) - wake_up(&sh->raid_conf->wait_for_overlap); - } -- put_cpu(); -+ spin_unlock(&percpu->lock); -+ put_cpu_light(); - } - - static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh) -@@ -6815,6 +6817,7 @@ static int raid456_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) - __func__, cpu); - return -ENOMEM; - } -+ spin_lock_init(&per_cpu_ptr(conf->percpu, cpu)->lock); - return 0; - } - -@@ -6825,7 +6828,6 @@ static int raid5_alloc_percpu(struct r5conf *conf) - conf->percpu = alloc_percpu(struct raid5_percpu); - if (!conf->percpu) - return -ENOMEM; -- - err = cpuhp_state_add_instance(CPUHP_MD_RAID5_PREPARE, &conf->node); - if (!err) { - conf->scribble_disks = max(conf->raid_disks, -diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h -index 8474c224127b..a3bf907ab2af 100644 ---- a/drivers/md/raid5.h -+++ b/drivers/md/raid5.h -@@ -637,6 +637,7 @@ struct r5conf { - int recovery_disabled; - /* per cpu variables */ - struct raid5_percpu { -+ spinlock_t lock; /* Protection for -RT */ - struct page *spare_page; /* Used when checking P/Q in raid6 */ - struct flex_array *scribble; /* space for constructing buffer - * lists and performing address --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0182-rt-Introduce-cpu_chill.patch linux-4.19.118/debian/patches-rt/0182-rt-Introduce-cpu_chill.patch --- linux-4.19.98/debian/patches-rt/0182-rt-Introduce-cpu_chill.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0182-rt-Introduce-cpu_chill.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,113 @@ +From 733fd0de9c18647a56f62e4b18288a7025cc476a Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 7 Mar 2012 20:51:03 +0100 +Subject: [PATCH 182/325] rt: Introduce cpu_chill() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Retry loops on RT might loop forever when the modifying side was +preempted. Add cpu_chill() to replace cpu_relax(). cpu_chill() +defaults to cpu_relax() for non RT. On RT it puts the looping task to +sleep for a tick so the preempted task can make progress. + +Steven Rostedt changed it to use a hrtimer instead of msleep(): +| +|Ulrich Obergfell pointed out that cpu_chill() calls msleep() which is woken +|up by the ksoftirqd running the TIMER softirq. But as the cpu_chill() is +|called from softirq context, it may block the ksoftirqd() from running, in +|which case, it may never wake up the msleep() causing the deadlock. + ++ bigeasy later changed to schedule_hrtimeout() +|If a task calls cpu_chill() and gets woken up by a regular or spurious +|wakeup and has a signal pending, then it exits the sleep loop in +|do_nanosleep() and sets up the restart block. If restart->nanosleep.type is +|not TI_NONE then this results in accessing a stale user pointer from a +|previously interrupted syscall and a copy to user based on the stale +|pointer or a BUG() when 'type' is not supported in nanosleep_copyout(). + ++ bigeasy: add PF_NOFREEZE: +| [....] Waiting for /dev to be fully populated... +| ===================================== +| [ BUG: udevd/229 still has locks held! ] +| 3.12.11-rt17 #23 Not tainted +| ------------------------------------- +| 1 lock held by udevd/229: +| #0: (&type->i_mutex_dir_key#2){+.+.+.}, at: lookup_slow+0x28/0x98 +| +| stack backtrace: +| CPU: 0 PID: 229 Comm: udevd Not tainted 3.12.11-rt17 #23 +| (unwind_backtrace+0x0/0xf8) from (show_stack+0x10/0x14) +| (show_stack+0x10/0x14) from (dump_stack+0x74/0xbc) +| (dump_stack+0x74/0xbc) from (do_nanosleep+0x120/0x160) +| (do_nanosleep+0x120/0x160) from (hrtimer_nanosleep+0x90/0x110) +| (hrtimer_nanosleep+0x90/0x110) from (cpu_chill+0x30/0x38) +| (cpu_chill+0x30/0x38) from (dentry_kill+0x158/0x1ec) +| (dentry_kill+0x158/0x1ec) from (dput+0x74/0x15c) +| (dput+0x74/0x15c) from (lookup_real+0x4c/0x50) +| (lookup_real+0x4c/0x50) from (__lookup_hash+0x34/0x44) +| (__lookup_hash+0x34/0x44) from (lookup_slow+0x38/0x98) +| (lookup_slow+0x38/0x98) from (path_lookupat+0x208/0x7fc) +| (path_lookupat+0x208/0x7fc) from (filename_lookup+0x20/0x60) +| (filename_lookup+0x20/0x60) from (user_path_at_empty+0x50/0x7c) +| (user_path_at_empty+0x50/0x7c) from (user_path_at+0x14/0x1c) +| (user_path_at+0x14/0x1c) from (vfs_fstatat+0x48/0x94) +| (vfs_fstatat+0x48/0x94) from (SyS_stat64+0x14/0x30) +| (SyS_stat64+0x14/0x30) from (ret_fast_syscall+0x0/0x48) + +Signed-off-by: Thomas Gleixner +Signed-off-by: Steven Rostedt +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/delay.h | 6 ++++++ + kernel/time/hrtimer.c | 21 +++++++++++++++++++++ + 2 files changed, 27 insertions(+) + +diff --git a/include/linux/delay.h b/include/linux/delay.h +index b78bab4395d8..7c4bc414a504 100644 +--- a/include/linux/delay.h ++++ b/include/linux/delay.h +@@ -64,4 +64,10 @@ static inline void ssleep(unsigned int seconds) + msleep(seconds * 1000); + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++extern void cpu_chill(void); ++#else ++# define cpu_chill() cpu_relax() ++#endif ++ + #endif /* defined(_LINUX_DELAY_H) */ +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index b800efb64238..98a771065818 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -1897,6 +1897,27 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, + } + #endif + ++#ifdef CONFIG_PREEMPT_RT_FULL ++/* ++ * Sleep for 1 ms in hope whoever holds what we want will let it go. ++ */ ++void cpu_chill(void) ++{ ++ ktime_t chill_time; ++ unsigned int freeze_flag = current->flags & PF_NOFREEZE; ++ ++ chill_time = ktime_set(0, NSEC_PER_MSEC); ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ current->flags |= PF_NOFREEZE; ++ sleeping_lock_inc(); ++ schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); ++ sleeping_lock_dec(); ++ if (!freeze_flag) ++ current->flags &= ~PF_NOFREEZE; ++} ++EXPORT_SYMBOL(cpu_chill); ++#endif ++ + /* + * Functions related to boot-time initialization: + */ +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch linux-4.19.118/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch --- linux-4.19.98/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,48 @@ +From 85afc621eb4a204e42836baf2e39a0f0ab1ab150 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 19 Feb 2019 16:59:15 +0100 +Subject: [PATCH 183/325] hrtimer: Don't lose state in cpu_chill() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In cpu_chill() the state is set to TASK_UNINTERRUPTIBLE and a timer is +programmed. On return the state is always TASK_RUNNING which means we +lose the state if it was something other than RUNNING. Also +set_current_state() sets ->task_state_change to within cpu_chill() which +is not expected. + +Save the task state on entry and restore it on return. Simply set the +state in order to avoid updating ->task_state_change. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/hrtimer.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 98a771065818..21a454557c8a 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -1905,15 +1905,18 @@ void cpu_chill(void) + { + ktime_t chill_time; + unsigned int freeze_flag = current->flags & PF_NOFREEZE; ++ long saved_state; + ++ saved_state = current->state; + chill_time = ktime_set(0, NSEC_PER_MSEC); +- set_current_state(TASK_UNINTERRUPTIBLE); ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); + current->flags |= PF_NOFREEZE; + sleeping_lock_inc(); + schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); + sleeping_lock_dec(); + if (!freeze_flag) + current->flags &= ~PF_NOFREEZE; ++ __set_current_state_no_track(saved_state); + } + EXPORT_SYMBOL(cpu_chill); + #endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0183-rt-Introduce-cpu_chill.patch linux-4.19.118/debian/patches-rt/0183-rt-Introduce-cpu_chill.patch --- linux-4.19.98/debian/patches-rt/0183-rt-Introduce-cpu_chill.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0183-rt-Introduce-cpu_chill.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -From c021d3e1d9574028eba2cdd5b6c776e9020a0d9d Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 7 Mar 2012 20:51:03 +0100 -Subject: [PATCH 183/290] rt: Introduce cpu_chill() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Retry loops on RT might loop forever when the modifying side was -preempted. Add cpu_chill() to replace cpu_relax(). cpu_chill() -defaults to cpu_relax() for non RT. On RT it puts the looping task to -sleep for a tick so the preempted task can make progress. - -Steven Rostedt changed it to use a hrtimer instead of msleep(): -| -|Ulrich Obergfell pointed out that cpu_chill() calls msleep() which is woken -|up by the ksoftirqd running the TIMER softirq. But as the cpu_chill() is -|called from softirq context, it may block the ksoftirqd() from running, in -|which case, it may never wake up the msleep() causing the deadlock. - -+ bigeasy later changed to schedule_hrtimeout() -|If a task calls cpu_chill() and gets woken up by a regular or spurious -|wakeup and has a signal pending, then it exits the sleep loop in -|do_nanosleep() and sets up the restart block. If restart->nanosleep.type is -|not TI_NONE then this results in accessing a stale user pointer from a -|previously interrupted syscall and a copy to user based on the stale -|pointer or a BUG() when 'type' is not supported in nanosleep_copyout(). - -+ bigeasy: add PF_NOFREEZE: -| [....] Waiting for /dev to be fully populated... -| ===================================== -| [ BUG: udevd/229 still has locks held! ] -| 3.12.11-rt17 #23 Not tainted -| ------------------------------------- -| 1 lock held by udevd/229: -| #0: (&type->i_mutex_dir_key#2){+.+.+.}, at: lookup_slow+0x28/0x98 -| -| stack backtrace: -| CPU: 0 PID: 229 Comm: udevd Not tainted 3.12.11-rt17 #23 -| (unwind_backtrace+0x0/0xf8) from (show_stack+0x10/0x14) -| (show_stack+0x10/0x14) from (dump_stack+0x74/0xbc) -| (dump_stack+0x74/0xbc) from (do_nanosleep+0x120/0x160) -| (do_nanosleep+0x120/0x160) from (hrtimer_nanosleep+0x90/0x110) -| (hrtimer_nanosleep+0x90/0x110) from (cpu_chill+0x30/0x38) -| (cpu_chill+0x30/0x38) from (dentry_kill+0x158/0x1ec) -| (dentry_kill+0x158/0x1ec) from (dput+0x74/0x15c) -| (dput+0x74/0x15c) from (lookup_real+0x4c/0x50) -| (lookup_real+0x4c/0x50) from (__lookup_hash+0x34/0x44) -| (__lookup_hash+0x34/0x44) from (lookup_slow+0x38/0x98) -| (lookup_slow+0x38/0x98) from (path_lookupat+0x208/0x7fc) -| (path_lookupat+0x208/0x7fc) from (filename_lookup+0x20/0x60) -| (filename_lookup+0x20/0x60) from (user_path_at_empty+0x50/0x7c) -| (user_path_at_empty+0x50/0x7c) from (user_path_at+0x14/0x1c) -| (user_path_at+0x14/0x1c) from (vfs_fstatat+0x48/0x94) -| (vfs_fstatat+0x48/0x94) from (SyS_stat64+0x14/0x30) -| (SyS_stat64+0x14/0x30) from (ret_fast_syscall+0x0/0x48) - -Signed-off-by: Thomas Gleixner -Signed-off-by: Steven Rostedt -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/delay.h | 6 ++++++ - kernel/time/hrtimer.c | 21 +++++++++++++++++++++ - 2 files changed, 27 insertions(+) - -diff --git a/include/linux/delay.h b/include/linux/delay.h -index b78bab4395d8..7c4bc414a504 100644 ---- a/include/linux/delay.h -+++ b/include/linux/delay.h -@@ -64,4 +64,10 @@ static inline void ssleep(unsigned int seconds) - msleep(seconds * 1000); - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+extern void cpu_chill(void); -+#else -+# define cpu_chill() cpu_relax() -+#endif -+ - #endif /* defined(_LINUX_DELAY_H) */ -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index b800efb64238..98a771065818 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -1897,6 +1897,27 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, - } - #endif - -+#ifdef CONFIG_PREEMPT_RT_FULL -+/* -+ * Sleep for 1 ms in hope whoever holds what we want will let it go. -+ */ -+void cpu_chill(void) -+{ -+ ktime_t chill_time; -+ unsigned int freeze_flag = current->flags & PF_NOFREEZE; -+ -+ chill_time = ktime_set(0, NSEC_PER_MSEC); -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ current->flags |= PF_NOFREEZE; -+ sleeping_lock_inc(); -+ schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); -+ sleeping_lock_dec(); -+ if (!freeze_flag) -+ current->flags &= ~PF_NOFREEZE; -+} -+EXPORT_SYMBOL(cpu_chill); -+#endif -+ - /* - * Functions related to boot-time initialization: - */ --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0184-hrtimer-Don-t-lose-state-in-cpu_chill.patch linux-4.19.118/debian/patches-rt/0184-hrtimer-Don-t-lose-state-in-cpu_chill.patch --- linux-4.19.98/debian/patches-rt/0184-hrtimer-Don-t-lose-state-in-cpu_chill.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0184-hrtimer-Don-t-lose-state-in-cpu_chill.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -From d81a1f846aac209ee8c5c7ccbc613324abeba9c4 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 19 Feb 2019 16:59:15 +0100 -Subject: [PATCH 184/290] hrtimer: Don't lose state in cpu_chill() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In cpu_chill() the state is set to TASK_UNINTERRUPTIBLE and a timer is -programmed. On return the state is always TASK_RUNNING which means we -lose the state if it was something other than RUNNING. Also -set_current_state() sets ->task_state_change to within cpu_chill() which -is not expected. - -Save the task state on entry and restore it on return. Simply set the -state in order to avoid updating ->task_state_change. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/time/hrtimer.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 98a771065818..21a454557c8a 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -1905,15 +1905,18 @@ void cpu_chill(void) - { - ktime_t chill_time; - unsigned int freeze_flag = current->flags & PF_NOFREEZE; -+ long saved_state; - -+ saved_state = current->state; - chill_time = ktime_set(0, NSEC_PER_MSEC); -- set_current_state(TASK_UNINTERRUPTIBLE); -+ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); - current->flags |= PF_NOFREEZE; - sleeping_lock_inc(); - schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); - sleeping_lock_dec(); - if (!freeze_flag) - current->flags &= ~PF_NOFREEZE; -+ __set_current_state_no_track(saved_state); - } - EXPORT_SYMBOL(cpu_chill); - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0184-hrtimer-cpu_chill-save-task-state-in-saved_state.patch linux-4.19.118/debian/patches-rt/0184-hrtimer-cpu_chill-save-task-state-in-saved_state.patch --- linux-4.19.98/debian/patches-rt/0184-hrtimer-cpu_chill-save-task-state-in-saved_state.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0184-hrtimer-cpu_chill-save-task-state-in-saved_state.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,63 @@ +From 9f5be54f1f4d5410605f14e2cfb080ac1dd4d31b Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 26 Feb 2019 12:31:10 +0100 +Subject: [PATCH 184/325] hrtimer: cpu_chill(): save task state in + ->saved_state() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In the previous change I saved the current task state on stack. This was +bad because while the task is scheduled-out it might receive a wake-up. +The wake up changes the task state and we must not destroy it. + +Save the task-state in ->saved_state under a PI-lock to unsure that +state changes during are not missed while the task temporary scheduled +out. + +Reported-by: Mike Galbraith +Tested-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/hrtimer.c | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 21a454557c8a..f16cbc98c47a 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -1903,20 +1903,28 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, + */ + void cpu_chill(void) + { +- ktime_t chill_time; + unsigned int freeze_flag = current->flags & PF_NOFREEZE; +- long saved_state; ++ struct task_struct *self = current; ++ ktime_t chill_time; + +- saved_state = current->state; +- chill_time = ktime_set(0, NSEC_PER_MSEC); ++ raw_spin_lock_irq(&self->pi_lock); ++ self->saved_state = self->state; + __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock_irq(&self->pi_lock); ++ ++ chill_time = ktime_set(0, NSEC_PER_MSEC); ++ + current->flags |= PF_NOFREEZE; + sleeping_lock_inc(); + schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); + sleeping_lock_dec(); + if (!freeze_flag) + current->flags &= ~PF_NOFREEZE; +- __set_current_state_no_track(saved_state); ++ ++ raw_spin_lock_irq(&self->pi_lock); ++ __set_current_state_no_track(self->saved_state); ++ self->saved_state = TASK_RUNNING; ++ raw_spin_unlock_irq(&self->pi_lock); + } + EXPORT_SYMBOL(cpu_chill); + #endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0185-block-blk-mq-move-blk_queue_usage_counter_release-in.patch linux-4.19.118/debian/patches-rt/0185-block-blk-mq-move-blk_queue_usage_counter_release-in.patch --- linux-4.19.98/debian/patches-rt/0185-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0185-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,120 @@ +From 477882e8bb18263b11d0a1ef9bfeb405e1c08e52 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 13 Mar 2018 13:49:16 +0100 +Subject: [PATCH 185/325] block: blk-mq: move blk_queue_usage_counter_release() + into process context +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +| BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914 +| in_atomic(): 1, irqs_disabled(): 0, pid: 255, name: kworker/u257:6 +| 5 locks held by kworker/u257:6/255: +| #0: ("events_unbound"){.+.+.+}, at: [] process_one_work+0x171/0x5e0 +| #1: ((&entry->work)){+.+.+.}, at: [] process_one_work+0x171/0x5e0 +| #2: (&shost->scan_mutex){+.+.+.}, at: [] __scsi_add_device+0xa3/0x130 [scsi_mod] +| #3: (&set->tag_list_lock){+.+...}, at: [] blk_mq_init_queue+0x96a/0xa50 +| #4: (rcu_read_lock_sched){......}, at: [] percpu_ref_kill_and_confirm+0x1d/0x120 +| Preemption disabled at:[] blk_mq_freeze_queue_start+0x56/0x70 +| +| CPU: 2 PID: 255 Comm: kworker/u257:6 Not tainted 3.18.7-rt0+ #1 +| Workqueue: events_unbound async_run_entry_fn +| 0000000000000003 ffff8800bc29f998 ffffffff815b3a12 0000000000000000 +| 0000000000000000 ffff8800bc29f9b8 ffffffff8109aa16 ffff8800bc29fa28 +| ffff8800bc5d1bc8 ffff8800bc29f9e8 ffffffff815b8dd4 ffff880000000000 +| Call Trace: +| [] dump_stack+0x4f/0x7c +| [] __might_sleep+0x116/0x190 +| [] rt_spin_lock+0x24/0x60 +| [] __wake_up+0x29/0x60 +| [] blk_mq_usage_counter_release+0x1e/0x20 +| [] percpu_ref_kill_and_confirm+0x106/0x120 +| [] blk_mq_freeze_queue_start+0x56/0x70 +| [] blk_mq_update_tag_set_depth+0x40/0xd0 +| [] blk_mq_init_queue+0x98c/0xa50 +| [] scsi_mq_alloc_queue+0x20/0x60 [scsi_mod] +| [] scsi_alloc_sdev+0x2f5/0x370 [scsi_mod] +| [] scsi_probe_and_add_lun+0x9e4/0xdd0 [scsi_mod] +| [] __scsi_add_device+0x126/0x130 [scsi_mod] +| [] ata_scsi_scan_host+0xaf/0x200 [libata] +| [] async_port_probe+0x46/0x60 [libata] +| [] async_run_entry_fn+0x3b/0xf0 +| [] process_one_work+0x201/0x5e0 + +percpu_ref_kill_and_confirm() invokes blk_mq_usage_counter_release() in +a rcu-sched region. swait based wake queue can't be used due to +wake_up_all() usage and disabled interrupts in !RT configs (as reported +by Corey Minyard). +The wq_has_sleeper() check has been suggested by Peter Zijlstra. + +Signed-off-by: Sebastian Andrzej Siewior +--- + block/blk-core.c | 14 +++++++++++++- + include/linux/blkdev.h | 2 ++ + 2 files changed, 15 insertions(+), 1 deletion(-) + +diff --git a/block/blk-core.c b/block/blk-core.c +index 4860cd26cd5a..13bf37156bb0 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -973,12 +973,21 @@ void blk_queue_exit(struct request_queue *q) + percpu_ref_put(&q->q_usage_counter); + } + ++static void blk_queue_usage_counter_release_swork(struct swork_event *sev) ++{ ++ struct request_queue *q = ++ container_of(sev, struct request_queue, mq_pcpu_wake); ++ ++ wake_up_all(&q->mq_freeze_wq); ++} ++ + static void blk_queue_usage_counter_release(struct percpu_ref *ref) + { + struct request_queue *q = + container_of(ref, struct request_queue, q_usage_counter); + +- wake_up_all(&q->mq_freeze_wq); ++ if (wq_has_sleeper(&q->mq_freeze_wq)) ++ swork_queue(&q->mq_pcpu_wake); + } + + static void blk_rq_timed_out_timer(struct timer_list *t) +@@ -1075,6 +1084,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, + queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); + + init_waitqueue_head(&q->mq_freeze_wq); ++ INIT_SWORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_swork); + + /* + * Init percpu_ref in atomic mode so that it's faster to shutdown. +@@ -3964,6 +3974,8 @@ int __init blk_dev_init(void) + if (!kblockd_workqueue) + panic("Failed to create kblockd\n"); + ++ BUG_ON(swork_get()); ++ + request_cachep = kmem_cache_create("blkdev_requests", + sizeof(struct request), 0, SLAB_PANIC, NULL); + +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 111ab4209797..2f3b2e5196eb 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + + struct module; + struct scsi_ioctl_command; +@@ -655,6 +656,7 @@ struct request_queue { + #endif + struct rcu_head rcu_head; + wait_queue_head_t mq_freeze_wq; ++ struct swork_event mq_pcpu_wake; + struct percpu_ref q_usage_counter; + struct list_head all_q_node; + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0185-hrtimer-cpu_chill-save-task-state-in-saved_state.patch linux-4.19.118/debian/patches-rt/0185-hrtimer-cpu_chill-save-task-state-in-saved_state.patch --- linux-4.19.98/debian/patches-rt/0185-hrtimer-cpu_chill-save-task-state-in-saved_state.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0185-hrtimer-cpu_chill-save-task-state-in-saved_state.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -From fe55dde1efd56a8afb667d104442861cde103feb Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 26 Feb 2019 12:31:10 +0100 -Subject: [PATCH 185/290] hrtimer: cpu_chill(): save task state in - ->saved_state() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In the previous change I saved the current task state on stack. This was -bad because while the task is scheduled-out it might receive a wake-up. -The wake up changes the task state and we must not destroy it. - -Save the task-state in ->saved_state under a PI-lock to unsure that -state changes during are not missed while the task temporary scheduled -out. - -Reported-by: Mike Galbraith -Tested-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/time/hrtimer.c | 18 +++++++++++++----- - 1 file changed, 13 insertions(+), 5 deletions(-) - -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 21a454557c8a..f16cbc98c47a 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -1903,20 +1903,28 @@ COMPAT_SYSCALL_DEFINE2(nanosleep, struct compat_timespec __user *, rqtp, - */ - void cpu_chill(void) - { -- ktime_t chill_time; - unsigned int freeze_flag = current->flags & PF_NOFREEZE; -- long saved_state; -+ struct task_struct *self = current; -+ ktime_t chill_time; - -- saved_state = current->state; -- chill_time = ktime_set(0, NSEC_PER_MSEC); -+ raw_spin_lock_irq(&self->pi_lock); -+ self->saved_state = self->state; - __set_current_state_no_track(TASK_UNINTERRUPTIBLE); -+ raw_spin_unlock_irq(&self->pi_lock); -+ -+ chill_time = ktime_set(0, NSEC_PER_MSEC); -+ - current->flags |= PF_NOFREEZE; - sleeping_lock_inc(); - schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); - sleeping_lock_dec(); - if (!freeze_flag) - current->flags &= ~PF_NOFREEZE; -- __set_current_state_no_track(saved_state); -+ -+ raw_spin_lock_irq(&self->pi_lock); -+ __set_current_state_no_track(self->saved_state); -+ self->saved_state = TASK_RUNNING; -+ raw_spin_unlock_irq(&self->pi_lock); - } - EXPORT_SYMBOL(cpu_chill); - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0186-block-Use-cpu_chill-for-retry-loops.patch linux-4.19.118/debian/patches-rt/0186-block-Use-cpu_chill-for-retry-loops.patch --- linux-4.19.98/debian/patches-rt/0186-block-Use-cpu_chill-for-retry-loops.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0186-block-Use-cpu_chill-for-retry-loops.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,51 @@ +From ebf1bbe26f6a3b6b1e785632dc79a9e66e81adc2 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 20 Dec 2012 18:28:26 +0100 +Subject: [PATCH 186/325] block: Use cpu_chill() for retry loops +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Retry loops on RT might loop forever when the modifying side was +preempted. Steven also observed a live lock when there was a +concurrent priority boosting going on. + +Use cpu_chill() instead of cpu_relax() to let the system +make progress. + +Signed-off-by: Thomas Gleixner +--- + block/blk-ioc.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/block/blk-ioc.c b/block/blk-ioc.c +index 01580f88fcb3..98d87e52ccdc 100644 +--- a/block/blk-ioc.c ++++ b/block/blk-ioc.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + + #include "blk.h" + +@@ -118,7 +119,7 @@ static void ioc_release_fn(struct work_struct *work) + spin_unlock(q->queue_lock); + } else { + spin_unlock_irqrestore(&ioc->lock, flags); +- cpu_relax(); ++ cpu_chill(); + spin_lock_irqsave_nested(&ioc->lock, flags, 1); + } + } +@@ -202,7 +203,7 @@ void put_io_context_active(struct io_context *ioc) + spin_unlock(icq->q->queue_lock); + } else { + spin_unlock_irqrestore(&ioc->lock, flags); +- cpu_relax(); ++ cpu_chill(); + goto retry; + } + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0186-block-blk-mq-move-blk_queue_usage_counter_release-in.patch linux-4.19.118/debian/patches-rt/0186-block-blk-mq-move-blk_queue_usage_counter_release-in.patch --- linux-4.19.98/debian/patches-rt/0186-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0186-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -From a315826e2a7f0937429019a4fc122b56a4a827b9 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 13 Mar 2018 13:49:16 +0100 -Subject: [PATCH 186/290] block: blk-mq: move blk_queue_usage_counter_release() - into process context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -| BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914 -| in_atomic(): 1, irqs_disabled(): 0, pid: 255, name: kworker/u257:6 -| 5 locks held by kworker/u257:6/255: -| #0: ("events_unbound"){.+.+.+}, at: [] process_one_work+0x171/0x5e0 -| #1: ((&entry->work)){+.+.+.}, at: [] process_one_work+0x171/0x5e0 -| #2: (&shost->scan_mutex){+.+.+.}, at: [] __scsi_add_device+0xa3/0x130 [scsi_mod] -| #3: (&set->tag_list_lock){+.+...}, at: [] blk_mq_init_queue+0x96a/0xa50 -| #4: (rcu_read_lock_sched){......}, at: [] percpu_ref_kill_and_confirm+0x1d/0x120 -| Preemption disabled at:[] blk_mq_freeze_queue_start+0x56/0x70 -| -| CPU: 2 PID: 255 Comm: kworker/u257:6 Not tainted 3.18.7-rt0+ #1 -| Workqueue: events_unbound async_run_entry_fn -| 0000000000000003 ffff8800bc29f998 ffffffff815b3a12 0000000000000000 -| 0000000000000000 ffff8800bc29f9b8 ffffffff8109aa16 ffff8800bc29fa28 -| ffff8800bc5d1bc8 ffff8800bc29f9e8 ffffffff815b8dd4 ffff880000000000 -| Call Trace: -| [] dump_stack+0x4f/0x7c -| [] __might_sleep+0x116/0x190 -| [] rt_spin_lock+0x24/0x60 -| [] __wake_up+0x29/0x60 -| [] blk_mq_usage_counter_release+0x1e/0x20 -| [] percpu_ref_kill_and_confirm+0x106/0x120 -| [] blk_mq_freeze_queue_start+0x56/0x70 -| [] blk_mq_update_tag_set_depth+0x40/0xd0 -| [] blk_mq_init_queue+0x98c/0xa50 -| [] scsi_mq_alloc_queue+0x20/0x60 [scsi_mod] -| [] scsi_alloc_sdev+0x2f5/0x370 [scsi_mod] -| [] scsi_probe_and_add_lun+0x9e4/0xdd0 [scsi_mod] -| [] __scsi_add_device+0x126/0x130 [scsi_mod] -| [] ata_scsi_scan_host+0xaf/0x200 [libata] -| [] async_port_probe+0x46/0x60 [libata] -| [] async_run_entry_fn+0x3b/0xf0 -| [] process_one_work+0x201/0x5e0 - -percpu_ref_kill_and_confirm() invokes blk_mq_usage_counter_release() in -a rcu-sched region. swait based wake queue can't be used due to -wake_up_all() usage and disabled interrupts in !RT configs (as reported -by Corey Minyard). -The wq_has_sleeper() check has been suggested by Peter Zijlstra. - -Signed-off-by: Sebastian Andrzej Siewior ---- - block/blk-core.c | 14 +++++++++++++- - include/linux/blkdev.h | 2 ++ - 2 files changed, 15 insertions(+), 1 deletion(-) - -diff --git a/block/blk-core.c b/block/blk-core.c -index 4860cd26cd5a..13bf37156bb0 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -973,12 +973,21 @@ void blk_queue_exit(struct request_queue *q) - percpu_ref_put(&q->q_usage_counter); - } - -+static void blk_queue_usage_counter_release_swork(struct swork_event *sev) -+{ -+ struct request_queue *q = -+ container_of(sev, struct request_queue, mq_pcpu_wake); -+ -+ wake_up_all(&q->mq_freeze_wq); -+} -+ - static void blk_queue_usage_counter_release(struct percpu_ref *ref) - { - struct request_queue *q = - container_of(ref, struct request_queue, q_usage_counter); - -- wake_up_all(&q->mq_freeze_wq); -+ if (wq_has_sleeper(&q->mq_freeze_wq)) -+ swork_queue(&q->mq_pcpu_wake); - } - - static void blk_rq_timed_out_timer(struct timer_list *t) -@@ -1075,6 +1084,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, - queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); - - init_waitqueue_head(&q->mq_freeze_wq); -+ INIT_SWORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_swork); - - /* - * Init percpu_ref in atomic mode so that it's faster to shutdown. -@@ -3964,6 +3974,8 @@ int __init blk_dev_init(void) - if (!kblockd_workqueue) - panic("Failed to create kblockd\n"); - -+ BUG_ON(swork_get()); -+ - request_cachep = kmem_cache_create("blkdev_requests", - sizeof(struct request), 0, SLAB_PANIC, NULL); - -diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h -index f1960add94df..7b7c0bc6a514 100644 ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - - struct module; - struct scsi_ioctl_command; -@@ -655,6 +656,7 @@ struct request_queue { - #endif - struct rcu_head rcu_head; - wait_queue_head_t mq_freeze_wq; -+ struct swork_event mq_pcpu_wake; - struct percpu_ref q_usage_counter; - struct list_head all_q_node; - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0187-block-Use-cpu_chill-for-retry-loops.patch linux-4.19.118/debian/patches-rt/0187-block-Use-cpu_chill-for-retry-loops.patch --- linux-4.19.98/debian/patches-rt/0187-block-Use-cpu_chill-for-retry-loops.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0187-block-Use-cpu_chill-for-retry-loops.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -From effa2a0476d7f71cd3c5007874c228db414f3318 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 20 Dec 2012 18:28:26 +0100 -Subject: [PATCH 187/290] block: Use cpu_chill() for retry loops -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Retry loops on RT might loop forever when the modifying side was -preempted. Steven also observed a live lock when there was a -concurrent priority boosting going on. - -Use cpu_chill() instead of cpu_relax() to let the system -make progress. - -Signed-off-by: Thomas Gleixner ---- - block/blk-ioc.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/block/blk-ioc.c b/block/blk-ioc.c -index 01580f88fcb3..98d87e52ccdc 100644 ---- a/block/blk-ioc.c -+++ b/block/blk-ioc.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - - #include "blk.h" - -@@ -118,7 +119,7 @@ static void ioc_release_fn(struct work_struct *work) - spin_unlock(q->queue_lock); - } else { - spin_unlock_irqrestore(&ioc->lock, flags); -- cpu_relax(); -+ cpu_chill(); - spin_lock_irqsave_nested(&ioc->lock, flags, 1); - } - } -@@ -202,7 +203,7 @@ void put_io_context_active(struct io_context *ioc) - spin_unlock(icq->q->queue_lock); - } else { - spin_unlock_irqrestore(&ioc->lock, flags); -- cpu_relax(); -+ cpu_chill(); - goto retry; - } - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0187-fs-dcache-Use-cpu_chill-in-trylock-loops.patch linux-4.19.118/debian/patches-rt/0187-fs-dcache-Use-cpu_chill-in-trylock-loops.patch --- linux-4.19.98/debian/patches-rt/0187-fs-dcache-Use-cpu_chill-in-trylock-loops.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0187-fs-dcache-Use-cpu_chill-in-trylock-loops.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,66 @@ +From f5454f2bfe74411fddac95ad5c3c8526ad6b28a3 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 7 Mar 2012 21:00:34 +0100 +Subject: [PATCH 187/325] fs: dcache: Use cpu_chill() in trylock loops +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Retry loops on RT might loop forever when the modifying side was +preempted. Use cpu_chill() instead of cpu_relax() to let the system +make progress. + +Signed-off-by: Thomas Gleixner +--- + fs/autofs/expire.c | 3 ++- + fs/namespace.c | 8 ++++++-- + 2 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/fs/autofs/expire.c b/fs/autofs/expire.c +index 70e9afe589fb..1a6b88ad4fe0 100644 +--- a/fs/autofs/expire.c ++++ b/fs/autofs/expire.c +@@ -8,6 +8,7 @@ + * option, any later version, incorporated herein by reference. + */ + ++#include + #include "autofs_i.h" + + /* Check if a dentry can be expired */ +@@ -153,7 +154,7 @@ static struct dentry *get_next_positive_dentry(struct dentry *prev, + parent = p->d_parent; + if (!spin_trylock(&parent->d_lock)) { + spin_unlock(&p->d_lock); +- cpu_relax(); ++ cpu_chill(); + goto relock; + } + spin_unlock(&p->d_lock); +diff --git a/fs/namespace.c b/fs/namespace.c +index 1fce41ba3535..5dc970027e30 100644 +--- a/fs/namespace.c ++++ b/fs/namespace.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -327,8 +328,11 @@ int __mnt_want_write(struct vfsmount *m) + * incremented count after it has set MNT_WRITE_HOLD. + */ + smp_mb(); +- while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) +- cpu_relax(); ++ while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) { ++ preempt_enable(); ++ cpu_chill(); ++ preempt_disable(); ++ } + /* + * After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will + * be set to match its requirements. So we must not load that until +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0188-fs-dcache-Use-cpu_chill-in-trylock-loops.patch linux-4.19.118/debian/patches-rt/0188-fs-dcache-Use-cpu_chill-in-trylock-loops.patch --- linux-4.19.98/debian/patches-rt/0188-fs-dcache-Use-cpu_chill-in-trylock-loops.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0188-fs-dcache-Use-cpu_chill-in-trylock-loops.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -From 3757c05ac9fc60a97b20abf3681d7f869c368be6 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 7 Mar 2012 21:00:34 +0100 -Subject: [PATCH 188/290] fs: dcache: Use cpu_chill() in trylock loops -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Retry loops on RT might loop forever when the modifying side was -preempted. Use cpu_chill() instead of cpu_relax() to let the system -make progress. - -Signed-off-by: Thomas Gleixner ---- - fs/autofs/expire.c | 3 ++- - fs/namespace.c | 8 ++++++-- - 2 files changed, 8 insertions(+), 3 deletions(-) - -diff --git a/fs/autofs/expire.c b/fs/autofs/expire.c -index 70e9afe589fb..1a6b88ad4fe0 100644 ---- a/fs/autofs/expire.c -+++ b/fs/autofs/expire.c -@@ -8,6 +8,7 @@ - * option, any later version, incorporated herein by reference. - */ - -+#include - #include "autofs_i.h" - - /* Check if a dentry can be expired */ -@@ -153,7 +154,7 @@ static struct dentry *get_next_positive_dentry(struct dentry *prev, - parent = p->d_parent; - if (!spin_trylock(&parent->d_lock)) { - spin_unlock(&p->d_lock); -- cpu_relax(); -+ cpu_chill(); - goto relock; - } - spin_unlock(&p->d_lock); -diff --git a/fs/namespace.c b/fs/namespace.c -index 1fce41ba3535..5dc970027e30 100644 ---- a/fs/namespace.c -+++ b/fs/namespace.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -327,8 +328,11 @@ int __mnt_want_write(struct vfsmount *m) - * incremented count after it has set MNT_WRITE_HOLD. - */ - smp_mb(); -- while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) -- cpu_relax(); -+ while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) { -+ preempt_enable(); -+ cpu_chill(); -+ preempt_disable(); -+ } - /* - * After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will - * be set to match its requirements. So we must not load that until --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0188-net-Use-cpu_chill-instead-of-cpu_relax.patch linux-4.19.118/debian/patches-rt/0188-net-Use-cpu_chill-instead-of-cpu_relax.patch --- linux-4.19.98/debian/patches-rt/0188-net-Use-cpu_chill-instead-of-cpu_relax.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0188-net-Use-cpu_chill-instead-of-cpu_relax.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,70 @@ +From c9660b290b88ad7b1e058ecba70708b21eaff85b Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 7 Mar 2012 21:10:04 +0100 +Subject: [PATCH 188/325] net: Use cpu_chill() instead of cpu_relax() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Retry loops on RT might loop forever when the modifying side was +preempted. Use cpu_chill() instead of cpu_relax() to let the system +make progress. + +Signed-off-by: Thomas Gleixner +--- + net/packet/af_packet.c | 5 +++-- + net/rds/ib_rdma.c | 3 ++- + 2 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +index 0e029aefa707..74e78df6cdf8 100644 +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -63,6 +63,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -668,7 +669,7 @@ static void prb_retire_rx_blk_timer_expired(struct timer_list *t) + if (BLOCK_NUM_PKTS(pbd)) { + while (atomic_read(&pkc->blk_fill_in_prog)) { + /* Waiting for skb_copy_bits to finish... */ +- cpu_relax(); ++ cpu_chill(); + } + } + +@@ -930,7 +931,7 @@ static void prb_retire_current_block(struct tpacket_kbdq_core *pkc, + if (!(status & TP_STATUS_BLK_TMO)) { + while (atomic_read(&pkc->blk_fill_in_prog)) { + /* Waiting for skb_copy_bits to finish... */ +- cpu_relax(); ++ cpu_chill(); + } + } + prb_close_block(pkc, pbd, po, status); +diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c +index 0b347f46b2f4..f395f06031bc 100644 +--- a/net/rds/ib_rdma.c ++++ b/net/rds/ib_rdma.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + #include "rds_single_path.h" + #include "ib_mr.h" +@@ -222,7 +223,7 @@ static inline void wait_clean_list_grace(void) + for_each_online_cpu(cpu) { + flag = &per_cpu(clean_list_grace, cpu); + while (test_bit(CLEAN_LIST_BUSY_BIT, flag)) +- cpu_relax(); ++ cpu_chill(); + } + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0189-fs-dcache-use-swait_queue-instead-of-waitqueue.patch linux-4.19.118/debian/patches-rt/0189-fs-dcache-use-swait_queue-instead-of-waitqueue.patch --- linux-4.19.98/debian/patches-rt/0189-fs-dcache-use-swait_queue-instead-of-waitqueue.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0189-fs-dcache-use-swait_queue-instead-of-waitqueue.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,241 @@ +From 44b16a4955e56c4a19b1e22c45172500d8ad261d Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 14 Sep 2016 14:35:49 +0200 +Subject: [PATCH 189/325] fs/dcache: use swait_queue instead of waitqueue +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +__d_lookup_done() invokes wake_up_all() while holding a hlist_bl_lock() +which disables preemption. As a workaround convert it to swait. + +Signed-off-by: Sebastian Andrzej Siewior +--- + fs/cifs/readdir.c | 2 +- + fs/dcache.c | 27 +++++++++++++++------------ + fs/fuse/dir.c | 2 +- + fs/namei.c | 4 ++-- + fs/nfs/dir.c | 4 ++-- + fs/nfs/unlink.c | 4 ++-- + fs/proc/base.c | 2 +- + fs/proc/proc_sysctl.c | 2 +- + include/linux/dcache.h | 4 ++-- + include/linux/nfs_xdr.h | 2 +- + kernel/sched/swait.c | 1 + + 11 files changed, 29 insertions(+), 25 deletions(-) + +diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c +index 3925a7bfc74d..33f7723fb83e 100644 +--- a/fs/cifs/readdir.c ++++ b/fs/cifs/readdir.c +@@ -80,7 +80,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, + struct inode *inode; + struct super_block *sb = parent->d_sb; + struct cifs_sb_info *cifs_sb = CIFS_SB(sb); +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + cifs_dbg(FYI, "%s: for %s\n", __func__, name->name); + +diff --git a/fs/dcache.c b/fs/dcache.c +index dcde8ffe384c..b2a00f3ff7df 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -2421,21 +2421,24 @@ static inline void end_dir_add(struct inode *dir, unsigned n) + + static void d_wait_lookup(struct dentry *dentry) + { +- if (d_in_lookup(dentry)) { +- DECLARE_WAITQUEUE(wait, current); +- add_wait_queue(dentry->d_wait, &wait); +- do { +- set_current_state(TASK_UNINTERRUPTIBLE); +- spin_unlock(&dentry->d_lock); +- schedule(); +- spin_lock(&dentry->d_lock); +- } while (d_in_lookup(dentry)); +- } ++ struct swait_queue __wait; ++ ++ if (!d_in_lookup(dentry)) ++ return; ++ ++ INIT_LIST_HEAD(&__wait.task_list); ++ do { ++ prepare_to_swait_exclusive(dentry->d_wait, &__wait, TASK_UNINTERRUPTIBLE); ++ spin_unlock(&dentry->d_lock); ++ schedule(); ++ spin_lock(&dentry->d_lock); ++ } while (d_in_lookup(dentry)); ++ finish_swait(dentry->d_wait, &__wait); + } + + struct dentry *d_alloc_parallel(struct dentry *parent, + const struct qstr *name, +- wait_queue_head_t *wq) ++ struct swait_queue_head *wq) + { + unsigned int hash = name->hash; + struct hlist_bl_head *b = in_lookup_hash(parent, hash); +@@ -2550,7 +2553,7 @@ void __d_lookup_done(struct dentry *dentry) + hlist_bl_lock(b); + dentry->d_flags &= ~DCACHE_PAR_LOOKUP; + __hlist_bl_del(&dentry->d_u.d_in_lookup_hash); +- wake_up_all(dentry->d_wait); ++ swake_up_all(dentry->d_wait); + dentry->d_wait = NULL; + hlist_bl_unlock(b); + INIT_HLIST_NODE(&dentry->d_u.d_alias); +diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c +index 6244345a5745..7ee10b7cc808 100644 +--- a/fs/fuse/dir.c ++++ b/fs/fuse/dir.c +@@ -1213,7 +1213,7 @@ static int fuse_direntplus_link(struct file *file, + struct inode *dir = d_inode(parent); + struct fuse_conn *fc; + struct inode *inode; +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + if (!o->nodeid) { + /* +diff --git a/fs/namei.c b/fs/namei.c +index 327844fedf3d..5114c8111807 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -1646,7 +1646,7 @@ static struct dentry *__lookup_slow(const struct qstr *name, + { + struct dentry *dentry, *old; + struct inode *inode = dir->d_inode; +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + /* Don't go there if it's already dead */ + if (unlikely(IS_DEADDIR(inode))) +@@ -3136,7 +3136,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, + struct dentry *dentry; + int error, create_error = 0; + umode_t mode = op->mode; +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + if (unlikely(IS_DEADDIR(dir_inode))) + return -ENOENT; +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c +index c60b20884c45..7e653c14c7ed 100644 +--- a/fs/nfs/dir.c ++++ b/fs/nfs/dir.c +@@ -457,7 +457,7 @@ static + void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) + { + struct qstr filename = QSTR_INIT(entry->name, entry->len); +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + struct dentry *dentry; + struct dentry *alias; + struct inode *dir = d_inode(parent); +@@ -1516,7 +1516,7 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry, + struct file *file, unsigned open_flags, + umode_t mode) + { +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + struct nfs_open_context *ctx; + struct dentry *res; + struct iattr attr = { .ia_valid = ATTR_OPEN }; +diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c +index ce9100b5604d..839bfa76f41e 100644 +--- a/fs/nfs/unlink.c ++++ b/fs/nfs/unlink.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + +@@ -206,7 +206,7 @@ nfs_async_unlink(struct dentry *dentry, const struct qstr *name) + goto out_free_name; + } + data->res.dir_attr = &data->dir_attr; +- init_waitqueue_head(&data->wq); ++ init_swait_queue_head(&data->wq); + + status = -EBUSY; + spin_lock(&dentry->d_lock); +diff --git a/fs/proc/base.c b/fs/proc/base.c +index 3b9b726b1a6c..a45d4d640f01 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -1890,7 +1890,7 @@ bool proc_fill_cache(struct file *file, struct dir_context *ctx, + + child = d_hash_and_lookup(dir, &qname); + if (!child) { +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + child = d_alloc_parallel(dir, &qname, &wq); + if (IS_ERR(child)) + goto end_instantiate; +diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c +index c95f32b83a94..75f500cb7e74 100644 +--- a/fs/proc/proc_sysctl.c ++++ b/fs/proc/proc_sysctl.c +@@ -681,7 +681,7 @@ static bool proc_sys_fill_cache(struct file *file, + + child = d_lookup(dir, &qname); + if (!child) { +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + child = d_alloc_parallel(dir, &qname, &wq); + if (IS_ERR(child)) + return false; +diff --git a/include/linux/dcache.h b/include/linux/dcache.h +index 0880baefd85f..8b4d6c8c1f7f 100644 +--- a/include/linux/dcache.h ++++ b/include/linux/dcache.h +@@ -105,7 +105,7 @@ struct dentry { + + union { + struct list_head d_lru; /* LRU list */ +- wait_queue_head_t *d_wait; /* in-lookup ones only */ ++ struct swait_queue_head *d_wait; /* in-lookup ones only */ + }; + struct list_head d_child; /* child of parent list */ + struct list_head d_subdirs; /* our children */ +@@ -236,7 +236,7 @@ extern struct dentry * d_alloc(struct dentry *, const struct qstr *); + extern struct dentry * d_alloc_anon(struct super_block *); + extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *); + extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *, +- wait_queue_head_t *); ++ struct swait_queue_head *); + extern struct dentry * d_splice_alias(struct inode *, struct dentry *); + extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *); + extern struct dentry * d_exact_alias(struct dentry *, struct inode *); +diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h +index cab24a127feb..73b0d19ef0d9 100644 +--- a/include/linux/nfs_xdr.h ++++ b/include/linux/nfs_xdr.h +@@ -1549,7 +1549,7 @@ struct nfs_unlinkdata { + struct nfs_removeargs args; + struct nfs_removeres res; + struct dentry *dentry; +- wait_queue_head_t wq; ++ struct swait_queue_head wq; + struct rpc_cred *cred; + struct nfs_fattr dir_attr; + long timeout; +diff --git a/kernel/sched/swait.c b/kernel/sched/swait.c +index c7cb30cdd1b7..119a56d7f739 100644 +--- a/kernel/sched/swait.c ++++ b/kernel/sched/swait.c +@@ -70,6 +70,7 @@ void swake_up_all(struct swait_queue_head *q) + struct swait_queue *curr; + LIST_HEAD(tmp); + ++ WARN_ON(irqs_disabled()); + raw_spin_lock_irq(&q->lock); + list_splice_init(&q->task_list, &tmp); + while (!list_empty(&tmp)) { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0189-net-Use-cpu_chill-instead-of-cpu_relax.patch linux-4.19.118/debian/patches-rt/0189-net-Use-cpu_chill-instead-of-cpu_relax.patch --- linux-4.19.98/debian/patches-rt/0189-net-Use-cpu_chill-instead-of-cpu_relax.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0189-net-Use-cpu_chill-instead-of-cpu_relax.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -From 8f296bb8916125380ca66e63999aac396f5ab698 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 7 Mar 2012 21:10:04 +0100 -Subject: [PATCH 189/290] net: Use cpu_chill() instead of cpu_relax() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Retry loops on RT might loop forever when the modifying side was -preempted. Use cpu_chill() instead of cpu_relax() to let the system -make progress. - -Signed-off-by: Thomas Gleixner ---- - net/packet/af_packet.c | 5 +++-- - net/rds/ib_rdma.c | 3 ++- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c -index ac65e66d1d72..b4267ce1f869 100644 ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -63,6 +63,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -668,7 +669,7 @@ static void prb_retire_rx_blk_timer_expired(struct timer_list *t) - if (BLOCK_NUM_PKTS(pbd)) { - while (atomic_read(&pkc->blk_fill_in_prog)) { - /* Waiting for skb_copy_bits to finish... */ -- cpu_relax(); -+ cpu_chill(); - } - } - -@@ -930,7 +931,7 @@ static void prb_retire_current_block(struct tpacket_kbdq_core *pkc, - if (!(status & TP_STATUS_BLK_TMO)) { - while (atomic_read(&pkc->blk_fill_in_prog)) { - /* Waiting for skb_copy_bits to finish... */ -- cpu_relax(); -+ cpu_chill(); - } - } - prb_close_block(pkc, pbd, po, status); -diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c -index 0b347f46b2f4..f395f06031bc 100644 ---- a/net/rds/ib_rdma.c -+++ b/net/rds/ib_rdma.c -@@ -34,6 +34,7 @@ - #include - #include - #include -+#include - - #include "rds_single_path.h" - #include "ib_mr.h" -@@ -222,7 +223,7 @@ static inline void wait_clean_list_grace(void) - for_each_online_cpu(cpu) { - flag = &per_cpu(clean_list_grace, cpu); - while (test_bit(CLEAN_LIST_BUSY_BIT, flag)) -- cpu_relax(); -+ cpu_chill(); - } - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0190-fs-dcache-use-swait_queue-instead-of-waitqueue.patch linux-4.19.118/debian/patches-rt/0190-fs-dcache-use-swait_queue-instead-of-waitqueue.patch --- linux-4.19.98/debian/patches-rt/0190-fs-dcache-use-swait_queue-instead-of-waitqueue.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0190-fs-dcache-use-swait_queue-instead-of-waitqueue.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,241 +0,0 @@ -From 558647aa05135aa727be9198f29a041686e683af Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 14 Sep 2016 14:35:49 +0200 -Subject: [PATCH 190/290] fs/dcache: use swait_queue instead of waitqueue -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -__d_lookup_done() invokes wake_up_all() while holding a hlist_bl_lock() -which disables preemption. As a workaround convert it to swait. - -Signed-off-by: Sebastian Andrzej Siewior ---- - fs/cifs/readdir.c | 2 +- - fs/dcache.c | 27 +++++++++++++++------------ - fs/fuse/dir.c | 2 +- - fs/namei.c | 4 ++-- - fs/nfs/dir.c | 4 ++-- - fs/nfs/unlink.c | 4 ++-- - fs/proc/base.c | 2 +- - fs/proc/proc_sysctl.c | 2 +- - include/linux/dcache.h | 4 ++-- - include/linux/nfs_xdr.h | 2 +- - kernel/sched/swait.c | 1 + - 11 files changed, 29 insertions(+), 25 deletions(-) - -diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c -index 3925a7bfc74d..33f7723fb83e 100644 ---- a/fs/cifs/readdir.c -+++ b/fs/cifs/readdir.c -@@ -80,7 +80,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, - struct inode *inode; - struct super_block *sb = parent->d_sb; - struct cifs_sb_info *cifs_sb = CIFS_SB(sb); -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - cifs_dbg(FYI, "%s: for %s\n", __func__, name->name); - -diff --git a/fs/dcache.c b/fs/dcache.c -index dcde8ffe384c..b2a00f3ff7df 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -2421,21 +2421,24 @@ static inline void end_dir_add(struct inode *dir, unsigned n) - - static void d_wait_lookup(struct dentry *dentry) - { -- if (d_in_lookup(dentry)) { -- DECLARE_WAITQUEUE(wait, current); -- add_wait_queue(dentry->d_wait, &wait); -- do { -- set_current_state(TASK_UNINTERRUPTIBLE); -- spin_unlock(&dentry->d_lock); -- schedule(); -- spin_lock(&dentry->d_lock); -- } while (d_in_lookup(dentry)); -- } -+ struct swait_queue __wait; -+ -+ if (!d_in_lookup(dentry)) -+ return; -+ -+ INIT_LIST_HEAD(&__wait.task_list); -+ do { -+ prepare_to_swait_exclusive(dentry->d_wait, &__wait, TASK_UNINTERRUPTIBLE); -+ spin_unlock(&dentry->d_lock); -+ schedule(); -+ spin_lock(&dentry->d_lock); -+ } while (d_in_lookup(dentry)); -+ finish_swait(dentry->d_wait, &__wait); - } - - struct dentry *d_alloc_parallel(struct dentry *parent, - const struct qstr *name, -- wait_queue_head_t *wq) -+ struct swait_queue_head *wq) - { - unsigned int hash = name->hash; - struct hlist_bl_head *b = in_lookup_hash(parent, hash); -@@ -2550,7 +2553,7 @@ void __d_lookup_done(struct dentry *dentry) - hlist_bl_lock(b); - dentry->d_flags &= ~DCACHE_PAR_LOOKUP; - __hlist_bl_del(&dentry->d_u.d_in_lookup_hash); -- wake_up_all(dentry->d_wait); -+ swake_up_all(dentry->d_wait); - dentry->d_wait = NULL; - hlist_bl_unlock(b); - INIT_HLIST_NODE(&dentry->d_u.d_alias); -diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c -index 6244345a5745..7ee10b7cc808 100644 ---- a/fs/fuse/dir.c -+++ b/fs/fuse/dir.c -@@ -1213,7 +1213,7 @@ static int fuse_direntplus_link(struct file *file, - struct inode *dir = d_inode(parent); - struct fuse_conn *fc; - struct inode *inode; -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - if (!o->nodeid) { - /* -diff --git a/fs/namei.c b/fs/namei.c -index 914178cdbe94..2a8c41bc227f 100644 ---- a/fs/namei.c -+++ b/fs/namei.c -@@ -1645,7 +1645,7 @@ static struct dentry *__lookup_slow(const struct qstr *name, - { - struct dentry *dentry, *old; - struct inode *inode = dir->d_inode; -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - /* Don't go there if it's already dead */ - if (unlikely(IS_DEADDIR(inode))) -@@ -3135,7 +3135,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, - struct dentry *dentry; - int error, create_error = 0; - umode_t mode = op->mode; -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - - if (unlikely(IS_DEADDIR(dir_inode))) - return -ENOENT; -diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c -index 17f8a9259971..6642f0c321ef 100644 ---- a/fs/nfs/dir.c -+++ b/fs/nfs/dir.c -@@ -445,7 +445,7 @@ static - void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) - { - struct qstr filename = QSTR_INIT(entry->name, entry->len); -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - struct dentry *dentry; - struct dentry *alias; - struct inode *dir = d_inode(parent); -@@ -1495,7 +1495,7 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry, - struct file *file, unsigned open_flags, - umode_t mode) - { -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - struct nfs_open_context *ctx; - struct dentry *res; - struct iattr attr = { .ia_valid = ATTR_OPEN }; -diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c -index ce9100b5604d..839bfa76f41e 100644 ---- a/fs/nfs/unlink.c -+++ b/fs/nfs/unlink.c -@@ -13,7 +13,7 @@ - #include - #include - #include --#include -+#include - #include - #include - -@@ -206,7 +206,7 @@ nfs_async_unlink(struct dentry *dentry, const struct qstr *name) - goto out_free_name; - } - data->res.dir_attr = &data->dir_attr; -- init_waitqueue_head(&data->wq); -+ init_swait_queue_head(&data->wq); - - status = -EBUSY; - spin_lock(&dentry->d_lock); -diff --git a/fs/proc/base.c b/fs/proc/base.c -index 3b9b726b1a6c..a45d4d640f01 100644 ---- a/fs/proc/base.c -+++ b/fs/proc/base.c -@@ -1890,7 +1890,7 @@ bool proc_fill_cache(struct file *file, struct dir_context *ctx, - - child = d_hash_and_lookup(dir, &qname); - if (!child) { -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - child = d_alloc_parallel(dir, &qname, &wq); - if (IS_ERR(child)) - goto end_instantiate; -diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c -index c95f32b83a94..75f500cb7e74 100644 ---- a/fs/proc/proc_sysctl.c -+++ b/fs/proc/proc_sysctl.c -@@ -681,7 +681,7 @@ static bool proc_sys_fill_cache(struct file *file, - - child = d_lookup(dir, &qname); - if (!child) { -- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); -+ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); - child = d_alloc_parallel(dir, &qname, &wq); - if (IS_ERR(child)) - return false; -diff --git a/include/linux/dcache.h b/include/linux/dcache.h -index 0880baefd85f..8b4d6c8c1f7f 100644 ---- a/include/linux/dcache.h -+++ b/include/linux/dcache.h -@@ -105,7 +105,7 @@ struct dentry { - - union { - struct list_head d_lru; /* LRU list */ -- wait_queue_head_t *d_wait; /* in-lookup ones only */ -+ struct swait_queue_head *d_wait; /* in-lookup ones only */ - }; - struct list_head d_child; /* child of parent list */ - struct list_head d_subdirs; /* our children */ -@@ -236,7 +236,7 @@ extern struct dentry * d_alloc(struct dentry *, const struct qstr *); - extern struct dentry * d_alloc_anon(struct super_block *); - extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *); - extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *, -- wait_queue_head_t *); -+ struct swait_queue_head *); - extern struct dentry * d_splice_alias(struct inode *, struct dentry *); - extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *); - extern struct dentry * d_exact_alias(struct dentry *, struct inode *); -diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h -index cab24a127feb..73b0d19ef0d9 100644 ---- a/include/linux/nfs_xdr.h -+++ b/include/linux/nfs_xdr.h -@@ -1549,7 +1549,7 @@ struct nfs_unlinkdata { - struct nfs_removeargs args; - struct nfs_removeres res; - struct dentry *dentry; -- wait_queue_head_t wq; -+ struct swait_queue_head wq; - struct rpc_cred *cred; - struct nfs_fattr dir_attr; - long timeout; -diff --git a/kernel/sched/swait.c b/kernel/sched/swait.c -index c7cb30cdd1b7..119a56d7f739 100644 ---- a/kernel/sched/swait.c -+++ b/kernel/sched/swait.c -@@ -70,6 +70,7 @@ void swake_up_all(struct swait_queue_head *q) - struct swait_queue *curr; - LIST_HEAD(tmp); - -+ WARN_ON(irqs_disabled()); - raw_spin_lock_irq(&q->lock); - list_splice_init(&q->task_list, &tmp); - while (!list_empty(&tmp)) { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0190-workqueue-Use-normal-rcu.patch linux-4.19.118/debian/patches-rt/0190-workqueue-Use-normal-rcu.patch --- linux-4.19.98/debian/patches-rt/0190-workqueue-Use-normal-rcu.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0190-workqueue-Use-normal-rcu.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,360 @@ +From 0b9664b2a0c21a43367d93c893afe90f7c873b5a Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 24 Jul 2013 15:26:54 +0200 +Subject: [PATCH 190/325] workqueue: Use normal rcu +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +There is no need for sched_rcu. The undocumented reason why sched_rcu +is used is to avoid a few explicit rcu_read_lock()/unlock() pairs by +abusing the fact that sched_rcu reader side critical sections are also +protected by preempt or irq disabled regions. + +Signed-off-by: Thomas Gleixner +--- + kernel/workqueue.c | 95 +++++++++++++++++++++++++--------------------- + 1 file changed, 52 insertions(+), 43 deletions(-) + +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index eef77c82d2e1..29dc939dad4e 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -127,7 +127,7 @@ enum { + * + * PL: wq_pool_mutex protected. + * +- * PR: wq_pool_mutex protected for writes. Sched-RCU protected for reads. ++ * PR: wq_pool_mutex protected for writes. RCU protected for reads. + * + * PW: wq_pool_mutex and wq->mutex protected for writes. Either for reads. + * +@@ -136,7 +136,7 @@ enum { + * + * WQ: wq->mutex protected. + * +- * WR: wq->mutex protected for writes. Sched-RCU protected for reads. ++ * WR: wq->mutex protected for writes. RCU protected for reads. + * + * MD: wq_mayday_lock protected. + */ +@@ -183,7 +183,7 @@ struct worker_pool { + atomic_t nr_running ____cacheline_aligned_in_smp; + + /* +- * Destruction of pool is sched-RCU protected to allow dereferences ++ * Destruction of pool is RCU protected to allow dereferences + * from get_work_pool(). + */ + struct rcu_head rcu; +@@ -212,7 +212,7 @@ struct pool_workqueue { + /* + * Release of unbound pwq is punted to system_wq. See put_pwq() + * and pwq_unbound_release_workfn() for details. pool_workqueue +- * itself is also sched-RCU protected so that the first pwq can be ++ * itself is also RCU protected so that the first pwq can be + * determined without grabbing wq->mutex. + */ + struct work_struct unbound_release_work; +@@ -357,20 +357,20 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); + #include + + #define assert_rcu_or_pool_mutex() \ +- RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ ++ RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ + !lockdep_is_held(&wq_pool_mutex), \ +- "sched RCU or wq_pool_mutex should be held") ++ "RCU or wq_pool_mutex should be held") + + #define assert_rcu_or_wq_mutex(wq) \ +- RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ ++ RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ + !lockdep_is_held(&wq->mutex), \ +- "sched RCU or wq->mutex should be held") ++ "RCU or wq->mutex should be held") + + #define assert_rcu_or_wq_mutex_or_pool_mutex(wq) \ +- RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ ++ RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ + !lockdep_is_held(&wq->mutex) && \ + !lockdep_is_held(&wq_pool_mutex), \ +- "sched RCU, wq->mutex or wq_pool_mutex should be held") ++ "RCU, wq->mutex or wq_pool_mutex should be held") + + #define for_each_cpu_worker_pool(pool, cpu) \ + for ((pool) = &per_cpu(cpu_worker_pools, cpu)[0]; \ +@@ -382,7 +382,7 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); + * @pool: iteration cursor + * @pi: integer used for iteration + * +- * This must be called either with wq_pool_mutex held or sched RCU read ++ * This must be called either with wq_pool_mutex held or RCU read + * locked. If the pool needs to be used beyond the locking in effect, the + * caller is responsible for guaranteeing that the pool stays online. + * +@@ -414,7 +414,7 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); + * @pwq: iteration cursor + * @wq: the target workqueue + * +- * This must be called either with wq->mutex held or sched RCU read locked. ++ * This must be called either with wq->mutex held or RCU read locked. + * If the pwq needs to be used beyond the locking in effect, the caller is + * responsible for guaranteeing that the pwq stays online. + * +@@ -550,7 +550,7 @@ static int worker_pool_assign_id(struct worker_pool *pool) + * @wq: the target workqueue + * @node: the node ID + * +- * This must be called with any of wq_pool_mutex, wq->mutex or sched RCU ++ * This must be called with any of wq_pool_mutex, wq->mutex or RCU + * read locked. + * If the pwq needs to be used beyond the locking in effect, the caller is + * responsible for guaranteeing that the pwq stays online. +@@ -694,8 +694,8 @@ static struct pool_workqueue *get_work_pwq(struct work_struct *work) + * @work: the work item of interest + * + * Pools are created and destroyed under wq_pool_mutex, and allows read +- * access under sched-RCU read lock. As such, this function should be +- * called under wq_pool_mutex or with preemption disabled. ++ * access under RCU read lock. As such, this function should be ++ * called under wq_pool_mutex or inside of a rcu_read_lock() region. + * + * All fields of the returned pool are accessible as long as the above + * mentioned locking is in effect. If the returned pool needs to be used +@@ -1100,7 +1100,7 @@ static void put_pwq_unlocked(struct pool_workqueue *pwq) + { + if (pwq) { + /* +- * As both pwqs and pools are sched-RCU protected, the ++ * As both pwqs and pools are RCU protected, the + * following lock operations are safe. + */ + spin_lock_irq(&pwq->pool->lock); +@@ -1228,6 +1228,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) + return 0; + ++ rcu_read_lock(); + /* + * The queueing is in progress, or it is already queued. Try to + * steal it from ->worklist without clearing WORK_STRUCT_PENDING. +@@ -1266,10 +1267,12 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + set_work_pool_and_keep_pending(work, pool->id); + + spin_unlock(&pool->lock); ++ rcu_read_unlock(); + return 1; + } + spin_unlock(&pool->lock); + fail: ++ rcu_read_unlock(); + local_irq_restore(*flags); + if (work_is_canceling(work)) + return -ENOENT; +@@ -1383,6 +1386,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + if (unlikely(wq->flags & __WQ_DRAINING) && + WARN_ON_ONCE(!is_chained_work(wq))) + return; ++ rcu_read_lock(); + retry: + /* pwq which will be used unless @work is executing elsewhere */ + if (wq->flags & WQ_UNBOUND) { +@@ -1441,10 +1445,8 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + /* pwq determined, queue */ + trace_workqueue_queue_work(req_cpu, pwq, work); + +- if (WARN_ON(!list_empty(&work->entry))) { +- spin_unlock(&pwq->pool->lock); +- return; +- } ++ if (WARN_ON(!list_empty(&work->entry))) ++ goto out; + + pwq->nr_in_flight[pwq->work_color]++; + work_flags = work_color_to_flags(pwq->work_color); +@@ -1462,7 +1464,9 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + + insert_work(pwq, work, worklist, work_flags); + ++out: + spin_unlock(&pwq->pool->lock); ++ rcu_read_unlock(); + } + + /** +@@ -2863,14 +2867,14 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, + + might_sleep(); + +- local_irq_disable(); ++ rcu_read_lock(); + pool = get_work_pool(work); + if (!pool) { +- local_irq_enable(); ++ rcu_read_unlock(); + return false; + } + +- spin_lock(&pool->lock); ++ spin_lock_irq(&pool->lock); + /* see the comment in try_to_grab_pending() with the same code */ + pwq = get_work_pwq(work); + if (pwq) { +@@ -2902,10 +2906,11 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, + lock_map_acquire(&pwq->wq->lockdep_map); + lock_map_release(&pwq->wq->lockdep_map); + } +- ++ rcu_read_unlock(); + return true; + already_gone: + spin_unlock_irq(&pool->lock); ++ rcu_read_unlock(); + return false; + } + +@@ -3352,7 +3357,7 @@ static void rcu_free_pool(struct rcu_head *rcu) + * put_unbound_pool - put a worker_pool + * @pool: worker_pool to put + * +- * Put @pool. If its refcnt reaches zero, it gets destroyed in sched-RCU ++ * Put @pool. If its refcnt reaches zero, it gets destroyed in RCU + * safe manner. get_unbound_pool() calls this function on its failure path + * and this function should be able to release pools which went through, + * successfully or not, init_worker_pool(). +@@ -3406,8 +3411,8 @@ static void put_unbound_pool(struct worker_pool *pool) + del_timer_sync(&pool->idle_timer); + del_timer_sync(&pool->mayday_timer); + +- /* sched-RCU protected to allow dereferences from get_work_pool() */ +- call_rcu_sched(&pool->rcu, rcu_free_pool); ++ /* RCU protected to allow dereferences from get_work_pool() */ ++ call_rcu(&pool->rcu, rcu_free_pool); + } + + /** +@@ -3514,14 +3519,14 @@ static void pwq_unbound_release_workfn(struct work_struct *work) + put_unbound_pool(pool); + mutex_unlock(&wq_pool_mutex); + +- call_rcu_sched(&pwq->rcu, rcu_free_pwq); ++ call_rcu(&pwq->rcu, rcu_free_pwq); + + /* + * If we're the last pwq going away, @wq is already dead and no one + * is gonna access it anymore. Schedule RCU free. + */ + if (is_last) +- call_rcu_sched(&wq->rcu, rcu_free_wq); ++ call_rcu(&wq->rcu, rcu_free_wq); + } + + /** +@@ -4221,7 +4226,7 @@ void destroy_workqueue(struct workqueue_struct *wq) + * The base ref is never dropped on per-cpu pwqs. Directly + * schedule RCU free. + */ +- call_rcu_sched(&wq->rcu, rcu_free_wq); ++ call_rcu(&wq->rcu, rcu_free_wq); + } else { + /* + * We're the sole accessor of @wq at this point. Directly +@@ -4331,7 +4336,8 @@ bool workqueue_congested(int cpu, struct workqueue_struct *wq) + struct pool_workqueue *pwq; + bool ret; + +- rcu_read_lock_sched(); ++ rcu_read_lock(); ++ preempt_disable(); + + if (cpu == WORK_CPU_UNBOUND) + cpu = smp_processor_id(); +@@ -4342,7 +4348,8 @@ bool workqueue_congested(int cpu, struct workqueue_struct *wq) + pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu)); + + ret = !list_empty(&pwq->delayed_works); +- rcu_read_unlock_sched(); ++ preempt_enable(); ++ rcu_read_unlock(); + + return ret; + } +@@ -4368,15 +4375,15 @@ unsigned int work_busy(struct work_struct *work) + if (work_pending(work)) + ret |= WORK_BUSY_PENDING; + +- local_irq_save(flags); ++ rcu_read_lock(); + pool = get_work_pool(work); + if (pool) { +- spin_lock(&pool->lock); ++ spin_lock_irqsave(&pool->lock, flags); + if (find_worker_executing_work(pool, work)) + ret |= WORK_BUSY_RUNNING; +- spin_unlock(&pool->lock); ++ spin_unlock_irqrestore(&pool->lock, flags); + } +- local_irq_restore(flags); ++ rcu_read_unlock(); + + return ret; + } +@@ -4561,7 +4568,7 @@ void show_workqueue_state(void) + unsigned long flags; + int pi; + +- rcu_read_lock_sched(); ++ rcu_read_lock(); + + pr_info("Showing busy workqueues and worker pools:\n"); + +@@ -4626,7 +4633,7 @@ void show_workqueue_state(void) + touch_nmi_watchdog(); + } + +- rcu_read_unlock_sched(); ++ rcu_read_unlock(); + } + + /* used to show worker information through /proc/PID/{comm,stat,status} */ +@@ -5013,16 +5020,16 @@ bool freeze_workqueues_busy(void) + * nr_active is monotonically decreasing. It's safe + * to peek without lock. + */ +- rcu_read_lock_sched(); ++ rcu_read_lock(); + for_each_pwq(pwq, wq) { + WARN_ON_ONCE(pwq->nr_active < 0); + if (pwq->nr_active) { + busy = true; +- rcu_read_unlock_sched(); ++ rcu_read_unlock(); + goto out_unlock; + } + } +- rcu_read_unlock_sched(); ++ rcu_read_unlock(); + } + out_unlock: + mutex_unlock(&wq_pool_mutex); +@@ -5217,7 +5224,8 @@ static ssize_t wq_pool_ids_show(struct device *dev, + const char *delim = ""; + int node, written = 0; + +- rcu_read_lock_sched(); ++ get_online_cpus(); ++ rcu_read_lock(); + for_each_node(node) { + written += scnprintf(buf + written, PAGE_SIZE - written, + "%s%d:%d", delim, node, +@@ -5225,7 +5233,8 @@ static ssize_t wq_pool_ids_show(struct device *dev, + delim = " "; + } + written += scnprintf(buf + written, PAGE_SIZE - written, "\n"); +- rcu_read_unlock_sched(); ++ rcu_read_unlock(); ++ put_online_cpus(); + + return written; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0191-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch linux-4.19.118/debian/patches-rt/0191-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch --- linux-4.19.98/debian/patches-rt/0191-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0191-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,186 @@ +From 72906548185c659d4a5693976040709cb5044c1f Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sun, 17 Jul 2011 21:42:26 +0200 +Subject: [PATCH 191/325] workqueue: Use local irq lock instead of irq disable + regions +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Use a local_irq_lock as a replacement for irq off regions. We keep the +semantic of irq-off in regard to the pool->lock and remain preemptible. + +Signed-off-by: Thomas Gleixner +--- + kernel/workqueue.c | 45 ++++++++++++++++++++++++++++++--------------- + 1 file changed, 30 insertions(+), 15 deletions(-) + +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 29dc939dad4e..f34586370fcb 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -49,6 +49,7 @@ + #include + #include + #include ++#include + + #include "workqueue_internal.h" + +@@ -350,6 +351,8 @@ EXPORT_SYMBOL_GPL(system_power_efficient_wq); + struct workqueue_struct *system_freezable_power_efficient_wq __read_mostly; + EXPORT_SYMBOL_GPL(system_freezable_power_efficient_wq); + ++static DEFINE_LOCAL_IRQ_LOCK(pendingb_lock); ++ + static int worker_thread(void *__worker); + static void workqueue_sysfs_unregister(struct workqueue_struct *wq); + +@@ -1103,9 +1106,11 @@ static void put_pwq_unlocked(struct pool_workqueue *pwq) + * As both pwqs and pools are RCU protected, the + * following lock operations are safe. + */ +- spin_lock_irq(&pwq->pool->lock); ++ rcu_read_lock(); ++ local_spin_lock_irq(pendingb_lock, &pwq->pool->lock); + put_pwq(pwq); +- spin_unlock_irq(&pwq->pool->lock); ++ local_spin_unlock_irq(pendingb_lock, &pwq->pool->lock); ++ rcu_read_unlock(); + } + } + +@@ -1209,7 +1214,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + struct worker_pool *pool; + struct pool_workqueue *pwq; + +- local_irq_save(*flags); ++ local_lock_irqsave(pendingb_lock, *flags); + + /* try to steal the timer if it exists */ + if (is_dwork) { +@@ -1273,7 +1278,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + spin_unlock(&pool->lock); + fail: + rcu_read_unlock(); +- local_irq_restore(*flags); ++ local_unlock_irqrestore(pendingb_lock, *flags); + if (work_is_canceling(work)) + return -ENOENT; + cpu_relax(); +@@ -1378,7 +1383,13 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + * queued or lose PENDING. Grabbing PENDING and queueing should + * happen with IRQ disabled. + */ ++#ifndef CONFIG_PREEMPT_RT_FULL ++ /* ++ * nort: On RT the "interrupts-disabled" rule has been replaced with ++ * pendingb_lock. ++ */ + lockdep_assert_irqs_disabled(); ++#endif + + debug_work_activate(work); + +@@ -1486,14 +1497,14 @@ bool queue_work_on(int cpu, struct workqueue_struct *wq, + bool ret = false; + unsigned long flags; + +- local_irq_save(flags); ++ local_lock_irqsave(pendingb_lock,flags); + + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { + __queue_work(cpu, wq, work); + ret = true; + } + +- local_irq_restore(flags); ++ local_unlock_irqrestore(pendingb_lock, flags); + return ret; + } + EXPORT_SYMBOL(queue_work_on); +@@ -1502,8 +1513,11 @@ void delayed_work_timer_fn(struct timer_list *t) + { + struct delayed_work *dwork = from_timer(dwork, t, timer); + ++ /* XXX */ ++ /* local_lock(pendingb_lock); */ + /* should have been called from irqsafe timer with irq already off */ + __queue_work(dwork->cpu, dwork->wq, &dwork->work); ++ /* local_unlock(pendingb_lock); */ + } + EXPORT_SYMBOL(delayed_work_timer_fn); + +@@ -1558,14 +1572,14 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, + unsigned long flags; + + /* read the comment in __queue_work() */ +- local_irq_save(flags); ++ local_lock_irqsave(pendingb_lock, flags); + + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { + __queue_delayed_work(cpu, wq, dwork, delay); + ret = true; + } + +- local_irq_restore(flags); ++ local_unlock_irqrestore(pendingb_lock, flags); + return ret; + } + EXPORT_SYMBOL(queue_delayed_work_on); +@@ -1600,7 +1614,7 @@ bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq, + + if (likely(ret >= 0)) { + __queue_delayed_work(cpu, wq, dwork, delay); +- local_irq_restore(flags); ++ local_unlock_irqrestore(pendingb_lock, flags); + } + + /* -ENOENT from try_to_grab_pending() becomes %true */ +@@ -1611,11 +1625,12 @@ EXPORT_SYMBOL_GPL(mod_delayed_work_on); + static void rcu_work_rcufn(struct rcu_head *rcu) + { + struct rcu_work *rwork = container_of(rcu, struct rcu_work, rcu); ++ unsigned long flags; + + /* read the comment in __queue_work() */ +- local_irq_disable(); ++ local_lock_irqsave(pendingb_lock, flags); + __queue_work(WORK_CPU_UNBOUND, rwork->wq, &rwork->work); +- local_irq_enable(); ++ local_unlock_irqrestore(pendingb_lock, flags); + } + + /** +@@ -3010,7 +3025,7 @@ static bool __cancel_work_timer(struct work_struct *work, bool is_dwork) + + /* tell other tasks trying to grab @work to back off */ + mark_work_canceling(work); +- local_irq_restore(flags); ++ local_unlock_irqrestore(pendingb_lock, flags); + + /* + * This allows canceling during early boot. We know that @work +@@ -3071,10 +3086,10 @@ EXPORT_SYMBOL_GPL(cancel_work_sync); + */ + bool flush_delayed_work(struct delayed_work *dwork) + { +- local_irq_disable(); ++ local_lock_irq(pendingb_lock); + if (del_timer_sync(&dwork->timer)) + __queue_work(dwork->cpu, dwork->wq, &dwork->work); +- local_irq_enable(); ++ local_unlock_irq(pendingb_lock); + return flush_work(&dwork->work); + } + EXPORT_SYMBOL(flush_delayed_work); +@@ -3112,7 +3127,7 @@ static bool __cancel_work(struct work_struct *work, bool is_dwork) + return false; + + set_work_pool_and_clear_pending(work, get_work_pool_id(work)); +- local_irq_restore(flags); ++ local_unlock_irqrestore(pendingb_lock, flags); + return ret; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0191-workqueue-Use-normal-rcu.patch linux-4.19.118/debian/patches-rt/0191-workqueue-Use-normal-rcu.patch --- linux-4.19.98/debian/patches-rt/0191-workqueue-Use-normal-rcu.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0191-workqueue-Use-normal-rcu.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,360 +0,0 @@ -From a65796914416941351ac0cd0271c5da76bed792a Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 24 Jul 2013 15:26:54 +0200 -Subject: [PATCH 191/290] workqueue: Use normal rcu -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -There is no need for sched_rcu. The undocumented reason why sched_rcu -is used is to avoid a few explicit rcu_read_lock()/unlock() pairs by -abusing the fact that sched_rcu reader side critical sections are also -protected by preempt or irq disabled regions. - -Signed-off-by: Thomas Gleixner ---- - kernel/workqueue.c | 95 +++++++++++++++++++++++++--------------------- - 1 file changed, 52 insertions(+), 43 deletions(-) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 493908464b9e..544007905706 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -127,7 +127,7 @@ enum { - * - * PL: wq_pool_mutex protected. - * -- * PR: wq_pool_mutex protected for writes. Sched-RCU protected for reads. -+ * PR: wq_pool_mutex protected for writes. RCU protected for reads. - * - * PW: wq_pool_mutex and wq->mutex protected for writes. Either for reads. - * -@@ -136,7 +136,7 @@ enum { - * - * WQ: wq->mutex protected. - * -- * WR: wq->mutex protected for writes. Sched-RCU protected for reads. -+ * WR: wq->mutex protected for writes. RCU protected for reads. - * - * MD: wq_mayday_lock protected. - */ -@@ -183,7 +183,7 @@ struct worker_pool { - atomic_t nr_running ____cacheline_aligned_in_smp; - - /* -- * Destruction of pool is sched-RCU protected to allow dereferences -+ * Destruction of pool is RCU protected to allow dereferences - * from get_work_pool(). - */ - struct rcu_head rcu; -@@ -212,7 +212,7 @@ struct pool_workqueue { - /* - * Release of unbound pwq is punted to system_wq. See put_pwq() - * and pwq_unbound_release_workfn() for details. pool_workqueue -- * itself is also sched-RCU protected so that the first pwq can be -+ * itself is also RCU protected so that the first pwq can be - * determined without grabbing wq->mutex. - */ - struct work_struct unbound_release_work; -@@ -357,20 +357,20 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); - #include - - #define assert_rcu_or_pool_mutex() \ -- RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ -+ RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ - !lockdep_is_held(&wq_pool_mutex), \ -- "sched RCU or wq_pool_mutex should be held") -+ "RCU or wq_pool_mutex should be held") - - #define assert_rcu_or_wq_mutex(wq) \ -- RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ -+ RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ - !lockdep_is_held(&wq->mutex), \ -- "sched RCU or wq->mutex should be held") -+ "RCU or wq->mutex should be held") - - #define assert_rcu_or_wq_mutex_or_pool_mutex(wq) \ -- RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() && \ -+ RCU_LOCKDEP_WARN(!rcu_read_lock_held() && \ - !lockdep_is_held(&wq->mutex) && \ - !lockdep_is_held(&wq_pool_mutex), \ -- "sched RCU, wq->mutex or wq_pool_mutex should be held") -+ "RCU, wq->mutex or wq_pool_mutex should be held") - - #define for_each_cpu_worker_pool(pool, cpu) \ - for ((pool) = &per_cpu(cpu_worker_pools, cpu)[0]; \ -@@ -382,7 +382,7 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); - * @pool: iteration cursor - * @pi: integer used for iteration - * -- * This must be called either with wq_pool_mutex held or sched RCU read -+ * This must be called either with wq_pool_mutex held or RCU read - * locked. If the pool needs to be used beyond the locking in effect, the - * caller is responsible for guaranteeing that the pool stays online. - * -@@ -414,7 +414,7 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); - * @pwq: iteration cursor - * @wq: the target workqueue - * -- * This must be called either with wq->mutex held or sched RCU read locked. -+ * This must be called either with wq->mutex held or RCU read locked. - * If the pwq needs to be used beyond the locking in effect, the caller is - * responsible for guaranteeing that the pwq stays online. - * -@@ -550,7 +550,7 @@ static int worker_pool_assign_id(struct worker_pool *pool) - * @wq: the target workqueue - * @node: the node ID - * -- * This must be called with any of wq_pool_mutex, wq->mutex or sched RCU -+ * This must be called with any of wq_pool_mutex, wq->mutex or RCU - * read locked. - * If the pwq needs to be used beyond the locking in effect, the caller is - * responsible for guaranteeing that the pwq stays online. -@@ -694,8 +694,8 @@ static struct pool_workqueue *get_work_pwq(struct work_struct *work) - * @work: the work item of interest - * - * Pools are created and destroyed under wq_pool_mutex, and allows read -- * access under sched-RCU read lock. As such, this function should be -- * called under wq_pool_mutex or with preemption disabled. -+ * access under RCU read lock. As such, this function should be -+ * called under wq_pool_mutex or inside of a rcu_read_lock() region. - * - * All fields of the returned pool are accessible as long as the above - * mentioned locking is in effect. If the returned pool needs to be used -@@ -1100,7 +1100,7 @@ static void put_pwq_unlocked(struct pool_workqueue *pwq) - { - if (pwq) { - /* -- * As both pwqs and pools are sched-RCU protected, the -+ * As both pwqs and pools are RCU protected, the - * following lock operations are safe. - */ - spin_lock_irq(&pwq->pool->lock); -@@ -1228,6 +1228,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) - return 0; - -+ rcu_read_lock(); - /* - * The queueing is in progress, or it is already queued. Try to - * steal it from ->worklist without clearing WORK_STRUCT_PENDING. -@@ -1266,10 +1267,12 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - set_work_pool_and_keep_pending(work, pool->id); - - spin_unlock(&pool->lock); -+ rcu_read_unlock(); - return 1; - } - spin_unlock(&pool->lock); - fail: -+ rcu_read_unlock(); - local_irq_restore(*flags); - if (work_is_canceling(work)) - return -ENOENT; -@@ -1383,6 +1386,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - if (unlikely(wq->flags & __WQ_DRAINING) && - WARN_ON_ONCE(!is_chained_work(wq))) - return; -+ rcu_read_lock(); - retry: - if (req_cpu == WORK_CPU_UNBOUND) - cpu = wq_select_unbound_cpu(raw_smp_processor_id()); -@@ -1439,10 +1443,8 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - /* pwq determined, queue */ - trace_workqueue_queue_work(req_cpu, pwq, work); - -- if (WARN_ON(!list_empty(&work->entry))) { -- spin_unlock(&pwq->pool->lock); -- return; -- } -+ if (WARN_ON(!list_empty(&work->entry))) -+ goto out; - - pwq->nr_in_flight[pwq->work_color]++; - work_flags = work_color_to_flags(pwq->work_color); -@@ -1460,7 +1462,9 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - - insert_work(pwq, work, worklist, work_flags); - -+out: - spin_unlock(&pwq->pool->lock); -+ rcu_read_unlock(); - } - - /** -@@ -2861,14 +2865,14 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, - - might_sleep(); - -- local_irq_disable(); -+ rcu_read_lock(); - pool = get_work_pool(work); - if (!pool) { -- local_irq_enable(); -+ rcu_read_unlock(); - return false; - } - -- spin_lock(&pool->lock); -+ spin_lock_irq(&pool->lock); - /* see the comment in try_to_grab_pending() with the same code */ - pwq = get_work_pwq(work); - if (pwq) { -@@ -2900,10 +2904,11 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, - lock_map_acquire(&pwq->wq->lockdep_map); - lock_map_release(&pwq->wq->lockdep_map); - } -- -+ rcu_read_unlock(); - return true; - already_gone: - spin_unlock_irq(&pool->lock); -+ rcu_read_unlock(); - return false; - } - -@@ -3350,7 +3355,7 @@ static void rcu_free_pool(struct rcu_head *rcu) - * put_unbound_pool - put a worker_pool - * @pool: worker_pool to put - * -- * Put @pool. If its refcnt reaches zero, it gets destroyed in sched-RCU -+ * Put @pool. If its refcnt reaches zero, it gets destroyed in RCU - * safe manner. get_unbound_pool() calls this function on its failure path - * and this function should be able to release pools which went through, - * successfully or not, init_worker_pool(). -@@ -3404,8 +3409,8 @@ static void put_unbound_pool(struct worker_pool *pool) - del_timer_sync(&pool->idle_timer); - del_timer_sync(&pool->mayday_timer); - -- /* sched-RCU protected to allow dereferences from get_work_pool() */ -- call_rcu_sched(&pool->rcu, rcu_free_pool); -+ /* RCU protected to allow dereferences from get_work_pool() */ -+ call_rcu(&pool->rcu, rcu_free_pool); - } - - /** -@@ -3512,14 +3517,14 @@ static void pwq_unbound_release_workfn(struct work_struct *work) - put_unbound_pool(pool); - mutex_unlock(&wq_pool_mutex); - -- call_rcu_sched(&pwq->rcu, rcu_free_pwq); -+ call_rcu(&pwq->rcu, rcu_free_pwq); - - /* - * If we're the last pwq going away, @wq is already dead and no one - * is gonna access it anymore. Schedule RCU free. - */ - if (is_last) -- call_rcu_sched(&wq->rcu, rcu_free_wq); -+ call_rcu(&wq->rcu, rcu_free_wq); - } - - /** -@@ -4219,7 +4224,7 @@ void destroy_workqueue(struct workqueue_struct *wq) - * The base ref is never dropped on per-cpu pwqs. Directly - * schedule RCU free. - */ -- call_rcu_sched(&wq->rcu, rcu_free_wq); -+ call_rcu(&wq->rcu, rcu_free_wq); - } else { - /* - * We're the sole accessor of @wq at this point. Directly -@@ -4329,7 +4334,8 @@ bool workqueue_congested(int cpu, struct workqueue_struct *wq) - struct pool_workqueue *pwq; - bool ret; - -- rcu_read_lock_sched(); -+ rcu_read_lock(); -+ preempt_disable(); - - if (cpu == WORK_CPU_UNBOUND) - cpu = smp_processor_id(); -@@ -4340,7 +4346,8 @@ bool workqueue_congested(int cpu, struct workqueue_struct *wq) - pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu)); - - ret = !list_empty(&pwq->delayed_works); -- rcu_read_unlock_sched(); -+ preempt_enable(); -+ rcu_read_unlock(); - - return ret; - } -@@ -4366,15 +4373,15 @@ unsigned int work_busy(struct work_struct *work) - if (work_pending(work)) - ret |= WORK_BUSY_PENDING; - -- local_irq_save(flags); -+ rcu_read_lock(); - pool = get_work_pool(work); - if (pool) { -- spin_lock(&pool->lock); -+ spin_lock_irqsave(&pool->lock, flags); - if (find_worker_executing_work(pool, work)) - ret |= WORK_BUSY_RUNNING; -- spin_unlock(&pool->lock); -+ spin_unlock_irqrestore(&pool->lock, flags); - } -- local_irq_restore(flags); -+ rcu_read_unlock(); - - return ret; - } -@@ -4559,7 +4566,7 @@ void show_workqueue_state(void) - unsigned long flags; - int pi; - -- rcu_read_lock_sched(); -+ rcu_read_lock(); - - pr_info("Showing busy workqueues and worker pools:\n"); - -@@ -4624,7 +4631,7 @@ void show_workqueue_state(void) - touch_nmi_watchdog(); - } - -- rcu_read_unlock_sched(); -+ rcu_read_unlock(); - } - - /* used to show worker information through /proc/PID/{comm,stat,status} */ -@@ -5011,16 +5018,16 @@ bool freeze_workqueues_busy(void) - * nr_active is monotonically decreasing. It's safe - * to peek without lock. - */ -- rcu_read_lock_sched(); -+ rcu_read_lock(); - for_each_pwq(pwq, wq) { - WARN_ON_ONCE(pwq->nr_active < 0); - if (pwq->nr_active) { - busy = true; -- rcu_read_unlock_sched(); -+ rcu_read_unlock(); - goto out_unlock; - } - } -- rcu_read_unlock_sched(); -+ rcu_read_unlock(); - } - out_unlock: - mutex_unlock(&wq_pool_mutex); -@@ -5215,7 +5222,8 @@ static ssize_t wq_pool_ids_show(struct device *dev, - const char *delim = ""; - int node, written = 0; - -- rcu_read_lock_sched(); -+ get_online_cpus(); -+ rcu_read_lock(); - for_each_node(node) { - written += scnprintf(buf + written, PAGE_SIZE - written, - "%s%d:%d", delim, node, -@@ -5223,7 +5231,8 @@ static ssize_t wq_pool_ids_show(struct device *dev, - delim = " "; - } - written += scnprintf(buf + written, PAGE_SIZE - written, "\n"); -- rcu_read_unlock_sched(); -+ rcu_read_unlock(); -+ put_online_cpus(); - - return written; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0192-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch linux-4.19.118/debian/patches-rt/0192-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch --- linux-4.19.98/debian/patches-rt/0192-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0192-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,139 @@ +From 53c5b0958ee67a2e56c5caacd839d18583f12e78 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Mon, 1 Jul 2013 11:02:42 +0200 +Subject: [PATCH 192/325] workqueue: Prevent workqueue versus ata-piix livelock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +An Intel i7 system regularly detected rcu_preempt stalls after the kernel +was upgraded from 3.6-rt to 3.8-rt. When the stall happened, disk I/O was no +longer possible, unless the system was restarted. + +The kernel message was: +INFO: rcu_preempt self-detected stall on CPU { 6} +[..] +NMI backtrace for cpu 6 +CPU 6 +Pid: 119, comm: irq/19-ata_piix Not tainted 3.8.13-rt13 #11 Shuttle Inc. SX58/SX58 +RIP: 0010:[] [] ip_compute_csum+0x30/0x30 +RSP: 0018:ffff880333303cb0 EFLAGS: 00000002 +RAX: 0000000000000006 RBX: 00000000000003e9 RCX: 0000000000000034 +RDX: 0000000000000000 RSI: ffffffff81aa16d0 RDI: 0000000000000001 +RBP: ffff880333303ce8 R08: ffffffff81aa16d0 R09: ffffffff81c1b8cc +R10: 0000000000000000 R11: 0000000000000000 R12: 000000000005161f +R13: 0000000000000006 R14: ffffffff81aa16d0 R15: 0000000000000002 +FS: 0000000000000000(0000) GS:ffff880333300000(0000) knlGS:0000000000000000 +CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b +CR2: 0000003c1b2bb420 CR3: 0000000001a0f000 CR4: 00000000000007e0 +DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 +DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 +Process irq/19-ata_piix (pid: 119, threadinfo ffff88032d88a000, task ffff88032df80000) +Stack: +ffffffff8124cb32 000000000005161e 00000000000003e9 0000000000001000 +0000000000009022 ffffffff81aa16d0 0000000000000002 ffff880333303cf8 +ffffffff8124caa9 ffff880333303d08 ffffffff8124cad2 ffff880333303d28 +Call Trace: + +[] ? delay_tsc+0x33/0xe3 +[] __delay+0xf/0x11 +[] __const_udelay+0x27/0x29 +[] native_safe_apic_wait_icr_idle+0x39/0x45 +[] __default_send_IPI_dest_field.constprop.0+0x1e/0x58 +[] default_send_IPI_mask_sequence_phys+0x49/0x7d +[] physflat_send_IPI_all+0x17/0x19 +[] arch_trigger_all_cpu_backtrace+0x50/0x79 +[] rcu_check_callbacks+0x1cb/0x568 +[] ? raise_softirq+0x2e/0x35 +[] ? tick_sched_do_timer+0x38/0x38 +[] update_process_times+0x44/0x55 +[] tick_sched_handle+0x4a/0x59 +[] tick_sched_timer+0x3c/0x5b +[] __run_hrtimer+0x9b/0x158 +[] hrtimer_interrupt+0x172/0x2aa +[] smp_apic_timer_interrupt+0x76/0x89 +[] apic_timer_interrupt+0x6d/0x80 + +[] ? __local_lock_irqsave+0x17/0x4a +[] try_to_grab_pending+0x42/0x17e +[] mod_delayed_work_on+0x32/0x88 +[] mod_delayed_work+0x1c/0x1e +[] blk_run_queue_async+0x37/0x39 +[] flush_end_io+0xf1/0x107 +[] blk_finish_request+0x21e/0x264 +[] blk_end_bidi_request+0x42/0x60 +[] blk_end_request+0x10/0x12 +[] scsi_io_completion+0x1bf/0x492 +[] ? sd_done+0x298/0x2ef +[] scsi_finish_command+0xe9/0xf2 +[] scsi_softirq_done+0x106/0x10f +[] blk_done_softirq+0x77/0x87 +[] do_current_softirqs+0x172/0x2e1 +[] ? irq_thread_fn+0x3a/0x3a +[] local_bh_enable+0x43/0x72 +[] irq_forced_thread_fn+0x46/0x52 +[] irq_thread+0x8c/0x17c +[] ? irq_thread+0x17c/0x17c +[] ? wake_threads_waitq+0x44/0x44 +[] kthread+0x8d/0x95 +[] ? __kthread_parkme+0x65/0x65 +[] ret_from_fork+0x7c/0xb0 +[] ? __kthread_parkme+0x65/0x65 + +The state of softirqd of this CPU at the time of the crash was: +ksoftirqd/6 R running task 0 53 2 0x00000000 +ffff88032fc39d18 0000000000000046 ffff88033330c4c0 ffff8803303f4710 +ffff88032fc39fd8 ffff88032fc39fd8 0000000000000000 0000000000062500 +ffff88032df88000 ffff8803303f4710 0000000000000000 ffff88032fc38000 +Call Trace: +[] ? __queue_work+0x27c/0x27c +[] preempt_schedule+0x61/0x76 +[] migrate_enable+0xe5/0x1df +[] ? __queue_work+0x27c/0x27c +[] run_timer_softirq+0x161/0x1d6 +[] do_current_softirqs+0x172/0x2e1 +[] run_ksoftirqd+0x2d/0x45 +[] smpboot_thread_fn+0x2ea/0x308 +[] ? test_ti_thread_flag+0xc/0xc +[] ? test_ti_thread_flag+0xc/0xc +[] kthread+0x8d/0x95 +[] ? __kthread_parkme+0x65/0x65 +[] ret_from_fork+0x7c/0xb0 +[] ? __kthread_parkme+0x65/0x65 + +Apparently, the softirq demon and the ata_piix IRQ handler were waiting +for each other to finish ending up in a livelock. After the below patch +was applied, the system no longer crashes. + +Reported-by: Carsten Emde +Proposed-by: Thomas Gleixner +Tested by: Carsten Emde +Signed-off-by: Carsten Emde +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/workqueue.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index f34586370fcb..21484e3938a6 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -50,6 +50,7 @@ + #include + #include + #include ++#include + + #include "workqueue_internal.h" + +@@ -1281,7 +1282,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + local_unlock_irqrestore(pendingb_lock, *flags); + if (work_is_canceling(work)) + return -ENOENT; +- cpu_relax(); ++ cpu_chill(); + return -EAGAIN; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0192-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch linux-4.19.118/debian/patches-rt/0192-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch --- linux-4.19.98/debian/patches-rt/0192-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0192-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ -From 670717ab259111dcf589c98670ff74a206bf87d3 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 21:42:26 +0200 -Subject: [PATCH 192/290] workqueue: Use local irq lock instead of irq disable - regions -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Use a local_irq_lock as a replacement for irq off regions. We keep the -semantic of irq-off in regard to the pool->lock and remain preemptible. - -Signed-off-by: Thomas Gleixner ---- - kernel/workqueue.c | 45 ++++++++++++++++++++++++++++++--------------- - 1 file changed, 30 insertions(+), 15 deletions(-) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 544007905706..0efb8d25d940 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -49,6 +49,7 @@ - #include - #include - #include -+#include - - #include "workqueue_internal.h" - -@@ -350,6 +351,8 @@ EXPORT_SYMBOL_GPL(system_power_efficient_wq); - struct workqueue_struct *system_freezable_power_efficient_wq __read_mostly; - EXPORT_SYMBOL_GPL(system_freezable_power_efficient_wq); - -+static DEFINE_LOCAL_IRQ_LOCK(pendingb_lock); -+ - static int worker_thread(void *__worker); - static void workqueue_sysfs_unregister(struct workqueue_struct *wq); - -@@ -1103,9 +1106,11 @@ static void put_pwq_unlocked(struct pool_workqueue *pwq) - * As both pwqs and pools are RCU protected, the - * following lock operations are safe. - */ -- spin_lock_irq(&pwq->pool->lock); -+ rcu_read_lock(); -+ local_spin_lock_irq(pendingb_lock, &pwq->pool->lock); - put_pwq(pwq); -- spin_unlock_irq(&pwq->pool->lock); -+ local_spin_unlock_irq(pendingb_lock, &pwq->pool->lock); -+ rcu_read_unlock(); - } - } - -@@ -1209,7 +1214,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - struct worker_pool *pool; - struct pool_workqueue *pwq; - -- local_irq_save(*flags); -+ local_lock_irqsave(pendingb_lock, *flags); - - /* try to steal the timer if it exists */ - if (is_dwork) { -@@ -1273,7 +1278,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - spin_unlock(&pool->lock); - fail: - rcu_read_unlock(); -- local_irq_restore(*flags); -+ local_unlock_irqrestore(pendingb_lock, *flags); - if (work_is_canceling(work)) - return -ENOENT; - cpu_relax(); -@@ -1378,7 +1383,13 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - * queued or lose PENDING. Grabbing PENDING and queueing should - * happen with IRQ disabled. - */ -+#ifndef CONFIG_PREEMPT_RT_FULL -+ /* -+ * nort: On RT the "interrupts-disabled" rule has been replaced with -+ * pendingb_lock. -+ */ - lockdep_assert_irqs_disabled(); -+#endif - - debug_work_activate(work); - -@@ -1484,14 +1495,14 @@ bool queue_work_on(int cpu, struct workqueue_struct *wq, - bool ret = false; - unsigned long flags; - -- local_irq_save(flags); -+ local_lock_irqsave(pendingb_lock,flags); - - if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { - __queue_work(cpu, wq, work); - ret = true; - } - -- local_irq_restore(flags); -+ local_unlock_irqrestore(pendingb_lock, flags); - return ret; - } - EXPORT_SYMBOL(queue_work_on); -@@ -1500,8 +1511,11 @@ void delayed_work_timer_fn(struct timer_list *t) - { - struct delayed_work *dwork = from_timer(dwork, t, timer); - -+ /* XXX */ -+ /* local_lock(pendingb_lock); */ - /* should have been called from irqsafe timer with irq already off */ - __queue_work(dwork->cpu, dwork->wq, &dwork->work); -+ /* local_unlock(pendingb_lock); */ - } - EXPORT_SYMBOL(delayed_work_timer_fn); - -@@ -1556,14 +1570,14 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, - unsigned long flags; - - /* read the comment in __queue_work() */ -- local_irq_save(flags); -+ local_lock_irqsave(pendingb_lock, flags); - - if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { - __queue_delayed_work(cpu, wq, dwork, delay); - ret = true; - } - -- local_irq_restore(flags); -+ local_unlock_irqrestore(pendingb_lock, flags); - return ret; - } - EXPORT_SYMBOL(queue_delayed_work_on); -@@ -1598,7 +1612,7 @@ bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq, - - if (likely(ret >= 0)) { - __queue_delayed_work(cpu, wq, dwork, delay); -- local_irq_restore(flags); -+ local_unlock_irqrestore(pendingb_lock, flags); - } - - /* -ENOENT from try_to_grab_pending() becomes %true */ -@@ -1609,11 +1623,12 @@ EXPORT_SYMBOL_GPL(mod_delayed_work_on); - static void rcu_work_rcufn(struct rcu_head *rcu) - { - struct rcu_work *rwork = container_of(rcu, struct rcu_work, rcu); -+ unsigned long flags; - - /* read the comment in __queue_work() */ -- local_irq_disable(); -+ local_lock_irqsave(pendingb_lock, flags); - __queue_work(WORK_CPU_UNBOUND, rwork->wq, &rwork->work); -- local_irq_enable(); -+ local_unlock_irqrestore(pendingb_lock, flags); - } - - /** -@@ -3008,7 +3023,7 @@ static bool __cancel_work_timer(struct work_struct *work, bool is_dwork) - - /* tell other tasks trying to grab @work to back off */ - mark_work_canceling(work); -- local_irq_restore(flags); -+ local_unlock_irqrestore(pendingb_lock, flags); - - /* - * This allows canceling during early boot. We know that @work -@@ -3069,10 +3084,10 @@ EXPORT_SYMBOL_GPL(cancel_work_sync); - */ - bool flush_delayed_work(struct delayed_work *dwork) - { -- local_irq_disable(); -+ local_lock_irq(pendingb_lock); - if (del_timer_sync(&dwork->timer)) - __queue_work(dwork->cpu, dwork->wq, &dwork->work); -- local_irq_enable(); -+ local_unlock_irq(pendingb_lock); - return flush_work(&dwork->work); - } - EXPORT_SYMBOL(flush_delayed_work); -@@ -3110,7 +3125,7 @@ static bool __cancel_work(struct work_struct *work, bool is_dwork) - return false; - - set_work_pool_and_clear_pending(work, get_work_pool_id(work)); -- local_irq_restore(flags); -+ local_unlock_irqrestore(pendingb_lock, flags); - return ret; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0193-sched-Distangle-worker-accounting-from-rqlock.patch linux-4.19.118/debian/patches-rt/0193-sched-Distangle-worker-accounting-from-rqlock.patch --- linux-4.19.98/debian/patches-rt/0193-sched-Distangle-worker-accounting-from-rqlock.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0193-sched-Distangle-worker-accounting-from-rqlock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,291 @@ +From 6fdac9a09208088f4ed195b86cdadeb37ae5ee1b Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 22 Jun 2011 19:47:03 +0200 +Subject: [PATCH 193/325] sched: Distangle worker accounting from rqlock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The worker accounting for cpu bound workers is plugged into the core +scheduler code and the wakeup code. This is not a hard requirement and +can be avoided by keeping track of the state in the workqueue code +itself. + +Keep track of the sleeping state in the worker itself and call the +notifier before entering the core scheduler. There might be false +positives when the task is woken between that call and actually +scheduling, but that's not really different from scheduling and being +woken immediately after switching away. There is also no harm from +updating nr_running when the task returns from scheduling instead of +accounting it in the wakeup code. + +Signed-off-by: Thomas Gleixner +Cc: Peter Zijlstra +Cc: Tejun Heo +Cc: Jens Axboe +Cc: Linus Torvalds +Link: http://lkml.kernel.org/r/20110622174919.135236139@linutronix.de +Signed-off-by: Thomas Gleixner +[bigeasy: preempt_disable() around wq_worker_sleeping() by Daniel Bristot de + Oliveira] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/sched/core.c | 90 +++++++++---------------------------- + kernel/workqueue.c | 52 ++++++++++----------- + kernel/workqueue_internal.h | 5 ++- + 3 files changed, 47 insertions(+), 100 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 3b2664e691de..dcf2deedd3f8 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1704,10 +1704,6 @@ static inline void ttwu_activate(struct rq *rq, struct task_struct *p, int en_fl + { + activate_task(rq, p, en_flags); + p->on_rq = TASK_ON_RQ_QUEUED; +- +- /* If a worker is waking up, notify the workqueue: */ +- if (p->flags & PF_WQ_WORKER) +- wq_worker_waking_up(p, cpu_of(rq)); + } + + /* +@@ -2143,56 +2139,6 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) + return success; + } + +-/** +- * try_to_wake_up_local - try to wake up a local task with rq lock held +- * @p: the thread to be awakened +- * @rf: request-queue flags for pinning +- * +- * Put @p on the run-queue if it's not already there. The caller must +- * ensure that this_rq() is locked, @p is bound to this_rq() and not +- * the current task. +- */ +-static void try_to_wake_up_local(struct task_struct *p, struct rq_flags *rf) +-{ +- struct rq *rq = task_rq(p); +- +- if (WARN_ON_ONCE(rq != this_rq()) || +- WARN_ON_ONCE(p == current)) +- return; +- +- lockdep_assert_held(&rq->lock); +- +- if (!raw_spin_trylock(&p->pi_lock)) { +- /* +- * This is OK, because current is on_cpu, which avoids it being +- * picked for load-balance and preemption/IRQs are still +- * disabled avoiding further scheduler activity on it and we've +- * not yet picked a replacement task. +- */ +- rq_unlock(rq, rf); +- raw_spin_lock(&p->pi_lock); +- rq_relock(rq, rf); +- } +- +- if (!(p->state & TASK_NORMAL)) +- goto out; +- +- trace_sched_waking(p); +- +- if (!task_on_rq_queued(p)) { +- if (p->in_iowait) { +- delayacct_blkio_end(p); +- atomic_dec(&rq->nr_iowait); +- } +- ttwu_activate(rq, p, ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK); +- } +- +- ttwu_do_wakeup(rq, p, 0, rf); +- ttwu_stat(p, smp_processor_id(), 0); +-out: +- raw_spin_unlock(&p->pi_lock); +-} +- + /** + * wake_up_process - Wake up a specific process + * @p: The process to be woken up. +@@ -3561,21 +3507,6 @@ static void __sched notrace __schedule(bool preempt) + atomic_inc(&rq->nr_iowait); + delayacct_blkio_start(); + } +- +- /* +- * If a worker went to sleep, notify and ask workqueue +- * whether it wants to wake up a task to maintain +- * concurrency. +- * Only call wake up if prev isn't blocked on a sleeping +- * spin lock. +- */ +- if (prev->flags & PF_WQ_WORKER && !prev->saved_state) { +- struct task_struct *to_wakeup; +- +- to_wakeup = wq_worker_sleeping(prev); +- if (to_wakeup) +- try_to_wake_up_local(to_wakeup, &rf); +- } + } + switch_count = &prev->nvcsw; + } +@@ -3635,6 +3566,20 @@ static inline void sched_submit_work(struct task_struct *tsk) + { + if (!tsk->state || tsk_is_pi_blocked(tsk)) + return; ++ ++ /* ++ * If a worker went to sleep, notify and ask workqueue whether ++ * it wants to wake up a task to maintain concurrency. ++ * As this function is called inside the schedule() context, ++ * we disable preemption to avoid it calling schedule() again ++ * in the possible wakeup of a kworker. ++ */ ++ if (tsk->flags & PF_WQ_WORKER) { ++ preempt_disable(); ++ wq_worker_sleeping(tsk); ++ preempt_enable_no_resched(); ++ } ++ + /* + * If we are going to sleep and we have plugged IO queued, + * make sure to submit it to avoid deadlocks. +@@ -3643,6 +3588,12 @@ static inline void sched_submit_work(struct task_struct *tsk) + blk_schedule_flush_plug(tsk); + } + ++static void sched_update_worker(struct task_struct *tsk) ++{ ++ if (tsk->flags & PF_WQ_WORKER) ++ wq_worker_running(tsk); ++} ++ + asmlinkage __visible void __sched schedule(void) + { + struct task_struct *tsk = current; +@@ -3653,6 +3604,7 @@ asmlinkage __visible void __sched schedule(void) + __schedule(false); + sched_preempt_enable_no_resched(); + } while (need_resched()); ++ sched_update_worker(tsk); + } + EXPORT_SYMBOL(schedule); + +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 21484e3938a6..77ae44a1a9ee 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -843,43 +843,32 @@ static void wake_up_worker(struct worker_pool *pool) + } + + /** +- * wq_worker_waking_up - a worker is waking up ++ * wq_worker_running - a worker is running again + * @task: task waking up +- * @cpu: CPU @task is waking up to + * +- * This function is called during try_to_wake_up() when a worker is +- * being awoken. +- * +- * CONTEXT: +- * spin_lock_irq(rq->lock) ++ * This function is called when a worker returns from schedule() + */ +-void wq_worker_waking_up(struct task_struct *task, int cpu) ++void wq_worker_running(struct task_struct *task) + { + struct worker *worker = kthread_data(task); + +- if (!(worker->flags & WORKER_NOT_RUNNING)) { +- WARN_ON_ONCE(worker->pool->cpu != cpu); ++ if (!worker->sleeping) ++ return; ++ if (!(worker->flags & WORKER_NOT_RUNNING)) + atomic_inc(&worker->pool->nr_running); +- } ++ worker->sleeping = 0; + } + + /** + * wq_worker_sleeping - a worker is going to sleep + * @task: task going to sleep + * +- * This function is called during schedule() when a busy worker is +- * going to sleep. Worker on the same cpu can be woken up by +- * returning pointer to its task. +- * +- * CONTEXT: +- * spin_lock_irq(rq->lock) +- * +- * Return: +- * Worker task on @cpu to wake up, %NULL if none. ++ * This function is called from schedule() when a busy worker is ++ * going to sleep. + */ +-struct task_struct *wq_worker_sleeping(struct task_struct *task) ++void wq_worker_sleeping(struct task_struct *task) + { +- struct worker *worker = kthread_data(task), *to_wakeup = NULL; ++ struct worker *next, *worker = kthread_data(task); + struct worker_pool *pool; + + /* +@@ -888,13 +877,15 @@ struct task_struct *wq_worker_sleeping(struct task_struct *task) + * checking NOT_RUNNING. + */ + if (worker->flags & WORKER_NOT_RUNNING) +- return NULL; ++ return; + + pool = worker->pool; + +- /* this can only happen on the local cpu */ +- if (WARN_ON_ONCE(pool->cpu != raw_smp_processor_id())) +- return NULL; ++ if (WARN_ON_ONCE(worker->sleeping)) ++ return; ++ ++ worker->sleeping = 1; ++ spin_lock_irq(&pool->lock); + + /* + * The counterpart of the following dec_and_test, implied mb, +@@ -908,9 +899,12 @@ struct task_struct *wq_worker_sleeping(struct task_struct *task) + * lock is safe. + */ + if (atomic_dec_and_test(&pool->nr_running) && +- !list_empty(&pool->worklist)) +- to_wakeup = first_idle_worker(pool); +- return to_wakeup ? to_wakeup->task : NULL; ++ !list_empty(&pool->worklist)) { ++ next = first_idle_worker(pool); ++ if (next) ++ wake_up_process(next->task); ++ } ++ spin_unlock_irq(&pool->lock); + } + + /** +diff --git a/kernel/workqueue_internal.h b/kernel/workqueue_internal.h +index 66fbb5a9e633..30cfed226b39 100644 +--- a/kernel/workqueue_internal.h ++++ b/kernel/workqueue_internal.h +@@ -44,6 +44,7 @@ struct worker { + unsigned long last_active; /* L: last active timestamp */ + unsigned int flags; /* X: flags */ + int id; /* I: worker id */ ++ int sleeping; /* None */ + + /* + * Opaque string set with work_set_desc(). Printed out with task +@@ -69,7 +70,7 @@ static inline struct worker *current_wq_worker(void) + * Scheduler hooks for concurrency managed workqueue. Only to be used from + * sched/core.c and workqueue.c. + */ +-void wq_worker_waking_up(struct task_struct *task, int cpu); +-struct task_struct *wq_worker_sleeping(struct task_struct *task); ++void wq_worker_running(struct task_struct *task); ++void wq_worker_sleeping(struct task_struct *task); + + #endif /* _KERNEL_WORKQUEUE_INTERNAL_H */ +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0193-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch linux-4.19.118/debian/patches-rt/0193-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch --- linux-4.19.98/debian/patches-rt/0193-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0193-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,139 +0,0 @@ -From c6d8c462a41a7c4c64ade776387c5b9394464de6 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Mon, 1 Jul 2013 11:02:42 +0200 -Subject: [PATCH 193/290] workqueue: Prevent workqueue versus ata-piix livelock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -An Intel i7 system regularly detected rcu_preempt stalls after the kernel -was upgraded from 3.6-rt to 3.8-rt. When the stall happened, disk I/O was no -longer possible, unless the system was restarted. - -The kernel message was: -INFO: rcu_preempt self-detected stall on CPU { 6} -[..] -NMI backtrace for cpu 6 -CPU 6 -Pid: 119, comm: irq/19-ata_piix Not tainted 3.8.13-rt13 #11 Shuttle Inc. SX58/SX58 -RIP: 0010:[] [] ip_compute_csum+0x30/0x30 -RSP: 0018:ffff880333303cb0 EFLAGS: 00000002 -RAX: 0000000000000006 RBX: 00000000000003e9 RCX: 0000000000000034 -RDX: 0000000000000000 RSI: ffffffff81aa16d0 RDI: 0000000000000001 -RBP: ffff880333303ce8 R08: ffffffff81aa16d0 R09: ffffffff81c1b8cc -R10: 0000000000000000 R11: 0000000000000000 R12: 000000000005161f -R13: 0000000000000006 R14: ffffffff81aa16d0 R15: 0000000000000002 -FS: 0000000000000000(0000) GS:ffff880333300000(0000) knlGS:0000000000000000 -CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b -CR2: 0000003c1b2bb420 CR3: 0000000001a0f000 CR4: 00000000000007e0 -DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 -DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 -Process irq/19-ata_piix (pid: 119, threadinfo ffff88032d88a000, task ffff88032df80000) -Stack: -ffffffff8124cb32 000000000005161e 00000000000003e9 0000000000001000 -0000000000009022 ffffffff81aa16d0 0000000000000002 ffff880333303cf8 -ffffffff8124caa9 ffff880333303d08 ffffffff8124cad2 ffff880333303d28 -Call Trace: - -[] ? delay_tsc+0x33/0xe3 -[] __delay+0xf/0x11 -[] __const_udelay+0x27/0x29 -[] native_safe_apic_wait_icr_idle+0x39/0x45 -[] __default_send_IPI_dest_field.constprop.0+0x1e/0x58 -[] default_send_IPI_mask_sequence_phys+0x49/0x7d -[] physflat_send_IPI_all+0x17/0x19 -[] arch_trigger_all_cpu_backtrace+0x50/0x79 -[] rcu_check_callbacks+0x1cb/0x568 -[] ? raise_softirq+0x2e/0x35 -[] ? tick_sched_do_timer+0x38/0x38 -[] update_process_times+0x44/0x55 -[] tick_sched_handle+0x4a/0x59 -[] tick_sched_timer+0x3c/0x5b -[] __run_hrtimer+0x9b/0x158 -[] hrtimer_interrupt+0x172/0x2aa -[] smp_apic_timer_interrupt+0x76/0x89 -[] apic_timer_interrupt+0x6d/0x80 - -[] ? __local_lock_irqsave+0x17/0x4a -[] try_to_grab_pending+0x42/0x17e -[] mod_delayed_work_on+0x32/0x88 -[] mod_delayed_work+0x1c/0x1e -[] blk_run_queue_async+0x37/0x39 -[] flush_end_io+0xf1/0x107 -[] blk_finish_request+0x21e/0x264 -[] blk_end_bidi_request+0x42/0x60 -[] blk_end_request+0x10/0x12 -[] scsi_io_completion+0x1bf/0x492 -[] ? sd_done+0x298/0x2ef -[] scsi_finish_command+0xe9/0xf2 -[] scsi_softirq_done+0x106/0x10f -[] blk_done_softirq+0x77/0x87 -[] do_current_softirqs+0x172/0x2e1 -[] ? irq_thread_fn+0x3a/0x3a -[] local_bh_enable+0x43/0x72 -[] irq_forced_thread_fn+0x46/0x52 -[] irq_thread+0x8c/0x17c -[] ? irq_thread+0x17c/0x17c -[] ? wake_threads_waitq+0x44/0x44 -[] kthread+0x8d/0x95 -[] ? __kthread_parkme+0x65/0x65 -[] ret_from_fork+0x7c/0xb0 -[] ? __kthread_parkme+0x65/0x65 - -The state of softirqd of this CPU at the time of the crash was: -ksoftirqd/6 R running task 0 53 2 0x00000000 -ffff88032fc39d18 0000000000000046 ffff88033330c4c0 ffff8803303f4710 -ffff88032fc39fd8 ffff88032fc39fd8 0000000000000000 0000000000062500 -ffff88032df88000 ffff8803303f4710 0000000000000000 ffff88032fc38000 -Call Trace: -[] ? __queue_work+0x27c/0x27c -[] preempt_schedule+0x61/0x76 -[] migrate_enable+0xe5/0x1df -[] ? __queue_work+0x27c/0x27c -[] run_timer_softirq+0x161/0x1d6 -[] do_current_softirqs+0x172/0x2e1 -[] run_ksoftirqd+0x2d/0x45 -[] smpboot_thread_fn+0x2ea/0x308 -[] ? test_ti_thread_flag+0xc/0xc -[] ? test_ti_thread_flag+0xc/0xc -[] kthread+0x8d/0x95 -[] ? __kthread_parkme+0x65/0x65 -[] ret_from_fork+0x7c/0xb0 -[] ? __kthread_parkme+0x65/0x65 - -Apparently, the softirq demon and the ata_piix IRQ handler were waiting -for each other to finish ending up in a livelock. After the below patch -was applied, the system no longer crashes. - -Reported-by: Carsten Emde -Proposed-by: Thomas Gleixner -Tested by: Carsten Emde -Signed-off-by: Carsten Emde -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/workqueue.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 0efb8d25d940..34734cdb5cb6 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -50,6 +50,7 @@ - #include - #include - #include -+#include - - #include "workqueue_internal.h" - -@@ -1281,7 +1282,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - local_unlock_irqrestore(pendingb_lock, *flags); - if (work_is_canceling(work)) - return -ENOENT; -- cpu_relax(); -+ cpu_chill(); - return -EAGAIN; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0194-debugobjects-Make-RT-aware.patch linux-4.19.118/debian/patches-rt/0194-debugobjects-Make-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0194-debugobjects-Make-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0194-debugobjects-Make-RT-aware.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,32 @@ +From 64a6b61b00e8d28a51171b6461134ce12cb70b28 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sun, 17 Jul 2011 21:41:35 +0200 +Subject: [PATCH 194/325] debugobjects: Make RT aware +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Avoid filling the pool / allocating memory with irqs off(). + +Signed-off-by: Thomas Gleixner +--- + lib/debugobjects.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/lib/debugobjects.c b/lib/debugobjects.c +index 14afeeb7d6ef..e28481c402ae 100644 +--- a/lib/debugobjects.c ++++ b/lib/debugobjects.c +@@ -376,7 +376,10 @@ __debug_object_init(void *addr, struct debug_obj_descr *descr, int onstack) + struct debug_obj *obj; + unsigned long flags; + +- fill_pool(); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (preempt_count() == 0 && !irqs_disabled()) ++#endif ++ fill_pool(); + + db = get_bucket((unsigned long) addr); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0194-sched-Distangle-worker-accounting-from-rqlock.patch linux-4.19.118/debian/patches-rt/0194-sched-Distangle-worker-accounting-from-rqlock.patch --- linux-4.19.98/debian/patches-rt/0194-sched-Distangle-worker-accounting-from-rqlock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0194-sched-Distangle-worker-accounting-from-rqlock.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,291 +0,0 @@ -From 811c45a6eb4df7a785f9fe8b20461bd72fee9d2c Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 22 Jun 2011 19:47:03 +0200 -Subject: [PATCH 194/290] sched: Distangle worker accounting from rqlock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The worker accounting for cpu bound workers is plugged into the core -scheduler code and the wakeup code. This is not a hard requirement and -can be avoided by keeping track of the state in the workqueue code -itself. - -Keep track of the sleeping state in the worker itself and call the -notifier before entering the core scheduler. There might be false -positives when the task is woken between that call and actually -scheduling, but that's not really different from scheduling and being -woken immediately after switching away. There is also no harm from -updating nr_running when the task returns from scheduling instead of -accounting it in the wakeup code. - -Signed-off-by: Thomas Gleixner -Cc: Peter Zijlstra -Cc: Tejun Heo -Cc: Jens Axboe -Cc: Linus Torvalds -Link: http://lkml.kernel.org/r/20110622174919.135236139@linutronix.de -Signed-off-by: Thomas Gleixner -[bigeasy: preempt_disable() around wq_worker_sleeping() by Daniel Bristot de - Oliveira] -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/sched/core.c | 90 +++++++++---------------------------- - kernel/workqueue.c | 52 ++++++++++----------- - kernel/workqueue_internal.h | 5 ++- - 3 files changed, 47 insertions(+), 100 deletions(-) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 3b2664e691de..dcf2deedd3f8 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1704,10 +1704,6 @@ static inline void ttwu_activate(struct rq *rq, struct task_struct *p, int en_fl - { - activate_task(rq, p, en_flags); - p->on_rq = TASK_ON_RQ_QUEUED; -- -- /* If a worker is waking up, notify the workqueue: */ -- if (p->flags & PF_WQ_WORKER) -- wq_worker_waking_up(p, cpu_of(rq)); - } - - /* -@@ -2143,56 +2139,6 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) - return success; - } - --/** -- * try_to_wake_up_local - try to wake up a local task with rq lock held -- * @p: the thread to be awakened -- * @rf: request-queue flags for pinning -- * -- * Put @p on the run-queue if it's not already there. The caller must -- * ensure that this_rq() is locked, @p is bound to this_rq() and not -- * the current task. -- */ --static void try_to_wake_up_local(struct task_struct *p, struct rq_flags *rf) --{ -- struct rq *rq = task_rq(p); -- -- if (WARN_ON_ONCE(rq != this_rq()) || -- WARN_ON_ONCE(p == current)) -- return; -- -- lockdep_assert_held(&rq->lock); -- -- if (!raw_spin_trylock(&p->pi_lock)) { -- /* -- * This is OK, because current is on_cpu, which avoids it being -- * picked for load-balance and preemption/IRQs are still -- * disabled avoiding further scheduler activity on it and we've -- * not yet picked a replacement task. -- */ -- rq_unlock(rq, rf); -- raw_spin_lock(&p->pi_lock); -- rq_relock(rq, rf); -- } -- -- if (!(p->state & TASK_NORMAL)) -- goto out; -- -- trace_sched_waking(p); -- -- if (!task_on_rq_queued(p)) { -- if (p->in_iowait) { -- delayacct_blkio_end(p); -- atomic_dec(&rq->nr_iowait); -- } -- ttwu_activate(rq, p, ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK); -- } -- -- ttwu_do_wakeup(rq, p, 0, rf); -- ttwu_stat(p, smp_processor_id(), 0); --out: -- raw_spin_unlock(&p->pi_lock); --} -- - /** - * wake_up_process - Wake up a specific process - * @p: The process to be woken up. -@@ -3561,21 +3507,6 @@ static void __sched notrace __schedule(bool preempt) - atomic_inc(&rq->nr_iowait); - delayacct_blkio_start(); - } -- -- /* -- * If a worker went to sleep, notify and ask workqueue -- * whether it wants to wake up a task to maintain -- * concurrency. -- * Only call wake up if prev isn't blocked on a sleeping -- * spin lock. -- */ -- if (prev->flags & PF_WQ_WORKER && !prev->saved_state) { -- struct task_struct *to_wakeup; -- -- to_wakeup = wq_worker_sleeping(prev); -- if (to_wakeup) -- try_to_wake_up_local(to_wakeup, &rf); -- } - } - switch_count = &prev->nvcsw; - } -@@ -3635,6 +3566,20 @@ static inline void sched_submit_work(struct task_struct *tsk) - { - if (!tsk->state || tsk_is_pi_blocked(tsk)) - return; -+ -+ /* -+ * If a worker went to sleep, notify and ask workqueue whether -+ * it wants to wake up a task to maintain concurrency. -+ * As this function is called inside the schedule() context, -+ * we disable preemption to avoid it calling schedule() again -+ * in the possible wakeup of a kworker. -+ */ -+ if (tsk->flags & PF_WQ_WORKER) { -+ preempt_disable(); -+ wq_worker_sleeping(tsk); -+ preempt_enable_no_resched(); -+ } -+ - /* - * If we are going to sleep and we have plugged IO queued, - * make sure to submit it to avoid deadlocks. -@@ -3643,6 +3588,12 @@ static inline void sched_submit_work(struct task_struct *tsk) - blk_schedule_flush_plug(tsk); - } - -+static void sched_update_worker(struct task_struct *tsk) -+{ -+ if (tsk->flags & PF_WQ_WORKER) -+ wq_worker_running(tsk); -+} -+ - asmlinkage __visible void __sched schedule(void) - { - struct task_struct *tsk = current; -@@ -3653,6 +3604,7 @@ asmlinkage __visible void __sched schedule(void) - __schedule(false); - sched_preempt_enable_no_resched(); - } while (need_resched()); -+ sched_update_worker(tsk); - } - EXPORT_SYMBOL(schedule); - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 34734cdb5cb6..045b82ca0eb5 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -843,43 +843,32 @@ static void wake_up_worker(struct worker_pool *pool) - } - - /** -- * wq_worker_waking_up - a worker is waking up -+ * wq_worker_running - a worker is running again - * @task: task waking up -- * @cpu: CPU @task is waking up to - * -- * This function is called during try_to_wake_up() when a worker is -- * being awoken. -- * -- * CONTEXT: -- * spin_lock_irq(rq->lock) -+ * This function is called when a worker returns from schedule() - */ --void wq_worker_waking_up(struct task_struct *task, int cpu) -+void wq_worker_running(struct task_struct *task) - { - struct worker *worker = kthread_data(task); - -- if (!(worker->flags & WORKER_NOT_RUNNING)) { -- WARN_ON_ONCE(worker->pool->cpu != cpu); -+ if (!worker->sleeping) -+ return; -+ if (!(worker->flags & WORKER_NOT_RUNNING)) - atomic_inc(&worker->pool->nr_running); -- } -+ worker->sleeping = 0; - } - - /** - * wq_worker_sleeping - a worker is going to sleep - * @task: task going to sleep - * -- * This function is called during schedule() when a busy worker is -- * going to sleep. Worker on the same cpu can be woken up by -- * returning pointer to its task. -- * -- * CONTEXT: -- * spin_lock_irq(rq->lock) -- * -- * Return: -- * Worker task on @cpu to wake up, %NULL if none. -+ * This function is called from schedule() when a busy worker is -+ * going to sleep. - */ --struct task_struct *wq_worker_sleeping(struct task_struct *task) -+void wq_worker_sleeping(struct task_struct *task) - { -- struct worker *worker = kthread_data(task), *to_wakeup = NULL; -+ struct worker *next, *worker = kthread_data(task); - struct worker_pool *pool; - - /* -@@ -888,13 +877,15 @@ struct task_struct *wq_worker_sleeping(struct task_struct *task) - * checking NOT_RUNNING. - */ - if (worker->flags & WORKER_NOT_RUNNING) -- return NULL; -+ return; - - pool = worker->pool; - -- /* this can only happen on the local cpu */ -- if (WARN_ON_ONCE(pool->cpu != raw_smp_processor_id())) -- return NULL; -+ if (WARN_ON_ONCE(worker->sleeping)) -+ return; -+ -+ worker->sleeping = 1; -+ spin_lock_irq(&pool->lock); - - /* - * The counterpart of the following dec_and_test, implied mb, -@@ -908,9 +899,12 @@ struct task_struct *wq_worker_sleeping(struct task_struct *task) - * lock is safe. - */ - if (atomic_dec_and_test(&pool->nr_running) && -- !list_empty(&pool->worklist)) -- to_wakeup = first_idle_worker(pool); -- return to_wakeup ? to_wakeup->task : NULL; -+ !list_empty(&pool->worklist)) { -+ next = first_idle_worker(pool); -+ if (next) -+ wake_up_process(next->task); -+ } -+ spin_unlock_irq(&pool->lock); - } - - /** -diff --git a/kernel/workqueue_internal.h b/kernel/workqueue_internal.h -index 66fbb5a9e633..30cfed226b39 100644 ---- a/kernel/workqueue_internal.h -+++ b/kernel/workqueue_internal.h -@@ -44,6 +44,7 @@ struct worker { - unsigned long last_active; /* L: last active timestamp */ - unsigned int flags; /* X: flags */ - int id; /* I: worker id */ -+ int sleeping; /* None */ - - /* - * Opaque string set with work_set_desc(). Printed out with task -@@ -69,7 +70,7 @@ static inline struct worker *current_wq_worker(void) - * Scheduler hooks for concurrency managed workqueue. Only to be used from - * sched/core.c and workqueue.c. - */ --void wq_worker_waking_up(struct task_struct *task, int cpu); --struct task_struct *wq_worker_sleeping(struct task_struct *task); -+void wq_worker_running(struct task_struct *task); -+void wq_worker_sleeping(struct task_struct *task); - - #endif /* _KERNEL_WORKQUEUE_INTERNAL_H */ --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0195-debugobjects-Make-RT-aware.patch linux-4.19.118/debian/patches-rt/0195-debugobjects-Make-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0195-debugobjects-Make-RT-aware.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0195-debugobjects-Make-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -From 0afdb35f56928f5bde82e37d5a90197756bbbc21 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 17 Jul 2011 21:41:35 +0200 -Subject: [PATCH 195/290] debugobjects: Make RT aware -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Avoid filling the pool / allocating memory with irqs off(). - -Signed-off-by: Thomas Gleixner ---- - lib/debugobjects.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/lib/debugobjects.c b/lib/debugobjects.c -index 14afeeb7d6ef..e28481c402ae 100644 ---- a/lib/debugobjects.c -+++ b/lib/debugobjects.c -@@ -376,7 +376,10 @@ __debug_object_init(void *addr, struct debug_obj_descr *descr, int onstack) - struct debug_obj *obj; - unsigned long flags; - -- fill_pool(); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (preempt_count() == 0 && !irqs_disabled()) -+#endif -+ fill_pool(); - - db = get_bucket((unsigned long) addr); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0195-seqlock-Prevent-rt-starvation.patch linux-4.19.118/debian/patches-rt/0195-seqlock-Prevent-rt-starvation.patch --- linux-4.19.98/debian/patches-rt/0195-seqlock-Prevent-rt-starvation.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0195-seqlock-Prevent-rt-starvation.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,195 @@ +From df0cac618c41453a2bc5292c8af2ea8e21ee39c1 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 22 Feb 2012 12:03:30 +0100 +Subject: [PATCH 195/325] seqlock: Prevent rt starvation +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +If a low prio writer gets preempted while holding the seqlock write +locked, a high prio reader spins forever on RT. + +To prevent this let the reader grab the spinlock, so it blocks and +eventually boosts the writer. This way the writer can proceed and +endless spinning is prevented. + +For seqcount writers we disable preemption over the update code +path. Thanks to Al Viro for distangling some VFS code to make that +possible. + +Nicholas Mc Guire: +- spin_lock+unlock => spin_unlock_wait +- __write_seqcount_begin => __raw_write_seqcount_begin + +Signed-off-by: Thomas Gleixner +--- + include/linux/seqlock.h | 57 ++++++++++++++++++++++++++++++++--------- + include/net/neighbour.h | 6 ++--- + 2 files changed, 48 insertions(+), 15 deletions(-) + +diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h +index bcf4cf26b8c8..689ed53016c7 100644 +--- a/include/linux/seqlock.h ++++ b/include/linux/seqlock.h +@@ -221,20 +221,30 @@ static inline int read_seqcount_retry(const seqcount_t *s, unsigned start) + return __read_seqcount_retry(s, start); + } + +- +- +-static inline void raw_write_seqcount_begin(seqcount_t *s) ++static inline void __raw_write_seqcount_begin(seqcount_t *s) + { + s->sequence++; + smp_wmb(); + } + +-static inline void raw_write_seqcount_end(seqcount_t *s) ++static inline void raw_write_seqcount_begin(seqcount_t *s) ++{ ++ preempt_disable_rt(); ++ __raw_write_seqcount_begin(s); ++} ++ ++static inline void __raw_write_seqcount_end(seqcount_t *s) + { + smp_wmb(); + s->sequence++; + } + ++static inline void raw_write_seqcount_end(seqcount_t *s) ++{ ++ __raw_write_seqcount_end(s); ++ preempt_enable_rt(); ++} ++ + /** + * raw_write_seqcount_barrier - do a seq write barrier + * @s: pointer to seqcount_t +@@ -428,10 +438,33 @@ typedef struct { + /* + * Read side functions for starting and finalizing a read side section. + */ ++#ifndef CONFIG_PREEMPT_RT_FULL + static inline unsigned read_seqbegin(const seqlock_t *sl) + { + return read_seqcount_begin(&sl->seqcount); + } ++#else ++/* ++ * Starvation safe read side for RT ++ */ ++static inline unsigned read_seqbegin(seqlock_t *sl) ++{ ++ unsigned ret; ++ ++repeat: ++ ret = READ_ONCE(sl->seqcount.sequence); ++ if (unlikely(ret & 1)) { ++ /* ++ * Take the lock and let the writer proceed (i.e. evtl ++ * boost it), otherwise we could loop here forever. ++ */ ++ spin_unlock_wait(&sl->lock); ++ goto repeat; ++ } ++ smp_rmb(); ++ return ret; ++} ++#endif + + static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) + { +@@ -446,36 +479,36 @@ static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) + static inline void write_seqlock(seqlock_t *sl) + { + spin_lock(&sl->lock); +- write_seqcount_begin(&sl->seqcount); ++ __raw_write_seqcount_begin(&sl->seqcount); + } + + static inline void write_sequnlock(seqlock_t *sl) + { +- write_seqcount_end(&sl->seqcount); ++ __raw_write_seqcount_end(&sl->seqcount); + spin_unlock(&sl->lock); + } + + static inline void write_seqlock_bh(seqlock_t *sl) + { + spin_lock_bh(&sl->lock); +- write_seqcount_begin(&sl->seqcount); ++ __raw_write_seqcount_begin(&sl->seqcount); + } + + static inline void write_sequnlock_bh(seqlock_t *sl) + { +- write_seqcount_end(&sl->seqcount); ++ __raw_write_seqcount_end(&sl->seqcount); + spin_unlock_bh(&sl->lock); + } + + static inline void write_seqlock_irq(seqlock_t *sl) + { + spin_lock_irq(&sl->lock); +- write_seqcount_begin(&sl->seqcount); ++ __raw_write_seqcount_begin(&sl->seqcount); + } + + static inline void write_sequnlock_irq(seqlock_t *sl) + { +- write_seqcount_end(&sl->seqcount); ++ __raw_write_seqcount_end(&sl->seqcount); + spin_unlock_irq(&sl->lock); + } + +@@ -484,7 +517,7 @@ static inline unsigned long __write_seqlock_irqsave(seqlock_t *sl) + unsigned long flags; + + spin_lock_irqsave(&sl->lock, flags); +- write_seqcount_begin(&sl->seqcount); ++ __raw_write_seqcount_begin(&sl->seqcount); + return flags; + } + +@@ -494,7 +527,7 @@ static inline unsigned long __write_seqlock_irqsave(seqlock_t *sl) + static inline void + write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags) + { +- write_seqcount_end(&sl->seqcount); ++ __raw_write_seqcount_end(&sl->seqcount); + spin_unlock_irqrestore(&sl->lock, flags); + } + +diff --git a/include/net/neighbour.h b/include/net/neighbour.h +index 5ce035984a4d..1166fc17b757 100644 +--- a/include/net/neighbour.h ++++ b/include/net/neighbour.h +@@ -451,7 +451,7 @@ static inline int neigh_hh_bridge(struct hh_cache *hh, struct sk_buff *skb) + } + #endif + +-static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb) ++static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb) + { + unsigned int hh_alen = 0; + unsigned int seq; +@@ -493,7 +493,7 @@ static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb + + static inline int neigh_output(struct neighbour *n, struct sk_buff *skb) + { +- const struct hh_cache *hh = &n->hh; ++ struct hh_cache *hh = &n->hh; + + if ((n->nud_state & NUD_CONNECTED) && hh->hh_len) + return neigh_hh_output(hh, skb); +@@ -534,7 +534,7 @@ struct neighbour_cb { + + #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) + +-static inline void neigh_ha_snapshot(char *dst, const struct neighbour *n, ++static inline void neigh_ha_snapshot(char *dst, struct neighbour *n, + const struct net_device *dev) + { + unsigned int seq; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0196-seqlock-Prevent-rt-starvation.patch linux-4.19.118/debian/patches-rt/0196-seqlock-Prevent-rt-starvation.patch --- linux-4.19.98/debian/patches-rt/0196-seqlock-Prevent-rt-starvation.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0196-seqlock-Prevent-rt-starvation.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,195 +0,0 @@ -From 77d71203cae68a6d582b3c05f375bd68caea10e8 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 22 Feb 2012 12:03:30 +0100 -Subject: [PATCH 196/290] seqlock: Prevent rt starvation -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -If a low prio writer gets preempted while holding the seqlock write -locked, a high prio reader spins forever on RT. - -To prevent this let the reader grab the spinlock, so it blocks and -eventually boosts the writer. This way the writer can proceed and -endless spinning is prevented. - -For seqcount writers we disable preemption over the update code -path. Thanks to Al Viro for distangling some VFS code to make that -possible. - -Nicholas Mc Guire: -- spin_lock+unlock => spin_unlock_wait -- __write_seqcount_begin => __raw_write_seqcount_begin - -Signed-off-by: Thomas Gleixner ---- - include/linux/seqlock.h | 57 ++++++++++++++++++++++++++++++++--------- - include/net/neighbour.h | 6 ++--- - 2 files changed, 48 insertions(+), 15 deletions(-) - -diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h -index bcf4cf26b8c8..689ed53016c7 100644 ---- a/include/linux/seqlock.h -+++ b/include/linux/seqlock.h -@@ -221,20 +221,30 @@ static inline int read_seqcount_retry(const seqcount_t *s, unsigned start) - return __read_seqcount_retry(s, start); - } - -- -- --static inline void raw_write_seqcount_begin(seqcount_t *s) -+static inline void __raw_write_seqcount_begin(seqcount_t *s) - { - s->sequence++; - smp_wmb(); - } - --static inline void raw_write_seqcount_end(seqcount_t *s) -+static inline void raw_write_seqcount_begin(seqcount_t *s) -+{ -+ preempt_disable_rt(); -+ __raw_write_seqcount_begin(s); -+} -+ -+static inline void __raw_write_seqcount_end(seqcount_t *s) - { - smp_wmb(); - s->sequence++; - } - -+static inline void raw_write_seqcount_end(seqcount_t *s) -+{ -+ __raw_write_seqcount_end(s); -+ preempt_enable_rt(); -+} -+ - /** - * raw_write_seqcount_barrier - do a seq write barrier - * @s: pointer to seqcount_t -@@ -428,10 +438,33 @@ typedef struct { - /* - * Read side functions for starting and finalizing a read side section. - */ -+#ifndef CONFIG_PREEMPT_RT_FULL - static inline unsigned read_seqbegin(const seqlock_t *sl) - { - return read_seqcount_begin(&sl->seqcount); - } -+#else -+/* -+ * Starvation safe read side for RT -+ */ -+static inline unsigned read_seqbegin(seqlock_t *sl) -+{ -+ unsigned ret; -+ -+repeat: -+ ret = READ_ONCE(sl->seqcount.sequence); -+ if (unlikely(ret & 1)) { -+ /* -+ * Take the lock and let the writer proceed (i.e. evtl -+ * boost it), otherwise we could loop here forever. -+ */ -+ spin_unlock_wait(&sl->lock); -+ goto repeat; -+ } -+ smp_rmb(); -+ return ret; -+} -+#endif - - static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) - { -@@ -446,36 +479,36 @@ static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start) - static inline void write_seqlock(seqlock_t *sl) - { - spin_lock(&sl->lock); -- write_seqcount_begin(&sl->seqcount); -+ __raw_write_seqcount_begin(&sl->seqcount); - } - - static inline void write_sequnlock(seqlock_t *sl) - { -- write_seqcount_end(&sl->seqcount); -+ __raw_write_seqcount_end(&sl->seqcount); - spin_unlock(&sl->lock); - } - - static inline void write_seqlock_bh(seqlock_t *sl) - { - spin_lock_bh(&sl->lock); -- write_seqcount_begin(&sl->seqcount); -+ __raw_write_seqcount_begin(&sl->seqcount); - } - - static inline void write_sequnlock_bh(seqlock_t *sl) - { -- write_seqcount_end(&sl->seqcount); -+ __raw_write_seqcount_end(&sl->seqcount); - spin_unlock_bh(&sl->lock); - } - - static inline void write_seqlock_irq(seqlock_t *sl) - { - spin_lock_irq(&sl->lock); -- write_seqcount_begin(&sl->seqcount); -+ __raw_write_seqcount_begin(&sl->seqcount); - } - - static inline void write_sequnlock_irq(seqlock_t *sl) - { -- write_seqcount_end(&sl->seqcount); -+ __raw_write_seqcount_end(&sl->seqcount); - spin_unlock_irq(&sl->lock); - } - -@@ -484,7 +517,7 @@ static inline unsigned long __write_seqlock_irqsave(seqlock_t *sl) - unsigned long flags; - - spin_lock_irqsave(&sl->lock, flags); -- write_seqcount_begin(&sl->seqcount); -+ __raw_write_seqcount_begin(&sl->seqcount); - return flags; - } - -@@ -494,7 +527,7 @@ static inline unsigned long __write_seqlock_irqsave(seqlock_t *sl) - static inline void - write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags) - { -- write_seqcount_end(&sl->seqcount); -+ __raw_write_seqcount_end(&sl->seqcount); - spin_unlock_irqrestore(&sl->lock, flags); - } - -diff --git a/include/net/neighbour.h b/include/net/neighbour.h -index 5ce035984a4d..1166fc17b757 100644 ---- a/include/net/neighbour.h -+++ b/include/net/neighbour.h -@@ -451,7 +451,7 @@ static inline int neigh_hh_bridge(struct hh_cache *hh, struct sk_buff *skb) - } - #endif - --static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb) -+static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb) - { - unsigned int hh_alen = 0; - unsigned int seq; -@@ -493,7 +493,7 @@ static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb - - static inline int neigh_output(struct neighbour *n, struct sk_buff *skb) - { -- const struct hh_cache *hh = &n->hh; -+ struct hh_cache *hh = &n->hh; - - if ((n->nud_state & NUD_CONNECTED) && hh->hh_len) - return neigh_hh_output(hh, skb); -@@ -534,7 +534,7 @@ struct neighbour_cb { - - #define NEIGH_CB(skb) ((struct neighbour_cb *)(skb)->cb) - --static inline void neigh_ha_snapshot(char *dst, const struct neighbour *n, -+static inline void neigh_ha_snapshot(char *dst, struct neighbour *n, - const struct net_device *dev) - { - unsigned int seq; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0196-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch linux-4.19.118/debian/patches-rt/0196-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch --- linux-4.19.98/debian/patches-rt/0196-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0196-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,61 @@ +From 3aac129a44a573f7e78f4f8554d0dee0936e345d Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Wed, 18 Feb 2015 16:05:28 +0100 +Subject: [PATCH 196/325] sunrpc: Make svc_xprt_do_enqueue() use + get_cpu_light() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:915 +|in_atomic(): 1, irqs_disabled(): 0, pid: 3194, name: rpc.nfsd +|Preemption disabled at:[] svc_xprt_received+0x4b/0xc0 [sunrpc] +|CPU: 6 PID: 3194 Comm: rpc.nfsd Not tainted 3.18.7-rt1 #9 +|Hardware name: MEDION MS-7848/MS-7848, BIOS M7848W08.404 11/06/2014 +| ffff880409630000 ffff8800d9a33c78 ffffffff815bdeb5 0000000000000002 +| 0000000000000000 ffff8800d9a33c98 ffffffff81073c86 ffff880408dd6008 +| ffff880408dd6000 ffff8800d9a33cb8 ffffffff815c3d84 ffff88040b3ac000 +|Call Trace: +| [] dump_stack+0x4f/0x9e +| [] __might_sleep+0xe6/0x150 +| [] rt_spin_lock+0x24/0x50 +| [] svc_xprt_do_enqueue+0x80/0x230 [sunrpc] +| [] svc_xprt_received+0x4b/0xc0 [sunrpc] +| [] svc_add_new_perm_xprt+0x6d/0x80 [sunrpc] +| [] svc_addsock+0x143/0x200 [sunrpc] +| [] write_ports+0x28c/0x340 [nfsd] +| [] nfsctl_transaction_write+0x4c/0x80 [nfsd] +| [] vfs_write+0xb3/0x1d0 +| [] SyS_write+0x49/0xb0 +| [] system_call_fastpath+0x16/0x1b + + +Signed-off-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + net/sunrpc/svc_xprt.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c +index 6cf0fd37cbf0..48c0a0b90946 100644 +--- a/net/sunrpc/svc_xprt.c ++++ b/net/sunrpc/svc_xprt.c +@@ -393,7 +393,7 @@ void svc_xprt_do_enqueue(struct svc_xprt *xprt) + if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) + return; + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + pool = svc_pool_for_cpu(xprt->xpt_server, cpu); + + atomic_long_inc(&pool->sp_stats.packets); +@@ -417,7 +417,7 @@ void svc_xprt_do_enqueue(struct svc_xprt *xprt) + rqstp = NULL; + out_unlock: + rcu_read_unlock(); +- put_cpu(); ++ put_cpu_light(); + trace_svc_xprt_do_enqueue(xprt, rqstp); + } + EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0197-net-Use-skbufhead-with-raw-lock.patch linux-4.19.118/debian/patches-rt/0197-net-Use-skbufhead-with-raw-lock.patch --- linux-4.19.98/debian/patches-rt/0197-net-Use-skbufhead-with-raw-lock.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0197-net-Use-skbufhead-with-raw-lock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,173 @@ +From 2ecccb79d16487a93f3885f752f4d03e13b7e308 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 12 Jul 2011 15:38:34 +0200 +Subject: [PATCH 197/325] net: Use skbufhead with raw lock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Use the rps lock as rawlock so we can keep irq-off regions. It looks low +latency. However we can't kfree() from this context therefore we defer this +to the softirq and use the tofree_queue list for it (similar to process_queue). + +Signed-off-by: Thomas Gleixner +--- + include/linux/netdevice.h | 1 + + include/linux/skbuff.h | 7 +++++++ + net/core/dev.c | 33 +++++++++++++++++++++++++-------- + 3 files changed, 33 insertions(+), 8 deletions(-) + +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +index 84bbdcbb199a..b816eb0bc1c4 100644 +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -2982,6 +2982,7 @@ struct softnet_data { + unsigned int dropped; + struct sk_buff_head input_pkt_queue; + struct napi_struct backlog; ++ struct sk_buff_head tofree_queue; + + }; + +diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h +index 25407c206e73..d4d7aea13cc6 100644 +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -287,6 +287,7 @@ struct sk_buff_head { + + __u32 qlen; + spinlock_t lock; ++ raw_spinlock_t raw_lock; + }; + + struct sk_buff; +@@ -1718,6 +1719,12 @@ static inline void skb_queue_head_init(struct sk_buff_head *list) + __skb_queue_head_init(list); + } + ++static inline void skb_queue_head_init_raw(struct sk_buff_head *list) ++{ ++ raw_spin_lock_init(&list->raw_lock); ++ __skb_queue_head_init(list); ++} ++ + static inline void skb_queue_head_init_class(struct sk_buff_head *list, + struct lock_class_key *class) + { +diff --git a/net/core/dev.c b/net/core/dev.c +index 655dbfac09fd..65eeba4e5eac 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -218,14 +218,14 @@ static inline struct hlist_head *dev_index_hash(struct net *net, int ifindex) + static inline void rps_lock(struct softnet_data *sd) + { + #ifdef CONFIG_RPS +- spin_lock(&sd->input_pkt_queue.lock); ++ raw_spin_lock(&sd->input_pkt_queue.raw_lock); + #endif + } + + static inline void rps_unlock(struct softnet_data *sd) + { + #ifdef CONFIG_RPS +- spin_unlock(&sd->input_pkt_queue.lock); ++ raw_spin_unlock(&sd->input_pkt_queue.raw_lock); + #endif + } + +@@ -5248,7 +5248,7 @@ static void flush_backlog(struct work_struct *work) + skb_queue_walk_safe(&sd->input_pkt_queue, skb, tmp) { + if (skb->dev->reg_state == NETREG_UNREGISTERING) { + __skb_unlink(skb, &sd->input_pkt_queue); +- kfree_skb(skb); ++ __skb_queue_tail(&sd->tofree_queue, skb); + input_queue_head_incr(sd); + } + } +@@ -5258,11 +5258,14 @@ static void flush_backlog(struct work_struct *work) + skb_queue_walk_safe(&sd->process_queue, skb, tmp) { + if (skb->dev->reg_state == NETREG_UNREGISTERING) { + __skb_unlink(skb, &sd->process_queue); +- kfree_skb(skb); ++ __skb_queue_tail(&sd->tofree_queue, skb); + input_queue_head_incr(sd); + } + } ++ if (!skb_queue_empty(&sd->tofree_queue)) ++ raise_softirq_irqoff(NET_RX_SOFTIRQ); + local_bh_enable(); ++ + } + + static void flush_all_backlogs(void) +@@ -5841,7 +5844,9 @@ static int process_backlog(struct napi_struct *napi, int quota) + while (again) { + struct sk_buff *skb; + ++ local_irq_disable(); + while ((skb = __skb_dequeue(&sd->process_queue))) { ++ local_irq_enable(); + rcu_read_lock(); + __netif_receive_skb(skb); + rcu_read_unlock(); +@@ -5849,9 +5854,9 @@ static int process_backlog(struct napi_struct *napi, int quota) + if (++work >= quota) + return work; + ++ local_irq_disable(); + } + +- local_irq_disable(); + rps_lock(sd); + if (skb_queue_empty(&sd->input_pkt_queue)) { + /* +@@ -6316,13 +6321,21 @@ static __latent_entropy void net_rx_action(struct softirq_action *h) + unsigned long time_limit = jiffies + + usecs_to_jiffies(netdev_budget_usecs); + int budget = netdev_budget; ++ struct sk_buff_head tofree_q; ++ struct sk_buff *skb; + LIST_HEAD(list); + LIST_HEAD(repoll); + ++ __skb_queue_head_init(&tofree_q); ++ + local_irq_disable(); ++ skb_queue_splice_init(&sd->tofree_queue, &tofree_q); + list_splice_init(&sd->poll_list, &list); + local_irq_enable(); + ++ while ((skb = __skb_dequeue(&tofree_q))) ++ kfree_skb(skb); ++ + for (;;) { + struct napi_struct *n; + +@@ -9506,10 +9519,13 @@ static int dev_cpu_dead(unsigned int oldcpu) + netif_rx_ni(skb); + input_queue_head_incr(oldsd); + } +- while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { ++ while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { + netif_rx_ni(skb); + input_queue_head_incr(oldsd); + } ++ while ((skb = __skb_dequeue(&oldsd->tofree_queue))) { ++ kfree_skb(skb); ++ } + + return 0; + } +@@ -9820,8 +9836,9 @@ static int __init net_dev_init(void) + + INIT_WORK(flush, flush_backlog); + +- skb_queue_head_init(&sd->input_pkt_queue); +- skb_queue_head_init(&sd->process_queue); ++ skb_queue_head_init_raw(&sd->input_pkt_queue); ++ skb_queue_head_init_raw(&sd->process_queue); ++ skb_queue_head_init_raw(&sd->tofree_queue); + #ifdef CONFIG_XFRM_OFFLOAD + skb_queue_head_init(&sd->xfrm_backlog); + #endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0197-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch linux-4.19.118/debian/patches-rt/0197-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch --- linux-4.19.98/debian/patches-rt/0197-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0197-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -From 9d2425d84597125b000c785903c4afd36f00673c Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Wed, 18 Feb 2015 16:05:28 +0100 -Subject: [PATCH 197/290] sunrpc: Make svc_xprt_do_enqueue() use - get_cpu_light() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:915 -|in_atomic(): 1, irqs_disabled(): 0, pid: 3194, name: rpc.nfsd -|Preemption disabled at:[] svc_xprt_received+0x4b/0xc0 [sunrpc] -|CPU: 6 PID: 3194 Comm: rpc.nfsd Not tainted 3.18.7-rt1 #9 -|Hardware name: MEDION MS-7848/MS-7848, BIOS M7848W08.404 11/06/2014 -| ffff880409630000 ffff8800d9a33c78 ffffffff815bdeb5 0000000000000002 -| 0000000000000000 ffff8800d9a33c98 ffffffff81073c86 ffff880408dd6008 -| ffff880408dd6000 ffff8800d9a33cb8 ffffffff815c3d84 ffff88040b3ac000 -|Call Trace: -| [] dump_stack+0x4f/0x9e -| [] __might_sleep+0xe6/0x150 -| [] rt_spin_lock+0x24/0x50 -| [] svc_xprt_do_enqueue+0x80/0x230 [sunrpc] -| [] svc_xprt_received+0x4b/0xc0 [sunrpc] -| [] svc_add_new_perm_xprt+0x6d/0x80 [sunrpc] -| [] svc_addsock+0x143/0x200 [sunrpc] -| [] write_ports+0x28c/0x340 [nfsd] -| [] nfsctl_transaction_write+0x4c/0x80 [nfsd] -| [] vfs_write+0xb3/0x1d0 -| [] SyS_write+0x49/0xb0 -| [] system_call_fastpath+0x16/0x1b - - -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - net/sunrpc/svc_xprt.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c -index 6cf0fd37cbf0..48c0a0b90946 100644 ---- a/net/sunrpc/svc_xprt.c -+++ b/net/sunrpc/svc_xprt.c -@@ -393,7 +393,7 @@ void svc_xprt_do_enqueue(struct svc_xprt *xprt) - if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) - return; - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - pool = svc_pool_for_cpu(xprt->xpt_server, cpu); - - atomic_long_inc(&pool->sp_stats.packets); -@@ -417,7 +417,7 @@ void svc_xprt_do_enqueue(struct svc_xprt *xprt) - rqstp = NULL; - out_unlock: - rcu_read_unlock(); -- put_cpu(); -+ put_cpu_light(); - trace_svc_xprt_do_enqueue(xprt, rqstp); - } - EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0198-net-Use-skbufhead-with-raw-lock.patch linux-4.19.118/debian/patches-rt/0198-net-Use-skbufhead-with-raw-lock.patch --- linux-4.19.98/debian/patches-rt/0198-net-Use-skbufhead-with-raw-lock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0198-net-Use-skbufhead-with-raw-lock.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ -From fc3e6e30f2ab8454e5d71c17c1893c38785c1271 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 12 Jul 2011 15:38:34 +0200 -Subject: [PATCH 198/290] net: Use skbufhead with raw lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Use the rps lock as rawlock so we can keep irq-off regions. It looks low -latency. However we can't kfree() from this context therefore we defer this -to the softirq and use the tofree_queue list for it (similar to process_queue). - -Signed-off-by: Thomas Gleixner ---- - include/linux/netdevice.h | 1 + - include/linux/skbuff.h | 7 +++++++ - net/core/dev.c | 33 +++++++++++++++++++++++++-------- - 3 files changed, 33 insertions(+), 8 deletions(-) - -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index d5527e3828d1..9aba444d7df0 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -2982,6 +2982,7 @@ struct softnet_data { - unsigned int dropped; - struct sk_buff_head input_pkt_queue; - struct napi_struct backlog; -+ struct sk_buff_head tofree_queue; - - }; - -diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h -index 25407c206e73..d4d7aea13cc6 100644 ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -287,6 +287,7 @@ struct sk_buff_head { - - __u32 qlen; - spinlock_t lock; -+ raw_spinlock_t raw_lock; - }; - - struct sk_buff; -@@ -1718,6 +1719,12 @@ static inline void skb_queue_head_init(struct sk_buff_head *list) - __skb_queue_head_init(list); - } - -+static inline void skb_queue_head_init_raw(struct sk_buff_head *list) -+{ -+ raw_spin_lock_init(&list->raw_lock); -+ __skb_queue_head_init(list); -+} -+ - static inline void skb_queue_head_init_class(struct sk_buff_head *list, - struct lock_class_key *class) - { -diff --git a/net/core/dev.c b/net/core/dev.c -index 4926a260bf0e..430ca0e79afc 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -218,14 +218,14 @@ static inline struct hlist_head *dev_index_hash(struct net *net, int ifindex) - static inline void rps_lock(struct softnet_data *sd) - { - #ifdef CONFIG_RPS -- spin_lock(&sd->input_pkt_queue.lock); -+ raw_spin_lock(&sd->input_pkt_queue.raw_lock); - #endif - } - - static inline void rps_unlock(struct softnet_data *sd) - { - #ifdef CONFIG_RPS -- spin_unlock(&sd->input_pkt_queue.lock); -+ raw_spin_unlock(&sd->input_pkt_queue.raw_lock); - #endif - } - -@@ -5275,7 +5275,7 @@ static void flush_backlog(struct work_struct *work) - skb_queue_walk_safe(&sd->input_pkt_queue, skb, tmp) { - if (skb->dev->reg_state == NETREG_UNREGISTERING) { - __skb_unlink(skb, &sd->input_pkt_queue); -- kfree_skb(skb); -+ __skb_queue_tail(&sd->tofree_queue, skb); - input_queue_head_incr(sd); - } - } -@@ -5285,11 +5285,14 @@ static void flush_backlog(struct work_struct *work) - skb_queue_walk_safe(&sd->process_queue, skb, tmp) { - if (skb->dev->reg_state == NETREG_UNREGISTERING) { - __skb_unlink(skb, &sd->process_queue); -- kfree_skb(skb); -+ __skb_queue_tail(&sd->tofree_queue, skb); - input_queue_head_incr(sd); - } - } -+ if (!skb_queue_empty(&sd->tofree_queue)) -+ raise_softirq_irqoff(NET_RX_SOFTIRQ); - local_bh_enable(); -+ - } - - static void flush_all_backlogs(void) -@@ -5868,7 +5871,9 @@ static int process_backlog(struct napi_struct *napi, int quota) - while (again) { - struct sk_buff *skb; - -+ local_irq_disable(); - while ((skb = __skb_dequeue(&sd->process_queue))) { -+ local_irq_enable(); - rcu_read_lock(); - __netif_receive_skb(skb); - rcu_read_unlock(); -@@ -5876,9 +5881,9 @@ static int process_backlog(struct napi_struct *napi, int quota) - if (++work >= quota) - return work; - -+ local_irq_disable(); - } - -- local_irq_disable(); - rps_lock(sd); - if (skb_queue_empty(&sd->input_pkt_queue)) { - /* -@@ -6343,13 +6348,21 @@ static __latent_entropy void net_rx_action(struct softirq_action *h) - unsigned long time_limit = jiffies + - usecs_to_jiffies(netdev_budget_usecs); - int budget = netdev_budget; -+ struct sk_buff_head tofree_q; -+ struct sk_buff *skb; - LIST_HEAD(list); - LIST_HEAD(repoll); - -+ __skb_queue_head_init(&tofree_q); -+ - local_irq_disable(); -+ skb_queue_splice_init(&sd->tofree_queue, &tofree_q); - list_splice_init(&sd->poll_list, &list); - local_irq_enable(); - -+ while ((skb = __skb_dequeue(&tofree_q))) -+ kfree_skb(skb); -+ - for (;;) { - struct napi_struct *n; - -@@ -9522,10 +9535,13 @@ static int dev_cpu_dead(unsigned int oldcpu) - netif_rx_ni(skb); - input_queue_head_incr(oldsd); - } -- while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { -+ while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { - netif_rx_ni(skb); - input_queue_head_incr(oldsd); - } -+ while ((skb = __skb_dequeue(&oldsd->tofree_queue))) { -+ kfree_skb(skb); -+ } - - return 0; - } -@@ -9836,8 +9852,9 @@ static int __init net_dev_init(void) - - INIT_WORK(flush, flush_backlog); - -- skb_queue_head_init(&sd->input_pkt_queue); -- skb_queue_head_init(&sd->process_queue); -+ skb_queue_head_init_raw(&sd->input_pkt_queue); -+ skb_queue_head_init_raw(&sd->process_queue); -+ skb_queue_head_init_raw(&sd->tofree_queue); - #ifdef CONFIG_XFRM_OFFLOAD - skb_queue_head_init(&sd->xfrm_backlog); - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0198-net-move-xmit_recursion-to-per-task-variable-on-RT.patch linux-4.19.118/debian/patches-rt/0198-net-move-xmit_recursion-to-per-task-variable-on-RT.patch --- linux-4.19.98/debian/patches-rt/0198-net-move-xmit_recursion-to-per-task-variable-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0198-net-move-xmit_recursion-to-per-task-variable-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,278 @@ +From 333172fb8641ddac36b12e08c4f88892939590d0 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 13 Jan 2016 15:55:02 +0100 +Subject: [PATCH 198/325] net: move xmit_recursion to per-task variable on -RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +A softirq on -RT can be preempted. That means one task is in +__dev_queue_xmit(), gets preempted and another task may enter +__dev_queue_xmit() aw well. netperf together with a bridge device +will then trigger the `recursion alert` because each task increments +the xmit_recursion variable which is per-CPU. +A virtual device like br0 is required to trigger this warning. + +This patch moves the lock owner and counter to be per task instead per-CPU so +it counts the recursion properly on -RT. The owner is also a task now and not a +CPU number. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/netdevice.h | 95 ++++++++++++++++++++++++++++++++++++--- + include/linux/sched.h | 3 ++ + net/core/dev.c | 15 ++++--- + net/core/filter.c | 6 +-- + 4 files changed, 104 insertions(+), 15 deletions(-) + +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +index b816eb0bc1c4..5de4b66e11fe 100644 +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -587,7 +587,11 @@ struct netdev_queue { + * write-mostly part + */ + spinlock_t _xmit_lock ____cacheline_aligned_in_smp; ++#ifdef CONFIG_PREEMPT_RT_FULL ++ struct task_struct *xmit_lock_owner; ++#else + int xmit_lock_owner; ++#endif + /* + * Time (in jiffies) of last Tx + */ +@@ -2620,14 +2624,53 @@ void netdev_freemem(struct net_device *dev); + void synchronize_net(void); + int init_dummy_netdev(struct net_device *dev); + +-DECLARE_PER_CPU(int, xmit_recursion); + #define XMIT_RECURSION_LIMIT 10 ++#ifdef CONFIG_PREEMPT_RT_FULL ++static inline int dev_recursion_level(void) ++{ ++ return current->xmit_recursion; ++} ++ ++static inline int xmit_rec_read(void) ++{ ++ return current->xmit_recursion; ++} ++ ++static inline void xmit_rec_inc(void) ++{ ++ current->xmit_recursion++; ++} ++ ++static inline void xmit_rec_dec(void) ++{ ++ current->xmit_recursion--; ++} ++ ++#else ++ ++DECLARE_PER_CPU(int, xmit_recursion); + + static inline int dev_recursion_level(void) + { + return this_cpu_read(xmit_recursion); + } + ++static inline int xmit_rec_read(void) ++{ ++ return __this_cpu_read(xmit_recursion); ++} ++ ++static inline void xmit_rec_inc(void) ++{ ++ __this_cpu_inc(xmit_recursion); ++} ++ ++static inline void xmit_rec_dec(void) ++{ ++ __this_cpu_dec(xmit_recursion); ++} ++#endif ++ + struct net_device *dev_get_by_index(struct net *net, int ifindex); + struct net_device *__dev_get_by_index(struct net *net, int ifindex); + struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex); +@@ -3805,10 +3848,48 @@ static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits) + return (1U << debug_value) - 1; + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu) ++{ ++ txq->xmit_lock_owner = current; ++} ++ ++static inline void netdev_queue_clear_owner(struct netdev_queue *txq) ++{ ++ txq->xmit_lock_owner = NULL; ++} ++ ++static inline bool netdev_queue_has_owner(struct netdev_queue *txq) ++{ ++ if (txq->xmit_lock_owner != NULL) ++ return true; ++ return false; ++} ++ ++#else ++ ++static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu) ++{ ++ txq->xmit_lock_owner = cpu; ++} ++ ++static inline void netdev_queue_clear_owner(struct netdev_queue *txq) ++{ ++ txq->xmit_lock_owner = -1; ++} ++ ++static inline bool netdev_queue_has_owner(struct netdev_queue *txq) ++{ ++ if (txq->xmit_lock_owner != -1) ++ return true; ++ return false; ++} ++#endif ++ + static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu) + { + spin_lock(&txq->_xmit_lock); +- txq->xmit_lock_owner = cpu; ++ netdev_queue_set_owner(txq, cpu); + } + + static inline bool __netif_tx_acquire(struct netdev_queue *txq) +@@ -3825,32 +3906,32 @@ static inline void __netif_tx_release(struct netdev_queue *txq) + static inline void __netif_tx_lock_bh(struct netdev_queue *txq) + { + spin_lock_bh(&txq->_xmit_lock); +- txq->xmit_lock_owner = smp_processor_id(); ++ netdev_queue_set_owner(txq, smp_processor_id()); + } + + static inline bool __netif_tx_trylock(struct netdev_queue *txq) + { + bool ok = spin_trylock(&txq->_xmit_lock); + if (likely(ok)) +- txq->xmit_lock_owner = smp_processor_id(); ++ netdev_queue_set_owner(txq, smp_processor_id()); + return ok; + } + + static inline void __netif_tx_unlock(struct netdev_queue *txq) + { +- txq->xmit_lock_owner = -1; ++ netdev_queue_clear_owner(txq); + spin_unlock(&txq->_xmit_lock); + } + + static inline void __netif_tx_unlock_bh(struct netdev_queue *txq) + { +- txq->xmit_lock_owner = -1; ++ netdev_queue_clear_owner(txq); + spin_unlock_bh(&txq->_xmit_lock); + } + + static inline void txq_trans_update(struct netdev_queue *txq) + { +- if (txq->xmit_lock_owner != -1) ++ if (netdev_queue_has_owner(txq)) + txq->trans_start = jiffies; + } + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index a38a2c2a8fe4..756fed8f5994 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1216,6 +1216,9 @@ struct task_struct { + #endif + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + unsigned long task_state_change; ++#endif ++#ifdef CONFIG_PREEMPT_RT_FULL ++ int xmit_recursion; + #endif + int pagefault_disabled; + #ifdef CONFIG_MMU +diff --git a/net/core/dev.c b/net/core/dev.c +index 65eeba4e5eac..031079f6703b 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -3540,8 +3540,10 @@ static void skb_update_prio(struct sk_buff *skb) + #define skb_update_prio(skb) + #endif + ++#ifndef CONFIG_PREEMPT_RT_FULL + DEFINE_PER_CPU(int, xmit_recursion); + EXPORT_SYMBOL(xmit_recursion); ++#endif + + /** + * dev_loopback_xmit - loop back @skb +@@ -3832,9 +3834,12 @@ static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) + if (dev->flags & IFF_UP) { + int cpu = smp_processor_id(); /* ok because BHs are off */ + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ if (txq->xmit_lock_owner != current) { ++#else + if (txq->xmit_lock_owner != cpu) { +- if (unlikely(__this_cpu_read(xmit_recursion) > +- XMIT_RECURSION_LIMIT)) ++#endif ++ if (unlikely(xmit_rec_read() > XMIT_RECURSION_LIMIT)) + goto recursion_alert; + + skb = validate_xmit_skb(skb, dev, &again); +@@ -3844,9 +3849,9 @@ static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) + HARD_TX_LOCK(dev, txq, cpu); + + if (!netif_xmit_stopped(txq)) { +- __this_cpu_inc(xmit_recursion); ++ xmit_rec_inc(); + skb = dev_hard_start_xmit(skb, dev, txq, &rc); +- __this_cpu_dec(xmit_recursion); ++ xmit_rec_dec(); + if (dev_xmit_complete(rc)) { + HARD_TX_UNLOCK(dev, txq); + goto out; +@@ -8565,7 +8570,7 @@ static void netdev_init_one_queue(struct net_device *dev, + /* Initialize queue lock */ + spin_lock_init(&queue->_xmit_lock); + netdev_set_xmit_lockdep_class(&queue->_xmit_lock, dev->type); +- queue->xmit_lock_owner = -1; ++ netdev_queue_clear_owner(queue); + netdev_queue_numa_node_write(queue, NUMA_NO_NODE); + queue->dev = dev; + #ifdef CONFIG_BQL +diff --git a/net/core/filter.c b/net/core/filter.c +index 40b3af05c883..205cd1bb9bc2 100644 +--- a/net/core/filter.c ++++ b/net/core/filter.c +@@ -2000,7 +2000,7 @@ static inline int __bpf_tx_skb(struct net_device *dev, struct sk_buff *skb) + { + int ret; + +- if (unlikely(__this_cpu_read(xmit_recursion) > XMIT_RECURSION_LIMIT)) { ++ if (unlikely(xmit_rec_read() > XMIT_RECURSION_LIMIT)) { + net_crit_ratelimited("bpf: recursion limit reached on datapath, buggy bpf program?\n"); + kfree_skb(skb); + return -ENETDOWN; +@@ -2009,9 +2009,9 @@ static inline int __bpf_tx_skb(struct net_device *dev, struct sk_buff *skb) + skb->dev = dev; + skb->tstamp = 0; + +- __this_cpu_inc(xmit_recursion); ++ xmit_rec_inc(); + ret = dev_queue_xmit(skb); +- __this_cpu_dec(xmit_recursion); ++ xmit_rec_dec(); + + return ret; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0199-net-move-xmit_recursion-to-per-task-variable-on-RT.patch linux-4.19.118/debian/patches-rt/0199-net-move-xmit_recursion-to-per-task-variable-on-RT.patch --- linux-4.19.98/debian/patches-rt/0199-net-move-xmit_recursion-to-per-task-variable-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0199-net-move-xmit_recursion-to-per-task-variable-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -From 4614b75f982f6d986f99de8d4d35afd3da7140b4 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 13 Jan 2016 15:55:02 +0100 -Subject: [PATCH 199/291] net: move xmit_recursion to per-task variable on -RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.90-rt35.tar.xz - -A softirq on -RT can be preempted. That means one task is in -__dev_queue_xmit(), gets preempted and another task may enter -__dev_queue_xmit() aw well. netperf together with a bridge device -will then trigger the `recursion alert` because each task increments -the xmit_recursion variable which is per-CPU. -A virtual device like br0 is required to trigger this warning. - -This patch moves the lock owner and counter to be per task instead per-CPU so -it counts the recursion properly on -RT. The owner is also a task now and not a -CPU number. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/netdevice.h | 95 ++++++++++++++++++++++++++++++++++++--- - include/linux/sched.h | 3 ++ - net/core/dev.c | 15 ++++--- - net/core/filter.c | 6 +-- - 4 files changed, 104 insertions(+), 15 deletions(-) - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -587,7 +587,11 @@ - * write-mostly part - */ - spinlock_t _xmit_lock ____cacheline_aligned_in_smp; -+#ifdef CONFIG_PREEMPT_RT_FULL -+ struct task_struct *xmit_lock_owner; -+#else - int xmit_lock_owner; -+#endif - /* - * Time (in jiffies) of last Tx - */ -@@ -2620,14 +2624,53 @@ - void synchronize_net(void); - int init_dummy_netdev(struct net_device *dev); - --DECLARE_PER_CPU(int, xmit_recursion); - #define XMIT_RECURSION_LIMIT 10 -+#ifdef CONFIG_PREEMPT_RT_FULL -+static inline int dev_recursion_level(void) -+{ -+ return current->xmit_recursion; -+} -+ -+static inline int xmit_rec_read(void) -+{ -+ return current->xmit_recursion; -+} -+ -+static inline void xmit_rec_inc(void) -+{ -+ current->xmit_recursion++; -+} -+ -+static inline void xmit_rec_dec(void) -+{ -+ current->xmit_recursion--; -+} -+ -+#else -+ -+DECLARE_PER_CPU(int, xmit_recursion); - - static inline int dev_recursion_level(void) - { - return this_cpu_read(xmit_recursion); - } - -+static inline int xmit_rec_read(void) -+{ -+ return __this_cpu_read(xmit_recursion); -+} -+ -+static inline void xmit_rec_inc(void) -+{ -+ __this_cpu_inc(xmit_recursion); -+} -+ -+static inline void xmit_rec_dec(void) -+{ -+ __this_cpu_dec(xmit_recursion); -+} -+#endif -+ - struct net_device *dev_get_by_index(struct net *net, int ifindex); - struct net_device *__dev_get_by_index(struct net *net, int ifindex); - struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex); -@@ -3803,10 +3846,48 @@ - return (1U << debug_value) - 1; - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu) -+{ -+ txq->xmit_lock_owner = current; -+} -+ -+static inline void netdev_queue_clear_owner(struct netdev_queue *txq) -+{ -+ txq->xmit_lock_owner = NULL; -+} -+ -+static inline bool netdev_queue_has_owner(struct netdev_queue *txq) -+{ -+ if (txq->xmit_lock_owner != NULL) -+ return true; -+ return false; -+} -+ -+#else -+ -+static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu) -+{ -+ txq->xmit_lock_owner = cpu; -+} -+ -+static inline void netdev_queue_clear_owner(struct netdev_queue *txq) -+{ -+ txq->xmit_lock_owner = -1; -+} -+ -+static inline bool netdev_queue_has_owner(struct netdev_queue *txq) -+{ -+ if (txq->xmit_lock_owner != -1) -+ return true; -+ return false; -+} -+#endif -+ - static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu) - { - spin_lock(&txq->_xmit_lock); -- txq->xmit_lock_owner = cpu; -+ netdev_queue_set_owner(txq, cpu); - } - - static inline bool __netif_tx_acquire(struct netdev_queue *txq) -@@ -3823,32 +3904,32 @@ - static inline void __netif_tx_lock_bh(struct netdev_queue *txq) - { - spin_lock_bh(&txq->_xmit_lock); -- txq->xmit_lock_owner = smp_processor_id(); -+ netdev_queue_set_owner(txq, smp_processor_id()); - } - - static inline bool __netif_tx_trylock(struct netdev_queue *txq) - { - bool ok = spin_trylock(&txq->_xmit_lock); - if (likely(ok)) -- txq->xmit_lock_owner = smp_processor_id(); -+ netdev_queue_set_owner(txq, smp_processor_id()); - return ok; - } - - static inline void __netif_tx_unlock(struct netdev_queue *txq) - { -- txq->xmit_lock_owner = -1; -+ netdev_queue_clear_owner(txq); - spin_unlock(&txq->_xmit_lock); - } - - static inline void __netif_tx_unlock_bh(struct netdev_queue *txq) - { -- txq->xmit_lock_owner = -1; -+ netdev_queue_clear_owner(txq); - spin_unlock_bh(&txq->_xmit_lock); - } - - static inline void txq_trans_update(struct netdev_queue *txq) - { -- if (txq->xmit_lock_owner != -1) -+ if (netdev_queue_has_owner(txq)) - txq->trans_start = jiffies; - } - ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1217,6 +1217,9 @@ - #ifdef CONFIG_DEBUG_ATOMIC_SLEEP - unsigned long task_state_change; - #endif -+#ifdef CONFIG_PREEMPT_RT_FULL -+ int xmit_recursion; -+#endif - int pagefault_disabled; - #ifdef CONFIG_MMU - struct task_struct *oom_reaper_list; ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3538,8 +3538,10 @@ - #define skb_update_prio(skb) - #endif - -+#ifndef CONFIG_PREEMPT_RT_FULL - DEFINE_PER_CPU(int, xmit_recursion); - EXPORT_SYMBOL(xmit_recursion); -+#endif - - /** - * dev_loopback_xmit - loop back @skb -@@ -3830,9 +3832,12 @@ - if (dev->flags & IFF_UP) { - int cpu = smp_processor_id(); /* ok because BHs are off */ - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ if (txq->xmit_lock_owner != current) { -+#else - if (txq->xmit_lock_owner != cpu) { -- if (unlikely(__this_cpu_read(xmit_recursion) > -- XMIT_RECURSION_LIMIT)) -+#endif -+ if (unlikely(xmit_rec_read() > XMIT_RECURSION_LIMIT)) - goto recursion_alert; - - skb = validate_xmit_skb(skb, dev, &again); -@@ -3842,9 +3847,9 @@ - HARD_TX_LOCK(dev, txq, cpu); - - if (!netif_xmit_stopped(txq)) { -- __this_cpu_inc(xmit_recursion); -+ xmit_rec_inc(); - skb = dev_hard_start_xmit(skb, dev, txq, &rc); -- __this_cpu_dec(xmit_recursion); -+ xmit_rec_dec(); - if (dev_xmit_complete(rc)) { - HARD_TX_UNLOCK(dev, txq); - goto out; -@@ -8583,7 +8588,7 @@ - /* Initialize queue lock */ - spin_lock_init(&queue->_xmit_lock); - netdev_set_xmit_lockdep_class(&queue->_xmit_lock, dev->type); -- queue->xmit_lock_owner = -1; -+ netdev_queue_clear_owner(queue); - netdev_queue_numa_node_write(queue, NUMA_NO_NODE); - queue->dev = dev; - #ifdef CONFIG_BQL ---- a/net/core/filter.c -+++ b/net/core/filter.c -@@ -2000,7 +2000,7 @@ - { - int ret; - -- if (unlikely(__this_cpu_read(xmit_recursion) > XMIT_RECURSION_LIMIT)) { -+ if (unlikely(xmit_rec_read() > XMIT_RECURSION_LIMIT)) { - net_crit_ratelimited("bpf: recursion limit reached on datapath, buggy bpf program?\n"); - kfree_skb(skb); - return -ENETDOWN; -@@ -2009,9 +2009,9 @@ - skb->dev = dev; - skb->tstamp = 0; - -- __this_cpu_inc(xmit_recursion); -+ xmit_rec_inc(); - ret = dev_queue_xmit(skb); -- __this_cpu_dec(xmit_recursion); -+ xmit_rec_dec(); - - return ret; - } diff -Nru linux-4.19.98/debian/patches-rt/0199-net-provide-a-way-to-delegate-processing-a-softirq-t.patch linux-4.19.118/debian/patches-rt/0199-net-provide-a-way-to-delegate-processing-a-softirq-t.patch --- linux-4.19.98/debian/patches-rt/0199-net-provide-a-way-to-delegate-processing-a-softirq-t.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0199-net-provide-a-way-to-delegate-processing-a-softirq-t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,89 @@ +From af455cf90e7dc741d2f547f1b0920e355053a316 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 20 Jan 2016 15:39:05 +0100 +Subject: [PATCH 199/325] net: provide a way to delegate processing a softirq + to ksoftirqd +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +If the NET_RX uses up all of his budget it moves the following NAPI +invocations into the `ksoftirqd`. On -RT it does not do so. Instead it +rises the NET_RX softirq in its current context again. + +In order to get closer to mainline's behaviour this patch provides +__raise_softirq_irqoff_ksoft() which raises the softirq in the ksoftird. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/interrupt.h | 8 ++++++++ + kernel/softirq.c | 21 +++++++++++++++++++++ + net/core/dev.c | 2 +- + 3 files changed, 30 insertions(+), 1 deletion(-) + +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index e1438fe66467..97d9ba26915e 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -518,6 +518,14 @@ extern void thread_do_softirq(void); + extern void open_softirq(int nr, void (*action)(struct softirq_action *)); + extern void softirq_init(void); + extern void __raise_softirq_irqoff(unsigned int nr); ++#ifdef CONFIG_PREEMPT_RT_FULL ++extern void __raise_softirq_irqoff_ksoft(unsigned int nr); ++#else ++static inline void __raise_softirq_irqoff_ksoft(unsigned int nr) ++{ ++ __raise_softirq_irqoff(nr); ++} ++#endif + + extern void raise_softirq_irqoff(unsigned int nr); + extern void raise_softirq(unsigned int nr); +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 27a4bb2303d0..25bcf2f2714b 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -721,6 +721,27 @@ void __raise_softirq_irqoff(unsigned int nr) + wakeup_proper_softirq(nr); + } + ++/* ++ * Same as __raise_softirq_irqoff() but will process them in ksoftirqd ++ */ ++void __raise_softirq_irqoff_ksoft(unsigned int nr) ++{ ++ unsigned int mask; ++ ++ if (WARN_ON_ONCE(!__this_cpu_read(ksoftirqd) || ++ !__this_cpu_read(ktimer_softirqd))) ++ return; ++ mask = 1UL << nr; ++ ++ trace_softirq_raise(nr); ++ or_softirq_pending(mask); ++ if (mask & TIMER_SOFTIRQS) ++ __this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask; ++ else ++ __this_cpu_read(ksoftirqd)->softirqs_raised |= mask; ++ wakeup_proper_softirq(nr); ++} ++ + /* + * This function must run with irqs disabled! + */ +diff --git a/net/core/dev.c b/net/core/dev.c +index 031079f6703b..f3c394d0037e 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -6370,7 +6370,7 @@ static __latent_entropy void net_rx_action(struct softirq_action *h) + list_splice_tail(&repoll, &list); + list_splice(&list, &sd->poll_list); + if (!list_empty(&sd->poll_list)) +- __raise_softirq_irqoff(NET_RX_SOFTIRQ); ++ __raise_softirq_irqoff_ksoft(NET_RX_SOFTIRQ); + + net_rps_action_and_irq_enable(sd); + out: +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0200-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch linux-4.19.118/debian/patches-rt/0200-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch --- linux-4.19.98/debian/patches-rt/0200-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0200-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,42 @@ +From b06436acd56539e7208907b2c34aa1739e4d7bcb Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 30 Mar 2016 13:36:29 +0200 +Subject: [PATCH 200/325] net: dev: always take qdisc's busylock in + __dev_xmit_skb() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The root-lock is dropped before dev_hard_start_xmit() is invoked and after +setting the __QDISC___STATE_RUNNING bit. If this task is now pushed away +by a task with a higher priority then the task with the higher priority +won't be able to submit packets to the NIC directly instead they will be +enqueued into the Qdisc. The NIC will remain idle until the task(s) with +higher priority leave the CPU and the task with lower priority gets back +and finishes the job. + +If we take always the busylock we ensure that the RT task can boost the +low-prio task and submit the packet. + +Signed-off-by: Sebastian Andrzej Siewior +--- + net/core/dev.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/net/core/dev.c b/net/core/dev.c +index f3c394d0037e..ddd65bbfcd3a 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -3468,7 +3468,11 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, + * This permits qdisc->running owner to get the lock more + * often and dequeue packets faster. + */ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ contended = true; ++#else + contended = qdisc_is_running(q); ++#endif + if (unlikely(contended)) + spin_lock(&q->busylock); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0200-net-provide-a-way-to-delegate-processing-a-softirq-t.patch linux-4.19.118/debian/patches-rt/0200-net-provide-a-way-to-delegate-processing-a-softirq-t.patch --- linux-4.19.98/debian/patches-rt/0200-net-provide-a-way-to-delegate-processing-a-softirq-t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0200-net-provide-a-way-to-delegate-processing-a-softirq-t.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -From 041b49006ea5c90319dd0e5ba91d255eb59ec635 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 20 Jan 2016 15:39:05 +0100 -Subject: [PATCH 200/290] net: provide a way to delegate processing a softirq - to ksoftirqd -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -If the NET_RX uses up all of his budget it moves the following NAPI -invocations into the `ksoftirqd`. On -RT it does not do so. Instead it -rises the NET_RX softirq in its current context again. - -In order to get closer to mainline's behaviour this patch provides -__raise_softirq_irqoff_ksoft() which raises the softirq in the ksoftird. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/interrupt.h | 8 ++++++++ - kernel/softirq.c | 21 +++++++++++++++++++++ - net/core/dev.c | 2 +- - 3 files changed, 30 insertions(+), 1 deletion(-) - -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 99f8b7ace7c9..72333899f043 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -524,6 +524,14 @@ extern void thread_do_softirq(void); - extern void open_softirq(int nr, void (*action)(struct softirq_action *)); - extern void softirq_init(void); - extern void __raise_softirq_irqoff(unsigned int nr); -+#ifdef CONFIG_PREEMPT_RT_FULL -+extern void __raise_softirq_irqoff_ksoft(unsigned int nr); -+#else -+static inline void __raise_softirq_irqoff_ksoft(unsigned int nr) -+{ -+ __raise_softirq_irqoff(nr); -+} -+#endif - - extern void raise_softirq_irqoff(unsigned int nr); - extern void raise_softirq(unsigned int nr); -diff --git a/kernel/softirq.c b/kernel/softirq.c -index 27a4bb2303d0..25bcf2f2714b 100644 ---- a/kernel/softirq.c -+++ b/kernel/softirq.c -@@ -721,6 +721,27 @@ void __raise_softirq_irqoff(unsigned int nr) - wakeup_proper_softirq(nr); - } - -+/* -+ * Same as __raise_softirq_irqoff() but will process them in ksoftirqd -+ */ -+void __raise_softirq_irqoff_ksoft(unsigned int nr) -+{ -+ unsigned int mask; -+ -+ if (WARN_ON_ONCE(!__this_cpu_read(ksoftirqd) || -+ !__this_cpu_read(ktimer_softirqd))) -+ return; -+ mask = 1UL << nr; -+ -+ trace_softirq_raise(nr); -+ or_softirq_pending(mask); -+ if (mask & TIMER_SOFTIRQS) -+ __this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask; -+ else -+ __this_cpu_read(ksoftirqd)->softirqs_raised |= mask; -+ wakeup_proper_softirq(nr); -+} -+ - /* - * This function must run with irqs disabled! - */ -diff --git a/net/core/dev.c b/net/core/dev.c -index ed1537cc9ab7..7605c7220020 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -6397,7 +6397,7 @@ static __latent_entropy void net_rx_action(struct softirq_action *h) - list_splice_tail(&repoll, &list); - list_splice(&list, &sd->poll_list); - if (!list_empty(&sd->poll_list)) -- __raise_softirq_irqoff(NET_RX_SOFTIRQ); -+ __raise_softirq_irqoff_ksoft(NET_RX_SOFTIRQ); - - net_rps_action_and_irq_enable(sd); - out: --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0201-net-Qdisc-use-a-seqlock-instead-seqcount.patch linux-4.19.118/debian/patches-rt/0201-net-Qdisc-use-a-seqlock-instead-seqcount.patch --- linux-4.19.98/debian/patches-rt/0201-net-Qdisc-use-a-seqlock-instead-seqcount.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0201-net-Qdisc-use-a-seqlock-instead-seqcount.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,293 @@ +From 41cf08fe25d006f91cd7ad1a97b7729a4f0c7a20 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 14 Sep 2016 17:36:35 +0200 +Subject: [PATCH 201/325] net/Qdisc: use a seqlock instead seqcount +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The seqcount disables preemption on -RT while it is held which can't +remove. Also we don't want the reader to spin for ages if the writer is +scheduled out. The seqlock on the other hand will serialize / sleep on +the lock while writer is active. + +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/seqlock.h | 9 +++++++++ + include/net/gen_stats.h | 9 +++++---- + include/net/net_seq_lock.h | 15 +++++++++++++++ + include/net/sch_generic.h | 19 +++++++++++++++++-- + net/core/gen_estimator.c | 6 +++--- + net/core/gen_stats.c | 8 ++++---- + net/sched/sch_api.c | 2 +- + net/sched/sch_generic.c | 12 ++++++++++++ + 8 files changed, 66 insertions(+), 14 deletions(-) + create mode 100644 include/net/net_seq_lock.h + +diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h +index 689ed53016c7..58f9909d6659 100644 +--- a/include/linux/seqlock.h ++++ b/include/linux/seqlock.h +@@ -482,6 +482,15 @@ static inline void write_seqlock(seqlock_t *sl) + __raw_write_seqcount_begin(&sl->seqcount); + } + ++static inline int try_write_seqlock(seqlock_t *sl) ++{ ++ if (spin_trylock(&sl->lock)) { ++ __raw_write_seqcount_begin(&sl->seqcount); ++ return 1; ++ } ++ return 0; ++} ++ + static inline void write_sequnlock(seqlock_t *sl) + { + __raw_write_seqcount_end(&sl->seqcount); +diff --git a/include/net/gen_stats.h b/include/net/gen_stats.h +index 883bb9085f15..3b593cdeb9af 100644 +--- a/include/net/gen_stats.h ++++ b/include/net/gen_stats.h +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + + struct gnet_stats_basic_cpu { + struct gnet_stats_basic_packed bstats; +@@ -36,11 +37,11 @@ int gnet_stats_start_copy_compat(struct sk_buff *skb, int type, + spinlock_t *lock, struct gnet_dump *d, + int padattr); + +-int gnet_stats_copy_basic(const seqcount_t *running, ++int gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_dump *d, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b); +-void __gnet_stats_copy_basic(const seqcount_t *running, ++void __gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b); +@@ -60,13 +61,13 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **rate_est, + spinlock_t *lock, +- seqcount_t *running, struct nlattr *opt); ++ net_seqlock_t *running, struct nlattr *opt); + void gen_kill_estimator(struct net_rate_estimator __rcu **ptr); + int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **ptr, + spinlock_t *lock, +- seqcount_t *running, struct nlattr *opt); ++ net_seqlock_t *running, struct nlattr *opt); + bool gen_estimator_active(struct net_rate_estimator __rcu **ptr); + bool gen_estimator_read(struct net_rate_estimator __rcu **ptr, + struct gnet_stats_rate_est64 *sample); +diff --git a/include/net/net_seq_lock.h b/include/net/net_seq_lock.h +new file mode 100644 +index 000000000000..a7034298a82a +--- /dev/null ++++ b/include/net/net_seq_lock.h +@@ -0,0 +1,15 @@ ++#ifndef __NET_NET_SEQ_LOCK_H__ ++#define __NET_NET_SEQ_LOCK_H__ ++ ++#ifdef CONFIG_PREEMPT_RT_BASE ++# define net_seqlock_t seqlock_t ++# define net_seq_begin(__r) read_seqbegin(__r) ++# define net_seq_retry(__r, __s) read_seqretry(__r, __s) ++ ++#else ++# define net_seqlock_t seqcount_t ++# define net_seq_begin(__r) read_seqcount_begin(__r) ++# define net_seq_retry(__r, __s) read_seqcount_retry(__r, __s) ++#endif ++ ++#endif +diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h +index d737a6a2600b..2d35b952bf60 100644 +--- a/include/net/sch_generic.h ++++ b/include/net/sch_generic.h +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -100,7 +101,7 @@ struct Qdisc { + struct sk_buff_head gso_skb ____cacheline_aligned_in_smp; + struct qdisc_skb_head q; + struct gnet_stats_basic_packed bstats; +- seqcount_t running; ++ net_seqlock_t running; + struct gnet_stats_queue qstats; + unsigned long state; + struct Qdisc *next_sched; +@@ -121,7 +122,11 @@ static inline bool qdisc_is_running(struct Qdisc *qdisc) + { + if (qdisc->flags & TCQ_F_NOLOCK) + return spin_is_locked(&qdisc->seqlock); ++#ifdef CONFIG_PREEMPT_RT_BASE ++ return spin_is_locked(&qdisc->running.lock) ? true : false; ++#else + return (raw_read_seqcount(&qdisc->running) & 1) ? true : false; ++#endif + } + + static inline bool qdisc_run_begin(struct Qdisc *qdisc) +@@ -132,17 +137,27 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc) + } else if (qdisc_is_running(qdisc)) { + return false; + } ++#ifdef CONFIG_PREEMPT_RT_BASE ++ if (try_write_seqlock(&qdisc->running)) ++ return true; ++ return false; ++#else + /* Variant of write_seqcount_begin() telling lockdep a trylock + * was attempted. + */ + raw_write_seqcount_begin(&qdisc->running); + seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_); + return true; ++#endif + } + + static inline void qdisc_run_end(struct Qdisc *qdisc) + { ++#ifdef CONFIG_PREEMPT_RT_BASE ++ write_sequnlock(&qdisc->running); ++#else + write_seqcount_end(&qdisc->running); ++#endif + if (qdisc->flags & TCQ_F_NOLOCK) + spin_unlock(&qdisc->seqlock); + } +@@ -459,7 +474,7 @@ static inline spinlock_t *qdisc_root_sleeping_lock(const struct Qdisc *qdisc) + return qdisc_lock(root); + } + +-static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) ++static inline net_seqlock_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) + { + struct Qdisc *root = qdisc_root_sleeping(qdisc); + +diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c +index e4e442d70c2d..c8fa906733fb 100644 +--- a/net/core/gen_estimator.c ++++ b/net/core/gen_estimator.c +@@ -46,7 +46,7 @@ + struct net_rate_estimator { + struct gnet_stats_basic_packed *bstats; + spinlock_t *stats_lock; +- seqcount_t *running; ++ net_seqlock_t *running; + struct gnet_stats_basic_cpu __percpu *cpu_bstats; + u8 ewma_log; + u8 intvl_log; /* period : (250ms << intvl_log) */ +@@ -129,7 +129,7 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **rate_est, + spinlock_t *lock, +- seqcount_t *running, ++ net_seqlock_t *running, + struct nlattr *opt) + { + struct gnet_estimator *parm = nla_data(opt); +@@ -227,7 +227,7 @@ int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **rate_est, + spinlock_t *lock, +- seqcount_t *running, struct nlattr *opt) ++ net_seqlock_t *running, struct nlattr *opt) + { + return gen_new_estimator(bstats, cpu_bstats, rate_est, + lock, running, opt); +diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c +index e2fd8baec65f..8bab88738691 100644 +--- a/net/core/gen_stats.c ++++ b/net/core/gen_stats.c +@@ -142,7 +142,7 @@ __gnet_stats_copy_basic_cpu(struct gnet_stats_basic_packed *bstats, + } + + void +-__gnet_stats_copy_basic(const seqcount_t *running, ++__gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b) +@@ -155,10 +155,10 @@ __gnet_stats_copy_basic(const seqcount_t *running, + } + do { + if (running) +- seq = read_seqcount_begin(running); ++ seq = net_seq_begin(running); + bstats->bytes = b->bytes; + bstats->packets = b->packets; +- } while (running && read_seqcount_retry(running, seq)); ++ } while (running && net_seq_retry(running, seq)); + } + EXPORT_SYMBOL(__gnet_stats_copy_basic); + +@@ -176,7 +176,7 @@ EXPORT_SYMBOL(__gnet_stats_copy_basic); + * if the room in the socket buffer was not sufficient. + */ + int +-gnet_stats_copy_basic(const seqcount_t *running, ++gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_dump *d, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b) +diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c +index 39e319d04bb8..fe99928aff78 100644 +--- a/net/sched/sch_api.c ++++ b/net/sched/sch_api.c +@@ -1166,7 +1166,7 @@ static struct Qdisc *qdisc_create(struct net_device *dev, + rcu_assign_pointer(sch->stab, stab); + } + if (tca[TCA_RATE]) { +- seqcount_t *running; ++ net_seqlock_t *running; + + err = -EOPNOTSUPP; + if (sch->flags & TCQ_F_MQROOT) { +diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c +index 4ab20f1138fd..a9ed58ca3924 100644 +--- a/net/sched/sch_generic.c ++++ b/net/sched/sch_generic.c +@@ -575,7 +575,11 @@ struct Qdisc noop_qdisc = { + .ops = &noop_qdisc_ops, + .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), + .dev_queue = &noop_netdev_queue, ++#ifdef CONFIG_PREEMPT_RT_BASE ++ .running = __SEQLOCK_UNLOCKED(noop_qdisc.running), ++#else + .running = SEQCNT_ZERO(noop_qdisc.running), ++#endif + .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), + .gso_skb = { + .next = (struct sk_buff *)&noop_qdisc.gso_skb, +@@ -876,9 +880,17 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, + lockdep_set_class(&sch->busylock, + dev->qdisc_tx_busylock ?: &qdisc_tx_busylock); + ++#ifdef CONFIG_PREEMPT_RT_BASE ++ seqlock_init(&sch->running); ++ lockdep_set_class(&sch->running.seqcount, ++ dev->qdisc_running_key ?: &qdisc_running_key); ++ lockdep_set_class(&sch->running.lock, ++ dev->qdisc_running_key ?: &qdisc_running_key); ++#else + seqcount_init(&sch->running); + lockdep_set_class(&sch->running, + dev->qdisc_running_key ?: &qdisc_running_key); ++#endif + + sch->ops = ops; + sch->flags = ops->static_flags; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0201-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch linux-4.19.118/debian/patches-rt/0201-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch --- linux-4.19.98/debian/patches-rt/0201-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0201-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -From 50cd61533d1b2d579c54d2acbb14c5e7034b1982 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 30 Mar 2016 13:36:29 +0200 -Subject: [PATCH 201/290] net: dev: always take qdisc's busylock in - __dev_xmit_skb() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The root-lock is dropped before dev_hard_start_xmit() is invoked and after -setting the __QDISC___STATE_RUNNING bit. If this task is now pushed away -by a task with a higher priority then the task with the higher priority -won't be able to submit packets to the NIC directly instead they will be -enqueued into the Qdisc. The NIC will remain idle until the task(s) with -higher priority leave the CPU and the task with lower priority gets back -and finishes the job. - -If we take always the busylock we ensure that the RT task can boost the -low-prio task and submit the packet. - -Signed-off-by: Sebastian Andrzej Siewior ---- - net/core/dev.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/net/core/dev.c b/net/core/dev.c -index 7605c7220020..1a30cf641e7c 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3466,7 +3466,11 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, - * This permits qdisc->running owner to get the lock more - * often and dequeue packets faster. - */ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ contended = true; -+#else - contended = qdisc_is_running(q); -+#endif - if (unlikely(contended)) - spin_lock(&q->busylock); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0202-net-Qdisc-use-a-seqlock-instead-seqcount.patch linux-4.19.118/debian/patches-rt/0202-net-Qdisc-use-a-seqlock-instead-seqcount.patch --- linux-4.19.98/debian/patches-rt/0202-net-Qdisc-use-a-seqlock-instead-seqcount.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0202-net-Qdisc-use-a-seqlock-instead-seqcount.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,293 +0,0 @@ -From 882fef39240fcd645d3affe57b5f9ed4cfb1aac5 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 14 Sep 2016 17:36:35 +0200 -Subject: [PATCH 202/290] net/Qdisc: use a seqlock instead seqcount -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The seqcount disables preemption on -RT while it is held which can't -remove. Also we don't want the reader to spin for ages if the writer is -scheduled out. The seqlock on the other hand will serialize / sleep on -the lock while writer is active. - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/seqlock.h | 9 +++++++++ - include/net/gen_stats.h | 9 +++++---- - include/net/net_seq_lock.h | 15 +++++++++++++++ - include/net/sch_generic.h | 19 +++++++++++++++++-- - net/core/gen_estimator.c | 6 +++--- - net/core/gen_stats.c | 8 ++++---- - net/sched/sch_api.c | 2 +- - net/sched/sch_generic.c | 12 ++++++++++++ - 8 files changed, 66 insertions(+), 14 deletions(-) - create mode 100644 include/net/net_seq_lock.h - -diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h -index 689ed53016c7..58f9909d6659 100644 ---- a/include/linux/seqlock.h -+++ b/include/linux/seqlock.h -@@ -482,6 +482,15 @@ static inline void write_seqlock(seqlock_t *sl) - __raw_write_seqcount_begin(&sl->seqcount); - } - -+static inline int try_write_seqlock(seqlock_t *sl) -+{ -+ if (spin_trylock(&sl->lock)) { -+ __raw_write_seqcount_begin(&sl->seqcount); -+ return 1; -+ } -+ return 0; -+} -+ - static inline void write_sequnlock(seqlock_t *sl) - { - __raw_write_seqcount_end(&sl->seqcount); -diff --git a/include/net/gen_stats.h b/include/net/gen_stats.h -index 883bb9085f15..3b593cdeb9af 100644 ---- a/include/net/gen_stats.h -+++ b/include/net/gen_stats.h -@@ -6,6 +6,7 @@ - #include - #include - #include -+#include - - struct gnet_stats_basic_cpu { - struct gnet_stats_basic_packed bstats; -@@ -36,11 +37,11 @@ int gnet_stats_start_copy_compat(struct sk_buff *skb, int type, - spinlock_t *lock, struct gnet_dump *d, - int padattr); - --int gnet_stats_copy_basic(const seqcount_t *running, -+int gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_dump *d, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b); --void __gnet_stats_copy_basic(const seqcount_t *running, -+void __gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b); -@@ -60,13 +61,13 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **rate_est, - spinlock_t *lock, -- seqcount_t *running, struct nlattr *opt); -+ net_seqlock_t *running, struct nlattr *opt); - void gen_kill_estimator(struct net_rate_estimator __rcu **ptr); - int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **ptr, - spinlock_t *lock, -- seqcount_t *running, struct nlattr *opt); -+ net_seqlock_t *running, struct nlattr *opt); - bool gen_estimator_active(struct net_rate_estimator __rcu **ptr); - bool gen_estimator_read(struct net_rate_estimator __rcu **ptr, - struct gnet_stats_rate_est64 *sample); -diff --git a/include/net/net_seq_lock.h b/include/net/net_seq_lock.h -new file mode 100644 -index 000000000000..a7034298a82a ---- /dev/null -+++ b/include/net/net_seq_lock.h -@@ -0,0 +1,15 @@ -+#ifndef __NET_NET_SEQ_LOCK_H__ -+#define __NET_NET_SEQ_LOCK_H__ -+ -+#ifdef CONFIG_PREEMPT_RT_BASE -+# define net_seqlock_t seqlock_t -+# define net_seq_begin(__r) read_seqbegin(__r) -+# define net_seq_retry(__r, __s) read_seqretry(__r, __s) -+ -+#else -+# define net_seqlock_t seqcount_t -+# define net_seq_begin(__r) read_seqcount_begin(__r) -+# define net_seq_retry(__r, __s) read_seqcount_retry(__r, __s) -+#endif -+ -+#endif -diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h -index c9cd5086bd54..b6328680dc71 100644 ---- a/include/net/sch_generic.h -+++ b/include/net/sch_generic.h -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -100,7 +101,7 @@ struct Qdisc { - struct sk_buff_head gso_skb ____cacheline_aligned_in_smp; - struct qdisc_skb_head q; - struct gnet_stats_basic_packed bstats; -- seqcount_t running; -+ net_seqlock_t running; - struct gnet_stats_queue qstats; - unsigned long state; - struct Qdisc *next_sched; -@@ -121,7 +122,11 @@ static inline bool qdisc_is_running(struct Qdisc *qdisc) - { - if (qdisc->flags & TCQ_F_NOLOCK) - return spin_is_locked(&qdisc->seqlock); -+#ifdef CONFIG_PREEMPT_RT_BASE -+ return spin_is_locked(&qdisc->running.lock) ? true : false; -+#else - return (raw_read_seqcount(&qdisc->running) & 1) ? true : false; -+#endif - } - - static inline bool qdisc_run_begin(struct Qdisc *qdisc) -@@ -132,17 +137,27 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc) - } else if (qdisc_is_running(qdisc)) { - return false; - } -+#ifdef CONFIG_PREEMPT_RT_BASE -+ if (try_write_seqlock(&qdisc->running)) -+ return true; -+ return false; -+#else - /* Variant of write_seqcount_begin() telling lockdep a trylock - * was attempted. - */ - raw_write_seqcount_begin(&qdisc->running); - seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_); - return true; -+#endif - } - - static inline void qdisc_run_end(struct Qdisc *qdisc) - { -+#ifdef CONFIG_PREEMPT_RT_BASE -+ write_sequnlock(&qdisc->running); -+#else - write_seqcount_end(&qdisc->running); -+#endif - if (qdisc->flags & TCQ_F_NOLOCK) - spin_unlock(&qdisc->seqlock); - } -@@ -458,7 +473,7 @@ static inline spinlock_t *qdisc_root_sleeping_lock(const struct Qdisc *qdisc) - return qdisc_lock(root); - } - --static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) -+static inline net_seqlock_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) - { - struct Qdisc *root = qdisc_root_sleeping(qdisc); - -diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c -index e4e442d70c2d..c8fa906733fb 100644 ---- a/net/core/gen_estimator.c -+++ b/net/core/gen_estimator.c -@@ -46,7 +46,7 @@ - struct net_rate_estimator { - struct gnet_stats_basic_packed *bstats; - spinlock_t *stats_lock; -- seqcount_t *running; -+ net_seqlock_t *running; - struct gnet_stats_basic_cpu __percpu *cpu_bstats; - u8 ewma_log; - u8 intvl_log; /* period : (250ms << intvl_log) */ -@@ -129,7 +129,7 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **rate_est, - spinlock_t *lock, -- seqcount_t *running, -+ net_seqlock_t *running, - struct nlattr *opt) - { - struct gnet_estimator *parm = nla_data(opt); -@@ -227,7 +227,7 @@ int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu_bstats, - struct net_rate_estimator __rcu **rate_est, - spinlock_t *lock, -- seqcount_t *running, struct nlattr *opt) -+ net_seqlock_t *running, struct nlattr *opt) - { - return gen_new_estimator(bstats, cpu_bstats, rate_est, - lock, running, opt); -diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c -index e2fd8baec65f..8bab88738691 100644 ---- a/net/core/gen_stats.c -+++ b/net/core/gen_stats.c -@@ -142,7 +142,7 @@ __gnet_stats_copy_basic_cpu(struct gnet_stats_basic_packed *bstats, - } - - void --__gnet_stats_copy_basic(const seqcount_t *running, -+__gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b) -@@ -155,10 +155,10 @@ __gnet_stats_copy_basic(const seqcount_t *running, - } - do { - if (running) -- seq = read_seqcount_begin(running); -+ seq = net_seq_begin(running); - bstats->bytes = b->bytes; - bstats->packets = b->packets; -- } while (running && read_seqcount_retry(running, seq)); -+ } while (running && net_seq_retry(running, seq)); - } - EXPORT_SYMBOL(__gnet_stats_copy_basic); - -@@ -176,7 +176,7 @@ EXPORT_SYMBOL(__gnet_stats_copy_basic); - * if the room in the socket buffer was not sufficient. - */ - int --gnet_stats_copy_basic(const seqcount_t *running, -+gnet_stats_copy_basic(net_seqlock_t *running, - struct gnet_dump *d, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b) -diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c -index 84fdc4857771..3c5c51657e1a 100644 ---- a/net/sched/sch_api.c -+++ b/net/sched/sch_api.c -@@ -1166,7 +1166,7 @@ static struct Qdisc *qdisc_create(struct net_device *dev, - rcu_assign_pointer(sch->stab, stab); - } - if (tca[TCA_RATE]) { -- seqcount_t *running; -+ net_seqlock_t *running; - - err = -EOPNOTSUPP; - if (sch->flags & TCQ_F_MQROOT) { -diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c -index 4ab20f1138fd..a9ed58ca3924 100644 ---- a/net/sched/sch_generic.c -+++ b/net/sched/sch_generic.c -@@ -575,7 +575,11 @@ struct Qdisc noop_qdisc = { - .ops = &noop_qdisc_ops, - .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), - .dev_queue = &noop_netdev_queue, -+#ifdef CONFIG_PREEMPT_RT_BASE -+ .running = __SEQLOCK_UNLOCKED(noop_qdisc.running), -+#else - .running = SEQCNT_ZERO(noop_qdisc.running), -+#endif - .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), - .gso_skb = { - .next = (struct sk_buff *)&noop_qdisc.gso_skb, -@@ -876,9 +880,17 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, - lockdep_set_class(&sch->busylock, - dev->qdisc_tx_busylock ?: &qdisc_tx_busylock); - -+#ifdef CONFIG_PREEMPT_RT_BASE -+ seqlock_init(&sch->running); -+ lockdep_set_class(&sch->running.seqcount, -+ dev->qdisc_running_key ?: &qdisc_running_key); -+ lockdep_set_class(&sch->running.lock, -+ dev->qdisc_running_key ?: &qdisc_running_key); -+#else - seqcount_init(&sch->running); - lockdep_set_class(&sch->running, - dev->qdisc_running_key ?: &qdisc_running_key); -+#endif - - sch->ops = ops; - sch->flags = ops->static_flags; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0202-net-add-back-the-missing-serialization-in-ip_send_un.patch linux-4.19.118/debian/patches-rt/0202-net-add-back-the-missing-serialization-in-ip_send_un.patch --- linux-4.19.98/debian/patches-rt/0202-net-add-back-the-missing-serialization-in-ip_send_un.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0202-net-add-back-the-missing-serialization-in-ip_send_un.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,99 @@ +From 933664614b03add80f4578bbb30de2698b553234 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 31 Aug 2016 17:21:56 +0200 +Subject: [PATCH 202/325] net: add back the missing serialization in + ip_send_unicast_reply() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Some time ago Sami Pietikäinen reported a crash on -RT in +ip_send_unicast_reply() which was later fixed by Nicholas Mc Guire +(v3.12.8-rt11). Later (v3.18.8) the code was reworked and I dropped the +patch. As it turns out it was mistake. +I have reports that the same crash is possible with a similar backtrace. +It seems that vanilla protects access to this_cpu_ptr() via +local_bh_disable(). This does not work the on -RT since we can have +NET_RX and NET_TX running in parallel on the same CPU. +This is brings back the old locks. + +|Unable to handle kernel NULL pointer dereference at virtual address 00000010 +|PC is at __ip_make_skb+0x198/0x3e8 +|[] (__ip_make_skb) from [] (ip_push_pending_frames+0x20/0x40) +|[] (ip_push_pending_frames) from [] (ip_send_unicast_reply+0x210/0x22c) +|[] (ip_send_unicast_reply) from [] (tcp_v4_send_reset+0x190/0x1c0) +|[] (tcp_v4_send_reset) from [] (tcp_v4_do_rcv+0x22c/0x288) +|[] (tcp_v4_do_rcv) from [] (release_sock+0xb4/0x150) +|[] (release_sock) from [] (tcp_close+0x240/0x454) +|[] (tcp_close) from [] (inet_release+0x74/0x7c) +|[] (inet_release) from [] (sock_release+0x30/0xb0) +|[] (sock_release) from [] (sock_close+0x1c/0x24) +|[] (sock_close) from [] (__fput+0xe8/0x20c) +|[] (__fput) from [] (____fput+0x18/0x1c) +|[] (____fput) from [] (task_work_run+0xa4/0xb8) +|[] (task_work_run) from [] (do_work_pending+0xd0/0xe4) +|[] (do_work_pending) from [] (work_pending+0xc/0x20) +|Code: e3530001 8a000001 e3a00040 ea000011 (e5973010) + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + net/ipv4/tcp_ipv4.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c +index 6da393016c11..105e94ff1095 100644 +--- a/net/ipv4/tcp_ipv4.c ++++ b/net/ipv4/tcp_ipv4.c +@@ -62,6 +62,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -634,6 +635,7 @@ void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb) + } + EXPORT_SYMBOL(tcp_v4_send_check); + ++static DEFINE_LOCAL_IRQ_LOCK(tcp_sk_lock); + /* + * This routine will send an RST to the other tcp. + * +@@ -768,6 +770,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb) + arg.tos = ip_hdr(skb)->tos; + arg.uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL); + local_bh_disable(); ++ local_lock(tcp_sk_lock); + ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); + if (sk) + ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? +@@ -780,6 +783,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb) + ctl_sk->sk_mark = 0; + __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); + __TCP_INC_STATS(net, TCP_MIB_OUTRSTS); ++ local_unlock(tcp_sk_lock); + local_bh_enable(); + + #ifdef CONFIG_TCP_MD5SIG +@@ -860,6 +864,7 @@ static void tcp_v4_send_ack(const struct sock *sk, + arg.tos = tos; + arg.uid = sock_net_uid(net, sk_fullsock(sk) ? sk : NULL); + local_bh_disable(); ++ local_lock(tcp_sk_lock); + ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); + if (sk) + ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? +@@ -871,6 +876,7 @@ static void tcp_v4_send_ack(const struct sock *sk, + + ctl_sk->sk_mark = 0; + __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); ++ local_unlock(tcp_sk_lock); + local_bh_enable(); + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0203-net-add-a-lock-around-icmp_sk.patch linux-4.19.118/debian/patches-rt/0203-net-add-a-lock-around-icmp_sk.patch --- linux-4.19.98/debian/patches-rt/0203-net-add-a-lock-around-icmp_sk.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0203-net-add-a-lock-around-icmp_sk.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,65 @@ +From d379a0b223af3be3d6573649cf5ee15b8e8f9efd Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 31 Aug 2016 17:54:09 +0200 +Subject: [PATCH 203/325] net: add a lock around icmp_sk() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +It looks like the this_cpu_ptr() access in icmp_sk() is protected with +local_bh_disable(). To avoid missing serialization in -RT I am adding +here a local lock. No crash has been observed, this is just precaution. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + net/ipv4/icmp.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c +index 4efa5e33513e..de67d595e298 100644 +--- a/net/ipv4/icmp.c ++++ b/net/ipv4/icmp.c +@@ -77,6 +77,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -204,6 +205,8 @@ static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1]; + * + * On SMP we have one ICMP socket per-cpu. + */ ++static DEFINE_LOCAL_IRQ_LOCK(icmp_sk_lock); ++ + static struct sock *icmp_sk(struct net *net) + { + return *this_cpu_ptr(net->ipv4.icmp_sk); +@@ -214,12 +217,16 @@ static inline struct sock *icmp_xmit_lock(struct net *net) + { + struct sock *sk; + ++ if (!local_trylock(icmp_sk_lock)) ++ return NULL; ++ + sk = icmp_sk(net); + + if (unlikely(!spin_trylock(&sk->sk_lock.slock))) { + /* This can happen if the output path signals a + * dst_link_failure() for an outgoing ICMP packet. + */ ++ local_unlock(icmp_sk_lock); + return NULL; + } + return sk; +@@ -228,6 +235,7 @@ static inline struct sock *icmp_xmit_lock(struct net *net) + static inline void icmp_xmit_unlock(struct sock *sk) + { + spin_unlock(&sk->sk_lock.slock); ++ local_unlock(icmp_sk_lock); + } + + int sysctl_icmp_msgs_per_sec __read_mostly = 1000; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0203-net-add-back-the-missing-serialization-in-ip_send_un.patch linux-4.19.118/debian/patches-rt/0203-net-add-back-the-missing-serialization-in-ip_send_un.patch --- linux-4.19.98/debian/patches-rt/0203-net-add-back-the-missing-serialization-in-ip_send_un.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0203-net-add-back-the-missing-serialization-in-ip_send_un.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -From a3e432c3b1fd867225b7515a94ca7b0fbd48b913 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 31 Aug 2016 17:21:56 +0200 -Subject: [PATCH 203/290] net: add back the missing serialization in - ip_send_unicast_reply() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Some time ago Sami Pietikäinen reported a crash on -RT in -ip_send_unicast_reply() which was later fixed by Nicholas Mc Guire -(v3.12.8-rt11). Later (v3.18.8) the code was reworked and I dropped the -patch. As it turns out it was mistake. -I have reports that the same crash is possible with a similar backtrace. -It seems that vanilla protects access to this_cpu_ptr() via -local_bh_disable(). This does not work the on -RT since we can have -NET_RX and NET_TX running in parallel on the same CPU. -This is brings back the old locks. - -|Unable to handle kernel NULL pointer dereference at virtual address 00000010 -|PC is at __ip_make_skb+0x198/0x3e8 -|[] (__ip_make_skb) from [] (ip_push_pending_frames+0x20/0x40) -|[] (ip_push_pending_frames) from [] (ip_send_unicast_reply+0x210/0x22c) -|[] (ip_send_unicast_reply) from [] (tcp_v4_send_reset+0x190/0x1c0) -|[] (tcp_v4_send_reset) from [] (tcp_v4_do_rcv+0x22c/0x288) -|[] (tcp_v4_do_rcv) from [] (release_sock+0xb4/0x150) -|[] (release_sock) from [] (tcp_close+0x240/0x454) -|[] (tcp_close) from [] (inet_release+0x74/0x7c) -|[] (inet_release) from [] (sock_release+0x30/0xb0) -|[] (sock_release) from [] (sock_close+0x1c/0x24) -|[] (sock_close) from [] (__fput+0xe8/0x20c) -|[] (__fput) from [] (____fput+0x18/0x1c) -|[] (____fput) from [] (task_work_run+0xa4/0xb8) -|[] (task_work_run) from [] (do_work_pending+0xd0/0xe4) -|[] (do_work_pending) from [] (work_pending+0xc/0x20) -|Code: e3530001 8a000001 e3a00040 ea000011 (e5973010) - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - net/ipv4/tcp_ipv4.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c -index 6da393016c11..105e94ff1095 100644 ---- a/net/ipv4/tcp_ipv4.c -+++ b/net/ipv4/tcp_ipv4.c -@@ -62,6 +62,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -634,6 +635,7 @@ void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb) - } - EXPORT_SYMBOL(tcp_v4_send_check); - -+static DEFINE_LOCAL_IRQ_LOCK(tcp_sk_lock); - /* - * This routine will send an RST to the other tcp. - * -@@ -768,6 +770,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb) - arg.tos = ip_hdr(skb)->tos; - arg.uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL); - local_bh_disable(); -+ local_lock(tcp_sk_lock); - ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); - if (sk) - ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? -@@ -780,6 +783,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb) - ctl_sk->sk_mark = 0; - __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); - __TCP_INC_STATS(net, TCP_MIB_OUTRSTS); -+ local_unlock(tcp_sk_lock); - local_bh_enable(); - - #ifdef CONFIG_TCP_MD5SIG -@@ -860,6 +864,7 @@ static void tcp_v4_send_ack(const struct sock *sk, - arg.tos = tos; - arg.uid = sock_net_uid(net, sk_fullsock(sk) ? sk : NULL); - local_bh_disable(); -+ local_lock(tcp_sk_lock); - ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); - if (sk) - ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? -@@ -871,6 +876,7 @@ static void tcp_v4_send_ack(const struct sock *sk, - - ctl_sk->sk_mark = 0; - __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); -+ local_unlock(tcp_sk_lock); - local_bh_enable(); - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0204-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch linux-4.19.118/debian/patches-rt/0204-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch --- linux-4.19.98/debian/patches-rt/0204-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0204-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,77 @@ +From 6d154a08a1e24d7e8cbb139a0b3d72fc211d45bd Mon Sep 17 00:00:00 2001 +From: Steven Rostedt +Date: Tue, 6 Dec 2016 17:50:30 -0500 +Subject: [PATCH 204/325] net: Have __napi_schedule_irqoff() disable interrupts + on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +A customer hit a crash where the napi sd->poll_list became corrupted. +The customer had the bnx2x driver, which does a +__napi_schedule_irqoff() in its interrupt handler. Unfortunately, when +running with CONFIG_PREEMPT_RT_FULL, this interrupt handler is run as a +thread and is preemptable. The call to ____napi_schedule() must be done +with interrupts disabled to protect the per cpu softnet_data's +"poll_list, which is protected by disabling interrupts (disabling +preemption is enough when all interrupts are threaded and +local_bh_disable() can't preempt)." + +As bnx2x isn't the only driver that does this, the safest thing to do +is to make __napi_schedule_irqoff() call __napi_schedule() instead when +CONFIG_PREEMPT_RT_FULL is enabled, which will call local_irq_save() +before calling ____napi_schedule(). + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Steven Rostedt (Red Hat) +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/netdevice.h | 12 ++++++++++++ + net/core/dev.c | 2 ++ + 2 files changed, 14 insertions(+) + +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +index 5de4b66e11fe..1d6bb0ab437f 100644 +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -422,7 +422,19 @@ typedef enum rx_handler_result rx_handler_result_t; + typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); + + void __napi_schedule(struct napi_struct *n); ++ ++/* ++ * When PREEMPT_RT_FULL is defined, all device interrupt handlers ++ * run as threads, and they can also be preempted (without PREEMPT_RT ++ * interrupt threads can not be preempted). Which means that calling ++ * __napi_schedule_irqoff() from an interrupt handler can be preempted ++ * and can corrupt the napi->poll_list. ++ */ ++#ifdef CONFIG_PREEMPT_RT_FULL ++#define __napi_schedule_irqoff(n) __napi_schedule(n) ++#else + void __napi_schedule_irqoff(struct napi_struct *n); ++#endif + + static inline bool napi_disable_pending(struct napi_struct *n) + { +diff --git a/net/core/dev.c b/net/core/dev.c +index ddd65bbfcd3a..efebf78b57b2 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -5940,6 +5940,7 @@ bool napi_schedule_prep(struct napi_struct *n) + } + EXPORT_SYMBOL(napi_schedule_prep); + ++#ifndef CONFIG_PREEMPT_RT_FULL + /** + * __napi_schedule_irqoff - schedule for receive + * @n: entry to schedule +@@ -5951,6 +5952,7 @@ void __napi_schedule_irqoff(struct napi_struct *n) + ____napi_schedule(this_cpu_ptr(&softnet_data), n); + } + EXPORT_SYMBOL(__napi_schedule_irqoff); ++#endif + + bool napi_complete_done(struct napi_struct *n, int work_done) + { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0204-net-add-a-lock-around-icmp_sk.patch linux-4.19.118/debian/patches-rt/0204-net-add-a-lock-around-icmp_sk.patch --- linux-4.19.98/debian/patches-rt/0204-net-add-a-lock-around-icmp_sk.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0204-net-add-a-lock-around-icmp_sk.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -From 4c0fdaffb6e6326c5c6318fcd0feb45d4bf77190 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 31 Aug 2016 17:54:09 +0200 -Subject: [PATCH 204/290] net: add a lock around icmp_sk() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -It looks like the this_cpu_ptr() access in icmp_sk() is protected with -local_bh_disable(). To avoid missing serialization in -RT I am adding -here a local lock. No crash has been observed, this is just precaution. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - net/ipv4/icmp.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c -index 4efa5e33513e..de67d595e298 100644 ---- a/net/ipv4/icmp.c -+++ b/net/ipv4/icmp.c -@@ -77,6 +77,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -204,6 +205,8 @@ static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1]; - * - * On SMP we have one ICMP socket per-cpu. - */ -+static DEFINE_LOCAL_IRQ_LOCK(icmp_sk_lock); -+ - static struct sock *icmp_sk(struct net *net) - { - return *this_cpu_ptr(net->ipv4.icmp_sk); -@@ -214,12 +217,16 @@ static inline struct sock *icmp_xmit_lock(struct net *net) - { - struct sock *sk; - -+ if (!local_trylock(icmp_sk_lock)) -+ return NULL; -+ - sk = icmp_sk(net); - - if (unlikely(!spin_trylock(&sk->sk_lock.slock))) { - /* This can happen if the output path signals a - * dst_link_failure() for an outgoing ICMP packet. - */ -+ local_unlock(icmp_sk_lock); - return NULL; - } - return sk; -@@ -228,6 +235,7 @@ static inline struct sock *icmp_xmit_lock(struct net *net) - static inline void icmp_xmit_unlock(struct sock *sk) - { - spin_unlock(&sk->sk_lock.slock); -+ local_unlock(icmp_sk_lock); - } - - int sysctl_icmp_msgs_per_sec __read_mostly = 1000; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0205-irqwork-push-most-work-into-softirq-context.patch linux-4.19.118/debian/patches-rt/0205-irqwork-push-most-work-into-softirq-context.patch --- linux-4.19.98/debian/patches-rt/0205-irqwork-push-most-work-into-softirq-context.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0205-irqwork-push-most-work-into-softirq-context.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,264 @@ +From 1df56a786174e8a45037c5f0be6c1c34d18162a3 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 23 Jun 2015 15:32:51 +0200 +Subject: [PATCH 205/325] irqwork: push most work into softirq context +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Initially we defered all irqwork into softirq because we didn't want the +latency spikes if perf or another user was busy and delayed the RT task. +The NOHZ trigger (nohz_full_kick_work) was the first user that did not work +as expected if it did not run in the original irqwork context so we had to +bring it back somehow for it. push_irq_work_func is the second one that +requires this. + +This patch adds the IRQ_WORK_HARD_IRQ which makes sure the callback runs +in raw-irq context. Everything else is defered into softirq context. Without +-RT we have the orignal behavior. + +This patch incorporates tglx orignal work which revoked a little bringing back +the arch_irq_work_raise() if possible and a few fixes from Steven Rostedt and +Mike Galbraith, + +[bigeasy: melt tglx's irq_work_tick_soft() which splits irq_work_tick() into a + hard and soft variant] +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/irq_work.h | 8 +++++ + kernel/irq_work.c | 75 ++++++++++++++++++++++++++++++---------- + kernel/rcu/tree.c | 1 + + kernel/sched/topology.c | 1 + + kernel/time/tick-sched.c | 1 + + kernel/time/timer.c | 2 ++ + 6 files changed, 70 insertions(+), 18 deletions(-) + +diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h +index b11fcdfd0770..0c50559987c5 100644 +--- a/include/linux/irq_work.h ++++ b/include/linux/irq_work.h +@@ -18,6 +18,8 @@ + + /* Doesn't want IPI, wait for tick: */ + #define IRQ_WORK_LAZY BIT(2) ++/* Run hard IRQ context, even on RT */ ++#define IRQ_WORK_HARD_IRQ BIT(3) + + #define IRQ_WORK_CLAIMED (IRQ_WORK_PENDING | IRQ_WORK_BUSY) + +@@ -52,4 +54,10 @@ static inline bool irq_work_needs_cpu(void) { return false; } + static inline void irq_work_run(void) { } + #endif + ++#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL) ++void irq_work_tick_soft(void); ++#else ++static inline void irq_work_tick_soft(void) { } ++#endif ++ + #endif /* _LINUX_IRQ_WORK_H */ +diff --git a/kernel/irq_work.c b/kernel/irq_work.c +index 73288914ed5e..2940622da5b3 100644 +--- a/kernel/irq_work.c ++++ b/kernel/irq_work.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include + + +@@ -57,29 +58,35 @@ void __weak arch_irq_work_raise(void) + } + + /* Enqueue on current CPU, work must already be claimed and preempt disabled */ +-static void __irq_work_queue_local(struct irq_work *work) ++static void __irq_work_queue_local(struct irq_work *work, struct llist_head *list) + { +- /* If the work is "lazy", handle it from next tick if any */ +- if (work->flags & IRQ_WORK_LAZY) { +- if (llist_add(&work->llnode, this_cpu_ptr(&lazy_list)) && +- tick_nohz_tick_stopped()) +- arch_irq_work_raise(); +- } else { +- if (llist_add(&work->llnode, this_cpu_ptr(&raised_list))) +- arch_irq_work_raise(); +- } ++ bool empty; ++ ++ empty = llist_add(&work->llnode, list); ++ ++ if (empty && ++ (!(work->flags & IRQ_WORK_LAZY) || ++ tick_nohz_tick_stopped())) ++ arch_irq_work_raise(); + } + + /* Enqueue the irq work @work on the current CPU */ + bool irq_work_queue(struct irq_work *work) + { ++ struct llist_head *list; ++ + /* Only queue if not already pending */ + if (!irq_work_claim(work)) + return false; + + /* Queue the entry and raise the IPI if needed. */ + preempt_disable(); +- __irq_work_queue_local(work); ++ if (IS_ENABLED(CONFIG_PREEMPT_RT_FULL) && !(work->flags & IRQ_WORK_HARD_IRQ)) ++ list = this_cpu_ptr(&lazy_list); ++ else ++ list = this_cpu_ptr(&raised_list); ++ ++ __irq_work_queue_local(work, list); + preempt_enable(); + + return true; +@@ -98,6 +105,9 @@ bool irq_work_queue_on(struct irq_work *work, int cpu) + return irq_work_queue(work); + + #else /* CONFIG_SMP: */ ++ struct llist_head *list; ++ bool lazy_work, realtime = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); ++ + /* All work should have been flushed before going offline */ + WARN_ON_ONCE(cpu_is_offline(cpu)); + +@@ -106,13 +116,21 @@ bool irq_work_queue_on(struct irq_work *work, int cpu) + return false; + + preempt_disable(); ++ ++ lazy_work = work->flags & IRQ_WORK_LAZY; ++ ++ if (lazy_work || (realtime && !(work->flags & IRQ_WORK_HARD_IRQ))) ++ list = &per_cpu(lazy_list, cpu); ++ else ++ list = &per_cpu(raised_list, cpu); ++ + if (cpu != smp_processor_id()) { + /* Arch remote IPI send/receive backend aren't NMI safe */ + WARN_ON_ONCE(in_nmi()); +- if (llist_add(&work->llnode, &per_cpu(raised_list, cpu))) ++ if (llist_add(&work->llnode, list)) + arch_send_call_function_single_ipi(cpu); + } else { +- __irq_work_queue_local(work); ++ __irq_work_queue_local(work, list); + } + preempt_enable(); + +@@ -128,9 +146,8 @@ bool irq_work_needs_cpu(void) + raised = this_cpu_ptr(&raised_list); + lazy = this_cpu_ptr(&lazy_list); + +- if (llist_empty(raised) || arch_irq_work_has_interrupt()) +- if (llist_empty(lazy)) +- return false; ++ if (llist_empty(raised) && llist_empty(lazy)) ++ return false; + + /* All work should have been flushed before going offline */ + WARN_ON_ONCE(cpu_is_offline(smp_processor_id())); +@@ -144,8 +161,12 @@ static void irq_work_run_list(struct llist_head *list) + struct llist_node *llnode; + unsigned long flags; + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ /* ++ * nort: On RT IRQ-work may run in SOFTIRQ context. ++ */ + BUG_ON(!irqs_disabled()); +- ++#endif + if (llist_empty(list)) + return; + +@@ -177,7 +198,16 @@ static void irq_work_run_list(struct llist_head *list) + void irq_work_run(void) + { + irq_work_run_list(this_cpu_ptr(&raised_list)); +- irq_work_run_list(this_cpu_ptr(&lazy_list)); ++ if (IS_ENABLED(CONFIG_PREEMPT_RT_FULL)) { ++ /* ++ * NOTE: we raise softirq via IPI for safety, ++ * and execute in irq_work_tick() to move the ++ * overhead from hard to soft irq context. ++ */ ++ if (!llist_empty(this_cpu_ptr(&lazy_list))) ++ raise_softirq(TIMER_SOFTIRQ); ++ } else ++ irq_work_run_list(this_cpu_ptr(&lazy_list)); + } + EXPORT_SYMBOL_GPL(irq_work_run); + +@@ -187,8 +217,17 @@ void irq_work_tick(void) + + if (!llist_empty(raised) && !arch_irq_work_has_interrupt()) + irq_work_run_list(raised); ++ ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT_FULL)) ++ irq_work_run_list(this_cpu_ptr(&lazy_list)); ++} ++ ++#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL) ++void irq_work_tick_soft(void) ++{ + irq_work_run_list(this_cpu_ptr(&lazy_list)); + } ++#endif + + /* + * Synchronize against the irq_work @entry, ensures the entry is not +diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c +index f162a4f54b05..278fe66bfb70 100644 +--- a/kernel/rcu/tree.c ++++ b/kernel/rcu/tree.c +@@ -1296,6 +1296,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp) + !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq && + (rnp->ffmask & rdp->grpmask)) { + init_irq_work(&rdp->rcu_iw, rcu_iw_handler); ++ rdp->rcu_iw.flags = IRQ_WORK_HARD_IRQ; + rdp->rcu_iw_pending = true; + rdp->rcu_iw_gp_seq = rnp->gp_seq; + irq_work_queue_on(&rdp->rcu_iw, rdp->cpu); +diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c +index 74b694392f2f..fb4d11bab6b7 100644 +--- a/kernel/sched/topology.c ++++ b/kernel/sched/topology.c +@@ -279,6 +279,7 @@ static int init_rootdomain(struct root_domain *rd) + rd->rto_cpu = -1; + raw_spin_lock_init(&rd->rto_lock); + init_irq_work(&rd->rto_push_work, rto_push_irq_work_func); ++ rd->rto_push_work.flags |= IRQ_WORK_HARD_IRQ; + #endif + + init_dl_bw(&rd->dl_bw); +diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c +index 2b0ddd50e879..4d31ec98e968 100644 +--- a/kernel/time/tick-sched.c ++++ b/kernel/time/tick-sched.c +@@ -236,6 +236,7 @@ static void nohz_full_kick_func(struct irq_work *work) + + static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = { + .func = nohz_full_kick_func, ++ .flags = IRQ_WORK_HARD_IRQ, + }; + + /* +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index 3fab1c50bf1b..2fcd56aa6092 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -1735,6 +1735,8 @@ static __latent_entropy void run_timer_softirq(struct softirq_action *h) + { + struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); + ++ irq_work_tick_soft(); ++ + __run_timers(base); + if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) + __run_timers(this_cpu_ptr(&timer_bases[BASE_DEF])); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0205-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch linux-4.19.118/debian/patches-rt/0205-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch --- linux-4.19.98/debian/patches-rt/0205-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0205-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -From 8da361e596b7594eb5b0f8abea644982a0c9a1d5 Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Tue, 6 Dec 2016 17:50:30 -0500 -Subject: [PATCH 205/290] net: Have __napi_schedule_irqoff() disable interrupts - on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -A customer hit a crash where the napi sd->poll_list became corrupted. -The customer had the bnx2x driver, which does a -__napi_schedule_irqoff() in its interrupt handler. Unfortunately, when -running with CONFIG_PREEMPT_RT_FULL, this interrupt handler is run as a -thread and is preemptable. The call to ____napi_schedule() must be done -with interrupts disabled to protect the per cpu softnet_data's -"poll_list, which is protected by disabling interrupts (disabling -preemption is enough when all interrupts are threaded and -local_bh_disable() can't preempt)." - -As bnx2x isn't the only driver that does this, the safest thing to do -is to make __napi_schedule_irqoff() call __napi_schedule() instead when -CONFIG_PREEMPT_RT_FULL is enabled, which will call local_irq_save() -before calling ____napi_schedule(). - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Steven Rostedt (Red Hat) -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/netdevice.h | 12 ++++++++++++ - net/core/dev.c | 2 ++ - 2 files changed, 14 insertions(+) - -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index c76c32aea759..49dc2818713a 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -422,7 +422,19 @@ typedef enum rx_handler_result rx_handler_result_t; - typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); - - void __napi_schedule(struct napi_struct *n); -+ -+/* -+ * When PREEMPT_RT_FULL is defined, all device interrupt handlers -+ * run as threads, and they can also be preempted (without PREEMPT_RT -+ * interrupt threads can not be preempted). Which means that calling -+ * __napi_schedule_irqoff() from an interrupt handler can be preempted -+ * and can corrupt the napi->poll_list. -+ */ -+#ifdef CONFIG_PREEMPT_RT_FULL -+#define __napi_schedule_irqoff(n) __napi_schedule(n) -+#else - void __napi_schedule_irqoff(struct napi_struct *n); -+#endif - - static inline bool napi_disable_pending(struct napi_struct *n) - { -diff --git a/net/core/dev.c b/net/core/dev.c -index 1a30cf641e7c..950356b8b5b1 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -5967,6 +5967,7 @@ bool napi_schedule_prep(struct napi_struct *n) - } - EXPORT_SYMBOL(napi_schedule_prep); - -+#ifndef CONFIG_PREEMPT_RT_FULL - /** - * __napi_schedule_irqoff - schedule for receive - * @n: entry to schedule -@@ -5978,6 +5979,7 @@ void __napi_schedule_irqoff(struct napi_struct *n) - ____napi_schedule(this_cpu_ptr(&softnet_data), n); - } - EXPORT_SYMBOL(__napi_schedule_irqoff); -+#endif - - bool napi_complete_done(struct napi_struct *n, int work_done) - { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0206-irqwork-push-most-work-into-softirq-context.patch linux-4.19.118/debian/patches-rt/0206-irqwork-push-most-work-into-softirq-context.patch --- linux-4.19.98/debian/patches-rt/0206-irqwork-push-most-work-into-softirq-context.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0206-irqwork-push-most-work-into-softirq-context.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,264 +0,0 @@ -From 6b96ba989ad06199b33100cf7469ebeae299a21e Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 23 Jun 2015 15:32:51 +0200 -Subject: [PATCH 206/290] irqwork: push most work into softirq context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Initially we defered all irqwork into softirq because we didn't want the -latency spikes if perf or another user was busy and delayed the RT task. -The NOHZ trigger (nohz_full_kick_work) was the first user that did not work -as expected if it did not run in the original irqwork context so we had to -bring it back somehow for it. push_irq_work_func is the second one that -requires this. - -This patch adds the IRQ_WORK_HARD_IRQ which makes sure the callback runs -in raw-irq context. Everything else is defered into softirq context. Without --RT we have the orignal behavior. - -This patch incorporates tglx orignal work which revoked a little bringing back -the arch_irq_work_raise() if possible and a few fixes from Steven Rostedt and -Mike Galbraith, - -[bigeasy: melt tglx's irq_work_tick_soft() which splits irq_work_tick() into a - hard and soft variant] -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/irq_work.h | 8 +++++ - kernel/irq_work.c | 75 ++++++++++++++++++++++++++++++---------- - kernel/rcu/tree.c | 1 + - kernel/sched/topology.c | 1 + - kernel/time/tick-sched.c | 1 + - kernel/time/timer.c | 2 ++ - 6 files changed, 70 insertions(+), 18 deletions(-) - -diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h -index b11fcdfd0770..0c50559987c5 100644 ---- a/include/linux/irq_work.h -+++ b/include/linux/irq_work.h -@@ -18,6 +18,8 @@ - - /* Doesn't want IPI, wait for tick: */ - #define IRQ_WORK_LAZY BIT(2) -+/* Run hard IRQ context, even on RT */ -+#define IRQ_WORK_HARD_IRQ BIT(3) - - #define IRQ_WORK_CLAIMED (IRQ_WORK_PENDING | IRQ_WORK_BUSY) - -@@ -52,4 +54,10 @@ static inline bool irq_work_needs_cpu(void) { return false; } - static inline void irq_work_run(void) { } - #endif - -+#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL) -+void irq_work_tick_soft(void); -+#else -+static inline void irq_work_tick_soft(void) { } -+#endif -+ - #endif /* _LINUX_IRQ_WORK_H */ -diff --git a/kernel/irq_work.c b/kernel/irq_work.c -index 73288914ed5e..2940622da5b3 100644 ---- a/kernel/irq_work.c -+++ b/kernel/irq_work.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - #include - - -@@ -57,29 +58,35 @@ void __weak arch_irq_work_raise(void) - } - - /* Enqueue on current CPU, work must already be claimed and preempt disabled */ --static void __irq_work_queue_local(struct irq_work *work) -+static void __irq_work_queue_local(struct irq_work *work, struct llist_head *list) - { -- /* If the work is "lazy", handle it from next tick if any */ -- if (work->flags & IRQ_WORK_LAZY) { -- if (llist_add(&work->llnode, this_cpu_ptr(&lazy_list)) && -- tick_nohz_tick_stopped()) -- arch_irq_work_raise(); -- } else { -- if (llist_add(&work->llnode, this_cpu_ptr(&raised_list))) -- arch_irq_work_raise(); -- } -+ bool empty; -+ -+ empty = llist_add(&work->llnode, list); -+ -+ if (empty && -+ (!(work->flags & IRQ_WORK_LAZY) || -+ tick_nohz_tick_stopped())) -+ arch_irq_work_raise(); - } - - /* Enqueue the irq work @work on the current CPU */ - bool irq_work_queue(struct irq_work *work) - { -+ struct llist_head *list; -+ - /* Only queue if not already pending */ - if (!irq_work_claim(work)) - return false; - - /* Queue the entry and raise the IPI if needed. */ - preempt_disable(); -- __irq_work_queue_local(work); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT_FULL) && !(work->flags & IRQ_WORK_HARD_IRQ)) -+ list = this_cpu_ptr(&lazy_list); -+ else -+ list = this_cpu_ptr(&raised_list); -+ -+ __irq_work_queue_local(work, list); - preempt_enable(); - - return true; -@@ -98,6 +105,9 @@ bool irq_work_queue_on(struct irq_work *work, int cpu) - return irq_work_queue(work); - - #else /* CONFIG_SMP: */ -+ struct llist_head *list; -+ bool lazy_work, realtime = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); -+ - /* All work should have been flushed before going offline */ - WARN_ON_ONCE(cpu_is_offline(cpu)); - -@@ -106,13 +116,21 @@ bool irq_work_queue_on(struct irq_work *work, int cpu) - return false; - - preempt_disable(); -+ -+ lazy_work = work->flags & IRQ_WORK_LAZY; -+ -+ if (lazy_work || (realtime && !(work->flags & IRQ_WORK_HARD_IRQ))) -+ list = &per_cpu(lazy_list, cpu); -+ else -+ list = &per_cpu(raised_list, cpu); -+ - if (cpu != smp_processor_id()) { - /* Arch remote IPI send/receive backend aren't NMI safe */ - WARN_ON_ONCE(in_nmi()); -- if (llist_add(&work->llnode, &per_cpu(raised_list, cpu))) -+ if (llist_add(&work->llnode, list)) - arch_send_call_function_single_ipi(cpu); - } else { -- __irq_work_queue_local(work); -+ __irq_work_queue_local(work, list); - } - preempt_enable(); - -@@ -128,9 +146,8 @@ bool irq_work_needs_cpu(void) - raised = this_cpu_ptr(&raised_list); - lazy = this_cpu_ptr(&lazy_list); - -- if (llist_empty(raised) || arch_irq_work_has_interrupt()) -- if (llist_empty(lazy)) -- return false; -+ if (llist_empty(raised) && llist_empty(lazy)) -+ return false; - - /* All work should have been flushed before going offline */ - WARN_ON_ONCE(cpu_is_offline(smp_processor_id())); -@@ -144,8 +161,12 @@ static void irq_work_run_list(struct llist_head *list) - struct llist_node *llnode; - unsigned long flags; - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ /* -+ * nort: On RT IRQ-work may run in SOFTIRQ context. -+ */ - BUG_ON(!irqs_disabled()); -- -+#endif - if (llist_empty(list)) - return; - -@@ -177,7 +198,16 @@ static void irq_work_run_list(struct llist_head *list) - void irq_work_run(void) - { - irq_work_run_list(this_cpu_ptr(&raised_list)); -- irq_work_run_list(this_cpu_ptr(&lazy_list)); -+ if (IS_ENABLED(CONFIG_PREEMPT_RT_FULL)) { -+ /* -+ * NOTE: we raise softirq via IPI for safety, -+ * and execute in irq_work_tick() to move the -+ * overhead from hard to soft irq context. -+ */ -+ if (!llist_empty(this_cpu_ptr(&lazy_list))) -+ raise_softirq(TIMER_SOFTIRQ); -+ } else -+ irq_work_run_list(this_cpu_ptr(&lazy_list)); - } - EXPORT_SYMBOL_GPL(irq_work_run); - -@@ -187,8 +217,17 @@ void irq_work_tick(void) - - if (!llist_empty(raised) && !arch_irq_work_has_interrupt()) - irq_work_run_list(raised); -+ -+ if (!IS_ENABLED(CONFIG_PREEMPT_RT_FULL)) -+ irq_work_run_list(this_cpu_ptr(&lazy_list)); -+} -+ -+#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL) -+void irq_work_tick_soft(void) -+{ - irq_work_run_list(this_cpu_ptr(&lazy_list)); - } -+#endif - - /* - * Synchronize against the irq_work @entry, ensures the entry is not -diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c -index f162a4f54b05..278fe66bfb70 100644 ---- a/kernel/rcu/tree.c -+++ b/kernel/rcu/tree.c -@@ -1296,6 +1296,7 @@ static int rcu_implicit_dynticks_qs(struct rcu_data *rdp) - !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq && - (rnp->ffmask & rdp->grpmask)) { - init_irq_work(&rdp->rcu_iw, rcu_iw_handler); -+ rdp->rcu_iw.flags = IRQ_WORK_HARD_IRQ; - rdp->rcu_iw_pending = true; - rdp->rcu_iw_gp_seq = rnp->gp_seq; - irq_work_queue_on(&rdp->rcu_iw, rdp->cpu); -diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c -index 74b694392f2f..fb4d11bab6b7 100644 ---- a/kernel/sched/topology.c -+++ b/kernel/sched/topology.c -@@ -279,6 +279,7 @@ static int init_rootdomain(struct root_domain *rd) - rd->rto_cpu = -1; - raw_spin_lock_init(&rd->rto_lock); - init_irq_work(&rd->rto_push_work, rto_push_irq_work_func); -+ rd->rto_push_work.flags |= IRQ_WORK_HARD_IRQ; - #endif - - init_dl_bw(&rd->dl_bw); -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 6482945f8ae8..da4a3f8feb56 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -232,6 +232,7 @@ static void nohz_full_kick_func(struct irq_work *work) - - static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = { - .func = nohz_full_kick_func, -+ .flags = IRQ_WORK_HARD_IRQ, - }; - - /* -diff --git a/kernel/time/timer.c b/kernel/time/timer.c -index 3fab1c50bf1b..2fcd56aa6092 100644 ---- a/kernel/time/timer.c -+++ b/kernel/time/timer.c -@@ -1735,6 +1735,8 @@ static __latent_entropy void run_timer_softirq(struct softirq_action *h) - { - struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]); - -+ irq_work_tick_soft(); -+ - __run_timers(base); - if (IS_ENABLED(CONFIG_NO_HZ_COMMON)) - __run_timers(this_cpu_ptr(&timer_bases[BASE_DEF])); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0206-printk-Make-rt-aware.patch linux-4.19.118/debian/patches-rt/0206-printk-Make-rt-aware.patch --- linux-4.19.98/debian/patches-rt/0206-printk-Make-rt-aware.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0206-printk-Make-rt-aware.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,114 @@ +From ea61badc3b80c688ddb6439a8bd334e111cf6b9f Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 19 Sep 2012 14:50:37 +0200 +Subject: [PATCH 206/325] printk: Make rt aware +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Drop the lock before calling the console driver and do not disable +interrupts while printing to a serial console. + +Signed-off-by: Thomas Gleixner +--- + kernel/printk/printk.c | 33 ++++++++++++++++++++++++++++++--- + 1 file changed, 30 insertions(+), 3 deletions(-) + +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index f934baed564d..c927f89961a8 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -1624,6 +1624,7 @@ SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) + return do_syslog(type, buf, len, SYSLOG_FROM_READER); + } + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * Special console_lock variants that help to reduce the risk of soft-lockups. + * They allow to pass console_lock to another printk() call using a busy wait. +@@ -1764,6 +1765,15 @@ static int console_trylock_spinning(void) + return 1; + } + ++#else ++ ++static int console_trylock_spinning(void) ++{ ++ return console_trylock(); ++} ++ ++#endif ++ + /* + * Call the console drivers, asking them to write out + * log_buf[start] to log_buf[end - 1]. +@@ -1779,6 +1789,7 @@ static void call_console_drivers(const char *ext_text, size_t ext_len, + if (!console_drivers) + return; + ++ migrate_disable(); + for_each_console(con) { + if (exclusive_console && con != exclusive_console) + continue; +@@ -1794,6 +1805,7 @@ static void call_console_drivers(const char *ext_text, size_t ext_len, + else + con->write(con, text, len); + } ++ migrate_enable(); + } + + int printk_delay_msec __read_mostly; +@@ -1988,20 +2000,30 @@ asmlinkage int vprintk_emit(int facility, int level, + + /* If called from the scheduler, we can not call up(). */ + if (!in_sched && pending_output) { ++ int may_trylock = 1; ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ /* ++ * we can't take a sleeping lock with IRQs or preeption disabled ++ * so we can't print in these contexts ++ */ ++ if (!(preempt_count() == 0 && !irqs_disabled())) ++ may_trylock = 0; ++#endif + /* + * Disable preemption to avoid being preempted while holding + * console_sem which would prevent anyone from printing to + * console + */ +- preempt_disable(); ++ migrate_disable(); + /* + * Try to acquire and then immediately release the console + * semaphore. The release will print out buffers and wake up + * /dev/kmsg and syslog() users. + */ +- if (console_trylock_spinning()) ++ if (may_trylock && console_trylock_spinning()) + console_unlock(); +- preempt_enable(); ++ migrate_enable(); + } + + if (pending_output) +@@ -2463,6 +2485,10 @@ void console_unlock(void) + console_seq++; + raw_spin_unlock(&logbuf_lock); + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ printk_safe_exit_irqrestore(flags); ++ call_console_drivers(ext_text, ext_len, text, len); ++#else + /* + * While actively printing out messages, if another printk() + * were to occur on another CPU, it may wait for this one to +@@ -2481,6 +2507,7 @@ void console_unlock(void) + } + + printk_safe_exit_irqrestore(flags); ++#endif + + if (do_cond_resched) + cond_resched(); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0207-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch linux-4.19.118/debian/patches-rt/0207-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch --- linux-4.19.98/debian/patches-rt/0207-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0207-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,48 @@ +From 5791d9898591312bc4dc34c9cb748b2cdfe0026f Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 19 May 2016 17:45:27 +0200 +Subject: [PATCH 207/325] kernel/printk: Don't try to print from IRQ/NMI region +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On -RT we try to acquire sleeping locks which might lead to warnings +from lockdep or a warn_on() from spin_try_lock() (which is a rtmutex on +RT). +We don't print in general from a IRQ off region so we should not try +this via console_unblank() / bust_spinlocks() as well. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/printk/printk.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index c927f89961a8..49ea374ba8ea 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -1789,6 +1789,11 @@ static void call_console_drivers(const char *ext_text, size_t ext_len, + if (!console_drivers) + return; + ++ if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) { ++ if (in_irq() || in_nmi()) ++ return; ++ } ++ + migrate_disable(); + for_each_console(con) { + if (exclusive_console && con != exclusive_console) +@@ -2555,6 +2560,11 @@ void console_unblank(void) + { + struct console *c; + ++ if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) { ++ if (in_irq() || in_nmi()) ++ return; ++ } ++ + /* + * console_unblank can no longer be called in interrupt context unless + * oops_in_progress is set to 1.. +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0207-printk-Make-rt-aware.patch linux-4.19.118/debian/patches-rt/0207-printk-Make-rt-aware.patch --- linux-4.19.98/debian/patches-rt/0207-printk-Make-rt-aware.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0207-printk-Make-rt-aware.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -From ddfc55c94d550664260bd755c4f0ec09f13cfed2 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 19 Sep 2012 14:50:37 +0200 -Subject: [PATCH 207/290] printk: Make rt aware -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Drop the lock before calling the console driver and do not disable -interrupts while printing to a serial console. - -Signed-off-by: Thomas Gleixner ---- - kernel/printk/printk.c | 33 ++++++++++++++++++++++++++++++--- - 1 file changed, 30 insertions(+), 3 deletions(-) - -diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c -index 9a7f259dbb20..83f386175dcc 100644 ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1624,6 +1624,7 @@ SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) - return do_syslog(type, buf, len, SYSLOG_FROM_READER); - } - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * Special console_lock variants that help to reduce the risk of soft-lockups. - * They allow to pass console_lock to another printk() call using a busy wait. -@@ -1764,6 +1765,15 @@ static int console_trylock_spinning(void) - return 1; - } - -+#else -+ -+static int console_trylock_spinning(void) -+{ -+ return console_trylock(); -+} -+ -+#endif -+ - /* - * Call the console drivers, asking them to write out - * log_buf[start] to log_buf[end - 1]. -@@ -1779,6 +1789,7 @@ static void call_console_drivers(const char *ext_text, size_t ext_len, - if (!console_drivers) - return; - -+ migrate_disable(); - for_each_console(con) { - if (exclusive_console && con != exclusive_console) - continue; -@@ -1794,6 +1805,7 @@ static void call_console_drivers(const char *ext_text, size_t ext_len, - else - con->write(con, text, len); - } -+ migrate_enable(); - } - - int printk_delay_msec __read_mostly; -@@ -1988,20 +2000,30 @@ asmlinkage int vprintk_emit(int facility, int level, - - /* If called from the scheduler, we can not call up(). */ - if (!in_sched && pending_output) { -+ int may_trylock = 1; -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ /* -+ * we can't take a sleeping lock with IRQs or preeption disabled -+ * so we can't print in these contexts -+ */ -+ if (!(preempt_count() == 0 && !irqs_disabled())) -+ may_trylock = 0; -+#endif - /* - * Disable preemption to avoid being preempted while holding - * console_sem which would prevent anyone from printing to - * console - */ -- preempt_disable(); -+ migrate_disable(); - /* - * Try to acquire and then immediately release the console - * semaphore. The release will print out buffers and wake up - * /dev/kmsg and syslog() users. - */ -- if (console_trylock_spinning()) -+ if (may_trylock && console_trylock_spinning()) - console_unlock(); -- preempt_enable(); -+ migrate_enable(); - } - - if (pending_output) -@@ -2463,6 +2485,10 @@ void console_unlock(void) - console_seq++; - raw_spin_unlock(&logbuf_lock); - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ printk_safe_exit_irqrestore(flags); -+ call_console_drivers(ext_text, ext_len, text, len); -+#else - /* - * While actively printing out messages, if another printk() - * were to occur on another CPU, it may wait for this one to -@@ -2481,6 +2507,7 @@ void console_unlock(void) - } - - printk_safe_exit_irqrestore(flags); -+#endif - - if (do_cond_resched) - cond_resched(); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0208-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch linux-4.19.118/debian/patches-rt/0208-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch --- linux-4.19.98/debian/patches-rt/0208-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0208-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -From ddc0ed9a091fdcda9dba71990fb9300de72e70bf Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 19 May 2016 17:45:27 +0200 -Subject: [PATCH 208/290] kernel/printk: Don't try to print from IRQ/NMI region -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On -RT we try to acquire sleeping locks which might lead to warnings -from lockdep or a warn_on() from spin_try_lock() (which is a rtmutex on -RT). -We don't print in general from a IRQ off region so we should not try -this via console_unblank() / bust_spinlocks() as well. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c -index 83f386175dcc..217abc6a53e1 100644 ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1789,6 +1789,11 @@ static void call_console_drivers(const char *ext_text, size_t ext_len, - if (!console_drivers) - return; - -+ if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) { -+ if (in_irq() || in_nmi()) -+ return; -+ } -+ - migrate_disable(); - for_each_console(con) { - if (exclusive_console && con != exclusive_console) -@@ -2555,6 +2560,11 @@ void console_unblank(void) - { - struct console *c; - -+ if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) { -+ if (in_irq() || in_nmi()) -+ return; -+ } -+ - /* - * console_unblank can no longer be called in interrupt context unless - * oops_in_progress is set to 1.. --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0208-printk-Drop-the-logbuf_lock-more-often.patch linux-4.19.118/debian/patches-rt/0208-printk-Drop-the-logbuf_lock-more-often.patch --- linux-4.19.98/debian/patches-rt/0208-printk-Drop-the-logbuf_lock-more-often.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0208-printk-Drop-the-logbuf_lock-more-often.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,83 @@ +From 801157c0e2dc4c9c1a54f714a2f3ac7d2e373e17 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 21 Mar 2013 19:01:05 +0100 +Subject: [PATCH 208/325] printk: Drop the logbuf_lock more often +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The lock is hold with irgs off. The latency drops 500us+ on my arm bugs +with a "full" buffer after executing "dmesg" on the shell. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/printk/printk.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index 49ea374ba8ea..acef3657a316 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -1427,12 +1427,23 @@ static int syslog_print_all(char __user *buf, int size, bool clear) + u64 next_seq; + u64 seq; + u32 idx; ++ int attempts = 0; ++ int num_msg; + + text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); + if (!text) + return -ENOMEM; + + logbuf_lock_irq(); ++ ++try_again: ++ attempts++; ++ if (attempts > 10) { ++ len = -EBUSY; ++ goto out; ++ } ++ num_msg = 0; ++ + /* + * Find first record that fits, including all following records, + * into the user-provided buffer for this dump. +@@ -1445,6 +1456,14 @@ static int syslog_print_all(char __user *buf, int size, bool clear) + len += msg_print_text(msg, true, NULL, 0); + idx = log_next(idx); + seq++; ++ num_msg++; ++ if (num_msg > 5) { ++ num_msg = 0; ++ logbuf_unlock_irq(); ++ logbuf_lock_irq(); ++ if (clear_seq < log_first_seq) ++ goto try_again; ++ } + } + + /* move first record forward until length fits into the buffer */ +@@ -1456,6 +1475,14 @@ static int syslog_print_all(char __user *buf, int size, bool clear) + len -= msg_print_text(msg, true, NULL, 0); + idx = log_next(idx); + seq++; ++ num_msg++; ++ if (num_msg > 5) { ++ num_msg = 0; ++ logbuf_unlock_irq(); ++ logbuf_lock_irq(); ++ if (clear_seq < log_first_seq) ++ goto try_again; ++ } + } + + /* last message fitting into this dump */ +@@ -1493,6 +1520,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear) + clear_seq = log_next_seq; + clear_idx = log_next_idx; + } ++out: + logbuf_unlock_irq(); + + kfree(text); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0209-ARM-enable-irq-in-translation-section-permission-fau.patch linux-4.19.118/debian/patches-rt/0209-ARM-enable-irq-in-translation-section-permission-fau.patch --- linux-4.19.98/debian/patches-rt/0209-ARM-enable-irq-in-translation-section-permission-fau.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0209-ARM-enable-irq-in-translation-section-permission-fau.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,96 @@ +From 0a08742cc5de665e32bf773748d75ed56e170466 Mon Sep 17 00:00:00 2001 +From: "Yadi.hu" +Date: Wed, 10 Dec 2014 10:32:09 +0800 +Subject: [PATCH 209/325] ARM: enable irq in translation/section permission + fault handlers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Probably happens on all ARM, with +CONFIG_PREEMPT_RT_FULL +CONFIG_DEBUG_ATOMIC_SLEEP + +This simple program.... + +int main() { + *((char*)0xc0001000) = 0; +}; + +[ 512.742724] BUG: sleeping function called from invalid context at kernel/rtmutex.c:658 +[ 512.743000] in_atomic(): 0, irqs_disabled(): 128, pid: 994, name: a +[ 512.743217] INFO: lockdep is turned off. +[ 512.743360] irq event stamp: 0 +[ 512.743482] hardirqs last enabled at (0): [< (null)>] (null) +[ 512.743714] hardirqs last disabled at (0): [] copy_process+0x3b0/0x11c0 +[ 512.744013] softirqs last enabled at (0): [] copy_process+0x3b0/0x11c0 +[ 512.744303] softirqs last disabled at (0): [< (null)>] (null) +[ 512.744631] [] (unwind_backtrace+0x0/0x104) +[ 512.745001] [] (dump_stack+0x20/0x24) +[ 512.745355] [] (__might_sleep+0x1dc/0x1e0) +[ 512.745717] [] (rt_spin_lock+0x34/0x6c) +[ 512.746073] [] (do_force_sig_info+0x34/0xf0) +[ 512.746457] [] (force_sig_info+0x18/0x1c) +[ 512.746829] [] (__do_user_fault+0x9c/0xd8) +[ 512.747185] [] (do_bad_area+0x7c/0x94) +[ 512.747536] [] (do_sect_fault+0x40/0x48) +[ 512.747898] [] (do_DataAbort+0x40/0xa0) +[ 512.748181] Exception stack(0xecaa1fb0 to 0xecaa1ff8) + +Oxc0000000 belongs to kernel address space, user task can not be +allowed to access it. For above condition, correct result is that +test case should receive a “segment fault” and exits but not stacks. + +the root cause is commit 02fe2845d6a8 ("avoid enabling interrupts in +prefetch/data abort handlers"),it deletes irq enable block in Data +abort assemble code and move them into page/breakpiont/alignment fault +handlers instead. But author does not enable irq in translation/section +permission fault handlers. ARM disables irq when it enters exception/ +interrupt mode, if kernel doesn't enable irq, it would be still disabled +during translation/section permission fault. + +We see the above splat because do_force_sig_info is still called with +IRQs off, and that code eventually does a: + + spin_lock_irqsave(&t->sighand->siglock, flags); + +As this is architecture independent code, and we've not seen any other +need for other arch to have the siglock converted to raw lock, we can +conclude that we should enable irq for ARM translation/section +permission exception. + + +Signed-off-by: Yadi.hu +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/arm/mm/fault.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c +index a9ee0d9dc740..20b0e146de98 100644 +--- a/arch/arm/mm/fault.c ++++ b/arch/arm/mm/fault.c +@@ -439,6 +439,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, + if (addr < TASK_SIZE) + return do_page_fault(addr, fsr, regs); + ++ if (interrupts_enabled(regs)) ++ local_irq_enable(); ++ + if (user_mode(regs)) + goto bad_area; + +@@ -506,6 +509,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, + static int + do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) + { ++ if (interrupts_enabled(regs)) ++ local_irq_enable(); ++ + do_bad_area(addr, fsr, regs); + return 0; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0209-printk-Drop-the-logbuf_lock-more-often.patch linux-4.19.118/debian/patches-rt/0209-printk-Drop-the-logbuf_lock-more-often.patch --- linux-4.19.98/debian/patches-rt/0209-printk-Drop-the-logbuf_lock-more-often.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0209-printk-Drop-the-logbuf_lock-more-often.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -From 369d276b8c46a573a55da8fdf568f3cb6522d075 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 21 Mar 2013 19:01:05 +0100 -Subject: [PATCH 209/290] printk: Drop the logbuf_lock more often -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The lock is hold with irgs off. The latency drops 500us+ on my arm bugs -with a "full" buffer after executing "dmesg" on the shell. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/printk/printk.c | 28 ++++++++++++++++++++++++++++ - 1 file changed, 28 insertions(+) - -diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c -index 217abc6a53e1..58517c68e896 100644 ---- a/kernel/printk/printk.c -+++ b/kernel/printk/printk.c -@@ -1427,12 +1427,23 @@ static int syslog_print_all(char __user *buf, int size, bool clear) - u64 next_seq; - u64 seq; - u32 idx; -+ int attempts = 0; -+ int num_msg; - - text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); - if (!text) - return -ENOMEM; - - logbuf_lock_irq(); -+ -+try_again: -+ attempts++; -+ if (attempts > 10) { -+ len = -EBUSY; -+ goto out; -+ } -+ num_msg = 0; -+ - /* - * Find first record that fits, including all following records, - * into the user-provided buffer for this dump. -@@ -1445,6 +1456,14 @@ static int syslog_print_all(char __user *buf, int size, bool clear) - len += msg_print_text(msg, true, NULL, 0); - idx = log_next(idx); - seq++; -+ num_msg++; -+ if (num_msg > 5) { -+ num_msg = 0; -+ logbuf_unlock_irq(); -+ logbuf_lock_irq(); -+ if (clear_seq < log_first_seq) -+ goto try_again; -+ } - } - - /* move first record forward until length fits into the buffer */ -@@ -1456,6 +1475,14 @@ static int syslog_print_all(char __user *buf, int size, bool clear) - len -= msg_print_text(msg, true, NULL, 0); - idx = log_next(idx); - seq++; -+ num_msg++; -+ if (num_msg > 5) { -+ num_msg = 0; -+ logbuf_unlock_irq(); -+ logbuf_lock_irq(); -+ if (clear_seq < log_first_seq) -+ goto try_again; -+ } - } - - /* last message fitting into this dump */ -@@ -1493,6 +1520,7 @@ static int syslog_print_all(char __user *buf, int size, bool clear) - clear_seq = log_next_seq; - clear_idx = log_next_idx; - } -+out: - logbuf_unlock_irq(); - - kfree(text); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0210-ARM-enable-irq-in-translation-section-permission-fau.patch linux-4.19.118/debian/patches-rt/0210-ARM-enable-irq-in-translation-section-permission-fau.patch --- linux-4.19.98/debian/patches-rt/0210-ARM-enable-irq-in-translation-section-permission-fau.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0210-ARM-enable-irq-in-translation-section-permission-fau.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -From 02d7b4ff5ed37112bbc7cb2cd8ee97f43f8c8800 Mon Sep 17 00:00:00 2001 -From: "Yadi.hu" -Date: Wed, 10 Dec 2014 10:32:09 +0800 -Subject: [PATCH 210/290] ARM: enable irq in translation/section permission - fault handlers -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Probably happens on all ARM, with -CONFIG_PREEMPT_RT_FULL -CONFIG_DEBUG_ATOMIC_SLEEP - -This simple program.... - -int main() { - *((char*)0xc0001000) = 0; -}; - -[ 512.742724] BUG: sleeping function called from invalid context at kernel/rtmutex.c:658 -[ 512.743000] in_atomic(): 0, irqs_disabled(): 128, pid: 994, name: a -[ 512.743217] INFO: lockdep is turned off. -[ 512.743360] irq event stamp: 0 -[ 512.743482] hardirqs last enabled at (0): [< (null)>] (null) -[ 512.743714] hardirqs last disabled at (0): [] copy_process+0x3b0/0x11c0 -[ 512.744013] softirqs last enabled at (0): [] copy_process+0x3b0/0x11c0 -[ 512.744303] softirqs last disabled at (0): [< (null)>] (null) -[ 512.744631] [] (unwind_backtrace+0x0/0x104) -[ 512.745001] [] (dump_stack+0x20/0x24) -[ 512.745355] [] (__might_sleep+0x1dc/0x1e0) -[ 512.745717] [] (rt_spin_lock+0x34/0x6c) -[ 512.746073] [] (do_force_sig_info+0x34/0xf0) -[ 512.746457] [] (force_sig_info+0x18/0x1c) -[ 512.746829] [] (__do_user_fault+0x9c/0xd8) -[ 512.747185] [] (do_bad_area+0x7c/0x94) -[ 512.747536] [] (do_sect_fault+0x40/0x48) -[ 512.747898] [] (do_DataAbort+0x40/0xa0) -[ 512.748181] Exception stack(0xecaa1fb0 to 0xecaa1ff8) - -Oxc0000000 belongs to kernel address space, user task can not be -allowed to access it. For above condition, correct result is that -test case should receive a “segment fault” and exits but not stacks. - -the root cause is commit 02fe2845d6a8 ("avoid enabling interrupts in -prefetch/data abort handlers"),it deletes irq enable block in Data -abort assemble code and move them into page/breakpiont/alignment fault -handlers instead. But author does not enable irq in translation/section -permission fault handlers. ARM disables irq when it enters exception/ -interrupt mode, if kernel doesn't enable irq, it would be still disabled -during translation/section permission fault. - -We see the above splat because do_force_sig_info is still called with -IRQs off, and that code eventually does a: - - spin_lock_irqsave(&t->sighand->siglock, flags); - -As this is architecture independent code, and we've not seen any other -need for other arch to have the siglock converted to raw lock, we can -conclude that we should enable irq for ARM translation/section -permission exception. - - -Signed-off-by: Yadi.hu -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm/mm/fault.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c -index a9ee0d9dc740..20b0e146de98 100644 ---- a/arch/arm/mm/fault.c -+++ b/arch/arm/mm/fault.c -@@ -439,6 +439,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, - if (addr < TASK_SIZE) - return do_page_fault(addr, fsr, regs); - -+ if (interrupts_enabled(regs)) -+ local_irq_enable(); -+ - if (user_mode(regs)) - goto bad_area; - -@@ -506,6 +509,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, - static int - do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) - { -+ if (interrupts_enabled(regs)) -+ local_irq_enable(); -+ - do_bad_area(addr, fsr, regs); - return 0; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0210-genirq-update-irq_set_irqchip_state-documentation.patch linux-4.19.118/debian/patches-rt/0210-genirq-update-irq_set_irqchip_state-documentation.patch --- linux-4.19.98/debian/patches-rt/0210-genirq-update-irq_set_irqchip_state-documentation.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0210-genirq-update-irq_set_irqchip_state-documentation.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,32 @@ +From cd209691e4220adde61d3e0c36179232a565dee3 Mon Sep 17 00:00:00 2001 +From: Josh Cartwright +Date: Thu, 11 Feb 2016 11:54:00 -0600 +Subject: [PATCH 210/325] genirq: update irq_set_irqchip_state documentation +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On -rt kernels, the use of migrate_disable()/migrate_enable() is +sufficient to guarantee a task isn't moved to another CPU. Update the +irq_set_irqchip_state() documentation to reflect this. + +Signed-off-by: Josh Cartwright +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/irq/manage.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c +index ccd8af6fe49d..1a3cf77b11f8 100644 +--- a/kernel/irq/manage.c ++++ b/kernel/irq/manage.c +@@ -2283,7 +2283,7 @@ EXPORT_SYMBOL_GPL(irq_get_irqchip_state); + * This call sets the internal irqchip state of an interrupt, + * depending on the value of @which. + * +- * This function should be called with preemption disabled if the ++ * This function should be called with migration disabled if the + * interrupt controller has per-cpu registers. + */ + int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0211-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch linux-4.19.118/debian/patches-rt/0211-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch --- linux-4.19.98/debian/patches-rt/0211-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0211-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,59 @@ +From b0db55e7a9eb7ef9e80ffbe089999bf94abe5f52 Mon Sep 17 00:00:00 2001 +From: Josh Cartwright +Date: Thu, 11 Feb 2016 11:54:01 -0600 +Subject: [PATCH 211/325] KVM: arm/arm64: downgrade preempt_disable()d region + to migrate_disable() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +kvm_arch_vcpu_ioctl_run() disables the use of preemption when updating +the vgic and timer states to prevent the calling task from migrating to +another CPU. It does so to prevent the task from writing to the +incorrect per-CPU GIC distributor registers. + +On -rt kernels, it's possible to maintain the same guarantee with the +use of migrate_{disable,enable}(), with the added benefit that the +migrate-disabled region is preemptible. Update +kvm_arch_vcpu_ioctl_run() to do so. + +Cc: Christoffer Dall +Reported-by: Manish Jaggi +Signed-off-by: Josh Cartwright +Signed-off-by: Sebastian Andrzej Siewior +--- + virt/kvm/arm/arm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c +index d982650deb33..efe2d6c0201c 100644 +--- a/virt/kvm/arm/arm.c ++++ b/virt/kvm/arm/arm.c +@@ -723,7 +723,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) + * involves poking the GIC, which must be done in a + * non-preemptible context. + */ +- preempt_disable(); ++ migrate_disable(); + + kvm_pmu_flush_hwstate(vcpu); + +@@ -772,7 +772,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) + kvm_timer_sync_hwstate(vcpu); + kvm_vgic_sync_hwstate(vcpu); + local_irq_enable(); +- preempt_enable(); ++ migrate_enable(); + continue; + } + +@@ -850,7 +850,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) + /* Exit types that need handling before we can be preempted */ + handle_exit_early(vcpu, run, ret); + +- preempt_enable(); ++ migrate_enable(); + + ret = handle_exit(vcpu, run, ret); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0211-genirq-update-irq_set_irqchip_state-documentation.patch linux-4.19.118/debian/patches-rt/0211-genirq-update-irq_set_irqchip_state-documentation.patch --- linux-4.19.98/debian/patches-rt/0211-genirq-update-irq_set_irqchip_state-documentation.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0211-genirq-update-irq_set_irqchip_state-documentation.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -From dd9707b2db096f5af75ee3207ac1ced6a8acec2d Mon Sep 17 00:00:00 2001 -From: Josh Cartwright -Date: Thu, 11 Feb 2016 11:54:00 -0600 -Subject: [PATCH 211/290] genirq: update irq_set_irqchip_state documentation -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On -rt kernels, the use of migrate_disable()/migrate_enable() is -sufficient to guarantee a task isn't moved to another CPU. Update the -irq_set_irqchip_state() documentation to reflect this. - -Signed-off-by: Josh Cartwright -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/irq/manage.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 3858ac895777..5701774a6d71 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -2330,7 +2330,7 @@ EXPORT_SYMBOL_GPL(irq_get_irqchip_state); - * This call sets the internal irqchip state of an interrupt, - * depending on the value of @which. - * -- * This function should be called with preemption disabled if the -+ * This function should be called with migration disabled if the - * interrupt controller has per-cpu registers. - */ - int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0212-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch linux-4.19.118/debian/patches-rt/0212-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch --- linux-4.19.98/debian/patches-rt/0212-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0212-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -From b697d50d198d98ced440f6f1474cb505ff3f70a8 Mon Sep 17 00:00:00 2001 -From: Josh Cartwright -Date: Thu, 11 Feb 2016 11:54:01 -0600 -Subject: [PATCH 212/290] KVM: arm/arm64: downgrade preempt_disable()d region - to migrate_disable() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -kvm_arch_vcpu_ioctl_run() disables the use of preemption when updating -the vgic and timer states to prevent the calling task from migrating to -another CPU. It does so to prevent the task from writing to the -incorrect per-CPU GIC distributor registers. - -On -rt kernels, it's possible to maintain the same guarantee with the -use of migrate_{disable,enable}(), with the added benefit that the -migrate-disabled region is preemptible. Update -kvm_arch_vcpu_ioctl_run() to do so. - -Cc: Christoffer Dall -Reported-by: Manish Jaggi -Signed-off-by: Josh Cartwright -Signed-off-by: Sebastian Andrzej Siewior ---- - virt/kvm/arm/arm.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c -index d982650deb33..efe2d6c0201c 100644 ---- a/virt/kvm/arm/arm.c -+++ b/virt/kvm/arm/arm.c -@@ -723,7 +723,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) - * involves poking the GIC, which must be done in a - * non-preemptible context. - */ -- preempt_disable(); -+ migrate_disable(); - - kvm_pmu_flush_hwstate(vcpu); - -@@ -772,7 +772,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) - kvm_timer_sync_hwstate(vcpu); - kvm_vgic_sync_hwstate(vcpu); - local_irq_enable(); -- preempt_enable(); -+ migrate_enable(); - continue; - } - -@@ -850,7 +850,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) - /* Exit types that need handling before we can be preempted */ - handle_exit_early(vcpu, run, ret); - -- preempt_enable(); -+ migrate_enable(); - - ret = handle_exit(vcpu, run, ret); - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0212-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch linux-4.19.118/debian/patches-rt/0212-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch --- linux-4.19.98/debian/patches-rt/0212-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0212-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,171 @@ +From 393b855896741c2df780f95d03412417717d4db2 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 25 Jul 2018 14:02:38 +0200 +Subject: [PATCH 212/325] arm64: fpsimd: use preemp_disable in addition to + local_bh_disable() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In v4.16-RT I noticed a number of warnings from task_fpsimd_load(). The +code disables BH and expects that it is not preemptible. On -RT the +task remains preemptible but remains the same CPU. This may corrupt the +content of the SIMD registers if the task is preempted during +saving/restoring those registers. + +Add preempt_disable()/enable() to enfore the required semantic on -RT. + +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/arm64/kernel/fpsimd.c | 31 +++++++++++++++++++++++++++++-- + 1 file changed, 29 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c +index 14fdbaa6ee3a..7d572175682a 100644 +--- a/arch/arm64/kernel/fpsimd.c ++++ b/arch/arm64/kernel/fpsimd.c +@@ -159,6 +159,16 @@ static void sve_free(struct task_struct *task) + __sve_free(task); + } + ++static void *sve_free_atomic(struct task_struct *task) ++{ ++ void *sve_state = task->thread.sve_state; ++ ++ WARN_ON(test_tsk_thread_flag(task, TIF_SVE)); ++ ++ task->thread.sve_state = NULL; ++ return sve_state; ++} ++ + /* + * TIF_SVE controls whether a task can use SVE without trapping while + * in userspace, and also the way a task's FPSIMD/SVE state is stored +@@ -549,6 +559,7 @@ int sve_set_vector_length(struct task_struct *task, + * non-SVE thread. + */ + if (task == current) { ++ preempt_disable(); + local_bh_disable(); + + fpsimd_save(); +@@ -559,8 +570,10 @@ int sve_set_vector_length(struct task_struct *task, + if (test_and_clear_tsk_thread_flag(task, TIF_SVE)) + sve_to_fpsimd(task); + +- if (task == current) ++ if (task == current) { + local_bh_enable(); ++ preempt_enable(); ++ } + + /* + * Force reallocation of task SVE state to the correct size +@@ -815,6 +828,7 @@ asmlinkage void do_sve_acc(unsigned int esr, struct pt_regs *regs) + + sve_alloc(current); + ++ preempt_disable(); + local_bh_disable(); + + fpsimd_save(); +@@ -828,6 +842,7 @@ asmlinkage void do_sve_acc(unsigned int esr, struct pt_regs *regs) + WARN_ON(1); /* SVE access shouldn't have trapped */ + + local_bh_enable(); ++ preempt_enable(); + } + + /* +@@ -894,10 +909,12 @@ void fpsimd_thread_switch(struct task_struct *next) + void fpsimd_flush_thread(void) + { + int vl, supported_vl; ++ void *mem = NULL; + + if (!system_supports_fpsimd()) + return; + ++ preempt_disable(); + local_bh_disable(); + + memset(¤t->thread.uw.fpsimd_state, 0, +@@ -906,7 +923,7 @@ void fpsimd_flush_thread(void) + + if (system_supports_sve()) { + clear_thread_flag(TIF_SVE); +- sve_free(current); ++ mem = sve_free_atomic(current); + + /* + * Reset the task vector length as required. +@@ -942,6 +959,8 @@ void fpsimd_flush_thread(void) + set_thread_flag(TIF_FOREIGN_FPSTATE); + + local_bh_enable(); ++ preempt_enable(); ++ kfree(mem); + } + + /* +@@ -953,9 +972,11 @@ void fpsimd_preserve_current_state(void) + if (!system_supports_fpsimd()) + return; + ++ preempt_disable(); + local_bh_disable(); + fpsimd_save(); + local_bh_enable(); ++ preempt_enable(); + } + + /* +@@ -1026,6 +1047,7 @@ void fpsimd_restore_current_state(void) + return; + } + ++ preempt_disable(); + local_bh_disable(); + + if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE)) { +@@ -1034,6 +1056,7 @@ void fpsimd_restore_current_state(void) + } + + local_bh_enable(); ++ preempt_enable(); + } + + /* +@@ -1046,6 +1069,7 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state) + if (WARN_ON(!system_supports_fpsimd())) + return; + ++ preempt_disable(); + local_bh_disable(); + + current->thread.uw.fpsimd_state = *state; +@@ -1058,6 +1082,7 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state) + clear_thread_flag(TIF_FOREIGN_FPSTATE); + + local_bh_enable(); ++ preempt_enable(); + } + + /* +@@ -1104,6 +1129,7 @@ void kernel_neon_begin(void) + + BUG_ON(!may_use_simd()); + ++ preempt_disable(); + local_bh_disable(); + + __this_cpu_write(kernel_neon_busy, true); +@@ -1117,6 +1143,7 @@ void kernel_neon_begin(void) + preempt_disable(); + + local_bh_enable(); ++ preempt_enable(); + } + EXPORT_SYMBOL(kernel_neon_begin); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0213-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch linux-4.19.118/debian/patches-rt/0213-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch --- linux-4.19.98/debian/patches-rt/0213-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0213-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,171 +0,0 @@ -From 3fb1b55dbb6832214ae31cb9f5ed08b8360162e7 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 25 Jul 2018 14:02:38 +0200 -Subject: [PATCH 213/290] arm64: fpsimd: use preemp_disable in addition to - local_bh_disable() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In v4.16-RT I noticed a number of warnings from task_fpsimd_load(). The -code disables BH and expects that it is not preemptible. On -RT the -task remains preemptible but remains the same CPU. This may corrupt the -content of the SIMD registers if the task is preempted during -saving/restoring those registers. - -Add preempt_disable()/enable() to enfore the required semantic on -RT. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm64/kernel/fpsimd.c | 31 +++++++++++++++++++++++++++++-- - 1 file changed, 29 insertions(+), 2 deletions(-) - -diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c -index 58c53bc96928..71252cd8b594 100644 ---- a/arch/arm64/kernel/fpsimd.c -+++ b/arch/arm64/kernel/fpsimd.c -@@ -159,6 +159,16 @@ static void sve_free(struct task_struct *task) - __sve_free(task); - } - -+static void *sve_free_atomic(struct task_struct *task) -+{ -+ void *sve_state = task->thread.sve_state; -+ -+ WARN_ON(test_tsk_thread_flag(task, TIF_SVE)); -+ -+ task->thread.sve_state = NULL; -+ return sve_state; -+} -+ - /* - * TIF_SVE controls whether a task can use SVE without trapping while - * in userspace, and also the way a task's FPSIMD/SVE state is stored -@@ -547,6 +557,7 @@ int sve_set_vector_length(struct task_struct *task, - * non-SVE thread. - */ - if (task == current) { -+ preempt_disable(); - local_bh_disable(); - - fpsimd_save(); -@@ -557,8 +568,10 @@ int sve_set_vector_length(struct task_struct *task, - if (test_and_clear_tsk_thread_flag(task, TIF_SVE)) - sve_to_fpsimd(task); - -- if (task == current) -+ if (task == current) { - local_bh_enable(); -+ preempt_enable(); -+ } - - /* - * Force reallocation of task SVE state to the correct size -@@ -813,6 +826,7 @@ asmlinkage void do_sve_acc(unsigned int esr, struct pt_regs *regs) - - sve_alloc(current); - -+ preempt_disable(); - local_bh_disable(); - - fpsimd_save(); -@@ -826,6 +840,7 @@ asmlinkage void do_sve_acc(unsigned int esr, struct pt_regs *regs) - WARN_ON(1); /* SVE access shouldn't have trapped */ - - local_bh_enable(); -+ preempt_enable(); - } - - /* -@@ -892,10 +907,12 @@ void fpsimd_thread_switch(struct task_struct *next) - void fpsimd_flush_thread(void) - { - int vl, supported_vl; -+ void *mem = NULL; - - if (!system_supports_fpsimd()) - return; - -+ preempt_disable(); - local_bh_disable(); - - memset(¤t->thread.uw.fpsimd_state, 0, -@@ -904,7 +921,7 @@ void fpsimd_flush_thread(void) - - if (system_supports_sve()) { - clear_thread_flag(TIF_SVE); -- sve_free(current); -+ mem = sve_free_atomic(current); - - /* - * Reset the task vector length as required. -@@ -940,6 +957,8 @@ void fpsimd_flush_thread(void) - set_thread_flag(TIF_FOREIGN_FPSTATE); - - local_bh_enable(); -+ preempt_enable(); -+ kfree(mem); - } - - /* -@@ -951,9 +970,11 @@ void fpsimd_preserve_current_state(void) - if (!system_supports_fpsimd()) - return; - -+ preempt_disable(); - local_bh_disable(); - fpsimd_save(); - local_bh_enable(); -+ preempt_enable(); - } - - /* -@@ -1011,6 +1032,7 @@ void fpsimd_restore_current_state(void) - if (!system_supports_fpsimd()) - return; - -+ preempt_disable(); - local_bh_disable(); - - if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE)) { -@@ -1019,6 +1041,7 @@ void fpsimd_restore_current_state(void) - } - - local_bh_enable(); -+ preempt_enable(); - } - - /* -@@ -1031,6 +1054,7 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state) - if (!system_supports_fpsimd()) - return; - -+ preempt_disable(); - local_bh_disable(); - - current->thread.uw.fpsimd_state = *state; -@@ -1043,6 +1067,7 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state) - clear_thread_flag(TIF_FOREIGN_FPSTATE); - - local_bh_enable(); -+ preempt_enable(); - } - - /* -@@ -1088,6 +1113,7 @@ void kernel_neon_begin(void) - - BUG_ON(!may_use_simd()); - -+ preempt_disable(); - local_bh_disable(); - - __this_cpu_write(kernel_neon_busy, true); -@@ -1101,6 +1127,7 @@ void kernel_neon_begin(void) - preempt_disable(); - - local_bh_enable(); -+ preempt_enable(); - } - EXPORT_SYMBOL(kernel_neon_begin); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0213-kgdb-serial-Short-term-workaround.patch linux-4.19.118/debian/patches-rt/0213-kgdb-serial-Short-term-workaround.patch --- linux-4.19.98/debian/patches-rt/0213-kgdb-serial-Short-term-workaround.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0213-kgdb-serial-Short-term-workaround.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,86 @@ +From 170661f56dab5575f4fa40a094e2bd185afb3908 Mon Sep 17 00:00:00 2001 +From: Jason Wessel +Date: Thu, 28 Jul 2011 12:42:23 -0500 +Subject: [PATCH 213/325] kgdb/serial: Short term workaround +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On 07/27/2011 04:37 PM, Thomas Gleixner wrote: +> - KGDB (not yet disabled) is reportedly unusable on -rt right now due +> to missing hacks in the console locking which I dropped on purpose. +> + +To work around this in the short term you can use this patch, in +addition to the clocksource watchdog patch that Thomas brewed up. + +Comments are welcome of course. Ultimately the right solution is to +change separation between the console and the HW to have a polled mode ++ work queue so as not to introduce any kind of latency. + +Thanks, +Jason. +--- + drivers/tty/serial/8250/8250_port.c | 3 +++ + include/linux/kdb.h | 2 ++ + kernel/debug/kdb/kdb_io.c | 2 ++ + 3 files changed, 7 insertions(+) + +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index 79e509468161..84dbc5a9959c 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -3245,6 +3246,8 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, + + if (port->sysrq || oops_in_progress) + locked = 0; ++ else if (in_kdb_printk()) ++ locked = spin_trylock_irqsave(&port->lock, flags); + else + spin_lock_irqsave(&port->lock, flags); + +diff --git a/include/linux/kdb.h b/include/linux/kdb.h +index 68bd88223417..e033b25b0b72 100644 +--- a/include/linux/kdb.h ++++ b/include/linux/kdb.h +@@ -167,6 +167,7 @@ extern __printf(2, 0) int vkdb_printf(enum kdb_msgsrc src, const char *fmt, + extern __printf(1, 2) int kdb_printf(const char *, ...); + typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...); + ++#define in_kdb_printk() (kdb_trap_printk) + extern void kdb_init(int level); + + /* Access to kdb specific polling devices */ +@@ -201,6 +202,7 @@ extern int kdb_register_flags(char *, kdb_func_t, char *, char *, + extern int kdb_unregister(char *); + #else /* ! CONFIG_KGDB_KDB */ + static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; } ++#define in_kdb_printk() (0) + static inline void kdb_init(int level) {} + static inline int kdb_register(char *cmd, kdb_func_t func, char *usage, + char *help, short minlen) { return 0; } +diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c +index 6a4b41484afe..197cb422f6e1 100644 +--- a/kernel/debug/kdb/kdb_io.c ++++ b/kernel/debug/kdb/kdb_io.c +@@ -857,9 +857,11 @@ int kdb_printf(const char *fmt, ...) + va_list ap; + int r; + ++ kdb_trap_printk++; + va_start(ap, fmt); + r = vkdb_printf(KDB_MSGSRC_INTERNAL, fmt, ap); + va_end(ap); ++ kdb_trap_printk--; + + return r; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0214-kgdb-serial-Short-term-workaround.patch linux-4.19.118/debian/patches-rt/0214-kgdb-serial-Short-term-workaround.patch --- linux-4.19.98/debian/patches-rt/0214-kgdb-serial-Short-term-workaround.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0214-kgdb-serial-Short-term-workaround.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -From d1c62c912763a6d7d729f43e63605bb17d7814fe Mon Sep 17 00:00:00 2001 -From: Jason Wessel -Date: Thu, 28 Jul 2011 12:42:23 -0500 -Subject: [PATCH 214/290] kgdb/serial: Short term workaround -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On 07/27/2011 04:37 PM, Thomas Gleixner wrote: -> - KGDB (not yet disabled) is reportedly unusable on -rt right now due -> to missing hacks in the console locking which I dropped on purpose. -> - -To work around this in the short term you can use this patch, in -addition to the clocksource watchdog patch that Thomas brewed up. - -Comments are welcome of course. Ultimately the right solution is to -change separation between the console and the HW to have a polled mode -+ work queue so as not to introduce any kind of latency. - -Thanks, -Jason. ---- - drivers/tty/serial/8250/8250_port.c | 3 +++ - include/linux/kdb.h | 2 ++ - kernel/debug/kdb/kdb_io.c | 2 ++ - 3 files changed, 7 insertions(+) - -diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c -index 6b1d46c1df3b..cd49a76be52a 100644 ---- a/drivers/tty/serial/8250/8250_port.c -+++ b/drivers/tty/serial/8250/8250_port.c -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -3241,6 +3242,8 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, - - if (port->sysrq || oops_in_progress) - locked = 0; -+ else if (in_kdb_printk()) -+ locked = spin_trylock_irqsave(&port->lock, flags); - else - spin_lock_irqsave(&port->lock, flags); - -diff --git a/include/linux/kdb.h b/include/linux/kdb.h -index 68bd88223417..e033b25b0b72 100644 ---- a/include/linux/kdb.h -+++ b/include/linux/kdb.h -@@ -167,6 +167,7 @@ extern __printf(2, 0) int vkdb_printf(enum kdb_msgsrc src, const char *fmt, - extern __printf(1, 2) int kdb_printf(const char *, ...); - typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...); - -+#define in_kdb_printk() (kdb_trap_printk) - extern void kdb_init(int level); - - /* Access to kdb specific polling devices */ -@@ -201,6 +202,7 @@ extern int kdb_register_flags(char *, kdb_func_t, char *, char *, - extern int kdb_unregister(char *); - #else /* ! CONFIG_KGDB_KDB */ - static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; } -+#define in_kdb_printk() (0) - static inline void kdb_init(int level) {} - static inline int kdb_register(char *cmd, kdb_func_t func, char *usage, - char *help, short minlen) { return 0; } -diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c -index 6a4b41484afe..197cb422f6e1 100644 ---- a/kernel/debug/kdb/kdb_io.c -+++ b/kernel/debug/kdb/kdb_io.c -@@ -857,9 +857,11 @@ int kdb_printf(const char *fmt, ...) - va_list ap; - int r; - -+ kdb_trap_printk++; - va_start(ap, fmt); - r = vkdb_printf(KDB_MSGSRC_INTERNAL, fmt, ap); - va_end(ap); -+ kdb_trap_printk--; - - return r; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0214-sysfs-Add-sys-kernel-realtime-entry.patch linux-4.19.118/debian/patches-rt/0214-sysfs-Add-sys-kernel-realtime-entry.patch --- linux-4.19.98/debian/patches-rt/0214-sysfs-Add-sys-kernel-realtime-entry.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0214-sysfs-Add-sys-kernel-realtime-entry.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,54 @@ +From 8e96037a97736d38d4c47e4e2a01b0d16061467c Mon Sep 17 00:00:00 2001 +From: Clark Williams +Date: Sat, 30 Jul 2011 21:55:53 -0500 +Subject: [PATCH 214/325] sysfs: Add /sys/kernel/realtime entry +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Add a /sys/kernel entry to indicate that the kernel is a +realtime kernel. + +Clark says that he needs this for udev rules, udev needs to evaluate +if its a PREEMPT_RT kernel a few thousand times and parsing uname +output is too slow or so. + +Are there better solutions? Should it exist and return 0 on !-rt? + +Signed-off-by: Clark Williams +Signed-off-by: Peter Zijlstra +--- + kernel/ksysfs.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c +index 46ba853656f6..9a23632b6294 100644 +--- a/kernel/ksysfs.c ++++ b/kernel/ksysfs.c +@@ -140,6 +140,15 @@ KERNEL_ATTR_RO(vmcoreinfo); + + #endif /* CONFIG_CRASH_CORE */ + ++#if defined(CONFIG_PREEMPT_RT_FULL) ++static ssize_t realtime_show(struct kobject *kobj, ++ struct kobj_attribute *attr, char *buf) ++{ ++ return sprintf(buf, "%d\n", 1); ++} ++KERNEL_ATTR_RO(realtime); ++#endif ++ + /* whether file capabilities are enabled */ + static ssize_t fscaps_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +@@ -230,6 +239,9 @@ static struct attribute * kernel_attrs[] = { + #ifndef CONFIG_TINY_RCU + &rcu_expedited_attr.attr, + &rcu_normal_attr.attr, ++#endif ++#ifdef CONFIG_PREEMPT_RT_FULL ++ &realtime_attr.attr, + #endif + NULL + }; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0215-mm-rt-kmap_atomic-scheduling.patch linux-4.19.118/debian/patches-rt/0215-mm-rt-kmap_atomic-scheduling.patch --- linux-4.19.98/debian/patches-rt/0215-mm-rt-kmap_atomic-scheduling.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0215-mm-rt-kmap_atomic-scheduling.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,325 @@ +From 93adaef2afa4c9475254580129869286a8dbea03 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Thu, 28 Jul 2011 10:43:51 +0200 +Subject: [PATCH 215/325] mm, rt: kmap_atomic scheduling +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In fact, with migrate_disable() existing one could play games with +kmap_atomic. You could save/restore the kmap_atomic slots on context +switch (if there are any in use of course), this should be esp easy now +that we have a kmap_atomic stack. + +Something like the below.. it wants replacing all the preempt_disable() +stuff with pagefault_disable() && migrate_disable() of course, but then +you can flip kmaps around like below. + +Signed-off-by: Peter Zijlstra +[dvhart@linux.intel.com: build fix] +Link: http://lkml.kernel.org/r/1311842631.5890.208.camel@twins + +[tglx@linutronix.de: Get rid of the per cpu variable and store the idx + and the pte content right away in the task struct. + Shortens the context switch code. ] +--- + arch/x86/kernel/process_32.c | 32 ++++++++++++++++++++++++++++++++ + arch/x86/mm/highmem_32.c | 13 ++++++++++--- + arch/x86/mm/iomap_32.c | 9 ++++++++- + include/linux/highmem.h | 31 +++++++++++++++++++++++++------ + include/linux/sched.h | 7 +++++++ + include/linux/uaccess.h | 2 ++ + mm/highmem.c | 6 ++++-- + 7 files changed, 88 insertions(+), 12 deletions(-) + +diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c +index 020efe0f9614..5d0c975559ad 100644 +--- a/arch/x86/kernel/process_32.c ++++ b/arch/x86/kernel/process_32.c +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -205,6 +206,35 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) + } + EXPORT_SYMBOL_GPL(start_thread); + ++#ifdef CONFIG_PREEMPT_RT_FULL ++static void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) ++{ ++ int i; ++ ++ /* ++ * Clear @prev's kmap_atomic mappings ++ */ ++ for (i = 0; i < prev_p->kmap_idx; i++) { ++ int idx = i + KM_TYPE_NR * smp_processor_id(); ++ pte_t *ptep = kmap_pte - idx; ++ ++ kpte_clear_flush(ptep, __fix_to_virt(FIX_KMAP_BEGIN + idx)); ++ } ++ /* ++ * Restore @next_p's kmap_atomic mappings ++ */ ++ for (i = 0; i < next_p->kmap_idx; i++) { ++ int idx = i + KM_TYPE_NR * smp_processor_id(); ++ ++ if (!pte_none(next_p->kmap_pte[i])) ++ set_pte(kmap_pte - idx, next_p->kmap_pte[i]); ++ } ++} ++#else ++static inline void ++switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { } ++#endif ++ + + /* + * switch_to(x,y) should switch tasks from x to y. +@@ -274,6 +304,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + + switch_to_extra(prev_p, next_p); + ++ switch_kmaps(prev_p, next_p); ++ + /* + * Leave lazy mode, flushing any hypercalls made here. + * This must be done before restoring TLS segments so +diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c +index 6d18b70ed5a9..f752724c22e8 100644 +--- a/arch/x86/mm/highmem_32.c ++++ b/arch/x86/mm/highmem_32.c +@@ -32,10 +32,11 @@ EXPORT_SYMBOL(kunmap); + */ + void *kmap_atomic_prot(struct page *page, pgprot_t prot) + { ++ pte_t pte = mk_pte(page, prot); + unsigned long vaddr; + int idx, type; + +- preempt_disable(); ++ preempt_disable_nort(); + pagefault_disable(); + + if (!PageHighMem(page)) +@@ -45,7 +46,10 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot) + idx = type + KM_TYPE_NR*smp_processor_id(); + vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); + BUG_ON(!pte_none(*(kmap_pte-idx))); +- set_pte(kmap_pte-idx, mk_pte(page, prot)); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ current->kmap_pte[type] = pte; ++#endif ++ set_pte(kmap_pte-idx, pte); + arch_flush_lazy_mmu_mode(); + + return (void *)vaddr; +@@ -88,6 +92,9 @@ void __kunmap_atomic(void *kvaddr) + * is a bad idea also, in case the page changes cacheability + * attributes or becomes a protected page in a hypervisor. + */ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ current->kmap_pte[type] = __pte(0); ++#endif + kpte_clear_flush(kmap_pte-idx, vaddr); + kmap_atomic_idx_pop(); + arch_flush_lazy_mmu_mode(); +@@ -100,7 +107,7 @@ void __kunmap_atomic(void *kvaddr) + #endif + + pagefault_enable(); +- preempt_enable(); ++ preempt_enable_nort(); + } + EXPORT_SYMBOL(__kunmap_atomic); + +diff --git a/arch/x86/mm/iomap_32.c b/arch/x86/mm/iomap_32.c +index b3294d36769d..d5a48210d0f6 100644 +--- a/arch/x86/mm/iomap_32.c ++++ b/arch/x86/mm/iomap_32.c +@@ -59,6 +59,7 @@ EXPORT_SYMBOL_GPL(iomap_free); + + void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) + { ++ pte_t pte = pfn_pte(pfn, prot); + unsigned long vaddr; + int idx, type; + +@@ -68,7 +69,10 @@ void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) + type = kmap_atomic_idx_push(); + idx = type + KM_TYPE_NR * smp_processor_id(); + vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- set_pte(kmap_pte - idx, pfn_pte(pfn, prot)); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ current->kmap_pte[type] = pte; ++#endif ++ set_pte(kmap_pte - idx, pte); + arch_flush_lazy_mmu_mode(); + + return (void *)vaddr; +@@ -119,6 +123,9 @@ iounmap_atomic(void __iomem *kvaddr) + * is a bad idea also, in case the page changes cacheability + * attributes or becomes a protected page in a hypervisor. + */ ++#ifdef CONFIG_PREEMPT_RT_FULL ++ current->kmap_pte[type] = __pte(0); ++#endif + kpte_clear_flush(kmap_pte-idx, vaddr); + kmap_atomic_idx_pop(); + } +diff --git a/include/linux/highmem.h b/include/linux/highmem.h +index 0690679832d4..1ac89e4718bf 100644 +--- a/include/linux/highmem.h ++++ b/include/linux/highmem.h +@@ -66,7 +66,7 @@ static inline void kunmap(struct page *page) + + static inline void *kmap_atomic(struct page *page) + { +- preempt_disable(); ++ preempt_disable_nort(); + pagefault_disable(); + return page_address(page); + } +@@ -75,7 +75,7 @@ static inline void *kmap_atomic(struct page *page) + static inline void __kunmap_atomic(void *addr) + { + pagefault_enable(); +- preempt_enable(); ++ preempt_enable_nort(); + } + + #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) +@@ -87,32 +87,51 @@ static inline void __kunmap_atomic(void *addr) + + #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) + ++#ifndef CONFIG_PREEMPT_RT_FULL + DECLARE_PER_CPU(int, __kmap_atomic_idx); ++#endif + + static inline int kmap_atomic_idx_push(void) + { ++#ifndef CONFIG_PREEMPT_RT_FULL + int idx = __this_cpu_inc_return(__kmap_atomic_idx) - 1; + +-#ifdef CONFIG_DEBUG_HIGHMEM ++# ifdef CONFIG_DEBUG_HIGHMEM + WARN_ON_ONCE(in_irq() && !irqs_disabled()); + BUG_ON(idx >= KM_TYPE_NR); +-#endif ++# endif + return idx; ++#else ++ current->kmap_idx++; ++ BUG_ON(current->kmap_idx > KM_TYPE_NR); ++ return current->kmap_idx - 1; ++#endif + } + + static inline int kmap_atomic_idx(void) + { ++#ifndef CONFIG_PREEMPT_RT_FULL + return __this_cpu_read(__kmap_atomic_idx) - 1; ++#else ++ return current->kmap_idx - 1; ++#endif + } + + static inline void kmap_atomic_idx_pop(void) + { +-#ifdef CONFIG_DEBUG_HIGHMEM ++#ifndef CONFIG_PREEMPT_RT_FULL ++# ifdef CONFIG_DEBUG_HIGHMEM + int idx = __this_cpu_dec_return(__kmap_atomic_idx); + + BUG_ON(idx < 0); +-#else ++# else + __this_cpu_dec(__kmap_atomic_idx); ++# endif ++#else ++ current->kmap_idx--; ++# ifdef CONFIG_DEBUG_HIGHMEM ++ BUG_ON(current->kmap_idx < 0); ++# endif + #endif + } + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 756fed8f5994..dc668524ccff 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -28,6 +28,7 @@ + #include + #include + #include ++#include + + /* task_struct member predeclarations (sorted alphabetically): */ + struct audit_context; +@@ -1214,6 +1215,12 @@ struct task_struct { + int softirq_nestcnt; + unsigned int softirqs_raised; + #endif ++#ifdef CONFIG_PREEMPT_RT_FULL ++# if defined CONFIG_HIGHMEM || defined CONFIG_X86_32 ++ int kmap_idx; ++ pte_t kmap_pte[KM_TYPE_NR]; ++# endif ++#endif + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + unsigned long task_state_change; + #endif +diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h +index efe79c1cdd47..128a8489047d 100644 +--- a/include/linux/uaccess.h ++++ b/include/linux/uaccess.h +@@ -185,6 +185,7 @@ static __always_inline void pagefault_disabled_dec(void) + */ + static inline void pagefault_disable(void) + { ++ migrate_disable(); + pagefault_disabled_inc(); + /* + * make sure to have issued the store before a pagefault +@@ -201,6 +202,7 @@ static inline void pagefault_enable(void) + */ + barrier(); + pagefault_disabled_dec(); ++ migrate_enable(); + } + + /* +diff --git a/mm/highmem.c b/mm/highmem.c +index 59db3223a5d6..22aa3ddbd87b 100644 +--- a/mm/highmem.c ++++ b/mm/highmem.c +@@ -30,10 +30,11 @@ + #include + #include + +- ++#ifndef CONFIG_PREEMPT_RT_FULL + #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) + DEFINE_PER_CPU(int, __kmap_atomic_idx); + #endif ++#endif + + /* + * Virtual_count is not a pure "count". +@@ -108,8 +109,9 @@ static inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color) + unsigned long totalhigh_pages __read_mostly; + EXPORT_SYMBOL(totalhigh_pages); + +- ++#ifndef CONFIG_PREEMPT_RT_FULL + EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx); ++#endif + + unsigned int nr_free_highpages (void) + { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0215-sysfs-Add-sys-kernel-realtime-entry.patch linux-4.19.118/debian/patches-rt/0215-sysfs-Add-sys-kernel-realtime-entry.patch --- linux-4.19.98/debian/patches-rt/0215-sysfs-Add-sys-kernel-realtime-entry.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0215-sysfs-Add-sys-kernel-realtime-entry.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -From 1c3cb84e399e50f312537ee0399deefc5557d1ea Mon Sep 17 00:00:00 2001 -From: Clark Williams -Date: Sat, 30 Jul 2011 21:55:53 -0500 -Subject: [PATCH 215/290] sysfs: Add /sys/kernel/realtime entry -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Add a /sys/kernel entry to indicate that the kernel is a -realtime kernel. - -Clark says that he needs this for udev rules, udev needs to evaluate -if its a PREEMPT_RT kernel a few thousand times and parsing uname -output is too slow or so. - -Are there better solutions? Should it exist and return 0 on !-rt? - -Signed-off-by: Clark Williams -Signed-off-by: Peter Zijlstra ---- - kernel/ksysfs.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c -index 46ba853656f6..9a23632b6294 100644 ---- a/kernel/ksysfs.c -+++ b/kernel/ksysfs.c -@@ -140,6 +140,15 @@ KERNEL_ATTR_RO(vmcoreinfo); - - #endif /* CONFIG_CRASH_CORE */ - -+#if defined(CONFIG_PREEMPT_RT_FULL) -+static ssize_t realtime_show(struct kobject *kobj, -+ struct kobj_attribute *attr, char *buf) -+{ -+ return sprintf(buf, "%d\n", 1); -+} -+KERNEL_ATTR_RO(realtime); -+#endif -+ - /* whether file capabilities are enabled */ - static ssize_t fscaps_show(struct kobject *kobj, - struct kobj_attribute *attr, char *buf) -@@ -230,6 +239,9 @@ static struct attribute * kernel_attrs[] = { - #ifndef CONFIG_TINY_RCU - &rcu_expedited_attr.attr, - &rcu_normal_attr.attr, -+#endif -+#ifdef CONFIG_PREEMPT_RT_FULL -+ &realtime_attr.attr, - #endif - NULL - }; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0216-mm-rt-kmap_atomic-scheduling.patch linux-4.19.118/debian/patches-rt/0216-mm-rt-kmap_atomic-scheduling.patch --- linux-4.19.98/debian/patches-rt/0216-mm-rt-kmap_atomic-scheduling.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0216-mm-rt-kmap_atomic-scheduling.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,325 +0,0 @@ -From aff5114bccbb42db5c0f8ada358804caefb8dd8d Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Thu, 28 Jul 2011 10:43:51 +0200 -Subject: [PATCH 216/290] mm, rt: kmap_atomic scheduling -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In fact, with migrate_disable() existing one could play games with -kmap_atomic. You could save/restore the kmap_atomic slots on context -switch (if there are any in use of course), this should be esp easy now -that we have a kmap_atomic stack. - -Something like the below.. it wants replacing all the preempt_disable() -stuff with pagefault_disable() && migrate_disable() of course, but then -you can flip kmaps around like below. - -Signed-off-by: Peter Zijlstra -[dvhart@linux.intel.com: build fix] -Link: http://lkml.kernel.org/r/1311842631.5890.208.camel@twins - -[tglx@linutronix.de: Get rid of the per cpu variable and store the idx - and the pte content right away in the task struct. - Shortens the context switch code. ] ---- - arch/x86/kernel/process_32.c | 32 ++++++++++++++++++++++++++++++++ - arch/x86/mm/highmem_32.c | 13 ++++++++++--- - arch/x86/mm/iomap_32.c | 9 ++++++++- - include/linux/highmem.h | 31 +++++++++++++++++++++++++------ - include/linux/sched.h | 7 +++++++ - include/linux/uaccess.h | 2 ++ - mm/highmem.c | 6 ++++-- - 7 files changed, 88 insertions(+), 12 deletions(-) - -diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c -index 020efe0f9614..5d0c975559ad 100644 ---- a/arch/x86/kernel/process_32.c -+++ b/arch/x86/kernel/process_32.c -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -205,6 +206,35 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) - } - EXPORT_SYMBOL_GPL(start_thread); - -+#ifdef CONFIG_PREEMPT_RT_FULL -+static void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) -+{ -+ int i; -+ -+ /* -+ * Clear @prev's kmap_atomic mappings -+ */ -+ for (i = 0; i < prev_p->kmap_idx; i++) { -+ int idx = i + KM_TYPE_NR * smp_processor_id(); -+ pte_t *ptep = kmap_pte - idx; -+ -+ kpte_clear_flush(ptep, __fix_to_virt(FIX_KMAP_BEGIN + idx)); -+ } -+ /* -+ * Restore @next_p's kmap_atomic mappings -+ */ -+ for (i = 0; i < next_p->kmap_idx; i++) { -+ int idx = i + KM_TYPE_NR * smp_processor_id(); -+ -+ if (!pte_none(next_p->kmap_pte[i])) -+ set_pte(kmap_pte - idx, next_p->kmap_pte[i]); -+ } -+} -+#else -+static inline void -+switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { } -+#endif -+ - - /* - * switch_to(x,y) should switch tasks from x to y. -@@ -274,6 +304,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) - - switch_to_extra(prev_p, next_p); - -+ switch_kmaps(prev_p, next_p); -+ - /* - * Leave lazy mode, flushing any hypercalls made here. - * This must be done before restoring TLS segments so -diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c -index 6d18b70ed5a9..f752724c22e8 100644 ---- a/arch/x86/mm/highmem_32.c -+++ b/arch/x86/mm/highmem_32.c -@@ -32,10 +32,11 @@ EXPORT_SYMBOL(kunmap); - */ - void *kmap_atomic_prot(struct page *page, pgprot_t prot) - { -+ pte_t pte = mk_pte(page, prot); - unsigned long vaddr; - int idx, type; - -- preempt_disable(); -+ preempt_disable_nort(); - pagefault_disable(); - - if (!PageHighMem(page)) -@@ -45,7 +46,10 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot) - idx = type + KM_TYPE_NR*smp_processor_id(); - vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); - BUG_ON(!pte_none(*(kmap_pte-idx))); -- set_pte(kmap_pte-idx, mk_pte(page, prot)); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ current->kmap_pte[type] = pte; -+#endif -+ set_pte(kmap_pte-idx, pte); - arch_flush_lazy_mmu_mode(); - - return (void *)vaddr; -@@ -88,6 +92,9 @@ void __kunmap_atomic(void *kvaddr) - * is a bad idea also, in case the page changes cacheability - * attributes or becomes a protected page in a hypervisor. - */ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ current->kmap_pte[type] = __pte(0); -+#endif - kpte_clear_flush(kmap_pte-idx, vaddr); - kmap_atomic_idx_pop(); - arch_flush_lazy_mmu_mode(); -@@ -100,7 +107,7 @@ void __kunmap_atomic(void *kvaddr) - #endif - - pagefault_enable(); -- preempt_enable(); -+ preempt_enable_nort(); - } - EXPORT_SYMBOL(__kunmap_atomic); - -diff --git a/arch/x86/mm/iomap_32.c b/arch/x86/mm/iomap_32.c -index b3294d36769d..d5a48210d0f6 100644 ---- a/arch/x86/mm/iomap_32.c -+++ b/arch/x86/mm/iomap_32.c -@@ -59,6 +59,7 @@ EXPORT_SYMBOL_GPL(iomap_free); - - void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) - { -+ pte_t pte = pfn_pte(pfn, prot); - unsigned long vaddr; - int idx, type; - -@@ -68,7 +69,10 @@ void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) - type = kmap_atomic_idx_push(); - idx = type + KM_TYPE_NR * smp_processor_id(); - vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); -- set_pte(kmap_pte - idx, pfn_pte(pfn, prot)); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ current->kmap_pte[type] = pte; -+#endif -+ set_pte(kmap_pte - idx, pte); - arch_flush_lazy_mmu_mode(); - - return (void *)vaddr; -@@ -119,6 +123,9 @@ iounmap_atomic(void __iomem *kvaddr) - * is a bad idea also, in case the page changes cacheability - * attributes or becomes a protected page in a hypervisor. - */ -+#ifdef CONFIG_PREEMPT_RT_FULL -+ current->kmap_pte[type] = __pte(0); -+#endif - kpte_clear_flush(kmap_pte-idx, vaddr); - kmap_atomic_idx_pop(); - } -diff --git a/include/linux/highmem.h b/include/linux/highmem.h -index 0690679832d4..1ac89e4718bf 100644 ---- a/include/linux/highmem.h -+++ b/include/linux/highmem.h -@@ -66,7 +66,7 @@ static inline void kunmap(struct page *page) - - static inline void *kmap_atomic(struct page *page) - { -- preempt_disable(); -+ preempt_disable_nort(); - pagefault_disable(); - return page_address(page); - } -@@ -75,7 +75,7 @@ static inline void *kmap_atomic(struct page *page) - static inline void __kunmap_atomic(void *addr) - { - pagefault_enable(); -- preempt_enable(); -+ preempt_enable_nort(); - } - - #define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) -@@ -87,32 +87,51 @@ static inline void __kunmap_atomic(void *addr) - - #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) - -+#ifndef CONFIG_PREEMPT_RT_FULL - DECLARE_PER_CPU(int, __kmap_atomic_idx); -+#endif - - static inline int kmap_atomic_idx_push(void) - { -+#ifndef CONFIG_PREEMPT_RT_FULL - int idx = __this_cpu_inc_return(__kmap_atomic_idx) - 1; - --#ifdef CONFIG_DEBUG_HIGHMEM -+# ifdef CONFIG_DEBUG_HIGHMEM - WARN_ON_ONCE(in_irq() && !irqs_disabled()); - BUG_ON(idx >= KM_TYPE_NR); --#endif -+# endif - return idx; -+#else -+ current->kmap_idx++; -+ BUG_ON(current->kmap_idx > KM_TYPE_NR); -+ return current->kmap_idx - 1; -+#endif - } - - static inline int kmap_atomic_idx(void) - { -+#ifndef CONFIG_PREEMPT_RT_FULL - return __this_cpu_read(__kmap_atomic_idx) - 1; -+#else -+ return current->kmap_idx - 1; -+#endif - } - - static inline void kmap_atomic_idx_pop(void) - { --#ifdef CONFIG_DEBUG_HIGHMEM -+#ifndef CONFIG_PREEMPT_RT_FULL -+# ifdef CONFIG_DEBUG_HIGHMEM - int idx = __this_cpu_dec_return(__kmap_atomic_idx); - - BUG_ON(idx < 0); --#else -+# else - __this_cpu_dec(__kmap_atomic_idx); -+# endif -+#else -+ current->kmap_idx--; -+# ifdef CONFIG_DEBUG_HIGHMEM -+ BUG_ON(current->kmap_idx < 0); -+# endif - #endif - } - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 5e1cc92c2f5c..834f46cb258b 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - - /* task_struct member predeclarations (sorted alphabetically): */ - struct audit_context; -@@ -1214,6 +1215,12 @@ struct task_struct { - int softirq_nestcnt; - unsigned int softirqs_raised; - #endif -+#ifdef CONFIG_PREEMPT_RT_FULL -+# if defined CONFIG_HIGHMEM || defined CONFIG_X86_32 -+ int kmap_idx; -+ pte_t kmap_pte[KM_TYPE_NR]; -+# endif -+#endif - #ifdef CONFIG_DEBUG_ATOMIC_SLEEP - unsigned long task_state_change; - #endif -diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h -index efe79c1cdd47..128a8489047d 100644 ---- a/include/linux/uaccess.h -+++ b/include/linux/uaccess.h -@@ -185,6 +185,7 @@ static __always_inline void pagefault_disabled_dec(void) - */ - static inline void pagefault_disable(void) - { -+ migrate_disable(); - pagefault_disabled_inc(); - /* - * make sure to have issued the store before a pagefault -@@ -201,6 +202,7 @@ static inline void pagefault_enable(void) - */ - barrier(); - pagefault_disabled_dec(); -+ migrate_enable(); - } - - /* -diff --git a/mm/highmem.c b/mm/highmem.c -index 59db3223a5d6..22aa3ddbd87b 100644 ---- a/mm/highmem.c -+++ b/mm/highmem.c -@@ -30,10 +30,11 @@ - #include - #include - -- -+#ifndef CONFIG_PREEMPT_RT_FULL - #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) - DEFINE_PER_CPU(int, __kmap_atomic_idx); - #endif -+#endif - - /* - * Virtual_count is not a pure "count". -@@ -108,8 +109,9 @@ static inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color) - unsigned long totalhigh_pages __read_mostly; - EXPORT_SYMBOL(totalhigh_pages); - -- -+#ifndef CONFIG_PREEMPT_RT_FULL - EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx); -+#endif - - unsigned int nr_free_highpages (void) - { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0216-x86-highmem-Add-a-already-used-pte-check.patch linux-4.19.118/debian/patches-rt/0216-x86-highmem-Add-a-already-used-pte-check.patch --- linux-4.19.98/debian/patches-rt/0216-x86-highmem-Add-a-already-used-pte-check.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0216-x86-highmem-Add-a-already-used-pte-check.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,29 @@ +From e31b99ed8028c6712b1664b2dc50011d9371b0d4 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 11 Mar 2013 17:09:55 +0100 +Subject: [PATCH 216/325] x86/highmem: Add a "already used pte" check +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +This is a copy from kmap_atomic_prot(). + +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/x86/mm/iomap_32.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/x86/mm/iomap_32.c b/arch/x86/mm/iomap_32.c +index d5a48210d0f6..c0ec8d430c02 100644 +--- a/arch/x86/mm/iomap_32.c ++++ b/arch/x86/mm/iomap_32.c +@@ -69,6 +69,8 @@ void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) + type = kmap_atomic_idx_push(); + idx = type + KM_TYPE_NR * smp_processor_id(); + vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); ++ WARN_ON(!pte_none(*(kmap_pte - idx))); ++ + #ifdef CONFIG_PREEMPT_RT_FULL + current->kmap_pte[type] = pte; + #endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0217-arm-highmem-Flush-tlb-on-unmap.patch linux-4.19.118/debian/patches-rt/0217-arm-highmem-Flush-tlb-on-unmap.patch --- linux-4.19.98/debian/patches-rt/0217-arm-highmem-Flush-tlb-on-unmap.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0217-arm-highmem-Flush-tlb-on-unmap.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,34 @@ +From e2e2e6bfc0c52d0b6f159920b94e93df8843807d Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 11 Mar 2013 21:37:27 +0100 +Subject: [PATCH 217/325] arm/highmem: Flush tlb on unmap +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The tlb should be flushed on unmap and thus make the mapping entry +invalid. This is only done in the non-debug case which does not look +right. + +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/arm/mm/highmem.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c +index d02f8187b1cc..eb4b225d28c9 100644 +--- a/arch/arm/mm/highmem.c ++++ b/arch/arm/mm/highmem.c +@@ -112,10 +112,10 @@ void __kunmap_atomic(void *kvaddr) + __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); + #ifdef CONFIG_DEBUG_HIGHMEM + BUG_ON(vaddr != __fix_to_virt(idx)); +- set_fixmap_pte(idx, __pte(0)); + #else + (void) idx; /* to kill a warning */ + #endif ++ set_fixmap_pte(idx, __pte(0)); + kmap_atomic_idx_pop(); + } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { + /* this address was obtained through kmap_high_get() */ +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0217-x86-highmem-Add-a-already-used-pte-check.patch linux-4.19.118/debian/patches-rt/0217-x86-highmem-Add-a-already-used-pte-check.patch --- linux-4.19.98/debian/patches-rt/0217-x86-highmem-Add-a-already-used-pte-check.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0217-x86-highmem-Add-a-already-used-pte-check.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -From 57772c842e1a3a0de1d2490c20afe90c72d8abfb Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 11 Mar 2013 17:09:55 +0100 -Subject: [PATCH 217/290] x86/highmem: Add a "already used pte" check -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -This is a copy from kmap_atomic_prot(). - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/mm/iomap_32.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/arch/x86/mm/iomap_32.c b/arch/x86/mm/iomap_32.c -index d5a48210d0f6..c0ec8d430c02 100644 ---- a/arch/x86/mm/iomap_32.c -+++ b/arch/x86/mm/iomap_32.c -@@ -69,6 +69,8 @@ void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) - type = kmap_atomic_idx_push(); - idx = type + KM_TYPE_NR * smp_processor_id(); - vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); -+ WARN_ON(!pte_none(*(kmap_pte - idx))); -+ - #ifdef CONFIG_PREEMPT_RT_FULL - current->kmap_pte[type] = pte; - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0218-arm-Enable-highmem-for-rt.patch linux-4.19.118/debian/patches-rt/0218-arm-Enable-highmem-for-rt.patch --- linux-4.19.98/debian/patches-rt/0218-arm-Enable-highmem-for-rt.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0218-arm-Enable-highmem-for-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,184 @@ +From 7e6c3574daf6585185e8d527a17e98c12b70af8f Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 13 Feb 2013 11:03:11 +0100 +Subject: [PATCH 218/325] arm: Enable highmem for rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +fixup highmem for ARM. + +Signed-off-by: Thomas Gleixner +--- + arch/arm/include/asm/switch_to.h | 8 +++++ + arch/arm/mm/highmem.c | 56 +++++++++++++++++++++++++++----- + include/linux/highmem.h | 1 + + 3 files changed, 57 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/include/asm/switch_to.h b/arch/arm/include/asm/switch_to.h +index d3e937dcee4d..6ab96a2ce1f8 100644 +--- a/arch/arm/include/asm/switch_to.h ++++ b/arch/arm/include/asm/switch_to.h +@@ -4,6 +4,13 @@ + + #include + ++#if defined CONFIG_PREEMPT_RT_FULL && defined CONFIG_HIGHMEM ++void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p); ++#else ++static inline void ++switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { } ++#endif ++ + /* + * For v7 SMP cores running a preemptible kernel we may be pre-empted + * during a TLB maintenance operation, so execute an inner-shareable dsb +@@ -26,6 +33,7 @@ extern struct task_struct *__switch_to(struct task_struct *, struct thread_info + #define switch_to(prev,next,last) \ + do { \ + __complete_pending_tlbi(); \ ++ switch_kmaps(prev, next); \ + last = __switch_to(prev,task_thread_info(prev), task_thread_info(next)); \ + } while (0) + +diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c +index eb4b225d28c9..542692dbd40a 100644 +--- a/arch/arm/mm/highmem.c ++++ b/arch/arm/mm/highmem.c +@@ -34,6 +34,11 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr) + return *ptep; + } + ++static unsigned int fixmap_idx(int type) ++{ ++ return FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++} ++ + void *kmap(struct page *page) + { + might_sleep(); +@@ -54,12 +59,13 @@ EXPORT_SYMBOL(kunmap); + + void *kmap_atomic(struct page *page) + { ++ pte_t pte = mk_pte(page, kmap_prot); + unsigned int idx; + unsigned long vaddr; + void *kmap; + int type; + +- preempt_disable(); ++ preempt_disable_nort(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); +@@ -79,7 +85,7 @@ void *kmap_atomic(struct page *page) + + type = kmap_atomic_idx_push(); + +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++ idx = fixmap_idx(type); + vaddr = __fix_to_virt(idx); + #ifdef CONFIG_DEBUG_HIGHMEM + /* +@@ -93,7 +99,10 @@ void *kmap_atomic(struct page *page) + * in place, so the contained TLB flush ensures the TLB is updated + * with the new mapping. + */ +- set_fixmap_pte(idx, mk_pte(page, kmap_prot)); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ current->kmap_pte[type] = pte; ++#endif ++ set_fixmap_pte(idx, pte); + + return (void *)vaddr; + } +@@ -106,10 +115,13 @@ void __kunmap_atomic(void *kvaddr) + + if (kvaddr >= (void *)FIXADDR_START) { + type = kmap_atomic_idx(); +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++ idx = fixmap_idx(type); + + if (cache_is_vivt()) + __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ current->kmap_pte[type] = __pte(0); ++#endif + #ifdef CONFIG_DEBUG_HIGHMEM + BUG_ON(vaddr != __fix_to_virt(idx)); + #else +@@ -122,28 +134,56 @@ void __kunmap_atomic(void *kvaddr) + kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); + } + pagefault_enable(); +- preempt_enable(); ++ preempt_enable_nort(); + } + EXPORT_SYMBOL(__kunmap_atomic); + + void *kmap_atomic_pfn(unsigned long pfn) + { ++ pte_t pte = pfn_pte(pfn, kmap_prot); + unsigned long vaddr; + int idx, type; + struct page *page = pfn_to_page(pfn); + +- preempt_disable(); ++ preempt_disable_nort(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); + + type = kmap_atomic_idx_push(); +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++ idx = fixmap_idx(type); + vaddr = __fix_to_virt(idx); + #ifdef CONFIG_DEBUG_HIGHMEM + BUG_ON(!pte_none(get_fixmap_pte(vaddr))); + #endif +- set_fixmap_pte(idx, pfn_pte(pfn, kmap_prot)); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ current->kmap_pte[type] = pte; ++#endif ++ set_fixmap_pte(idx, pte); + + return (void *)vaddr; + } ++#if defined CONFIG_PREEMPT_RT_FULL ++void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) ++{ ++ int i; ++ ++ /* ++ * Clear @prev's kmap_atomic mappings ++ */ ++ for (i = 0; i < prev_p->kmap_idx; i++) { ++ int idx = fixmap_idx(i); ++ ++ set_fixmap_pte(idx, __pte(0)); ++ } ++ /* ++ * Restore @next_p's kmap_atomic mappings ++ */ ++ for (i = 0; i < next_p->kmap_idx; i++) { ++ int idx = fixmap_idx(i); ++ ++ if (!pte_none(next_p->kmap_pte[i])) ++ set_fixmap_pte(idx, next_p->kmap_pte[i]); ++ } ++} ++#endif +diff --git a/include/linux/highmem.h b/include/linux/highmem.h +index 1ac89e4718bf..eaa2ef9bc10e 100644 +--- a/include/linux/highmem.h ++++ b/include/linux/highmem.h +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + + #include + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0218-arm-highmem-Flush-tlb-on-unmap.patch linux-4.19.118/debian/patches-rt/0218-arm-highmem-Flush-tlb-on-unmap.patch --- linux-4.19.98/debian/patches-rt/0218-arm-highmem-Flush-tlb-on-unmap.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0218-arm-highmem-Flush-tlb-on-unmap.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -From fded314d1af3bcdfc535e14068010d160ffc940f Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 11 Mar 2013 21:37:27 +0100 -Subject: [PATCH 218/290] arm/highmem: Flush tlb on unmap -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The tlb should be flushed on unmap and thus make the mapping entry -invalid. This is only done in the non-debug case which does not look -right. - -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/arm/mm/highmem.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c -index d02f8187b1cc..eb4b225d28c9 100644 ---- a/arch/arm/mm/highmem.c -+++ b/arch/arm/mm/highmem.c -@@ -112,10 +112,10 @@ void __kunmap_atomic(void *kvaddr) - __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); - #ifdef CONFIG_DEBUG_HIGHMEM - BUG_ON(vaddr != __fix_to_virt(idx)); -- set_fixmap_pte(idx, __pte(0)); - #else - (void) idx; /* to kill a warning */ - #endif -+ set_fixmap_pte(idx, __pte(0)); - kmap_atomic_idx_pop(); - } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { - /* this address was obtained through kmap_high_get() */ --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0219-arm-Enable-highmem-for-rt.patch linux-4.19.118/debian/patches-rt/0219-arm-Enable-highmem-for-rt.patch --- linux-4.19.98/debian/patches-rt/0219-arm-Enable-highmem-for-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0219-arm-Enable-highmem-for-rt.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,184 +0,0 @@ -From 5fc0ce79ee0183b4033b86d6824ee0463b6cfa3f Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 13 Feb 2013 11:03:11 +0100 -Subject: [PATCH 219/290] arm: Enable highmem for rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -fixup highmem for ARM. - -Signed-off-by: Thomas Gleixner ---- - arch/arm/include/asm/switch_to.h | 8 +++++ - arch/arm/mm/highmem.c | 56 +++++++++++++++++++++++++++----- - include/linux/highmem.h | 1 + - 3 files changed, 57 insertions(+), 8 deletions(-) - -diff --git a/arch/arm/include/asm/switch_to.h b/arch/arm/include/asm/switch_to.h -index d3e937dcee4d..6ab96a2ce1f8 100644 ---- a/arch/arm/include/asm/switch_to.h -+++ b/arch/arm/include/asm/switch_to.h -@@ -4,6 +4,13 @@ - - #include - -+#if defined CONFIG_PREEMPT_RT_FULL && defined CONFIG_HIGHMEM -+void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p); -+#else -+static inline void -+switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { } -+#endif -+ - /* - * For v7 SMP cores running a preemptible kernel we may be pre-empted - * during a TLB maintenance operation, so execute an inner-shareable dsb -@@ -26,6 +33,7 @@ extern struct task_struct *__switch_to(struct task_struct *, struct thread_info - #define switch_to(prev,next,last) \ - do { \ - __complete_pending_tlbi(); \ -+ switch_kmaps(prev, next); \ - last = __switch_to(prev,task_thread_info(prev), task_thread_info(next)); \ - } while (0) - -diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c -index eb4b225d28c9..542692dbd40a 100644 ---- a/arch/arm/mm/highmem.c -+++ b/arch/arm/mm/highmem.c -@@ -34,6 +34,11 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr) - return *ptep; - } - -+static unsigned int fixmap_idx(int type) -+{ -+ return FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); -+} -+ - void *kmap(struct page *page) - { - might_sleep(); -@@ -54,12 +59,13 @@ EXPORT_SYMBOL(kunmap); - - void *kmap_atomic(struct page *page) - { -+ pte_t pte = mk_pte(page, kmap_prot); - unsigned int idx; - unsigned long vaddr; - void *kmap; - int type; - -- preempt_disable(); -+ preempt_disable_nort(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); -@@ -79,7 +85,7 @@ void *kmap_atomic(struct page *page) - - type = kmap_atomic_idx_push(); - -- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); -+ idx = fixmap_idx(type); - vaddr = __fix_to_virt(idx); - #ifdef CONFIG_DEBUG_HIGHMEM - /* -@@ -93,7 +99,10 @@ void *kmap_atomic(struct page *page) - * in place, so the contained TLB flush ensures the TLB is updated - * with the new mapping. - */ -- set_fixmap_pte(idx, mk_pte(page, kmap_prot)); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ current->kmap_pte[type] = pte; -+#endif -+ set_fixmap_pte(idx, pte); - - return (void *)vaddr; - } -@@ -106,10 +115,13 @@ void __kunmap_atomic(void *kvaddr) - - if (kvaddr >= (void *)FIXADDR_START) { - type = kmap_atomic_idx(); -- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); -+ idx = fixmap_idx(type); - - if (cache_is_vivt()) - __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ current->kmap_pte[type] = __pte(0); -+#endif - #ifdef CONFIG_DEBUG_HIGHMEM - BUG_ON(vaddr != __fix_to_virt(idx)); - #else -@@ -122,28 +134,56 @@ void __kunmap_atomic(void *kvaddr) - kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); - } - pagefault_enable(); -- preempt_enable(); -+ preempt_enable_nort(); - } - EXPORT_SYMBOL(__kunmap_atomic); - - void *kmap_atomic_pfn(unsigned long pfn) - { -+ pte_t pte = pfn_pte(pfn, kmap_prot); - unsigned long vaddr; - int idx, type; - struct page *page = pfn_to_page(pfn); - -- preempt_disable(); -+ preempt_disable_nort(); - pagefault_disable(); - if (!PageHighMem(page)) - return page_address(page); - - type = kmap_atomic_idx_push(); -- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); -+ idx = fixmap_idx(type); - vaddr = __fix_to_virt(idx); - #ifdef CONFIG_DEBUG_HIGHMEM - BUG_ON(!pte_none(get_fixmap_pte(vaddr))); - #endif -- set_fixmap_pte(idx, pfn_pte(pfn, kmap_prot)); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ current->kmap_pte[type] = pte; -+#endif -+ set_fixmap_pte(idx, pte); - - return (void *)vaddr; - } -+#if defined CONFIG_PREEMPT_RT_FULL -+void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) -+{ -+ int i; -+ -+ /* -+ * Clear @prev's kmap_atomic mappings -+ */ -+ for (i = 0; i < prev_p->kmap_idx; i++) { -+ int idx = fixmap_idx(i); -+ -+ set_fixmap_pte(idx, __pte(0)); -+ } -+ /* -+ * Restore @next_p's kmap_atomic mappings -+ */ -+ for (i = 0; i < next_p->kmap_idx; i++) { -+ int idx = fixmap_idx(i); -+ -+ if (!pte_none(next_p->kmap_pte[i])) -+ set_fixmap_pte(idx, next_p->kmap_pte[i]); -+ } -+} -+#endif -diff --git a/include/linux/highmem.h b/include/linux/highmem.h -index 1ac89e4718bf..eaa2ef9bc10e 100644 ---- a/include/linux/highmem.h -+++ b/include/linux/highmem.h -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - - #include - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0219-scsi-fcoe-Make-RT-aware.patch linux-4.19.118/debian/patches-rt/0219-scsi-fcoe-Make-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0219-scsi-fcoe-Make-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0219-scsi-fcoe-Make-RT-aware.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,116 @@ +From f9942365667b0c9170e0e87b7221705c559683d1 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sat, 12 Nov 2011 14:00:48 +0100 +Subject: [PATCH 219/325] scsi/fcoe: Make RT aware. +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Do not disable preemption while taking sleeping locks. All user look safe +for migrate_diable() only. + +Signed-off-by: Thomas Gleixner +--- + drivers/scsi/fcoe/fcoe.c | 16 ++++++++-------- + drivers/scsi/fcoe/fcoe_ctlr.c | 4 ++-- + drivers/scsi/libfc/fc_exch.c | 4 ++-- + 3 files changed, 12 insertions(+), 12 deletions(-) + +diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c +index 6768b2e8148a..c20f51af6bdf 100644 +--- a/drivers/scsi/fcoe/fcoe.c ++++ b/drivers/scsi/fcoe/fcoe.c +@@ -1459,11 +1459,11 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev, + static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen) + { + struct fcoe_percpu_s *fps; +- int rc; ++ int rc, cpu = get_cpu_light(); + +- fps = &get_cpu_var(fcoe_percpu); ++ fps = &per_cpu(fcoe_percpu, cpu); + rc = fcoe_get_paged_crc_eof(skb, tlen, fps); +- put_cpu_var(fcoe_percpu); ++ put_cpu_light(); + + return rc; + } +@@ -1650,11 +1650,11 @@ static inline int fcoe_filter_frames(struct fc_lport *lport, + return 0; + } + +- stats = per_cpu_ptr(lport->stats, get_cpu()); ++ stats = per_cpu_ptr(lport->stats, get_cpu_light()); + stats->InvalidCRCCount++; + if (stats->InvalidCRCCount < 5) + printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); +- put_cpu(); ++ put_cpu_light(); + return -EINVAL; + } + +@@ -1697,7 +1697,7 @@ static void fcoe_recv_frame(struct sk_buff *skb) + */ + hp = (struct fcoe_hdr *) skb_network_header(skb); + +- stats = per_cpu_ptr(lport->stats, get_cpu()); ++ stats = per_cpu_ptr(lport->stats, get_cpu_light()); + if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) { + if (stats->ErrorFrames < 5) + printk(KERN_WARNING "fcoe: FCoE version " +@@ -1729,13 +1729,13 @@ static void fcoe_recv_frame(struct sk_buff *skb) + goto drop; + + if (!fcoe_filter_frames(lport, fp)) { +- put_cpu(); ++ put_cpu_light(); + fc_exch_recv(lport, fp); + return; + } + drop: + stats->ErrorFrames++; +- put_cpu(); ++ put_cpu_light(); + kfree_skb(skb); + } + +diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c +index 24cbd0a2cc69..ccf60801fe9d 100644 +--- a/drivers/scsi/fcoe/fcoe_ctlr.c ++++ b/drivers/scsi/fcoe/fcoe_ctlr.c +@@ -838,7 +838,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) + + INIT_LIST_HEAD(&del_list); + +- stats = per_cpu_ptr(fip->lp->stats, get_cpu()); ++ stats = per_cpu_ptr(fip->lp->stats, get_cpu_light()); + + list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { + deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2; +@@ -874,7 +874,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) + sel_time = fcf->time; + } + } +- put_cpu(); ++ put_cpu_light(); + + list_for_each_entry_safe(fcf, next, &del_list, list) { + /* Removes fcf from current list */ +diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c +index 6ba257cbc6d9..d2398a19f84c 100644 +--- a/drivers/scsi/libfc/fc_exch.c ++++ b/drivers/scsi/libfc/fc_exch.c +@@ -833,10 +833,10 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport, + } + memset(ep, 0, sizeof(*ep)); + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + pool = per_cpu_ptr(mp->pool, cpu); + spin_lock_bh(&pool->lock); +- put_cpu(); ++ put_cpu_light(); + + /* peek cache of free slot */ + if (pool->left != FC_XID_UNKNOWN) { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0220-scsi-fcoe-Make-RT-aware.patch linux-4.19.118/debian/patches-rt/0220-scsi-fcoe-Make-RT-aware.patch --- linux-4.19.98/debian/patches-rt/0220-scsi-fcoe-Make-RT-aware.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0220-scsi-fcoe-Make-RT-aware.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,116 +0,0 @@ -From 8e3f3ca20fb094619a58f24a7503aa7d1e6e8f84 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sat, 12 Nov 2011 14:00:48 +0100 -Subject: [PATCH 220/290] scsi/fcoe: Make RT aware. -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Do not disable preemption while taking sleeping locks. All user look safe -for migrate_diable() only. - -Signed-off-by: Thomas Gleixner ---- - drivers/scsi/fcoe/fcoe.c | 16 ++++++++-------- - drivers/scsi/fcoe/fcoe_ctlr.c | 4 ++-- - drivers/scsi/libfc/fc_exch.c | 4 ++-- - 3 files changed, 12 insertions(+), 12 deletions(-) - -diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c -index 6768b2e8148a..c20f51af6bdf 100644 ---- a/drivers/scsi/fcoe/fcoe.c -+++ b/drivers/scsi/fcoe/fcoe.c -@@ -1459,11 +1459,11 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev, - static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen) - { - struct fcoe_percpu_s *fps; -- int rc; -+ int rc, cpu = get_cpu_light(); - -- fps = &get_cpu_var(fcoe_percpu); -+ fps = &per_cpu(fcoe_percpu, cpu); - rc = fcoe_get_paged_crc_eof(skb, tlen, fps); -- put_cpu_var(fcoe_percpu); -+ put_cpu_light(); - - return rc; - } -@@ -1650,11 +1650,11 @@ static inline int fcoe_filter_frames(struct fc_lport *lport, - return 0; - } - -- stats = per_cpu_ptr(lport->stats, get_cpu()); -+ stats = per_cpu_ptr(lport->stats, get_cpu_light()); - stats->InvalidCRCCount++; - if (stats->InvalidCRCCount < 5) - printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); -- put_cpu(); -+ put_cpu_light(); - return -EINVAL; - } - -@@ -1697,7 +1697,7 @@ static void fcoe_recv_frame(struct sk_buff *skb) - */ - hp = (struct fcoe_hdr *) skb_network_header(skb); - -- stats = per_cpu_ptr(lport->stats, get_cpu()); -+ stats = per_cpu_ptr(lport->stats, get_cpu_light()); - if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) { - if (stats->ErrorFrames < 5) - printk(KERN_WARNING "fcoe: FCoE version " -@@ -1729,13 +1729,13 @@ static void fcoe_recv_frame(struct sk_buff *skb) - goto drop; - - if (!fcoe_filter_frames(lport, fp)) { -- put_cpu(); -+ put_cpu_light(); - fc_exch_recv(lport, fp); - return; - } - drop: - stats->ErrorFrames++; -- put_cpu(); -+ put_cpu_light(); - kfree_skb(skb); - } - -diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c -index 24cbd0a2cc69..ccf60801fe9d 100644 ---- a/drivers/scsi/fcoe/fcoe_ctlr.c -+++ b/drivers/scsi/fcoe/fcoe_ctlr.c -@@ -838,7 +838,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) - - INIT_LIST_HEAD(&del_list); - -- stats = per_cpu_ptr(fip->lp->stats, get_cpu()); -+ stats = per_cpu_ptr(fip->lp->stats, get_cpu_light()); - - list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { - deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2; -@@ -874,7 +874,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) - sel_time = fcf->time; - } - } -- put_cpu(); -+ put_cpu_light(); - - list_for_each_entry_safe(fcf, next, &del_list, list) { - /* Removes fcf from current list */ -diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c -index 42bcf7f3a0f9..2ce045d6860c 100644 ---- a/drivers/scsi/libfc/fc_exch.c -+++ b/drivers/scsi/libfc/fc_exch.c -@@ -833,10 +833,10 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport, - } - memset(ep, 0, sizeof(*ep)); - -- cpu = get_cpu(); -+ cpu = get_cpu_light(); - pool = per_cpu_ptr(mp->pool, cpu); - spin_lock_bh(&pool->lock); -- put_cpu(); -+ put_cpu_light(); - - /* peek cache of free slot */ - if (pool->left != FC_XID_UNKNOWN) { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0220-x86-crypto-Reduce-preempt-disabled-regions.patch linux-4.19.118/debian/patches-rt/0220-x86-crypto-Reduce-preempt-disabled-regions.patch --- linux-4.19.98/debian/patches-rt/0220-x86-crypto-Reduce-preempt-disabled-regions.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0220-x86-crypto-Reduce-preempt-disabled-regions.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,118 @@ +From 70e03d592732e45dfa91ed382404c60a03ad0202 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Mon, 14 Nov 2011 18:19:27 +0100 +Subject: [PATCH 220/325] x86: crypto: Reduce preempt disabled regions +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Restrict the preempt disabled regions to the actual floating point +operations and enable preemption for the administrative actions. + +This is necessary on RT to avoid that kfree and other operations are +called with preemption disabled. + +Reported-and-tested-by: Carsten Emde +Signed-off-by: Peter Zijlstra + +Signed-off-by: Thomas Gleixner +--- + arch/x86/crypto/aesni-intel_glue.c | 22 ++++++++++++---------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c +index 917f25e4d0a8..58d8c03fc32d 100644 +--- a/arch/x86/crypto/aesni-intel_glue.c ++++ b/arch/x86/crypto/aesni-intel_glue.c +@@ -434,14 +434,14 @@ static int ecb_encrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_ecb_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -456,14 +456,14 @@ static int ecb_decrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_ecb_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -478,14 +478,14 @@ static int cbc_encrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_cbc_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK, walk.iv); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -500,14 +500,14 @@ static int cbc_decrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_cbc_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK, walk.iv); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -557,18 +557,20 @@ static int ctr_crypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) { ++ kernel_fpu_begin(); + aesni_ctr_enc_tfm(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK, walk.iv); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } + if (walk.nbytes) { ++ kernel_fpu_begin(); + ctr_crypt_final(ctx, &walk); ++ kernel_fpu_end(); + err = skcipher_walk_done(&walk, 0); + } +- kernel_fpu_end(); + + return err; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0221-crypto-Reduce-preempt-disabled-regions-more-algos.patch linux-4.19.118/debian/patches-rt/0221-crypto-Reduce-preempt-disabled-regions-more-algos.patch --- linux-4.19.98/debian/patches-rt/0221-crypto-Reduce-preempt-disabled-regions-more-algos.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0221-crypto-Reduce-preempt-disabled-regions-more-algos.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,263 @@ +From 54513c07d07617c245ba13e2c56c569b1d47eb4d Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 21 Feb 2014 17:24:04 +0100 +Subject: [PATCH 221/325] crypto: Reduce preempt disabled regions, more algos +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Don Estabrook reported +| kernel: WARNING: CPU: 2 PID: 858 at kernel/sched/core.c:2428 migrate_disable+0xed/0x100() +| kernel: WARNING: CPU: 2 PID: 858 at kernel/sched/core.c:2462 migrate_enable+0x17b/0x200() +| kernel: WARNING: CPU: 3 PID: 865 at kernel/sched/core.c:2428 migrate_disable+0xed/0x100() + +and his backtrace showed some crypto functions which looked fine. + +The problem is the following sequence: + +glue_xts_crypt_128bit() +{ + blkcipher_walk_virt(); /* normal migrate_disable() */ + + glue_fpu_begin(); /* get atomic */ + + while (nbytes) { + __glue_xts_crypt_128bit(); + blkcipher_walk_done(); /* with nbytes = 0, migrate_enable() + * while we are atomic */ + }; + glue_fpu_end() /* no longer atomic */ +} + +and this is why the counter get out of sync and the warning is printed. +The other problem is that we are non-preemptible between +glue_fpu_begin() and glue_fpu_end() and the latency grows. To fix this, +I shorten the FPU off region and ensure blkcipher_walk_done() is called +with preemption enabled. This might hurt the performance because we now +enable/disable the FPU state more often but we gain lower latency and +the bug is gone. + + +Reported-by: Don Estabrook +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/x86/crypto/cast5_avx_glue.c | 21 +++++++++------------ + arch/x86/crypto/glue_helper.c | 31 ++++++++++++++++--------------- + 2 files changed, 25 insertions(+), 27 deletions(-) + +diff --git a/arch/x86/crypto/cast5_avx_glue.c b/arch/x86/crypto/cast5_avx_glue.c +index 41034745d6a2..d4bf7fc02ee7 100644 +--- a/arch/x86/crypto/cast5_avx_glue.c ++++ b/arch/x86/crypto/cast5_avx_glue.c +@@ -61,7 +61,7 @@ static inline void cast5_fpu_end(bool fpu_enabled) + + static int ecb_crypt(struct skcipher_request *req, bool enc) + { +- bool fpu_enabled = false; ++ bool fpu_enabled; + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); + struct skcipher_walk walk; +@@ -76,7 +76,7 @@ static int ecb_crypt(struct skcipher_request *req, bool enc) + u8 *wsrc = walk.src.virt.addr; + u8 *wdst = walk.dst.virt.addr; + +- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); ++ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); + + /* Process multi-block batch */ + if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) { +@@ -105,10 +105,9 @@ static int ecb_crypt(struct skcipher_request *req, bool enc) + } while (nbytes >= bsize); + + done: ++ cast5_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } +- +- cast5_fpu_end(fpu_enabled); + return err; + } + +@@ -212,7 +211,7 @@ static int cbc_decrypt(struct skcipher_request *req) + { + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); +- bool fpu_enabled = false; ++ bool fpu_enabled; + struct skcipher_walk walk; + unsigned int nbytes; + int err; +@@ -220,12 +219,11 @@ static int cbc_decrypt(struct skcipher_request *req) + err = skcipher_walk_virt(&walk, req, false); + + while ((nbytes = walk.nbytes)) { +- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); ++ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); + nbytes = __cbc_decrypt(ctx, &walk); ++ cast5_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } +- +- cast5_fpu_end(fpu_enabled); + return err; + } + +@@ -292,7 +290,7 @@ static int ctr_crypt(struct skcipher_request *req) + { + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); +- bool fpu_enabled = false; ++ bool fpu_enabled; + struct skcipher_walk walk; + unsigned int nbytes; + int err; +@@ -300,13 +298,12 @@ static int ctr_crypt(struct skcipher_request *req) + err = skcipher_walk_virt(&walk, req, false); + + while ((nbytes = walk.nbytes) >= CAST5_BLOCK_SIZE) { +- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); ++ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); + nbytes = __ctr_crypt(&walk, ctx); ++ cast5_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } + +- cast5_fpu_end(fpu_enabled); +- + if (walk.nbytes) { + ctr_crypt_final(&walk, ctx); + err = skcipher_walk_done(&walk, 0); +diff --git a/arch/x86/crypto/glue_helper.c b/arch/x86/crypto/glue_helper.c +index a78ef99a9981..dac489a1c4da 100644 +--- a/arch/x86/crypto/glue_helper.c ++++ b/arch/x86/crypto/glue_helper.c +@@ -38,7 +38,7 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, + void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); + const unsigned int bsize = 128 / 8; + struct skcipher_walk walk; +- bool fpu_enabled = false; ++ bool fpu_enabled; + unsigned int nbytes; + int err; + +@@ -51,7 +51,7 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, + unsigned int i; + + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, +- &walk, fpu_enabled, nbytes); ++ &walk, false, nbytes); + for (i = 0; i < gctx->num_funcs; i++) { + func_bytes = bsize * gctx->funcs[i].num_blocks; + +@@ -69,10 +69,9 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, + if (nbytes < bsize) + break; + } ++ glue_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } +- +- glue_fpu_end(fpu_enabled); + return err; + } + EXPORT_SYMBOL_GPL(glue_ecb_req_128bit); +@@ -115,7 +114,7 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, + void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); + const unsigned int bsize = 128 / 8; + struct skcipher_walk walk; +- bool fpu_enabled = false; ++ bool fpu_enabled; + unsigned int nbytes; + int err; + +@@ -129,7 +128,7 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, + u128 last_iv; + + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, +- &walk, fpu_enabled, nbytes); ++ &walk, false, nbytes); + /* Start of the last block. */ + src += nbytes / bsize - 1; + dst += nbytes / bsize - 1; +@@ -161,10 +160,10 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, + done: + u128_xor(dst, dst, (u128 *)walk.iv); + *(u128 *)walk.iv = last_iv; ++ glue_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } + +- glue_fpu_end(fpu_enabled); + return err; + } + EXPORT_SYMBOL_GPL(glue_cbc_decrypt_req_128bit); +@@ -175,7 +174,7 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, + void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); + const unsigned int bsize = 128 / 8; + struct skcipher_walk walk; +- bool fpu_enabled = false; ++ bool fpu_enabled; + unsigned int nbytes; + int err; + +@@ -189,7 +188,7 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, + le128 ctrblk; + + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, +- &walk, fpu_enabled, nbytes); ++ &walk, false, nbytes); + + be128_to_le128(&ctrblk, (be128 *)walk.iv); + +@@ -213,11 +212,10 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, + } + + le128_to_be128((be128 *)walk.iv, &ctrblk); ++ glue_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } + +- glue_fpu_end(fpu_enabled); +- + if (nbytes) { + le128 ctrblk; + u128 tmp; +@@ -278,7 +276,7 @@ int glue_xts_req_128bit(const struct common_glue_ctx *gctx, + { + const unsigned int bsize = 128 / 8; + struct skcipher_walk walk; +- bool fpu_enabled = false; ++ bool fpu_enabled; + unsigned int nbytes; + int err; + +@@ -289,21 +287,24 @@ int glue_xts_req_128bit(const struct common_glue_ctx *gctx, + + /* set minimum length to bsize, for tweak_fn */ + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, +- &walk, fpu_enabled, ++ &walk, false, + nbytes < bsize ? bsize : nbytes); + + /* calculate first value of T */ + tweak_fn(tweak_ctx, walk.iv, walk.iv); + + while (nbytes) { ++ fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, ++ &walk, fpu_enabled, ++ nbytes < bsize ? bsize : nbytes); + nbytes = __glue_xts_req_128bit(gctx, crypt_ctx, &walk); + ++ glue_fpu_end(fpu_enabled); ++ fpu_enabled = false; + err = skcipher_walk_done(&walk, nbytes); + nbytes = walk.nbytes; + } + +- glue_fpu_end(fpu_enabled); +- + return err; + } + EXPORT_SYMBOL_GPL(glue_xts_req_128bit); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0221-x86-crypto-Reduce-preempt-disabled-regions.patch linux-4.19.118/debian/patches-rt/0221-x86-crypto-Reduce-preempt-disabled-regions.patch --- linux-4.19.98/debian/patches-rt/0221-x86-crypto-Reduce-preempt-disabled-regions.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0221-x86-crypto-Reduce-preempt-disabled-regions.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -From 90de79b5b60daade1df8897b30d56b19dea5d83a Mon Sep 17 00:00:00 2001 -From: Peter Zijlstra -Date: Mon, 14 Nov 2011 18:19:27 +0100 -Subject: [PATCH 221/290] x86: crypto: Reduce preempt disabled regions -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Restrict the preempt disabled regions to the actual floating point -operations and enable preemption for the administrative actions. - -This is necessary on RT to avoid that kfree and other operations are -called with preemption disabled. - -Reported-and-tested-by: Carsten Emde -Signed-off-by: Peter Zijlstra - -Signed-off-by: Thomas Gleixner ---- - arch/x86/crypto/aesni-intel_glue.c | 22 ++++++++++++---------- - 1 file changed, 12 insertions(+), 10 deletions(-) - -diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c -index 917f25e4d0a8..58d8c03fc32d 100644 ---- a/arch/x86/crypto/aesni-intel_glue.c -+++ b/arch/x86/crypto/aesni-intel_glue.c -@@ -434,14 +434,14 @@ static int ecb_encrypt(struct skcipher_request *req) - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_ecb_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -456,14 +456,14 @@ static int ecb_decrypt(struct skcipher_request *req) - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_ecb_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -478,14 +478,14 @@ static int cbc_encrypt(struct skcipher_request *req) - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_cbc_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK, walk.iv); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -500,14 +500,14 @@ static int cbc_decrypt(struct skcipher_request *req) - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes)) { -+ kernel_fpu_begin(); - aesni_cbc_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK, walk.iv); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } -- kernel_fpu_end(); - - return err; - } -@@ -557,18 +557,20 @@ static int ctr_crypt(struct skcipher_request *req) - - err = skcipher_walk_virt(&walk, req, true); - -- kernel_fpu_begin(); - while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) { -+ kernel_fpu_begin(); - aesni_ctr_enc_tfm(ctx, walk.dst.virt.addr, walk.src.virt.addr, - nbytes & AES_BLOCK_MASK, walk.iv); -+ kernel_fpu_end(); - nbytes &= AES_BLOCK_SIZE - 1; - err = skcipher_walk_done(&walk, nbytes); - } - if (walk.nbytes) { -+ kernel_fpu_begin(); - ctr_crypt_final(ctx, &walk); -+ kernel_fpu_end(); - err = skcipher_walk_done(&walk, 0); - } -- kernel_fpu_end(); - - return err; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0222-crypto-Reduce-preempt-disabled-regions-more-algos.patch linux-4.19.118/debian/patches-rt/0222-crypto-Reduce-preempt-disabled-regions-more-algos.patch --- linux-4.19.98/debian/patches-rt/0222-crypto-Reduce-preempt-disabled-regions-more-algos.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0222-crypto-Reduce-preempt-disabled-regions-more-algos.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,263 +0,0 @@ -From a51e00d991c576ba020f9db8d2c4453cd7f15ecd Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 21 Feb 2014 17:24:04 +0100 -Subject: [PATCH 222/290] crypto: Reduce preempt disabled regions, more algos -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Don Estabrook reported -| kernel: WARNING: CPU: 2 PID: 858 at kernel/sched/core.c:2428 migrate_disable+0xed/0x100() -| kernel: WARNING: CPU: 2 PID: 858 at kernel/sched/core.c:2462 migrate_enable+0x17b/0x200() -| kernel: WARNING: CPU: 3 PID: 865 at kernel/sched/core.c:2428 migrate_disable+0xed/0x100() - -and his backtrace showed some crypto functions which looked fine. - -The problem is the following sequence: - -glue_xts_crypt_128bit() -{ - blkcipher_walk_virt(); /* normal migrate_disable() */ - - glue_fpu_begin(); /* get atomic */ - - while (nbytes) { - __glue_xts_crypt_128bit(); - blkcipher_walk_done(); /* with nbytes = 0, migrate_enable() - * while we are atomic */ - }; - glue_fpu_end() /* no longer atomic */ -} - -and this is why the counter get out of sync and the warning is printed. -The other problem is that we are non-preemptible between -glue_fpu_begin() and glue_fpu_end() and the latency grows. To fix this, -I shorten the FPU off region and ensure blkcipher_walk_done() is called -with preemption enabled. This might hurt the performance because we now -enable/disable the FPU state more often but we gain lower latency and -the bug is gone. - - -Reported-by: Don Estabrook -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/crypto/cast5_avx_glue.c | 21 +++++++++------------ - arch/x86/crypto/glue_helper.c | 31 ++++++++++++++++--------------- - 2 files changed, 25 insertions(+), 27 deletions(-) - -diff --git a/arch/x86/crypto/cast5_avx_glue.c b/arch/x86/crypto/cast5_avx_glue.c -index 41034745d6a2..d4bf7fc02ee7 100644 ---- a/arch/x86/crypto/cast5_avx_glue.c -+++ b/arch/x86/crypto/cast5_avx_glue.c -@@ -61,7 +61,7 @@ static inline void cast5_fpu_end(bool fpu_enabled) - - static int ecb_crypt(struct skcipher_request *req, bool enc) - { -- bool fpu_enabled = false; -+ bool fpu_enabled; - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); - struct skcipher_walk walk; -@@ -76,7 +76,7 @@ static int ecb_crypt(struct skcipher_request *req, bool enc) - u8 *wsrc = walk.src.virt.addr; - u8 *wdst = walk.dst.virt.addr; - -- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); -+ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); - - /* Process multi-block batch */ - if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) { -@@ -105,10 +105,9 @@ static int ecb_crypt(struct skcipher_request *req, bool enc) - } while (nbytes >= bsize); - - done: -+ cast5_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } -- -- cast5_fpu_end(fpu_enabled); - return err; - } - -@@ -212,7 +211,7 @@ static int cbc_decrypt(struct skcipher_request *req) - { - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); -- bool fpu_enabled = false; -+ bool fpu_enabled; - struct skcipher_walk walk; - unsigned int nbytes; - int err; -@@ -220,12 +219,11 @@ static int cbc_decrypt(struct skcipher_request *req) - err = skcipher_walk_virt(&walk, req, false); - - while ((nbytes = walk.nbytes)) { -- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); -+ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); - nbytes = __cbc_decrypt(ctx, &walk); -+ cast5_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } -- -- cast5_fpu_end(fpu_enabled); - return err; - } - -@@ -292,7 +290,7 @@ static int ctr_crypt(struct skcipher_request *req) - { - struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); - struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); -- bool fpu_enabled = false; -+ bool fpu_enabled; - struct skcipher_walk walk; - unsigned int nbytes; - int err; -@@ -300,13 +298,12 @@ static int ctr_crypt(struct skcipher_request *req) - err = skcipher_walk_virt(&walk, req, false); - - while ((nbytes = walk.nbytes) >= CAST5_BLOCK_SIZE) { -- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); -+ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); - nbytes = __ctr_crypt(&walk, ctx); -+ cast5_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } - -- cast5_fpu_end(fpu_enabled); -- - if (walk.nbytes) { - ctr_crypt_final(&walk, ctx); - err = skcipher_walk_done(&walk, 0); -diff --git a/arch/x86/crypto/glue_helper.c b/arch/x86/crypto/glue_helper.c -index a78ef99a9981..dac489a1c4da 100644 ---- a/arch/x86/crypto/glue_helper.c -+++ b/arch/x86/crypto/glue_helper.c -@@ -38,7 +38,7 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, - void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); - const unsigned int bsize = 128 / 8; - struct skcipher_walk walk; -- bool fpu_enabled = false; -+ bool fpu_enabled; - unsigned int nbytes; - int err; - -@@ -51,7 +51,7 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, - unsigned int i; - - fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -- &walk, fpu_enabled, nbytes); -+ &walk, false, nbytes); - for (i = 0; i < gctx->num_funcs; i++) { - func_bytes = bsize * gctx->funcs[i].num_blocks; - -@@ -69,10 +69,9 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, - if (nbytes < bsize) - break; - } -+ glue_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } -- -- glue_fpu_end(fpu_enabled); - return err; - } - EXPORT_SYMBOL_GPL(glue_ecb_req_128bit); -@@ -115,7 +114,7 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, - void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); - const unsigned int bsize = 128 / 8; - struct skcipher_walk walk; -- bool fpu_enabled = false; -+ bool fpu_enabled; - unsigned int nbytes; - int err; - -@@ -129,7 +128,7 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, - u128 last_iv; - - fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -- &walk, fpu_enabled, nbytes); -+ &walk, false, nbytes); - /* Start of the last block. */ - src += nbytes / bsize - 1; - dst += nbytes / bsize - 1; -@@ -161,10 +160,10 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, - done: - u128_xor(dst, dst, (u128 *)walk.iv); - *(u128 *)walk.iv = last_iv; -+ glue_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } - -- glue_fpu_end(fpu_enabled); - return err; - } - EXPORT_SYMBOL_GPL(glue_cbc_decrypt_req_128bit); -@@ -175,7 +174,7 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, - void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); - const unsigned int bsize = 128 / 8; - struct skcipher_walk walk; -- bool fpu_enabled = false; -+ bool fpu_enabled; - unsigned int nbytes; - int err; - -@@ -189,7 +188,7 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, - le128 ctrblk; - - fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -- &walk, fpu_enabled, nbytes); -+ &walk, false, nbytes); - - be128_to_le128(&ctrblk, (be128 *)walk.iv); - -@@ -213,11 +212,10 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, - } - - le128_to_be128((be128 *)walk.iv, &ctrblk); -+ glue_fpu_end(fpu_enabled); - err = skcipher_walk_done(&walk, nbytes); - } - -- glue_fpu_end(fpu_enabled); -- - if (nbytes) { - le128 ctrblk; - u128 tmp; -@@ -278,7 +276,7 @@ int glue_xts_req_128bit(const struct common_glue_ctx *gctx, - { - const unsigned int bsize = 128 / 8; - struct skcipher_walk walk; -- bool fpu_enabled = false; -+ bool fpu_enabled; - unsigned int nbytes; - int err; - -@@ -289,21 +287,24 @@ int glue_xts_req_128bit(const struct common_glue_ctx *gctx, - - /* set minimum length to bsize, for tweak_fn */ - fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -- &walk, fpu_enabled, -+ &walk, false, - nbytes < bsize ? bsize : nbytes); - - /* calculate first value of T */ - tweak_fn(tweak_ctx, walk.iv, walk.iv); - - while (nbytes) { -+ fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, -+ &walk, fpu_enabled, -+ nbytes < bsize ? bsize : nbytes); - nbytes = __glue_xts_req_128bit(gctx, crypt_ctx, &walk); - -+ glue_fpu_end(fpu_enabled); -+ fpu_enabled = false; - err = skcipher_walk_done(&walk, nbytes); - nbytes = walk.nbytes; - } - -- glue_fpu_end(fpu_enabled); -- - return err; - } - EXPORT_SYMBOL_GPL(glue_xts_req_128bit); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0222-crypto-limit-more-FPU-enabled-sections.patch linux-4.19.118/debian/patches-rt/0222-crypto-limit-more-FPU-enabled-sections.patch --- linux-4.19.98/debian/patches-rt/0222-crypto-limit-more-FPU-enabled-sections.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0222-crypto-limit-more-FPU-enabled-sections.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,108 @@ +From 5368881693eeb89db040948e8911af5a704debb2 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 30 Nov 2017 13:40:10 +0100 +Subject: [PATCH 222/325] crypto: limit more FPU-enabled sections +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Those crypto drivers use SSE/AVX/… for their crypto work and in order to +do so in kernel they need to enable the "FPU" in kernel mode which +disables preemption. +There are two problems with the way they are used: +- the while loop which processes X bytes may create latency spikes and + should be avoided or limited. +- the cipher-walk-next part may allocate/free memory and may use + kmap_atomic(). + +The whole kernel_fpu_begin()/end() processing isn't probably that cheap. +It most likely makes sense to process as much of those as possible in one +go. The new *_fpu_sched_rt() schedules only if a RT task is pending. + +Probably we should measure the performance those ciphers in pure SW +mode and with this optimisations to see if it makes sense to keep them +for RT. + +This kernel_fpu_resched() makes the code more preemptible which might hurt +performance. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/x86/crypto/chacha20_glue.c | 9 +++++---- + arch/x86/include/asm/fpu/api.h | 1 + + arch/x86/kernel/fpu/core.c | 12 ++++++++++++ + 3 files changed, 18 insertions(+), 4 deletions(-) + +diff --git a/arch/x86/crypto/chacha20_glue.c b/arch/x86/crypto/chacha20_glue.c +index dce7c5d39c2f..6194160b7fbc 100644 +--- a/arch/x86/crypto/chacha20_glue.c ++++ b/arch/x86/crypto/chacha20_glue.c +@@ -81,23 +81,24 @@ static int chacha20_simd(struct skcipher_request *req) + + crypto_chacha20_init(state, ctx, walk.iv); + +- kernel_fpu_begin(); +- + while (walk.nbytes >= CHACHA20_BLOCK_SIZE) { ++ kernel_fpu_begin(); ++ + chacha20_dosimd(state, walk.dst.virt.addr, walk.src.virt.addr, + rounddown(walk.nbytes, CHACHA20_BLOCK_SIZE)); ++ kernel_fpu_end(); + err = skcipher_walk_done(&walk, + walk.nbytes % CHACHA20_BLOCK_SIZE); + } + + if (walk.nbytes) { ++ kernel_fpu_begin(); + chacha20_dosimd(state, walk.dst.virt.addr, walk.src.virt.addr, + walk.nbytes); ++ kernel_fpu_end(); + err = skcipher_walk_done(&walk, 0); + } + +- kernel_fpu_end(); +- + return err; + } + +diff --git a/arch/x86/include/asm/fpu/api.h b/arch/x86/include/asm/fpu/api.h +index b56d504af654..e51c7094075d 100644 +--- a/arch/x86/include/asm/fpu/api.h ++++ b/arch/x86/include/asm/fpu/api.h +@@ -20,6 +20,7 @@ + */ + extern void kernel_fpu_begin(void); + extern void kernel_fpu_end(void); ++extern void kernel_fpu_resched(void); + extern bool irq_fpu_usable(void); + + /* +diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c +index 2e5003fef51a..768c53767bb2 100644 +--- a/arch/x86/kernel/fpu/core.c ++++ b/arch/x86/kernel/fpu/core.c +@@ -136,6 +136,18 @@ void kernel_fpu_end(void) + } + EXPORT_SYMBOL_GPL(kernel_fpu_end); + ++void kernel_fpu_resched(void) ++{ ++ WARN_ON_FPU(!this_cpu_read(in_kernel_fpu)); ++ ++ if (should_resched(PREEMPT_OFFSET)) { ++ kernel_fpu_end(); ++ cond_resched(); ++ kernel_fpu_begin(); ++ } ++} ++EXPORT_SYMBOL_GPL(kernel_fpu_resched); ++ + /* + * Save the FPU state (mark it for reload if necessary): + * +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0223-crypto-limit-more-FPU-enabled-sections.patch linux-4.19.118/debian/patches-rt/0223-crypto-limit-more-FPU-enabled-sections.patch --- linux-4.19.98/debian/patches-rt/0223-crypto-limit-more-FPU-enabled-sections.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0223-crypto-limit-more-FPU-enabled-sections.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,108 +0,0 @@ -From dc93a0747106cd976c1745561130f7249b2f2447 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 30 Nov 2017 13:40:10 +0100 -Subject: [PATCH 223/290] crypto: limit more FPU-enabled sections -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Those crypto drivers use SSE/AVX/… for their crypto work and in order to -do so in kernel they need to enable the "FPU" in kernel mode which -disables preemption. -There are two problems with the way they are used: -- the while loop which processes X bytes may create latency spikes and - should be avoided or limited. -- the cipher-walk-next part may allocate/free memory and may use - kmap_atomic(). - -The whole kernel_fpu_begin()/end() processing isn't probably that cheap. -It most likely makes sense to process as much of those as possible in one -go. The new *_fpu_sched_rt() schedules only if a RT task is pending. - -Probably we should measure the performance those ciphers in pure SW -mode and with this optimisations to see if it makes sense to keep them -for RT. - -This kernel_fpu_resched() makes the code more preemptible which might hurt -performance. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/crypto/chacha20_glue.c | 9 +++++---- - arch/x86/include/asm/fpu/api.h | 1 + - arch/x86/kernel/fpu/core.c | 12 ++++++++++++ - 3 files changed, 18 insertions(+), 4 deletions(-) - -diff --git a/arch/x86/crypto/chacha20_glue.c b/arch/x86/crypto/chacha20_glue.c -index dce7c5d39c2f..6194160b7fbc 100644 ---- a/arch/x86/crypto/chacha20_glue.c -+++ b/arch/x86/crypto/chacha20_glue.c -@@ -81,23 +81,24 @@ static int chacha20_simd(struct skcipher_request *req) - - crypto_chacha20_init(state, ctx, walk.iv); - -- kernel_fpu_begin(); -- - while (walk.nbytes >= CHACHA20_BLOCK_SIZE) { -+ kernel_fpu_begin(); -+ - chacha20_dosimd(state, walk.dst.virt.addr, walk.src.virt.addr, - rounddown(walk.nbytes, CHACHA20_BLOCK_SIZE)); -+ kernel_fpu_end(); - err = skcipher_walk_done(&walk, - walk.nbytes % CHACHA20_BLOCK_SIZE); - } - - if (walk.nbytes) { -+ kernel_fpu_begin(); - chacha20_dosimd(state, walk.dst.virt.addr, walk.src.virt.addr, - walk.nbytes); -+ kernel_fpu_end(); - err = skcipher_walk_done(&walk, 0); - } - -- kernel_fpu_end(); -- - return err; - } - -diff --git a/arch/x86/include/asm/fpu/api.h b/arch/x86/include/asm/fpu/api.h -index b56d504af654..e51c7094075d 100644 ---- a/arch/x86/include/asm/fpu/api.h -+++ b/arch/x86/include/asm/fpu/api.h -@@ -20,6 +20,7 @@ - */ - extern void kernel_fpu_begin(void); - extern void kernel_fpu_end(void); -+extern void kernel_fpu_resched(void); - extern bool irq_fpu_usable(void); - - /* -diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c -index 2e5003fef51a..768c53767bb2 100644 ---- a/arch/x86/kernel/fpu/core.c -+++ b/arch/x86/kernel/fpu/core.c -@@ -136,6 +136,18 @@ void kernel_fpu_end(void) - } - EXPORT_SYMBOL_GPL(kernel_fpu_end); - -+void kernel_fpu_resched(void) -+{ -+ WARN_ON_FPU(!this_cpu_read(in_kernel_fpu)); -+ -+ if (should_resched(PREEMPT_OFFSET)) { -+ kernel_fpu_end(); -+ cond_resched(); -+ kernel_fpu_begin(); -+ } -+} -+EXPORT_SYMBOL_GPL(kernel_fpu_resched); -+ - /* - * Save the FPU state (mark it for reload if necessary): - * --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0223-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch linux-4.19.118/debian/patches-rt/0223-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch --- linux-4.19.98/debian/patches-rt/0223-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0223-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,83 @@ +From 7e78bc20913ad1e15f26623a153852802cec3da6 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Wed, 11 Jul 2018 17:14:47 +0200 +Subject: [PATCH 223/325] crypto: scompress - serialize RT percpu scratch + buffer access with a local lock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +| BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974 +| in_atomic(): 1, irqs_disabled(): 0, pid: 1401, name: cryptomgr_test +| Preemption disabled at: +| [] scomp_acomp_comp_decomp+0x34/0x1a0 +| CPU: 21 PID: 1401 Comm: cryptomgr_test Tainted: G W 4.16.18-rt9-rt #1 +| Hardware name: www.cavium.com crb-1s/crb-1s, BIOS 0.3 Apr 25 2017 +| Call trace: +| dump_backtrace+0x0/0x1c8 +| show_stack+0x24/0x30 +| dump_stack+0xac/0xe8 +| ___might_sleep+0x124/0x188 +| rt_spin_lock+0x40/0x88 +| zip_load_instr+0x44/0x170 [thunderx_zip] +| zip_deflate+0x184/0x378 [thunderx_zip] +| zip_compress+0xb0/0x130 [thunderx_zip] +| zip_scomp_compress+0x48/0x60 [thunderx_zip] +| scomp_acomp_comp_decomp+0xd8/0x1a0 +| scomp_acomp_compress+0x24/0x30 +| test_acomp+0x15c/0x558 +| alg_test_comp+0xc0/0x128 +| alg_test.part.6+0x120/0x2c0 +| alg_test+0x6c/0xa0 +| cryptomgr_test+0x50/0x58 +| kthread+0x134/0x138 +| ret_from_fork+0x10/0x18 + +Mainline disables preemption to serialize percpu scratch buffer access, +causing the splat above. Serialize with a local lock for RT instead. + +Signed-off-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + crypto/scompress.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/crypto/scompress.c b/crypto/scompress.c +index 968bbcf65c94..c2f0077e0801 100644 +--- a/crypto/scompress.c ++++ b/crypto/scompress.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -34,6 +35,7 @@ static void * __percpu *scomp_src_scratches; + static void * __percpu *scomp_dst_scratches; + static int scomp_scratch_users; + static DEFINE_MUTEX(scomp_lock); ++static DEFINE_LOCAL_IRQ_LOCK(scomp_scratches_lock); + + #ifdef CONFIG_NET + static int crypto_scomp_report(struct sk_buff *skb, struct crypto_alg *alg) +@@ -146,7 +148,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) + void **tfm_ctx = acomp_tfm_ctx(tfm); + struct crypto_scomp *scomp = *tfm_ctx; + void **ctx = acomp_request_ctx(req); +- const int cpu = get_cpu(); ++ const int cpu = local_lock_cpu(scomp_scratches_lock); + u8 *scratch_src = *per_cpu_ptr(scomp_src_scratches, cpu); + u8 *scratch_dst = *per_cpu_ptr(scomp_dst_scratches, cpu); + int ret; +@@ -181,7 +183,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) + 1); + } + out: +- put_cpu(); ++ local_unlock_cpu(scomp_scratches_lock); + return ret; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0224-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch linux-4.19.118/debian/patches-rt/0224-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch --- linux-4.19.98/debian/patches-rt/0224-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0224-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,85 @@ +From 16d33551afe71fce5f6c74376d543ad66293fe9b Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 26 Jul 2018 18:52:00 +0200 +Subject: [PATCH 224/325] crypto: cryptd - add a lock instead + preempt_disable/local_bh_disable +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +cryptd has a per-CPU lock which protected with local_bh_disable() and +preempt_disable(). +Add an explicit spin_lock to make the locking context more obvious and +visible to lockdep. Since it is a per-CPU lock, there should be no lock +contention on the actual spinlock. +There is a small race-window where we could be migrated to another CPU +after the cpu_queue has been obtain. This is not a problem because the +actual ressource is protected by the spinlock. + +Signed-off-by: Sebastian Andrzej Siewior +--- + crypto/cryptd.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/crypto/cryptd.c b/crypto/cryptd.c +index e0c8e907b086..e079f9a70201 100644 +--- a/crypto/cryptd.c ++++ b/crypto/cryptd.c +@@ -39,6 +39,7 @@ MODULE_PARM_DESC(cryptd_max_cpu_qlen, "Set cryptd Max queue depth"); + struct cryptd_cpu_queue { + struct crypto_queue queue; + struct work_struct work; ++ spinlock_t qlock; + }; + + struct cryptd_queue { +@@ -117,6 +118,7 @@ static int cryptd_init_queue(struct cryptd_queue *queue, + cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu); + crypto_init_queue(&cpu_queue->queue, max_cpu_qlen); + INIT_WORK(&cpu_queue->work, cryptd_queue_worker); ++ spin_lock_init(&cpu_queue->qlock); + } + pr_info("cryptd: max_cpu_qlen set to %d\n", max_cpu_qlen); + return 0; +@@ -141,8 +143,10 @@ static int cryptd_enqueue_request(struct cryptd_queue *queue, + struct cryptd_cpu_queue *cpu_queue; + atomic_t *refcnt; + +- cpu = get_cpu(); +- cpu_queue = this_cpu_ptr(queue->cpu_queue); ++ cpu_queue = raw_cpu_ptr(queue->cpu_queue); ++ spin_lock_bh(&cpu_queue->qlock); ++ cpu = smp_processor_id(); ++ + err = crypto_enqueue_request(&cpu_queue->queue, request); + + refcnt = crypto_tfm_ctx(request->tfm); +@@ -158,7 +162,7 @@ static int cryptd_enqueue_request(struct cryptd_queue *queue, + atomic_inc(refcnt); + + out_put_cpu: +- put_cpu(); ++ spin_unlock_bh(&cpu_queue->qlock); + + return err; + } +@@ -174,16 +178,11 @@ static void cryptd_queue_worker(struct work_struct *work) + cpu_queue = container_of(work, struct cryptd_cpu_queue, work); + /* + * Only handle one request at a time to avoid hogging crypto workqueue. +- * preempt_disable/enable is used to prevent being preempted by +- * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent +- * cryptd_enqueue_request() being accessed from software interrupts. + */ +- local_bh_disable(); +- preempt_disable(); ++ spin_lock_bh(&cpu_queue->qlock); + backlog = crypto_get_backlog(&cpu_queue->queue); + req = crypto_dequeue_request(&cpu_queue->queue); +- preempt_enable(); +- local_bh_enable(); ++ spin_unlock_bh(&cpu_queue->qlock); + + if (!req) + return; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0224-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch linux-4.19.118/debian/patches-rt/0224-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch --- linux-4.19.98/debian/patches-rt/0224-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0224-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -From 6388ffad9f71b6cc1e7074b010a3c0cd24de1ea7 Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Wed, 11 Jul 2018 17:14:47 +0200 -Subject: [PATCH 224/290] crypto: scompress - serialize RT percpu scratch - buffer access with a local lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -| BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974 -| in_atomic(): 1, irqs_disabled(): 0, pid: 1401, name: cryptomgr_test -| Preemption disabled at: -| [] scomp_acomp_comp_decomp+0x34/0x1a0 -| CPU: 21 PID: 1401 Comm: cryptomgr_test Tainted: G W 4.16.18-rt9-rt #1 -| Hardware name: www.cavium.com crb-1s/crb-1s, BIOS 0.3 Apr 25 2017 -| Call trace: -| dump_backtrace+0x0/0x1c8 -| show_stack+0x24/0x30 -| dump_stack+0xac/0xe8 -| ___might_sleep+0x124/0x188 -| rt_spin_lock+0x40/0x88 -| zip_load_instr+0x44/0x170 [thunderx_zip] -| zip_deflate+0x184/0x378 [thunderx_zip] -| zip_compress+0xb0/0x130 [thunderx_zip] -| zip_scomp_compress+0x48/0x60 [thunderx_zip] -| scomp_acomp_comp_decomp+0xd8/0x1a0 -| scomp_acomp_compress+0x24/0x30 -| test_acomp+0x15c/0x558 -| alg_test_comp+0xc0/0x128 -| alg_test.part.6+0x120/0x2c0 -| alg_test+0x6c/0xa0 -| cryptomgr_test+0x50/0x58 -| kthread+0x134/0x138 -| ret_from_fork+0x10/0x18 - -Mainline disables preemption to serialize percpu scratch buffer access, -causing the splat above. Serialize with a local lock for RT instead. - -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - crypto/scompress.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/crypto/scompress.c b/crypto/scompress.c -index 968bbcf65c94..c2f0077e0801 100644 ---- a/crypto/scompress.c -+++ b/crypto/scompress.c -@@ -24,6 +24,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -34,6 +35,7 @@ static void * __percpu *scomp_src_scratches; - static void * __percpu *scomp_dst_scratches; - static int scomp_scratch_users; - static DEFINE_MUTEX(scomp_lock); -+static DEFINE_LOCAL_IRQ_LOCK(scomp_scratches_lock); - - #ifdef CONFIG_NET - static int crypto_scomp_report(struct sk_buff *skb, struct crypto_alg *alg) -@@ -146,7 +148,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) - void **tfm_ctx = acomp_tfm_ctx(tfm); - struct crypto_scomp *scomp = *tfm_ctx; - void **ctx = acomp_request_ctx(req); -- const int cpu = get_cpu(); -+ const int cpu = local_lock_cpu(scomp_scratches_lock); - u8 *scratch_src = *per_cpu_ptr(scomp_src_scratches, cpu); - u8 *scratch_dst = *per_cpu_ptr(scomp_dst_scratches, cpu); - int ret; -@@ -181,7 +183,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) - 1); - } - out: -- put_cpu(); -+ local_unlock_cpu(scomp_scratches_lock); - return ret; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0225-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch linux-4.19.118/debian/patches-rt/0225-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch --- linux-4.19.98/debian/patches-rt/0225-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0225-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -From e154dffb6f88ac74a8ab087c4b884413754e38aa Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 26 Jul 2018 18:52:00 +0200 -Subject: [PATCH 225/290] crypto: cryptd - add a lock instead - preempt_disable/local_bh_disable -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -cryptd has a per-CPU lock which protected with local_bh_disable() and -preempt_disable(). -Add an explicit spin_lock to make the locking context more obvious and -visible to lockdep. Since it is a per-CPU lock, there should be no lock -contention on the actual spinlock. -There is a small race-window where we could be migrated to another CPU -after the cpu_queue has been obtain. This is not a problem because the -actual ressource is protected by the spinlock. - -Signed-off-by: Sebastian Andrzej Siewior ---- - crypto/cryptd.c | 19 +++++++++---------- - 1 file changed, 9 insertions(+), 10 deletions(-) - -diff --git a/crypto/cryptd.c b/crypto/cryptd.c -index e0c8e907b086..e079f9a70201 100644 ---- a/crypto/cryptd.c -+++ b/crypto/cryptd.c -@@ -39,6 +39,7 @@ MODULE_PARM_DESC(cryptd_max_cpu_qlen, "Set cryptd Max queue depth"); - struct cryptd_cpu_queue { - struct crypto_queue queue; - struct work_struct work; -+ spinlock_t qlock; - }; - - struct cryptd_queue { -@@ -117,6 +118,7 @@ static int cryptd_init_queue(struct cryptd_queue *queue, - cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu); - crypto_init_queue(&cpu_queue->queue, max_cpu_qlen); - INIT_WORK(&cpu_queue->work, cryptd_queue_worker); -+ spin_lock_init(&cpu_queue->qlock); - } - pr_info("cryptd: max_cpu_qlen set to %d\n", max_cpu_qlen); - return 0; -@@ -141,8 +143,10 @@ static int cryptd_enqueue_request(struct cryptd_queue *queue, - struct cryptd_cpu_queue *cpu_queue; - atomic_t *refcnt; - -- cpu = get_cpu(); -- cpu_queue = this_cpu_ptr(queue->cpu_queue); -+ cpu_queue = raw_cpu_ptr(queue->cpu_queue); -+ spin_lock_bh(&cpu_queue->qlock); -+ cpu = smp_processor_id(); -+ - err = crypto_enqueue_request(&cpu_queue->queue, request); - - refcnt = crypto_tfm_ctx(request->tfm); -@@ -158,7 +162,7 @@ static int cryptd_enqueue_request(struct cryptd_queue *queue, - atomic_inc(refcnt); - - out_put_cpu: -- put_cpu(); -+ spin_unlock_bh(&cpu_queue->qlock); - - return err; - } -@@ -174,16 +178,11 @@ static void cryptd_queue_worker(struct work_struct *work) - cpu_queue = container_of(work, struct cryptd_cpu_queue, work); - /* - * Only handle one request at a time to avoid hogging crypto workqueue. -- * preempt_disable/enable is used to prevent being preempted by -- * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent -- * cryptd_enqueue_request() being accessed from software interrupts. - */ -- local_bh_disable(); -- preempt_disable(); -+ spin_lock_bh(&cpu_queue->qlock); - backlog = crypto_get_backlog(&cpu_queue->queue); - req = crypto_dequeue_request(&cpu_queue->queue); -- preempt_enable(); -- local_bh_enable(); -+ spin_unlock_bh(&cpu_queue->qlock); - - if (!req) - return; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0225-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch linux-4.19.118/debian/patches-rt/0225-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch --- linux-4.19.98/debian/patches-rt/0225-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0225-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,34 @@ +From d12a028cd42d3b1e973b81f39e15641480bb9ffd Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 14 Jul 2015 14:26:34 +0200 +Subject: [PATCH 225/325] panic: skip get_random_bytes for RT_FULL in + init_oops_id +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Disable on -RT. If this is invoked from irq-context we will have problems +to acquire the sleeping lock. + +Signed-off-by: Thomas Gleixner +--- + kernel/panic.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/kernel/panic.c b/kernel/panic.c +index 8138a676fb7d..fa114be5c30f 100644 +--- a/kernel/panic.c ++++ b/kernel/panic.c +@@ -480,9 +480,11 @@ static u64 oops_id; + + static int init_oops_id(void) + { ++#ifndef CONFIG_PREEMPT_RT_FULL + if (!oops_id) + get_random_bytes(&oops_id, sizeof(oops_id)); + else ++#endif + oops_id++; + + return 0; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0226-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch linux-4.19.118/debian/patches-rt/0226-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch --- linux-4.19.98/debian/patches-rt/0226-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0226-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -From 9aa84af05c5298af918741fdd22779fe320edc90 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 14 Jul 2015 14:26:34 +0200 -Subject: [PATCH 226/290] panic: skip get_random_bytes for RT_FULL in - init_oops_id -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Disable on -RT. If this is invoked from irq-context we will have problems -to acquire the sleeping lock. - -Signed-off-by: Thomas Gleixner ---- - kernel/panic.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/kernel/panic.c b/kernel/panic.c -index 8138a676fb7d..fa114be5c30f 100644 ---- a/kernel/panic.c -+++ b/kernel/panic.c -@@ -480,9 +480,11 @@ static u64 oops_id; - - static int init_oops_id(void) - { -+#ifndef CONFIG_PREEMPT_RT_FULL - if (!oops_id) - get_random_bytes(&oops_id, sizeof(oops_id)); - else -+#endif - oops_id++; - - return 0; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0226-x86-stackprotector-Avoid-random-pool-on-rt.patch linux-4.19.118/debian/patches-rt/0226-x86-stackprotector-Avoid-random-pool-on-rt.patch --- linux-4.19.98/debian/patches-rt/0226-x86-stackprotector-Avoid-random-pool-on-rt.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0226-x86-stackprotector-Avoid-random-pool-on-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,51 @@ +From 4e386d000be9c36e56caa970e99aea818986cbec Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 16 Dec 2010 14:25:18 +0100 +Subject: [PATCH 226/325] x86: stackprotector: Avoid random pool on rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +CPU bringup calls into the random pool to initialize the stack +canary. During boot that works nicely even on RT as the might sleep +checks are disabled. During CPU hotplug the might sleep checks +trigger. Making the locks in random raw is a major PITA, so avoid the +call on RT is the only sensible solution. This is basically the same +randomness which we get during boot where the random pool has no +entropy and we rely on the TSC randomnness. + +Reported-by: Carsten Emde +Signed-off-by: Thomas Gleixner +--- + arch/x86/include/asm/stackprotector.h | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h +index 8ec97a62c245..7bc85841fc56 100644 +--- a/arch/x86/include/asm/stackprotector.h ++++ b/arch/x86/include/asm/stackprotector.h +@@ -60,7 +60,7 @@ + */ + static __always_inline void boot_init_stack_canary(void) + { +- u64 canary; ++ u64 uninitialized_var(canary); + u64 tsc; + + #ifdef CONFIG_X86_64 +@@ -71,8 +71,14 @@ static __always_inline void boot_init_stack_canary(void) + * of randomness. The TSC only matters for very early init, + * there it already has some randomness on most systems. Later + * on during the bootup the random pool has true entropy too. ++ * For preempt-rt we need to weaken the randomness a bit, as ++ * we can't call into the random generator from atomic context ++ * due to locking constraints. We just leave canary ++ * uninitialized and use the TSC based randomness on top of it. + */ ++#ifndef CONFIG_PREEMPT_RT_FULL + get_random_bytes(&canary, sizeof(canary)); ++#endif + tsc = rdtsc(); + canary += tsc + (tsc << 32UL); + canary &= CANARY_MASK; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0227-random-Make-it-work-on-rt.patch linux-4.19.118/debian/patches-rt/0227-random-Make-it-work-on-rt.patch --- linux-4.19.98/debian/patches-rt/0227-random-Make-it-work-on-rt.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0227-random-Make-it-work-on-rt.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,167 @@ +From c6da6886f88cf56b43a37670ec2c12c5d0b58044 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 21 Aug 2012 20:38:50 +0200 +Subject: [PATCH 227/325] random: Make it work on rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Delegate the random insertion to the forced threaded interrupt +handler. Store the return IP of the hard interrupt handler in the irq +descriptor and feed it into the random generator as a source of +entropy. + +Signed-off-by: Thomas Gleixner +--- + drivers/char/random.c | 11 +++++------ + drivers/hv/hv.c | 4 +++- + drivers/hv/vmbus_drv.c | 4 +++- + include/linux/irqdesc.h | 1 + + include/linux/random.h | 2 +- + kernel/irq/handle.c | 8 +++++++- + kernel/irq/manage.c | 6 ++++++ + 7 files changed, 26 insertions(+), 10 deletions(-) + +diff --git a/drivers/char/random.c b/drivers/char/random.c +index d5f970d039bb..838950ff569f 100644 +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -1232,28 +1232,27 @@ static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs) + return *ptr; + } + +-void add_interrupt_randomness(int irq, int irq_flags) ++void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) + { + struct entropy_store *r; + struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); +- struct pt_regs *regs = get_irq_regs(); + unsigned long now = jiffies; + cycles_t cycles = random_get_entropy(); + __u32 c_high, j_high; +- __u64 ip; + unsigned long seed; + int credit = 0; + + if (cycles == 0) +- cycles = get_reg(fast_pool, regs); ++ cycles = get_reg(fast_pool, NULL); + c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; + j_high = (sizeof(now) > 4) ? now >> 32 : 0; + fast_pool->pool[0] ^= cycles ^ j_high ^ irq; + fast_pool->pool[1] ^= now ^ c_high; +- ip = regs ? instruction_pointer(regs) : _RET_IP_; ++ if (!ip) ++ ip = _RET_IP_; + fast_pool->pool[2] ^= ip; + fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 : +- get_reg(fast_pool, regs); ++ get_reg(fast_pool, NULL); + + fast_mix(fast_pool); + add_interrupt_bench(cycles); +diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c +index 12bc9fa21111..278f03f50147 100644 +--- a/drivers/hv/hv.c ++++ b/drivers/hv/hv.c +@@ -112,10 +112,12 @@ int hv_post_message(union hv_connection_id connection_id, + static void hv_stimer0_isr(void) + { + struct hv_per_cpu_context *hv_cpu; ++ struct pt_regs *regs = get_irq_regs(); ++ u64 ip = regs ? instruction_pointer(regs) : 0; + + hv_cpu = this_cpu_ptr(hv_context.cpu_context); + hv_cpu->clk_evt->event_handler(hv_cpu->clk_evt); +- add_interrupt_randomness(stimer0_vector, 0); ++ add_interrupt_randomness(stimer0_vector, 0, ip); + } + + static int hv_ce_set_next_event(unsigned long delta, +diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c +index 9aa18f387a34..39aaa14993cc 100644 +--- a/drivers/hv/vmbus_drv.c ++++ b/drivers/hv/vmbus_drv.c +@@ -1042,6 +1042,8 @@ static void vmbus_isr(void) + void *page_addr = hv_cpu->synic_event_page; + struct hv_message *msg; + union hv_synic_event_flags *event; ++ struct pt_regs *regs = get_irq_regs(); ++ u64 ip = regs ? instruction_pointer(regs) : 0; + bool handled = false; + + if (unlikely(page_addr == NULL)) +@@ -1085,7 +1087,7 @@ static void vmbus_isr(void) + tasklet_schedule(&hv_cpu->msg_dpc); + } + +- add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0); ++ add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0, ip); + } + + /* +diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h +index 875c41b23f20..ff5eb8d1ede4 100644 +--- a/include/linux/irqdesc.h ++++ b/include/linux/irqdesc.h +@@ -71,6 +71,7 @@ struct irq_desc { + unsigned int irqs_unhandled; + atomic_t threads_handled; + int threads_handled_last; ++ u64 random_ip; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + const struct cpumask *percpu_affinity; +diff --git a/include/linux/random.h b/include/linux/random.h +index 445a0ea4ff49..a7b7d9f97580 100644 +--- a/include/linux/random.h ++++ b/include/linux/random.h +@@ -32,7 +32,7 @@ static inline void add_latent_entropy(void) {} + + extern void add_input_randomness(unsigned int type, unsigned int code, + unsigned int value) __latent_entropy; +-extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy; ++extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) __latent_entropy; + + extern void get_random_bytes(void *buf, int nbytes); + extern int wait_for_random_bytes(void); +diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c +index 38554bc35375..06a80bbf78af 100644 +--- a/kernel/irq/handle.c ++++ b/kernel/irq/handle.c +@@ -185,10 +185,16 @@ irqreturn_t handle_irq_event_percpu(struct irq_desc *desc) + { + irqreturn_t retval; + unsigned int flags = 0; ++ struct pt_regs *regs = get_irq_regs(); ++ u64 ip = regs ? instruction_pointer(regs) : 0; + + retval = __handle_irq_event_percpu(desc, &flags); + +- add_interrupt_randomness(desc->irq_data.irq, flags); ++#ifdef CONFIG_PREEMPT_RT_FULL ++ desc->random_ip = ip; ++#else ++ add_interrupt_randomness(desc->irq_data.irq, flags, ip); ++#endif + + if (!noirqdebug) + note_interrupt(desc, retval); +diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c +index 1a3cf77b11f8..9591a451e05a 100644 +--- a/kernel/irq/manage.c ++++ b/kernel/irq/manage.c +@@ -1063,6 +1063,12 @@ static int irq_thread(void *data) + if (action_ret == IRQ_WAKE_THREAD) + irq_wake_secondary(desc, action); + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ migrate_disable(); ++ add_interrupt_randomness(action->irq, 0, ++ desc->random_ip ^ (unsigned long) action); ++ migrate_enable(); ++#endif + wake_threads_waitq(desc); + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0227-x86-stackprotector-Avoid-random-pool-on-rt.patch linux-4.19.118/debian/patches-rt/0227-x86-stackprotector-Avoid-random-pool-on-rt.patch --- linux-4.19.98/debian/patches-rt/0227-x86-stackprotector-Avoid-random-pool-on-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0227-x86-stackprotector-Avoid-random-pool-on-rt.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -From 54f488a780d046deaf409f393451114571fddc2b Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 16 Dec 2010 14:25:18 +0100 -Subject: [PATCH 227/290] x86: stackprotector: Avoid random pool on rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -CPU bringup calls into the random pool to initialize the stack -canary. During boot that works nicely even on RT as the might sleep -checks are disabled. During CPU hotplug the might sleep checks -trigger. Making the locks in random raw is a major PITA, so avoid the -call on RT is the only sensible solution. This is basically the same -randomness which we get during boot where the random pool has no -entropy and we rely on the TSC randomnness. - -Reported-by: Carsten Emde -Signed-off-by: Thomas Gleixner ---- - arch/x86/include/asm/stackprotector.h | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h -index 8ec97a62c245..7bc85841fc56 100644 ---- a/arch/x86/include/asm/stackprotector.h -+++ b/arch/x86/include/asm/stackprotector.h -@@ -60,7 +60,7 @@ - */ - static __always_inline void boot_init_stack_canary(void) - { -- u64 canary; -+ u64 uninitialized_var(canary); - u64 tsc; - - #ifdef CONFIG_X86_64 -@@ -71,8 +71,14 @@ static __always_inline void boot_init_stack_canary(void) - * of randomness. The TSC only matters for very early init, - * there it already has some randomness on most systems. Later - * on during the bootup the random pool has true entropy too. -+ * For preempt-rt we need to weaken the randomness a bit, as -+ * we can't call into the random generator from atomic context -+ * due to locking constraints. We just leave canary -+ * uninitialized and use the TSC based randomness on top of it. - */ -+#ifndef CONFIG_PREEMPT_RT_FULL - get_random_bytes(&canary, sizeof(canary)); -+#endif - tsc = rdtsc(); - canary += tsc + (tsc << 32UL); - canary &= CANARY_MASK; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0228-cpu-hotplug-Implement-CPU-pinning.patch linux-4.19.118/debian/patches-rt/0228-cpu-hotplug-Implement-CPU-pinning.patch --- linux-4.19.98/debian/patches-rt/0228-cpu-hotplug-Implement-CPU-pinning.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0228-cpu-hotplug-Implement-CPU-pinning.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,117 @@ +From 4e82f79ed7a3629248241e307320aa1ba73aeaa2 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 19 Jul 2017 17:31:20 +0200 +Subject: [PATCH 228/325] cpu/hotplug: Implement CPU pinning +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 1 + + kernel/cpu.c | 38 ++++++++++++++++++++++++++++++++++++++ + 2 files changed, 39 insertions(+) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index dc668524ccff..fc9300d0787d 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -671,6 +671,7 @@ struct task_struct { + #if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + int migrate_disable; + int migrate_disable_update; ++ int pinned_on_cpu; + # ifdef CONFIG_SCHED_DEBUG + int migrate_disable_atomic; + # endif +diff --git a/kernel/cpu.c b/kernel/cpu.c +index 328d7bf67d2f..e005e64ae30f 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -75,6 +75,11 @@ static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state) = { + .fail = CPUHP_INVALID, + }; + ++#ifdef CONFIG_HOTPLUG_CPU ++static DEFINE_PER_CPU(struct rt_rw_lock, cpuhp_pin_lock) = \ ++ __RWLOCK_RT_INITIALIZER(cpuhp_pin_lock); ++#endif ++ + #if defined(CONFIG_LOCKDEP) && defined(CONFIG_SMP) + static struct lockdep_map cpuhp_state_up_map = + STATIC_LOCKDEP_MAP_INIT("cpuhp_state-up", &cpuhp_state_up_map); +@@ -286,7 +291,28 @@ static int cpu_hotplug_disabled; + */ + void pin_current_cpu(void) + { ++ struct rt_rw_lock *cpuhp_pin; ++ unsigned int cpu; ++ int ret; ++ ++again: ++ cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); ++ ret = __read_rt_trylock(cpuhp_pin); ++ if (ret) { ++ current->pinned_on_cpu = smp_processor_id(); ++ return; ++ } ++ cpu = smp_processor_id(); ++ preempt_enable(); ++ ++ __read_rt_lock(cpuhp_pin); + ++ preempt_disable(); ++ if (cpu != smp_processor_id()) { ++ __read_rt_unlock(cpuhp_pin); ++ goto again; ++ } ++ current->pinned_on_cpu = cpu; + } + + /** +@@ -294,6 +320,13 @@ void pin_current_cpu(void) + */ + void unpin_current_cpu(void) + { ++ struct rt_rw_lock *cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); ++ ++ if (WARN_ON(current->pinned_on_cpu != smp_processor_id())) ++ cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, current->pinned_on_cpu); ++ ++ current->pinned_on_cpu = -1; ++ __read_rt_unlock(cpuhp_pin); + } + + DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock); +@@ -853,6 +886,7 @@ static int take_cpu_down(void *_param) + + static int takedown_cpu(unsigned int cpu) + { ++ struct rt_rw_lock *cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, cpu); + struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu); + int err; + +@@ -865,11 +899,14 @@ static int takedown_cpu(unsigned int cpu) + */ + irq_lock_sparse(); + ++ __write_rt_lock(cpuhp_pin); ++ + /* + * So now all preempt/rcu users must observe !cpu_active(). + */ + err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu)); + if (err) { ++ __write_rt_unlock(cpuhp_pin); + /* CPU refused to die */ + irq_unlock_sparse(); + /* Unpark the hotplug thread so we can rollback there */ +@@ -888,6 +925,7 @@ static int takedown_cpu(unsigned int cpu) + wait_for_ap_thread(st, false); + BUG_ON(st->state != CPUHP_AP_IDLE_DEAD); + ++ __write_rt_unlock(cpuhp_pin); + /* Interrupts are moved away from the dying cpu, reenable alloc/free */ + irq_unlock_sparse(); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0228-random-Make-it-work-on-rt.patch linux-4.19.118/debian/patches-rt/0228-random-Make-it-work-on-rt.patch --- linux-4.19.98/debian/patches-rt/0228-random-Make-it-work-on-rt.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0228-random-Make-it-work-on-rt.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,167 +0,0 @@ -From 56f7ebec5cf501075c40f3d7ff1283a3279f88ca Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Tue, 21 Aug 2012 20:38:50 +0200 -Subject: [PATCH 228/290] random: Make it work on rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Delegate the random insertion to the forced threaded interrupt -handler. Store the return IP of the hard interrupt handler in the irq -descriptor and feed it into the random generator as a source of -entropy. - -Signed-off-by: Thomas Gleixner ---- - drivers/char/random.c | 11 +++++------ - drivers/hv/hv.c | 4 +++- - drivers/hv/vmbus_drv.c | 4 +++- - include/linux/irqdesc.h | 1 + - include/linux/random.h | 2 +- - kernel/irq/handle.c | 8 +++++++- - kernel/irq/manage.c | 6 ++++++ - 7 files changed, 26 insertions(+), 10 deletions(-) - -diff --git a/drivers/char/random.c b/drivers/char/random.c -index 86fe1df90239..468a128c8ad8 100644 ---- a/drivers/char/random.c -+++ b/drivers/char/random.c -@@ -1232,28 +1232,27 @@ static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs) - return *ptr; - } - --void add_interrupt_randomness(int irq, int irq_flags) -+void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) - { - struct entropy_store *r; - struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); -- struct pt_regs *regs = get_irq_regs(); - unsigned long now = jiffies; - cycles_t cycles = random_get_entropy(); - __u32 c_high, j_high; -- __u64 ip; - unsigned long seed; - int credit = 0; - - if (cycles == 0) -- cycles = get_reg(fast_pool, regs); -+ cycles = get_reg(fast_pool, NULL); - c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; - j_high = (sizeof(now) > 4) ? now >> 32 : 0; - fast_pool->pool[0] ^= cycles ^ j_high ^ irq; - fast_pool->pool[1] ^= now ^ c_high; -- ip = regs ? instruction_pointer(regs) : _RET_IP_; -+ if (!ip) -+ ip = _RET_IP_; - fast_pool->pool[2] ^= ip; - fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 : -- get_reg(fast_pool, regs); -+ get_reg(fast_pool, NULL); - - fast_mix(fast_pool); - add_interrupt_bench(cycles); -diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c -index 12bc9fa21111..278f03f50147 100644 ---- a/drivers/hv/hv.c -+++ b/drivers/hv/hv.c -@@ -112,10 +112,12 @@ int hv_post_message(union hv_connection_id connection_id, - static void hv_stimer0_isr(void) - { - struct hv_per_cpu_context *hv_cpu; -+ struct pt_regs *regs = get_irq_regs(); -+ u64 ip = regs ? instruction_pointer(regs) : 0; - - hv_cpu = this_cpu_ptr(hv_context.cpu_context); - hv_cpu->clk_evt->event_handler(hv_cpu->clk_evt); -- add_interrupt_randomness(stimer0_vector, 0); -+ add_interrupt_randomness(stimer0_vector, 0, ip); - } - - static int hv_ce_set_next_event(unsigned long delta, -diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index 9aa18f387a34..39aaa14993cc 100644 ---- a/drivers/hv/vmbus_drv.c -+++ b/drivers/hv/vmbus_drv.c -@@ -1042,6 +1042,8 @@ static void vmbus_isr(void) - void *page_addr = hv_cpu->synic_event_page; - struct hv_message *msg; - union hv_synic_event_flags *event; -+ struct pt_regs *regs = get_irq_regs(); -+ u64 ip = regs ? instruction_pointer(regs) : 0; - bool handled = false; - - if (unlikely(page_addr == NULL)) -@@ -1085,7 +1087,7 @@ static void vmbus_isr(void) - tasklet_schedule(&hv_cpu->msg_dpc); - } - -- add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0); -+ add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0, ip); - } - - /* -diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h -index 875c41b23f20..ff5eb8d1ede4 100644 ---- a/include/linux/irqdesc.h -+++ b/include/linux/irqdesc.h -@@ -71,6 +71,7 @@ struct irq_desc { - unsigned int irqs_unhandled; - atomic_t threads_handled; - int threads_handled_last; -+ u64 random_ip; - raw_spinlock_t lock; - struct cpumask *percpu_enabled; - const struct cpumask *percpu_affinity; -diff --git a/include/linux/random.h b/include/linux/random.h -index 445a0ea4ff49..a7b7d9f97580 100644 ---- a/include/linux/random.h -+++ b/include/linux/random.h -@@ -32,7 +32,7 @@ static inline void add_latent_entropy(void) {} - - extern void add_input_randomness(unsigned int type, unsigned int code, - unsigned int value) __latent_entropy; --extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy; -+extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) __latent_entropy; - - extern void get_random_bytes(void *buf, int nbytes); - extern int wait_for_random_bytes(void); -diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c -index 38554bc35375..06a80bbf78af 100644 ---- a/kernel/irq/handle.c -+++ b/kernel/irq/handle.c -@@ -185,10 +185,16 @@ irqreturn_t handle_irq_event_percpu(struct irq_desc *desc) - { - irqreturn_t retval; - unsigned int flags = 0; -+ struct pt_regs *regs = get_irq_regs(); -+ u64 ip = regs ? instruction_pointer(regs) : 0; - - retval = __handle_irq_event_percpu(desc, &flags); - -- add_interrupt_randomness(desc->irq_data.irq, flags); -+#ifdef CONFIG_PREEMPT_RT_FULL -+ desc->random_ip = ip; -+#else -+ add_interrupt_randomness(desc->irq_data.irq, flags, ip); -+#endif - - if (!noirqdebug) - note_interrupt(desc, retval); -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 5701774a6d71..ce86341a9e19 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -1110,6 +1110,12 @@ static int irq_thread(void *data) - if (action_ret == IRQ_WAKE_THREAD) - irq_wake_secondary(desc, action); - -+#ifdef CONFIG_PREEMPT_RT_FULL -+ migrate_disable(); -+ add_interrupt_randomness(action->irq, 0, -+ desc->random_ip ^ (unsigned long) action); -+ migrate_enable(); -+#endif - wake_threads_waitq(desc); - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0229-cpu-hotplug-Implement-CPU-pinning.patch linux-4.19.118/debian/patches-rt/0229-cpu-hotplug-Implement-CPU-pinning.patch --- linux-4.19.98/debian/patches-rt/0229-cpu-hotplug-Implement-CPU-pinning.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0229-cpu-hotplug-Implement-CPU-pinning.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -From 42dc365f8f07fc9531d70fcc94605ab25acc2685 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 19 Jul 2017 17:31:20 +0200 -Subject: [PATCH 229/290] cpu/hotplug: Implement CPU pinning -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Signed-off-by: Thomas Gleixner ---- - include/linux/sched.h | 1 + - kernel/cpu.c | 38 ++++++++++++++++++++++++++++++++++++++ - 2 files changed, 39 insertions(+) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 834f46cb258b..4559d8039c45 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -671,6 +671,7 @@ struct task_struct { - #if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) - int migrate_disable; - int migrate_disable_update; -+ int pinned_on_cpu; - # ifdef CONFIG_SCHED_DEBUG - int migrate_disable_atomic; - # endif -diff --git a/kernel/cpu.c b/kernel/cpu.c -index cf1f2eb6bb90..e6c2d814f7f9 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -75,6 +75,11 @@ static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state) = { - .fail = CPUHP_INVALID, - }; - -+#ifdef CONFIG_HOTPLUG_CPU -+static DEFINE_PER_CPU(struct rt_rw_lock, cpuhp_pin_lock) = \ -+ __RWLOCK_RT_INITIALIZER(cpuhp_pin_lock); -+#endif -+ - #if defined(CONFIG_LOCKDEP) && defined(CONFIG_SMP) - static struct lockdep_map cpuhp_state_up_map = - STATIC_LOCKDEP_MAP_INIT("cpuhp_state-up", &cpuhp_state_up_map); -@@ -286,7 +291,28 @@ static int cpu_hotplug_disabled; - */ - void pin_current_cpu(void) - { -+ struct rt_rw_lock *cpuhp_pin; -+ unsigned int cpu; -+ int ret; -+ -+again: -+ cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); -+ ret = __read_rt_trylock(cpuhp_pin); -+ if (ret) { -+ current->pinned_on_cpu = smp_processor_id(); -+ return; -+ } -+ cpu = smp_processor_id(); -+ preempt_enable(); -+ -+ __read_rt_lock(cpuhp_pin); - -+ preempt_disable(); -+ if (cpu != smp_processor_id()) { -+ __read_rt_unlock(cpuhp_pin); -+ goto again; -+ } -+ current->pinned_on_cpu = cpu; - } - - /** -@@ -294,6 +320,13 @@ void pin_current_cpu(void) - */ - void unpin_current_cpu(void) - { -+ struct rt_rw_lock *cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); -+ -+ if (WARN_ON(current->pinned_on_cpu != smp_processor_id())) -+ cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, current->pinned_on_cpu); -+ -+ current->pinned_on_cpu = -1; -+ __read_rt_unlock(cpuhp_pin); - } - - DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock); -@@ -854,6 +887,7 @@ static int take_cpu_down(void *_param) - - static int takedown_cpu(unsigned int cpu) - { -+ struct rt_rw_lock *cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, cpu); - struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu); - int err; - -@@ -866,11 +900,14 @@ static int takedown_cpu(unsigned int cpu) - */ - irq_lock_sparse(); - -+ __write_rt_lock(cpuhp_pin); -+ - /* - * So now all preempt/rcu users must observe !cpu_active(). - */ - err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu)); - if (err) { -+ __write_rt_unlock(cpuhp_pin); - /* CPU refused to die */ - irq_unlock_sparse(); - /* Unpark the hotplug thread so we can rollback there */ -@@ -889,6 +926,7 @@ static int takedown_cpu(unsigned int cpu) - wait_for_ap_thread(st, false); - BUG_ON(st->state != CPUHP_AP_IDLE_DEAD); - -+ __write_rt_unlock(cpuhp_pin); - /* Interrupts are moved away from the dying cpu, reenable alloc/free */ - irq_unlock_sparse(); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0229-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch linux-4.19.118/debian/patches-rt/0229-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch --- linux-4.19.98/debian/patches-rt/0229-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0229-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,39 @@ +From 6c85c9d14af744f5849d8a712a166b3673f5d2fa Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Sun, 19 Aug 2018 08:28:35 +0200 +Subject: [PATCH 229/325] sched: Allow pinned user tasks to be awakened to the + CPU they pinned +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Since commit 7af443ee16976 ("sched/core: Require cpu_active() in +select_task_rq(), for user tasks") select_fallback_rq() will BUG() if +the CPU to which a task has pinned itself and pinned becomes +!cpu_active() while it slept. +The task will continue running on the to-be-removed CPU and will remove +itself from the CPU during takedown_cpu() (while cpuhp_pin_lock will be +acquired) and move to another CPU based on its mask after the +migrate_disable() section has been left. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/sched/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index dcf2deedd3f8..6ef0dcea94d7 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -904,7 +904,7 @@ static inline bool is_cpu_allowed(struct task_struct *p, int cpu) + if (!cpumask_test_cpu(cpu, p->cpus_ptr)) + return false; + +- if (is_per_cpu_kthread(p)) ++ if (is_per_cpu_kthread(p) || __migrate_disabled(p)) + return cpu_online(cpu); + + return cpu_active(cpu); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0230-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch linux-4.19.118/debian/patches-rt/0230-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch --- linux-4.19.98/debian/patches-rt/0230-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0230-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,102 @@ +From a7ad4f3355c842964614bdfec4ab3c08082dc074 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 4 Aug 2017 18:31:00 +0200 +Subject: [PATCH 230/325] hotplug: duct-tape RT-rwlock usage for non-RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +This type is only available on -RT. We need to craft something for +non-RT. Since the only migrate_disable() user is -RT only, there is no +damage. + +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/cpu.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/kernel/cpu.c b/kernel/cpu.c +index e005e64ae30f..948fbcc4d63c 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -75,7 +75,7 @@ static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state) = { + .fail = CPUHP_INVALID, + }; + +-#ifdef CONFIG_HOTPLUG_CPU ++#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PREEMPT_RT_FULL) + static DEFINE_PER_CPU(struct rt_rw_lock, cpuhp_pin_lock) = \ + __RWLOCK_RT_INITIALIZER(cpuhp_pin_lock); + #endif +@@ -291,6 +291,7 @@ static int cpu_hotplug_disabled; + */ + void pin_current_cpu(void) + { ++#ifdef CONFIG_PREEMPT_RT_FULL + struct rt_rw_lock *cpuhp_pin; + unsigned int cpu; + int ret; +@@ -313,6 +314,7 @@ void pin_current_cpu(void) + goto again; + } + current->pinned_on_cpu = cpu; ++#endif + } + + /** +@@ -320,6 +322,7 @@ void pin_current_cpu(void) + */ + void unpin_current_cpu(void) + { ++#ifdef CONFIG_PREEMPT_RT_FULL + struct rt_rw_lock *cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); + + if (WARN_ON(current->pinned_on_cpu != smp_processor_id())) +@@ -327,6 +330,7 @@ void unpin_current_cpu(void) + + current->pinned_on_cpu = -1; + __read_rt_unlock(cpuhp_pin); ++#endif + } + + DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock); +@@ -886,7 +890,9 @@ static int take_cpu_down(void *_param) + + static int takedown_cpu(unsigned int cpu) + { ++#ifdef CONFIG_PREEMPT_RT_FULL + struct rt_rw_lock *cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, cpu); ++#endif + struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu); + int err; + +@@ -899,14 +905,18 @@ static int takedown_cpu(unsigned int cpu) + */ + irq_lock_sparse(); + ++#ifdef CONFIG_PREEMPT_RT_FULL + __write_rt_lock(cpuhp_pin); ++#endif + + /* + * So now all preempt/rcu users must observe !cpu_active(). + */ + err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu)); + if (err) { ++#ifdef CONFIG_PREEMPT_RT_FULL + __write_rt_unlock(cpuhp_pin); ++#endif + /* CPU refused to die */ + irq_unlock_sparse(); + /* Unpark the hotplug thread so we can rollback there */ +@@ -925,7 +935,9 @@ static int takedown_cpu(unsigned int cpu) + wait_for_ap_thread(st, false); + BUG_ON(st->state != CPUHP_AP_IDLE_DEAD); + ++#ifdef CONFIG_PREEMPT_RT_FULL + __write_rt_unlock(cpuhp_pin); ++#endif + /* Interrupts are moved away from the dying cpu, reenable alloc/free */ + irq_unlock_sparse(); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0230-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch linux-4.19.118/debian/patches-rt/0230-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch --- linux-4.19.98/debian/patches-rt/0230-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0230-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -From b4a9b46277740b295834182cfe114d91b0c44e31 Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Sun, 19 Aug 2018 08:28:35 +0200 -Subject: [PATCH 230/290] sched: Allow pinned user tasks to be awakened to the - CPU they pinned -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Since commit 7af443ee16976 ("sched/core: Require cpu_active() in -select_task_rq(), for user tasks") select_fallback_rq() will BUG() if -the CPU to which a task has pinned itself and pinned becomes -!cpu_active() while it slept. -The task will continue running on the to-be-removed CPU and will remove -itself from the CPU during takedown_cpu() (while cpuhp_pin_lock will be -acquired) and move to another CPU based on its mask after the -migrate_disable() section has been left. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/sched/core.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index dcf2deedd3f8..6ef0dcea94d7 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -904,7 +904,7 @@ static inline bool is_cpu_allowed(struct task_struct *p, int cpu) - if (!cpumask_test_cpu(cpu, p->cpus_ptr)) - return false; - -- if (is_per_cpu_kthread(p)) -+ if (is_per_cpu_kthread(p) || __migrate_disabled(p)) - return cpu_online(cpu); - - return cpu_active(cpu); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0231-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch linux-4.19.118/debian/patches-rt/0231-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch --- linux-4.19.98/debian/patches-rt/0231-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0231-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,102 +0,0 @@ -From bd5177f5caaa75365fab66e40f912772cd9da73b Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 4 Aug 2017 18:31:00 +0200 -Subject: [PATCH 231/290] hotplug: duct-tape RT-rwlock usage for non-RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -This type is only available on -RT. We need to craft something for -non-RT. Since the only migrate_disable() user is -RT only, there is no -damage. - -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/cpu.c | 14 +++++++++++++- - 1 file changed, 13 insertions(+), 1 deletion(-) - -diff --git a/kernel/cpu.c b/kernel/cpu.c -index e6c2d814f7f9..c8631e699ce2 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -75,7 +75,7 @@ static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state) = { - .fail = CPUHP_INVALID, - }; - --#ifdef CONFIG_HOTPLUG_CPU -+#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PREEMPT_RT_FULL) - static DEFINE_PER_CPU(struct rt_rw_lock, cpuhp_pin_lock) = \ - __RWLOCK_RT_INITIALIZER(cpuhp_pin_lock); - #endif -@@ -291,6 +291,7 @@ static int cpu_hotplug_disabled; - */ - void pin_current_cpu(void) - { -+#ifdef CONFIG_PREEMPT_RT_FULL - struct rt_rw_lock *cpuhp_pin; - unsigned int cpu; - int ret; -@@ -313,6 +314,7 @@ void pin_current_cpu(void) - goto again; - } - current->pinned_on_cpu = cpu; -+#endif - } - - /** -@@ -320,6 +322,7 @@ void pin_current_cpu(void) - */ - void unpin_current_cpu(void) - { -+#ifdef CONFIG_PREEMPT_RT_FULL - struct rt_rw_lock *cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); - - if (WARN_ON(current->pinned_on_cpu != smp_processor_id())) -@@ -327,6 +330,7 @@ void unpin_current_cpu(void) - - current->pinned_on_cpu = -1; - __read_rt_unlock(cpuhp_pin); -+#endif - } - - DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock); -@@ -887,7 +891,9 @@ static int take_cpu_down(void *_param) - - static int takedown_cpu(unsigned int cpu) - { -+#ifdef CONFIG_PREEMPT_RT_FULL - struct rt_rw_lock *cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, cpu); -+#endif - struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu); - int err; - -@@ -900,14 +906,18 @@ static int takedown_cpu(unsigned int cpu) - */ - irq_lock_sparse(); - -+#ifdef CONFIG_PREEMPT_RT_FULL - __write_rt_lock(cpuhp_pin); -+#endif - - /* - * So now all preempt/rcu users must observe !cpu_active(). - */ - err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu)); - if (err) { -+#ifdef CONFIG_PREEMPT_RT_FULL - __write_rt_unlock(cpuhp_pin); -+#endif - /* CPU refused to die */ - irq_unlock_sparse(); - /* Unpark the hotplug thread so we can rollback there */ -@@ -926,7 +936,9 @@ static int takedown_cpu(unsigned int cpu) - wait_for_ap_thread(st, false); - BUG_ON(st->state != CPUHP_AP_IDLE_DEAD); - -+#ifdef CONFIG_PREEMPT_RT_FULL - __write_rt_unlock(cpuhp_pin); -+#endif - /* Interrupts are moved away from the dying cpu, reenable alloc/free */ - irq_unlock_sparse(); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0231-net-Remove-preemption-disabling-in-netif_rx.patch linux-4.19.118/debian/patches-rt/0231-net-Remove-preemption-disabling-in-netif_rx.patch --- linux-4.19.98/debian/patches-rt/0231-net-Remove-preemption-disabling-in-netif_rx.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0231-net-Remove-preemption-disabling-in-netif_rx.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,71 @@ +From 49d2a425ffed7592c3ab05c01653311d6f2dc878 Mon Sep 17 00:00:00 2001 +From: Priyanka Jain +Date: Thu, 17 May 2012 09:35:11 +0530 +Subject: [PATCH 231/325] net: Remove preemption disabling in netif_rx() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +1)enqueue_to_backlog() (called from netif_rx) should be + bind to a particluar CPU. This can be achieved by + disabling migration. No need to disable preemption + +2)Fixes crash "BUG: scheduling while atomic: ksoftirqd" + in case of RT. + If preemption is disabled, enqueue_to_backog() is called + in atomic context. And if backlog exceeds its count, + kfree_skb() is called. But in RT, kfree_skb() might + gets scheduled out, so it expects non atomic context. + +3)When CONFIG_PREEMPT_RT_FULL is not defined, + migrate_enable(), migrate_disable() maps to + preempt_enable() and preempt_disable(), so no + change in functionality in case of non-RT. + +-Replace preempt_enable(), preempt_disable() with + migrate_enable(), migrate_disable() respectively +-Replace get_cpu(), put_cpu() with get_cpu_light(), + put_cpu_light() respectively + +Signed-off-by: Priyanka Jain +Acked-by: Rajan Srivastava +Cc: +Link: http://lkml.kernel.org/r/1337227511-2271-1-git-send-email-Priyanka.Jain@freescale.com + +Signed-off-by: Thomas Gleixner +--- + net/core/dev.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/net/core/dev.c b/net/core/dev.c +index efebf78b57b2..81174cf6bf9a 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -4489,7 +4489,7 @@ static int netif_rx_internal(struct sk_buff *skb) + struct rps_dev_flow voidflow, *rflow = &voidflow; + int cpu; + +- preempt_disable(); ++ migrate_disable(); + rcu_read_lock(); + + cpu = get_rps_cpu(skb->dev, skb, &rflow); +@@ -4499,14 +4499,14 @@ static int netif_rx_internal(struct sk_buff *skb) + ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); + + rcu_read_unlock(); +- preempt_enable(); ++ migrate_enable(); + } else + #endif + { + unsigned int qtail; + +- ret = enqueue_to_backlog(skb, get_cpu(), &qtail); +- put_cpu(); ++ ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail); ++ put_cpu_light(); + } + return ret; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0232-net-Another-local_irq_disable-kmalloc-headache.patch linux-4.19.118/debian/patches-rt/0232-net-Another-local_irq_disable-kmalloc-headache.patch --- linux-4.19.98/debian/patches-rt/0232-net-Another-local_irq_disable-kmalloc-headache.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0232-net-Another-local_irq_disable-kmalloc-headache.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,65 @@ +From 0b7fd8c1fb0d391cbb75bf3343f4bb1aade387ad Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 26 Sep 2012 16:21:08 +0200 +Subject: [PATCH 232/325] net: Another local_irq_disable/kmalloc headache +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Replace it by a local lock. Though that's pretty inefficient :( + +Signed-off-by: Thomas Gleixner +--- + net/core/skbuff.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/net/core/skbuff.c b/net/core/skbuff.c +index 0629ca89ab74..6ca7cb2b4364 100644 +--- a/net/core/skbuff.c ++++ b/net/core/skbuff.c +@@ -63,6 +63,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -330,6 +331,7 @@ struct napi_alloc_cache { + + static DEFINE_PER_CPU(struct page_frag_cache, netdev_alloc_cache); + static DEFINE_PER_CPU(struct napi_alloc_cache, napi_alloc_cache); ++static DEFINE_LOCAL_IRQ_LOCK(netdev_alloc_lock); + + static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) + { +@@ -337,10 +339,10 @@ static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) + unsigned long flags; + void *data; + +- local_irq_save(flags); ++ local_lock_irqsave(netdev_alloc_lock, flags); + nc = this_cpu_ptr(&netdev_alloc_cache); + data = page_frag_alloc(nc, fragsz, gfp_mask); +- local_irq_restore(flags); ++ local_unlock_irqrestore(netdev_alloc_lock, flags); + return data; + } + +@@ -412,13 +414,13 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int len, + if (sk_memalloc_socks()) + gfp_mask |= __GFP_MEMALLOC; + +- local_irq_save(flags); ++ local_lock_irqsave(netdev_alloc_lock, flags); + + nc = this_cpu_ptr(&netdev_alloc_cache); + data = page_frag_alloc(nc, len, gfp_mask); + pfmemalloc = nc->pfmemalloc; + +- local_irq_restore(flags); ++ local_unlock_irqrestore(netdev_alloc_lock, flags); + + if (unlikely(!data)) + return NULL; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0232-net-Remove-preemption-disabling-in-netif_rx.patch linux-4.19.118/debian/patches-rt/0232-net-Remove-preemption-disabling-in-netif_rx.patch --- linux-4.19.98/debian/patches-rt/0232-net-Remove-preemption-disabling-in-netif_rx.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0232-net-Remove-preemption-disabling-in-netif_rx.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -From 9dcfd3052899233a5c4b7593793005967d025b3f Mon Sep 17 00:00:00 2001 -From: Priyanka Jain -Date: Thu, 17 May 2012 09:35:11 +0530 -Subject: [PATCH 232/290] net: Remove preemption disabling in netif_rx() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -1)enqueue_to_backlog() (called from netif_rx) should be - bind to a particluar CPU. This can be achieved by - disabling migration. No need to disable preemption - -2)Fixes crash "BUG: scheduling while atomic: ksoftirqd" - in case of RT. - If preemption is disabled, enqueue_to_backog() is called - in atomic context. And if backlog exceeds its count, - kfree_skb() is called. But in RT, kfree_skb() might - gets scheduled out, so it expects non atomic context. - -3)When CONFIG_PREEMPT_RT_FULL is not defined, - migrate_enable(), migrate_disable() maps to - preempt_enable() and preempt_disable(), so no - change in functionality in case of non-RT. - --Replace preempt_enable(), preempt_disable() with - migrate_enable(), migrate_disable() respectively --Replace get_cpu(), put_cpu() with get_cpu_light(), - put_cpu_light() respectively - -Signed-off-by: Priyanka Jain -Acked-by: Rajan Srivastava -Cc: -Link: http://lkml.kernel.org/r/1337227511-2271-1-git-send-email-Priyanka.Jain@freescale.com - -Signed-off-by: Thomas Gleixner ---- - net/core/dev.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/net/core/dev.c b/net/core/dev.c -index 950356b8b5b1..ee8cb6d4f6aa 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4499,7 +4499,7 @@ static int netif_rx_internal(struct sk_buff *skb) - struct rps_dev_flow voidflow, *rflow = &voidflow; - int cpu; - -- preempt_disable(); -+ migrate_disable(); - rcu_read_lock(); - - cpu = get_rps_cpu(skb->dev, skb, &rflow); -@@ -4509,14 +4509,14 @@ static int netif_rx_internal(struct sk_buff *skb) - ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); - - rcu_read_unlock(); -- preempt_enable(); -+ migrate_enable(); - } else - #endif - { - unsigned int qtail; - -- ret = enqueue_to_backlog(skb, get_cpu(), &qtail); -- put_cpu(); -+ ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail); -+ put_cpu_light(); - } - return ret; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0233-net-Another-local_irq_disable-kmalloc-headache.patch linux-4.19.118/debian/patches-rt/0233-net-Another-local_irq_disable-kmalloc-headache.patch --- linux-4.19.98/debian/patches-rt/0233-net-Another-local_irq_disable-kmalloc-headache.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0233-net-Another-local_irq_disable-kmalloc-headache.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -From e6babcfe0fa1248a3e14b455738237a4e13b50eb Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 26 Sep 2012 16:21:08 +0200 -Subject: [PATCH 233/290] net: Another local_irq_disable/kmalloc headache -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Replace it by a local lock. Though that's pretty inefficient :( - -Signed-off-by: Thomas Gleixner ---- - net/core/skbuff.c | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -diff --git a/net/core/skbuff.c b/net/core/skbuff.c -index 0629ca89ab74..6ca7cb2b4364 100644 ---- a/net/core/skbuff.c -+++ b/net/core/skbuff.c -@@ -63,6 +63,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -330,6 +331,7 @@ struct napi_alloc_cache { - - static DEFINE_PER_CPU(struct page_frag_cache, netdev_alloc_cache); - static DEFINE_PER_CPU(struct napi_alloc_cache, napi_alloc_cache); -+static DEFINE_LOCAL_IRQ_LOCK(netdev_alloc_lock); - - static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) - { -@@ -337,10 +339,10 @@ static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) - unsigned long flags; - void *data; - -- local_irq_save(flags); -+ local_lock_irqsave(netdev_alloc_lock, flags); - nc = this_cpu_ptr(&netdev_alloc_cache); - data = page_frag_alloc(nc, fragsz, gfp_mask); -- local_irq_restore(flags); -+ local_unlock_irqrestore(netdev_alloc_lock, flags); - return data; - } - -@@ -412,13 +414,13 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, unsigned int len, - if (sk_memalloc_socks()) - gfp_mask |= __GFP_MEMALLOC; - -- local_irq_save(flags); -+ local_lock_irqsave(netdev_alloc_lock, flags); - - nc = this_cpu_ptr(&netdev_alloc_cache); - data = page_frag_alloc(nc, len, gfp_mask); - pfmemalloc = nc->pfmemalloc; - -- local_irq_restore(flags); -+ local_unlock_irqrestore(netdev_alloc_lock, flags); - - if (unlikely(!data)) - return NULL; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0233-net-core-protect-users-of-napi_alloc_cache-against-r.patch linux-4.19.118/debian/patches-rt/0233-net-core-protect-users-of-napi_alloc_cache-against-r.patch --- linux-4.19.98/debian/patches-rt/0233-net-core-protect-users-of-napi_alloc_cache-against-r.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0233-net-core-protect-users-of-napi_alloc_cache-against-r.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,119 @@ +From 6b203654d8df14f8220b6aca13cea79eca4c401e Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 15 Jan 2016 16:33:34 +0100 +Subject: [PATCH 233/325] net/core: protect users of napi_alloc_cache against + reentrance +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On -RT the code running in BH can not be moved to another CPU so CPU +local variable remain local. However the code can be preempted +and another task may enter BH accessing the same CPU using the same +napi_alloc_cache variable. +This patch ensures that each user of napi_alloc_cache uses a local lock. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + net/core/skbuff.c | 25 +++++++++++++++++++------ + 1 file changed, 19 insertions(+), 6 deletions(-) + +diff --git a/net/core/skbuff.c b/net/core/skbuff.c +index 6ca7cb2b4364..c5c0d2095873 100644 +--- a/net/core/skbuff.c ++++ b/net/core/skbuff.c +@@ -332,6 +332,7 @@ struct napi_alloc_cache { + static DEFINE_PER_CPU(struct page_frag_cache, netdev_alloc_cache); + static DEFINE_PER_CPU(struct napi_alloc_cache, napi_alloc_cache); + static DEFINE_LOCAL_IRQ_LOCK(netdev_alloc_lock); ++static DEFINE_LOCAL_IRQ_LOCK(napi_alloc_cache_lock); + + static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) + { +@@ -363,9 +364,13 @@ EXPORT_SYMBOL(netdev_alloc_frag); + + static void *__napi_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) + { +- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); ++ struct napi_alloc_cache *nc; ++ void *data; + +- return page_frag_alloc(&nc->page, fragsz, gfp_mask); ++ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); ++ data = page_frag_alloc(&nc->page, fragsz, gfp_mask); ++ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); ++ return data; + } + + void *napi_alloc_frag(unsigned int fragsz) +@@ -461,9 +466,10 @@ EXPORT_SYMBOL(__netdev_alloc_skb); + struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, + gfp_t gfp_mask) + { +- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); ++ struct napi_alloc_cache *nc; + struct sk_buff *skb; + void *data; ++ bool pfmemalloc; + + len += NET_SKB_PAD + NET_IP_ALIGN; + +@@ -481,7 +487,10 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, + if (sk_memalloc_socks()) + gfp_mask |= __GFP_MEMALLOC; + ++ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + data = page_frag_alloc(&nc->page, len, gfp_mask); ++ pfmemalloc = nc->page.pfmemalloc; ++ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + if (unlikely(!data)) + return NULL; + +@@ -492,7 +501,7 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, + } + + /* use OR instead of assignment to avoid clearing of bits in mask */ +- if (nc->page.pfmemalloc) ++ if (pfmemalloc) + skb->pfmemalloc = 1; + skb->head_frag = 1; + +@@ -724,23 +733,26 @@ void __consume_stateless_skb(struct sk_buff *skb) + + void __kfree_skb_flush(void) + { +- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); ++ struct napi_alloc_cache *nc; + ++ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + /* flush skb_cache if containing objects */ + if (nc->skb_count) { + kmem_cache_free_bulk(skbuff_head_cache, nc->skb_count, + nc->skb_cache); + nc->skb_count = 0; + } ++ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + } + + static inline void _kfree_skb_defer(struct sk_buff *skb) + { +- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); ++ struct napi_alloc_cache *nc; + + /* drop skb->head and call any destructors for packet */ + skb_release_all(skb); + ++ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + /* record skb to CPU local list */ + nc->skb_cache[nc->skb_count++] = skb; + +@@ -755,6 +767,7 @@ static inline void _kfree_skb_defer(struct sk_buff *skb) + nc->skb_cache); + nc->skb_count = 0; + } ++ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); + } + void __kfree_skb_defer(struct sk_buff *skb) + { +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0234-net-core-protect-users-of-napi_alloc_cache-against-r.patch linux-4.19.118/debian/patches-rt/0234-net-core-protect-users-of-napi_alloc_cache-against-r.patch --- linux-4.19.98/debian/patches-rt/0234-net-core-protect-users-of-napi_alloc_cache-against-r.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0234-net-core-protect-users-of-napi_alloc_cache-against-r.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,119 +0,0 @@ -From cf637289b14f736be18788b3ba3160ba35949396 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 15 Jan 2016 16:33:34 +0100 -Subject: [PATCH 234/290] net/core: protect users of napi_alloc_cache against - reentrance -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On -RT the code running in BH can not be moved to another CPU so CPU -local variable remain local. However the code can be preempted -and another task may enter BH accessing the same CPU using the same -napi_alloc_cache variable. -This patch ensures that each user of napi_alloc_cache uses a local lock. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - net/core/skbuff.c | 25 +++++++++++++++++++------ - 1 file changed, 19 insertions(+), 6 deletions(-) - -diff --git a/net/core/skbuff.c b/net/core/skbuff.c -index 6ca7cb2b4364..c5c0d2095873 100644 ---- a/net/core/skbuff.c -+++ b/net/core/skbuff.c -@@ -332,6 +332,7 @@ struct napi_alloc_cache { - static DEFINE_PER_CPU(struct page_frag_cache, netdev_alloc_cache); - static DEFINE_PER_CPU(struct napi_alloc_cache, napi_alloc_cache); - static DEFINE_LOCAL_IRQ_LOCK(netdev_alloc_lock); -+static DEFINE_LOCAL_IRQ_LOCK(napi_alloc_cache_lock); - - static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) - { -@@ -363,9 +364,13 @@ EXPORT_SYMBOL(netdev_alloc_frag); - - static void *__napi_alloc_frag(unsigned int fragsz, gfp_t gfp_mask) - { -- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); -+ struct napi_alloc_cache *nc; -+ void *data; - -- return page_frag_alloc(&nc->page, fragsz, gfp_mask); -+ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); -+ data = page_frag_alloc(&nc->page, fragsz, gfp_mask); -+ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); -+ return data; - } - - void *napi_alloc_frag(unsigned int fragsz) -@@ -461,9 +466,10 @@ EXPORT_SYMBOL(__netdev_alloc_skb); - struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, - gfp_t gfp_mask) - { -- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); -+ struct napi_alloc_cache *nc; - struct sk_buff *skb; - void *data; -+ bool pfmemalloc; - - len += NET_SKB_PAD + NET_IP_ALIGN; - -@@ -481,7 +487,10 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, - if (sk_memalloc_socks()) - gfp_mask |= __GFP_MEMALLOC; - -+ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); - data = page_frag_alloc(&nc->page, len, gfp_mask); -+ pfmemalloc = nc->page.pfmemalloc; -+ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); - if (unlikely(!data)) - return NULL; - -@@ -492,7 +501,7 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, - } - - /* use OR instead of assignment to avoid clearing of bits in mask */ -- if (nc->page.pfmemalloc) -+ if (pfmemalloc) - skb->pfmemalloc = 1; - skb->head_frag = 1; - -@@ -724,23 +733,26 @@ void __consume_stateless_skb(struct sk_buff *skb) - - void __kfree_skb_flush(void) - { -- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); -+ struct napi_alloc_cache *nc; - -+ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); - /* flush skb_cache if containing objects */ - if (nc->skb_count) { - kmem_cache_free_bulk(skbuff_head_cache, nc->skb_count, - nc->skb_cache); - nc->skb_count = 0; - } -+ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); - } - - static inline void _kfree_skb_defer(struct sk_buff *skb) - { -- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); -+ struct napi_alloc_cache *nc; - - /* drop skb->head and call any destructors for packet */ - skb_release_all(skb); - -+ nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache); - /* record skb to CPU local list */ - nc->skb_cache[nc->skb_count++] = skb; - -@@ -755,6 +767,7 @@ static inline void _kfree_skb_defer(struct sk_buff *skb) - nc->skb_cache); - nc->skb_count = 0; - } -+ put_locked_var(napi_alloc_cache_lock, napi_alloc_cache); - } - void __kfree_skb_defer(struct sk_buff *skb) - { --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0234-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch linux-4.19.118/debian/patches-rt/0234-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch --- linux-4.19.98/debian/patches-rt/0234-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0234-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,84 @@ +From 6d3705f90c5a421b590ab921ceec46da6167e5a9 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Sun, 28 Oct 2012 11:18:08 +0100 +Subject: [PATCH 234/325] net: netfilter: Serialize xt_write_recseq sections on + RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The netfilter code relies only on the implicit semantics of +local_bh_disable() for serializing wt_write_recseq sections. RT breaks +that and needs explicit serialization here. + +Reported-by: Peter LaDow +Signed-off-by: Thomas Gleixner +--- + include/linux/netfilter/x_tables.h | 7 +++++++ + net/netfilter/core.c | 6 ++++++ + 2 files changed, 13 insertions(+) + +diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h +index 9077b3ebea08..1710f2aff350 100644 +--- a/include/linux/netfilter/x_tables.h ++++ b/include/linux/netfilter/x_tables.h +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + #include + + /* Test a struct->invflags and a boolean for inequality */ +@@ -345,6 +346,8 @@ void xt_free_table_info(struct xt_table_info *info); + */ + DECLARE_PER_CPU(seqcount_t, xt_recseq); + ++DECLARE_LOCAL_IRQ_LOCK(xt_write_lock); ++ + /* xt_tee_enabled - true if x_tables needs to handle reentrancy + * + * Enabled if current ip(6)tables ruleset has at least one -j TEE rule. +@@ -365,6 +368,9 @@ static inline unsigned int xt_write_recseq_begin(void) + { + unsigned int addend; + ++ /* RT protection */ ++ local_lock(xt_write_lock); ++ + /* + * Low order bit of sequence is set if we already + * called xt_write_recseq_begin(). +@@ -395,6 +401,7 @@ static inline void xt_write_recseq_end(unsigned int addend) + /* this is kind of a write_seqcount_end(), but addend is 0 or 1 */ + smp_wmb(); + __this_cpu_add(xt_recseq.sequence, addend); ++ local_unlock(xt_write_lock); + } + + /* +diff --git a/net/netfilter/core.c b/net/netfilter/core.c +index 93aaec3a54ec..b364cf8e5776 100644 +--- a/net/netfilter/core.c ++++ b/net/netfilter/core.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -27,6 +28,11 @@ + + #include "nf_internals.h" + ++#ifdef CONFIG_PREEMPT_RT_BASE ++DEFINE_LOCAL_IRQ_LOCK(xt_write_lock); ++EXPORT_PER_CPU_SYMBOL(xt_write_lock); ++#endif ++ + const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly; + EXPORT_SYMBOL_GPL(nf_ipv6_ops); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0235-net-Add-a-mutex-around-devnet_rename_seq.patch linux-4.19.118/debian/patches-rt/0235-net-Add-a-mutex-around-devnet_rename_seq.patch --- linux-4.19.98/debian/patches-rt/0235-net-Add-a-mutex-around-devnet_rename_seq.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0235-net-Add-a-mutex-around-devnet_rename_seq.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,113 @@ +From 10dbf1ed93bf3b5e4708bb97a2d690135db04f70 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 20 Mar 2013 18:06:20 +0100 +Subject: [PATCH 235/325] net: Add a mutex around devnet_rename_seq +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On RT write_seqcount_begin() disables preemption and device_rename() +allocates memory with GFP_KERNEL and grabs later the sysfs_mutex +mutex. Serialize with a mutex and add use the non preemption disabling +__write_seqcount_begin(). + +To avoid writer starvation, let the reader grab the mutex and release +it when it detects a writer in progress. This keeps the normal case +(no reader on the fly) fast. + +[ tglx: Instead of replacing the seqcount by a mutex, add the mutex ] + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Thomas Gleixner +--- + net/core/dev.c | 34 ++++++++++++++++++++-------------- + 1 file changed, 20 insertions(+), 14 deletions(-) + +diff --git a/net/core/dev.c b/net/core/dev.c +index 81174cf6bf9a..be33b775565e 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -196,6 +196,7 @@ static unsigned int napi_gen_id = NR_CPUS; + static DEFINE_READ_MOSTLY_HASHTABLE(napi_hash, 8); + + static seqcount_t devnet_rename_seq; ++static DEFINE_MUTEX(devnet_rename_mutex); + + static inline void dev_base_seq_inc(struct net *net) + { +@@ -921,7 +922,8 @@ int netdev_get_name(struct net *net, char *name, int ifindex) + strcpy(name, dev->name); + rcu_read_unlock(); + if (read_seqcount_retry(&devnet_rename_seq, seq)) { +- cond_resched(); ++ mutex_lock(&devnet_rename_mutex); ++ mutex_unlock(&devnet_rename_mutex); + goto retry; + } + +@@ -1198,20 +1200,17 @@ int dev_change_name(struct net_device *dev, const char *newname) + likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK))) + return -EBUSY; + +- write_seqcount_begin(&devnet_rename_seq); ++ mutex_lock(&devnet_rename_mutex); ++ __raw_write_seqcount_begin(&devnet_rename_seq); + +- if (strncmp(newname, dev->name, IFNAMSIZ) == 0) { +- write_seqcount_end(&devnet_rename_seq); +- return 0; +- } ++ if (strncmp(newname, dev->name, IFNAMSIZ) == 0) ++ goto outunlock; + + memcpy(oldname, dev->name, IFNAMSIZ); + + err = dev_get_valid_name(net, dev, newname); +- if (err < 0) { +- write_seqcount_end(&devnet_rename_seq); +- return err; +- } ++ if (err < 0) ++ goto outunlock; + + if (oldname[0] && !strchr(oldname, '%')) + netdev_info(dev, "renamed from %s\n", oldname); +@@ -1224,11 +1223,12 @@ int dev_change_name(struct net_device *dev, const char *newname) + if (ret) { + memcpy(dev->name, oldname, IFNAMSIZ); + dev->name_assign_type = old_assign_type; +- write_seqcount_end(&devnet_rename_seq); +- return ret; ++ err = ret; ++ goto outunlock; + } + +- write_seqcount_end(&devnet_rename_seq); ++ __raw_write_seqcount_end(&devnet_rename_seq); ++ mutex_unlock(&devnet_rename_mutex); + + netdev_adjacent_rename_links(dev, oldname); + +@@ -1249,7 +1249,8 @@ int dev_change_name(struct net_device *dev, const char *newname) + /* err >= 0 after dev_alloc_name() or stores the first errno */ + if (err >= 0) { + err = ret; +- write_seqcount_begin(&devnet_rename_seq); ++ mutex_lock(&devnet_rename_mutex); ++ __raw_write_seqcount_begin(&devnet_rename_seq); + memcpy(dev->name, oldname, IFNAMSIZ); + memcpy(oldname, newname, IFNAMSIZ); + dev->name_assign_type = old_assign_type; +@@ -1262,6 +1263,11 @@ int dev_change_name(struct net_device *dev, const char *newname) + } + + return err; ++ ++outunlock: ++ __raw_write_seqcount_end(&devnet_rename_seq); ++ mutex_unlock(&devnet_rename_mutex); ++ return err; + } + + /** +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0235-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch linux-4.19.118/debian/patches-rt/0235-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch --- linux-4.19.98/debian/patches-rt/0235-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0235-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -From 28b182b074b9bb5ea0707e1f674eae8d576357c7 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Sun, 28 Oct 2012 11:18:08 +0100 -Subject: [PATCH 235/290] net: netfilter: Serialize xt_write_recseq sections on - RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The netfilter code relies only on the implicit semantics of -local_bh_disable() for serializing wt_write_recseq sections. RT breaks -that and needs explicit serialization here. - -Reported-by: Peter LaDow -Signed-off-by: Thomas Gleixner ---- - include/linux/netfilter/x_tables.h | 7 +++++++ - net/netfilter/core.c | 6 ++++++ - 2 files changed, 13 insertions(+) - -diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h -index 9077b3ebea08..1710f2aff350 100644 ---- a/include/linux/netfilter/x_tables.h -+++ b/include/linux/netfilter/x_tables.h -@@ -6,6 +6,7 @@ - #include - #include - #include -+#include - #include - - /* Test a struct->invflags and a boolean for inequality */ -@@ -345,6 +346,8 @@ void xt_free_table_info(struct xt_table_info *info); - */ - DECLARE_PER_CPU(seqcount_t, xt_recseq); - -+DECLARE_LOCAL_IRQ_LOCK(xt_write_lock); -+ - /* xt_tee_enabled - true if x_tables needs to handle reentrancy - * - * Enabled if current ip(6)tables ruleset has at least one -j TEE rule. -@@ -365,6 +368,9 @@ static inline unsigned int xt_write_recseq_begin(void) - { - unsigned int addend; - -+ /* RT protection */ -+ local_lock(xt_write_lock); -+ - /* - * Low order bit of sequence is set if we already - * called xt_write_recseq_begin(). -@@ -395,6 +401,7 @@ static inline void xt_write_recseq_end(unsigned int addend) - /* this is kind of a write_seqcount_end(), but addend is 0 or 1 */ - smp_wmb(); - __this_cpu_add(xt_recseq.sequence, addend); -+ local_unlock(xt_write_lock); - } - - /* -diff --git a/net/netfilter/core.c b/net/netfilter/core.c -index 93aaec3a54ec..b364cf8e5776 100644 ---- a/net/netfilter/core.c -+++ b/net/netfilter/core.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -27,6 +28,11 @@ - - #include "nf_internals.h" - -+#ifdef CONFIG_PREEMPT_RT_BASE -+DEFINE_LOCAL_IRQ_LOCK(xt_write_lock); -+EXPORT_PER_CPU_SYMBOL(xt_write_lock); -+#endif -+ - const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly; - EXPORT_SYMBOL_GPL(nf_ipv6_ops); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0236-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch linux-4.19.118/debian/patches-rt/0236-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch --- linux-4.19.98/debian/patches-rt/0236-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0236-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,62 @@ +From a7433e1568e592ed54f114147646a3ab23d5ce5e Mon Sep 17 00:00:00 2001 +From: Yong Zhang +Date: Mon, 16 Apr 2012 15:01:56 +0800 +Subject: [PATCH 236/325] lockdep: selftest: Only do hardirq context test for + raw spinlock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +On -rt there is no softirq context any more and rwlock is sleepable, +disable softirq context test and rwlock+irq test. + +Signed-off-by: Yong Zhang +Cc: Yong Zhang +Link: http://lkml.kernel.org/r/1334559716-18447-3-git-send-email-yong.zhang0@gmail.com +Signed-off-by: Thomas Gleixner +--- + lib/locking-selftest.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c +index 1e1bbf171eca..5cdf3809905e 100644 +--- a/lib/locking-selftest.c ++++ b/lib/locking-selftest.c +@@ -2057,6 +2057,7 @@ void locking_selftest(void) + + printk(" --------------------------------------------------------------------------\n"); + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * irq-context testcases: + */ +@@ -2069,6 +2070,28 @@ void locking_selftest(void) + + DO_TESTCASE_6x2("irq read-recursion", irq_read_recursion); + // DO_TESTCASE_6x2B("irq read-recursion #2", irq_read_recursion2); ++#else ++ /* On -rt, we only do hardirq context test for raw spinlock */ ++ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 12); ++ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 21); ++ ++ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 12); ++ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 21); ++ ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 123); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 132); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 213); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 231); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 312); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 321); ++ ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 123); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 132); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 213); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 231); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 312); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 321); ++#endif + + ww_tests(); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0236-net-Add-a-mutex-around-devnet_rename_seq.patch linux-4.19.118/debian/patches-rt/0236-net-Add-a-mutex-around-devnet_rename_seq.patch --- linux-4.19.98/debian/patches-rt/0236-net-Add-a-mutex-around-devnet_rename_seq.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0236-net-Add-a-mutex-around-devnet_rename_seq.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,113 +0,0 @@ -From d93ef2fbc7cc016328b4e3cfc2b58960acc4b696 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 20 Mar 2013 18:06:20 +0100 -Subject: [PATCH 236/290] net: Add a mutex around devnet_rename_seq -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On RT write_seqcount_begin() disables preemption and device_rename() -allocates memory with GFP_KERNEL and grabs later the sysfs_mutex -mutex. Serialize with a mutex and add use the non preemption disabling -__write_seqcount_begin(). - -To avoid writer starvation, let the reader grab the mutex and release -it when it detects a writer in progress. This keeps the normal case -(no reader on the fly) fast. - -[ tglx: Instead of replacing the seqcount by a mutex, add the mutex ] - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Thomas Gleixner ---- - net/core/dev.c | 34 ++++++++++++++++++++-------------- - 1 file changed, 20 insertions(+), 14 deletions(-) - -diff --git a/net/core/dev.c b/net/core/dev.c -index ee8cb6d4f6aa..fd54d56e1e7d 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -196,6 +196,7 @@ static unsigned int napi_gen_id = NR_CPUS; - static DEFINE_READ_MOSTLY_HASHTABLE(napi_hash, 8); - - static seqcount_t devnet_rename_seq; -+static DEFINE_MUTEX(devnet_rename_mutex); - - static inline void dev_base_seq_inc(struct net *net) - { -@@ -921,7 +922,8 @@ int netdev_get_name(struct net *net, char *name, int ifindex) - strcpy(name, dev->name); - rcu_read_unlock(); - if (read_seqcount_retry(&devnet_rename_seq, seq)) { -- cond_resched(); -+ mutex_lock(&devnet_rename_mutex); -+ mutex_unlock(&devnet_rename_mutex); - goto retry; - } - -@@ -1198,20 +1200,17 @@ int dev_change_name(struct net_device *dev, const char *newname) - likely(!(dev->priv_flags & IFF_LIVE_RENAME_OK))) - return -EBUSY; - -- write_seqcount_begin(&devnet_rename_seq); -+ mutex_lock(&devnet_rename_mutex); -+ __raw_write_seqcount_begin(&devnet_rename_seq); - -- if (strncmp(newname, dev->name, IFNAMSIZ) == 0) { -- write_seqcount_end(&devnet_rename_seq); -- return 0; -- } -+ if (strncmp(newname, dev->name, IFNAMSIZ) == 0) -+ goto outunlock; - - memcpy(oldname, dev->name, IFNAMSIZ); - - err = dev_get_valid_name(net, dev, newname); -- if (err < 0) { -- write_seqcount_end(&devnet_rename_seq); -- return err; -- } -+ if (err < 0) -+ goto outunlock; - - if (oldname[0] && !strchr(oldname, '%')) - netdev_info(dev, "renamed from %s\n", oldname); -@@ -1224,11 +1223,12 @@ int dev_change_name(struct net_device *dev, const char *newname) - if (ret) { - memcpy(dev->name, oldname, IFNAMSIZ); - dev->name_assign_type = old_assign_type; -- write_seqcount_end(&devnet_rename_seq); -- return ret; -+ err = ret; -+ goto outunlock; - } - -- write_seqcount_end(&devnet_rename_seq); -+ __raw_write_seqcount_end(&devnet_rename_seq); -+ mutex_unlock(&devnet_rename_mutex); - - netdev_adjacent_rename_links(dev, oldname); - -@@ -1249,7 +1249,8 @@ int dev_change_name(struct net_device *dev, const char *newname) - /* err >= 0 after dev_alloc_name() or stores the first errno */ - if (err >= 0) { - err = ret; -- write_seqcount_begin(&devnet_rename_seq); -+ mutex_lock(&devnet_rename_mutex); -+ __raw_write_seqcount_begin(&devnet_rename_seq); - memcpy(dev->name, oldname, IFNAMSIZ); - memcpy(oldname, newname, IFNAMSIZ); - dev->name_assign_type = old_assign_type; -@@ -1262,6 +1263,11 @@ int dev_change_name(struct net_device *dev, const char *newname) - } - - return err; -+ -+outunlock: -+ __raw_write_seqcount_end(&devnet_rename_seq); -+ mutex_unlock(&devnet_rename_mutex); -+ return err; - } - - /** --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0237-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch linux-4.19.118/debian/patches-rt/0237-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch --- linux-4.19.98/debian/patches-rt/0237-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0237-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -From d7695d53a9f2bed0ce8208662ba7f099af5b03ea Mon Sep 17 00:00:00 2001 -From: Yong Zhang -Date: Mon, 16 Apr 2012 15:01:56 +0800 -Subject: [PATCH 237/290] lockdep: selftest: Only do hardirq context test for - raw spinlock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -On -rt there is no softirq context any more and rwlock is sleepable, -disable softirq context test and rwlock+irq test. - -Signed-off-by: Yong Zhang -Cc: Yong Zhang -Link: http://lkml.kernel.org/r/1334559716-18447-3-git-send-email-yong.zhang0@gmail.com -Signed-off-by: Thomas Gleixner ---- - lib/locking-selftest.c | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) - -diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c -index 1e1bbf171eca..5cdf3809905e 100644 ---- a/lib/locking-selftest.c -+++ b/lib/locking-selftest.c -@@ -2057,6 +2057,7 @@ void locking_selftest(void) - - printk(" --------------------------------------------------------------------------\n"); - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * irq-context testcases: - */ -@@ -2069,6 +2070,28 @@ void locking_selftest(void) - - DO_TESTCASE_6x2("irq read-recursion", irq_read_recursion); - // DO_TESTCASE_6x2B("irq read-recursion #2", irq_read_recursion2); -+#else -+ /* On -rt, we only do hardirq context test for raw spinlock */ -+ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 12); -+ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 21); -+ -+ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 12); -+ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 21); -+ -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 123); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 132); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 213); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 231); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 312); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 321); -+ -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 123); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 132); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 213); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 231); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 312); -+ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 321); -+#endif - - ww_tests(); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0237-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch linux-4.19.118/debian/patches-rt/0237-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch --- linux-4.19.98/debian/patches-rt/0237-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0237-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,149 @@ +From 17d81d48ff86eb0c073d5d52660b57dd2b6a3c4c Mon Sep 17 00:00:00 2001 +From: Josh Cartwright +Date: Wed, 28 Jan 2015 13:08:45 -0600 +Subject: [PATCH 237/325] lockdep: selftest: fix warnings due to missing + PREEMPT_RT conditionals +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +"lockdep: Selftest: Only do hardirq context test for raw spinlock" +disabled the execution of certain tests with PREEMPT_RT_FULL, but did +not prevent the tests from still being defined. This leads to warnings +like: + + ./linux/lib/locking-selftest.c:574:1: warning: 'irqsafe1_hard_rlock_12' defined but not used [-Wunused-function] + ./linux/lib/locking-selftest.c:574:1: warning: 'irqsafe1_hard_rlock_21' defined but not used [-Wunused-function] + ./linux/lib/locking-selftest.c:577:1: warning: 'irqsafe1_hard_wlock_12' defined but not used [-Wunused-function] + ./linux/lib/locking-selftest.c:577:1: warning: 'irqsafe1_hard_wlock_21' defined but not used [-Wunused-function] + ./linux/lib/locking-selftest.c:580:1: warning: 'irqsafe1_soft_spin_12' defined but not used [-Wunused-function] + ... + +Fixed by wrapping the test definitions in #ifndef CONFIG_PREEMPT_RT_FULL +conditionals. + + +Signed-off-by: Josh Cartwright +Signed-off-by: Xander Huff +Acked-by: Gratian Crisan +Signed-off-by: Sebastian Andrzej Siewior +--- + lib/locking-selftest.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c +index 5cdf3809905e..32db9532ddd4 100644 +--- a/lib/locking-selftest.c ++++ b/lib/locking-selftest.c +@@ -742,6 +742,8 @@ GENERATE_TESTCASE(init_held_rtmutex); + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock) + +@@ -757,9 +759,12 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * Enabling hardirqs with a softirq-safe lock held: + */ +@@ -792,6 +797,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock) + #undef E1 + #undef E2 + ++#endif ++ + /* + * Enabling irqs with an irq-safe lock held: + */ +@@ -815,6 +822,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock) + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock) + +@@ -830,6 +839,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + +@@ -861,6 +872,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock) + +@@ -876,6 +889,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + #undef E3 +@@ -909,6 +924,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock) + +@@ -924,10 +941,14 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + #undef E3 + ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + /* + * read-lock / write-lock irq inversion. + * +@@ -990,6 +1011,10 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_wlock) + #undef E2 + #undef E3 + ++#endif ++ ++#ifndef CONFIG_PREEMPT_RT_FULL ++ + /* + * read-lock / write-lock recursion that is actually safe. + */ +@@ -1028,6 +1053,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_soft) + #undef E2 + #undef E3 + ++#endif ++ + /* + * read-lock / write-lock recursion that is unsafe. + */ +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0238-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch linux-4.19.118/debian/patches-rt/0238-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch --- linux-4.19.98/debian/patches-rt/0238-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0238-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -From 0bcc13d1f486d89eea4550bd9be5b6607a041a85 Mon Sep 17 00:00:00 2001 -From: Josh Cartwright -Date: Wed, 28 Jan 2015 13:08:45 -0600 -Subject: [PATCH 238/290] lockdep: selftest: fix warnings due to missing - PREEMPT_RT conditionals -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -"lockdep: Selftest: Only do hardirq context test for raw spinlock" -disabled the execution of certain tests with PREEMPT_RT_FULL, but did -not prevent the tests from still being defined. This leads to warnings -like: - - ./linux/lib/locking-selftest.c:574:1: warning: 'irqsafe1_hard_rlock_12' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:574:1: warning: 'irqsafe1_hard_rlock_21' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:577:1: warning: 'irqsafe1_hard_wlock_12' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:577:1: warning: 'irqsafe1_hard_wlock_21' defined but not used [-Wunused-function] - ./linux/lib/locking-selftest.c:580:1: warning: 'irqsafe1_soft_spin_12' defined but not used [-Wunused-function] - ... - -Fixed by wrapping the test definitions in #ifndef CONFIG_PREEMPT_RT_FULL -conditionals. - - -Signed-off-by: Josh Cartwright -Signed-off-by: Xander Huff -Acked-by: Gratian Crisan -Signed-off-by: Sebastian Andrzej Siewior ---- - lib/locking-selftest.c | 27 +++++++++++++++++++++++++++ - 1 file changed, 27 insertions(+) - -diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c -index 5cdf3809905e..32db9532ddd4 100644 ---- a/lib/locking-selftest.c -+++ b/lib/locking-selftest.c -@@ -742,6 +742,8 @@ GENERATE_TESTCASE(init_held_rtmutex); - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock) - -@@ -757,9 +759,12 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_rlock) - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - -+#ifndef CONFIG_PREEMPT_RT_FULL - /* - * Enabling hardirqs with a softirq-safe lock held: - */ -@@ -792,6 +797,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock) - #undef E1 - #undef E2 - -+#endif -+ - /* - * Enabling irqs with an irq-safe lock held: - */ -@@ -815,6 +822,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock) - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock) - -@@ -830,6 +839,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_rlock) - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - -@@ -861,6 +872,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock) - -@@ -876,6 +889,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_rlock) - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - #undef E3 -@@ -909,6 +924,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) - #include "locking-selftest-spin-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin) - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - #include "locking-selftest-rlock-hardirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock) - -@@ -924,10 +941,14 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_rlock) - #include "locking-selftest-wlock-softirq.h" - GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock) - -+#endif -+ - #undef E1 - #undef E2 - #undef E3 - -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - /* - * read-lock / write-lock irq inversion. - * -@@ -990,6 +1011,10 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_inversion_soft_wlock) - #undef E2 - #undef E3 - -+#endif -+ -+#ifndef CONFIG_PREEMPT_RT_FULL -+ - /* - * read-lock / write-lock recursion that is actually safe. - */ -@@ -1028,6 +1053,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_soft) - #undef E2 - #undef E3 - -+#endif -+ - /* - * read-lock / write-lock recursion that is unsafe. - */ --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0238-sched-Add-support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0238-sched-Add-support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0238-sched-Add-support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0238-sched-Add-support-for-lazy-preemption.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,671 @@ +From 457f29371e64b1dbd2b086ba9c2a356d2606ec4a Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 26 Oct 2012 18:50:54 +0100 +Subject: [PATCH 238/325] sched: Add support for lazy preemption +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +It has become an obsession to mitigate the determinism vs. throughput +loss of RT. Looking at the mainline semantics of preemption points +gives a hint why RT sucks throughput wise for ordinary SCHED_OTHER +tasks. One major issue is the wakeup of tasks which are right away +preempting the waking task while the waking task holds a lock on which +the woken task will block right after having preempted the wakee. In +mainline this is prevented due to the implicit preemption disable of +spin/rw_lock held regions. On RT this is not possible due to the fully +preemptible nature of sleeping spinlocks. + +Though for a SCHED_OTHER task preempting another SCHED_OTHER task this +is really not a correctness issue. RT folks are concerned about +SCHED_FIFO/RR tasks preemption and not about the purely fairness +driven SCHED_OTHER preemption latencies. + +So I introduced a lazy preemption mechanism which only applies to +SCHED_OTHER tasks preempting another SCHED_OTHER task. Aside of the +existing preempt_count each tasks sports now a preempt_lazy_count +which is manipulated on lock acquiry and release. This is slightly +incorrect as for lazyness reasons I coupled this on +migrate_disable/enable so some other mechanisms get the same treatment +(e.g. get_cpu_light). + +Now on the scheduler side instead of setting NEED_RESCHED this sets +NEED_RESCHED_LAZY in case of a SCHED_OTHER/SCHED_OTHER preemption and +therefor allows to exit the waking task the lock held region before +the woken task preempts. That also works better for cross CPU wakeups +as the other side can stay in the adaptive spinning loop. + +For RT class preemption there is no change. This simply sets +NEED_RESCHED and forgoes the lazy preemption counter. + + Initial test do not expose any observable latency increasement, but +history shows that I've been proven wrong before :) + +The lazy preemption mode is per default on, but with +CONFIG_SCHED_DEBUG enabled it can be disabled via: + + # echo NO_PREEMPT_LAZY >/sys/kernel/debug/sched_features + +and reenabled via + + # echo PREEMPT_LAZY >/sys/kernel/debug/sched_features + +The test results so far are very machine and workload dependent, but +there is a clear trend that it enhances the non RT workload +performance. + +Signed-off-by: Thomas Gleixner +--- + include/linux/preempt.h | 35 ++++++++++++++- + include/linux/sched.h | 38 +++++++++++++++++ + include/linux/thread_info.h | 12 +++++- + include/linux/trace_events.h | 1 + + kernel/Kconfig.preempt | 6 +++ + kernel/cpu.c | 2 + + kernel/sched/core.c | 83 +++++++++++++++++++++++++++++++++++- + kernel/sched/fair.c | 16 +++---- + kernel/sched/features.h | 3 ++ + kernel/sched/sched.h | 9 ++++ + kernel/trace/trace.c | 36 +++++++++------- + kernel/trace/trace.h | 2 + + kernel/trace/trace_output.c | 14 +++++- + 13 files changed, 228 insertions(+), 29 deletions(-) + +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index ed8413e7140f..9c74a019bf57 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -180,6 +180,20 @@ extern void preempt_count_sub(int val); + #define preempt_count_inc() preempt_count_add(1) + #define preempt_count_dec() preempt_count_sub(1) + ++#ifdef CONFIG_PREEMPT_LAZY ++#define add_preempt_lazy_count(val) do { preempt_lazy_count() += (val); } while (0) ++#define sub_preempt_lazy_count(val) do { preempt_lazy_count() -= (val); } while (0) ++#define inc_preempt_lazy_count() add_preempt_lazy_count(1) ++#define dec_preempt_lazy_count() sub_preempt_lazy_count(1) ++#define preempt_lazy_count() (current_thread_info()->preempt_lazy_count) ++#else ++#define add_preempt_lazy_count(val) do { } while (0) ++#define sub_preempt_lazy_count(val) do { } while (0) ++#define inc_preempt_lazy_count() do { } while (0) ++#define dec_preempt_lazy_count() do { } while (0) ++#define preempt_lazy_count() (0) ++#endif ++ + #ifdef CONFIG_PREEMPT_COUNT + + #define preempt_disable() \ +@@ -188,6 +202,12 @@ do { \ + barrier(); \ + } while (0) + ++#define preempt_lazy_disable() \ ++do { \ ++ inc_preempt_lazy_count(); \ ++ barrier(); \ ++} while (0) ++ + #define sched_preempt_enable_no_resched() \ + do { \ + barrier(); \ +@@ -250,6 +270,13 @@ do { \ + __preempt_schedule(); \ + } while (0) + ++#define preempt_lazy_enable() \ ++do { \ ++ dec_preempt_lazy_count(); \ ++ barrier(); \ ++ preempt_check_resched(); \ ++} while (0) ++ + #else /* !CONFIG_PREEMPT */ + #define preempt_enable() \ + do { \ +@@ -257,6 +284,12 @@ do { \ + preempt_count_dec(); \ + } while (0) + ++#define preempt_lazy_enable() \ ++do { \ ++ dec_preempt_lazy_count(); \ ++ barrier(); \ ++} while (0) ++ + #define preempt_enable_notrace() \ + do { \ + barrier(); \ +@@ -323,7 +356,7 @@ do { \ + } while (0) + #define preempt_fold_need_resched() \ + do { \ +- if (tif_need_resched()) \ ++ if (tif_need_resched_now()) \ + set_preempt_need_resched(); \ + } while (0) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index fc9300d0787d..a8ebd49c4f96 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -1733,6 +1733,44 @@ static inline int test_tsk_need_resched(struct task_struct *tsk) + return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); + } + ++#ifdef CONFIG_PREEMPT_LAZY ++static inline void set_tsk_need_resched_lazy(struct task_struct *tsk) ++{ ++ set_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); ++} ++ ++static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) ++{ ++ clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); ++} ++ ++static inline int test_tsk_need_resched_lazy(struct task_struct *tsk) ++{ ++ return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY)); ++} ++ ++static inline int need_resched_lazy(void) ++{ ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++} ++ ++static inline int need_resched_now(void) ++{ ++ return test_thread_flag(TIF_NEED_RESCHED); ++} ++ ++#else ++static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) { } ++static inline int need_resched_lazy(void) { return 0; } ++ ++static inline int need_resched_now(void) ++{ ++ return test_thread_flag(TIF_NEED_RESCHED); ++} ++ ++#endif ++ ++ + static inline bool __task_is_stopped_or_traced(struct task_struct *task) + { + if (task->state & (__TASK_STOPPED | __TASK_TRACED)) +diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h +index 8d8821b3689a..d3fcab20d2a3 100644 +--- a/include/linux/thread_info.h ++++ b/include/linux/thread_info.h +@@ -97,7 +97,17 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag) + #define test_thread_flag(flag) \ + test_ti_thread_flag(current_thread_info(), flag) + +-#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) ++#ifdef CONFIG_PREEMPT_LAZY ++#define tif_need_resched() (test_thread_flag(TIF_NEED_RESCHED) || \ ++ test_thread_flag(TIF_NEED_RESCHED_LAZY)) ++#define tif_need_resched_now() (test_thread_flag(TIF_NEED_RESCHED)) ++#define tif_need_resched_lazy() test_thread_flag(TIF_NEED_RESCHED_LAZY)) ++ ++#else ++#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) ++#define tif_need_resched_now() test_thread_flag(TIF_NEED_RESCHED) ++#define tif_need_resched_lazy() 0 ++#endif + + #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES + static inline int arch_within_stack_frames(const void * const stack, +diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h +index 1cc4d2da954c..72864a11cec0 100644 +--- a/include/linux/trace_events.h ++++ b/include/linux/trace_events.h +@@ -64,6 +64,7 @@ struct trace_entry { + int pid; + unsigned short migrate_disable; + unsigned short padding; ++ unsigned char preempt_lazy_count; + }; + + #define TRACE_EVENT_TYPE_MAX \ +diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt +index 907d72b3ba95..306567f72a3e 100644 +--- a/kernel/Kconfig.preempt ++++ b/kernel/Kconfig.preempt +@@ -6,6 +6,12 @@ config PREEMPT_RT_BASE + bool + select PREEMPT + ++config HAVE_PREEMPT_LAZY ++ bool ++ ++config PREEMPT_LAZY ++ def_bool y if HAVE_PREEMPT_LAZY && PREEMPT_RT_FULL ++ + choice + prompt "Preemption Model" + default PREEMPT_NONE +diff --git a/kernel/cpu.c b/kernel/cpu.c +index 948fbcc4d63c..1541189f417b 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -304,11 +304,13 @@ void pin_current_cpu(void) + return; + } + cpu = smp_processor_id(); ++ preempt_lazy_enable(); + preempt_enable(); + + __read_rt_lock(cpuhp_pin); + + preempt_disable(); ++ preempt_lazy_disable(); + if (cpu != smp_processor_id()) { + __read_rt_unlock(cpuhp_pin); + goto again; +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 6ef0dcea94d7..a17c765d3fcb 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -493,6 +493,48 @@ void resched_curr(struct rq *rq) + trace_sched_wake_idle_without_ipi(cpu); + } + ++#ifdef CONFIG_PREEMPT_LAZY ++ ++static int tsk_is_polling(struct task_struct *p) ++{ ++#ifdef TIF_POLLING_NRFLAG ++ return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); ++#else ++ return 0; ++#endif ++} ++ ++void resched_curr_lazy(struct rq *rq) ++{ ++ struct task_struct *curr = rq->curr; ++ int cpu; ++ ++ if (!sched_feat(PREEMPT_LAZY)) { ++ resched_curr(rq); ++ return; ++ } ++ ++ lockdep_assert_held(&rq->lock); ++ ++ if (test_tsk_need_resched(curr)) ++ return; ++ ++ if (test_tsk_need_resched_lazy(curr)) ++ return; ++ ++ set_tsk_need_resched_lazy(curr); ++ ++ cpu = cpu_of(rq); ++ if (cpu == smp_processor_id()) ++ return; ++ ++ /* NEED_RESCHED_LAZY must be visible before we test polling */ ++ smp_mb(); ++ if (!tsk_is_polling(curr)) ++ smp_send_reschedule(cpu); ++} ++#endif ++ + void resched_cpu(int cpu) + { + struct rq *rq = cpu_rq(cpu); +@@ -2405,6 +2447,9 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) + p->on_cpu = 0; + #endif + init_task_preempt_count(p); ++#ifdef CONFIG_HAVE_PREEMPT_LAZY ++ task_thread_info(p)->preempt_lazy_count = 0; ++#endif + #ifdef CONFIG_SMP + plist_node_init(&p->pushable_tasks, MAX_PRIO); + RB_CLEAR_NODE(&p->pushable_dl_tasks); +@@ -3513,6 +3558,7 @@ static void __sched notrace __schedule(bool preempt) + + next = pick_next_task(rq, prev, &rf); + clear_tsk_need_resched(prev); ++ clear_tsk_need_resched_lazy(prev); + clear_preempt_need_resched(); + + if (likely(prev != next)) { +@@ -3693,6 +3739,30 @@ static void __sched notrace preempt_schedule_common(void) + } while (need_resched()); + } + ++#ifdef CONFIG_PREEMPT_LAZY ++/* ++ * If TIF_NEED_RESCHED is then we allow to be scheduled away since this is ++ * set by a RT task. Oterwise we try to avoid beeing scheduled out as long as ++ * preempt_lazy_count counter >0. ++ */ ++static __always_inline int preemptible_lazy(void) ++{ ++ if (test_thread_flag(TIF_NEED_RESCHED)) ++ return 1; ++ if (current_thread_info()->preempt_lazy_count) ++ return 0; ++ return 1; ++} ++ ++#else ++ ++static inline int preemptible_lazy(void) ++{ ++ return 1; ++} ++ ++#endif ++ + #ifdef CONFIG_PREEMPT + /* + * this is the entry point to schedule() from in-kernel preemption +@@ -3707,7 +3777,8 @@ asmlinkage __visible void __sched notrace preempt_schedule(void) + */ + if (likely(!preemptible())) + return; +- ++ if (!preemptible_lazy()) ++ return; + preempt_schedule_common(); + } + NOKPROBE_SYMBOL(preempt_schedule); +@@ -3734,6 +3805,9 @@ asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) + if (likely(!preemptible())) + return; + ++ if (!preemptible_lazy()) ++ return; ++ + do { + /* + * Because the function tracer can trace preempt_count_sub() +@@ -5503,7 +5577,9 @@ void init_idle(struct task_struct *idle, int cpu) + + /* Set the preempt count _outside_ the spinlocks! */ + init_idle_preempt_count(idle, cpu); +- ++#ifdef CONFIG_HAVE_PREEMPT_LAZY ++ task_thread_info(idle)->preempt_lazy_count = 0; ++#endif + /* + * The idle tasks have their own, simple scheduling class: + */ +@@ -7228,6 +7304,7 @@ void migrate_disable(void) + } + + preempt_disable(); ++ preempt_lazy_disable(); + pin_current_cpu(); + + migrate_disable_update_cpus_allowed(p); +@@ -7295,6 +7372,7 @@ void migrate_enable(void) + arg.dest_cpu = dest_cpu; + + unpin_current_cpu(); ++ preempt_lazy_enable(); + preempt_enable(); + stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); + tlb_migrate_finish(p->mm); +@@ -7303,6 +7381,7 @@ void migrate_enable(void) + } + } + unpin_current_cpu(); ++ preempt_lazy_enable(); + preempt_enable(); + } + EXPORT_SYMBOL(migrate_enable); +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index fe58e95484cf..ef7dea404f26 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -4104,7 +4104,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) + ideal_runtime = sched_slice(cfs_rq, curr); + delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; + if (delta_exec > ideal_runtime) { +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + /* + * The current task ran long enough, ensure it doesn't get + * re-elected due to buddy favours. +@@ -4128,7 +4128,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) + return; + + if (delta > ideal_runtime) +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + } + + static void +@@ -4270,7 +4270,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) + * validating it and just reschedule. + */ + if (queued) { +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + return; + } + /* +@@ -4404,7 +4404,7 @@ static void __account_cfs_rq_runtime(struct cfs_rq *cfs_rq, u64 delta_exec) + * hierarchy can be throttled + */ + if (!assign_cfs_rq_runtime(cfs_rq) && likely(cfs_rq->curr)) +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + } + + static __always_inline +@@ -5112,7 +5112,7 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) + + if (delta < 0) { + if (rq->curr == p) +- resched_curr(rq); ++ resched_curr_lazy(rq); + return; + } + hrtick_start(rq, delta); +@@ -6705,7 +6705,7 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ + return; + + preempt: +- resched_curr(rq); ++ resched_curr_lazy(rq); + /* + * Only set the backward buddy when the current task is still + * on the rq. This can happen when a wakeup gets interleaved +@@ -9826,7 +9826,7 @@ static void task_fork_fair(struct task_struct *p) + * 'current' within the tree based on its new key value. + */ + swap(curr->vruntime, se->vruntime); +- resched_curr(rq); ++ resched_curr_lazy(rq); + } + + se->vruntime -= cfs_rq->min_vruntime; +@@ -9850,7 +9850,7 @@ prio_changed_fair(struct rq *rq, struct task_struct *p, int oldprio) + */ + if (rq->curr == p) { + if (p->prio > oldprio) +- resched_curr(rq); ++ resched_curr_lazy(rq); + } else + check_preempt_curr(rq, p, 0); + } +diff --git a/kernel/sched/features.h b/kernel/sched/features.h +index 68de18405857..12a12be6770b 100644 +--- a/kernel/sched/features.h ++++ b/kernel/sched/features.h +@@ -48,6 +48,9 @@ SCHED_FEAT(NONTASK_CAPACITY, true) + + #ifdef CONFIG_PREEMPT_RT_FULL + SCHED_FEAT(TTWU_QUEUE, false) ++# ifdef CONFIG_PREEMPT_LAZY ++SCHED_FEAT(PREEMPT_LAZY, true) ++# endif + #else + + /* +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index c79e32488940..c90574112bca 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -1634,6 +1634,15 @@ extern void reweight_task(struct task_struct *p, int prio); + extern void resched_curr(struct rq *rq); + extern void resched_cpu(int cpu); + ++#ifdef CONFIG_PREEMPT_LAZY ++extern void resched_curr_lazy(struct rq *rq); ++#else ++static inline void resched_curr_lazy(struct rq *rq) ++{ ++ resched_curr(rq); ++} ++#endif ++ + extern struct rt_bandwidth def_rt_bandwidth; + extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime); + +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index 1fac8a2de78f..89d54ed4f9a7 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -2139,6 +2139,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, + struct task_struct *tsk = current; + + entry->preempt_count = pc & 0xff; ++ entry->preempt_lazy_count = preempt_lazy_count(); + entry->pid = (tsk) ? tsk->pid : 0; + entry->flags = + #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT +@@ -2149,7 +2150,8 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, + ((pc & NMI_MASK ) ? TRACE_FLAG_NMI : 0) | + ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | + ((pc & SOFTIRQ_OFFSET) ? TRACE_FLAG_SOFTIRQ : 0) | +- (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | ++ (tif_need_resched_now() ? TRACE_FLAG_NEED_RESCHED : 0) | ++ (need_resched_lazy() ? TRACE_FLAG_NEED_RESCHED_LAZY : 0) | + (test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0); + + entry->migrate_disable = (tsk) ? __migrate_disabled(tsk) & 0xFF : 0; +@@ -3351,15 +3353,17 @@ get_total_entries(struct trace_buffer *buf, + + static void print_lat_help_header(struct seq_file *m) + { +- seq_puts(m, "# _------=> CPU# \n" +- "# / _-----=> irqs-off \n" +- "# | / _----=> need-resched \n" +- "# || / _---=> hardirq/softirq \n" +- "# ||| / _--=> preempt-depth \n" +- "# |||| / _--=> migrate-disable\n" +- "# ||||| / delay \n" +- "# cmd pid |||||| time | caller \n" +- "# \\ / ||||| \\ | / \n"); ++ seq_puts(m, "# _--------=> CPU# \n" ++ "# / _-------=> irqs-off \n" ++ "# | / _------=> need-resched \n" ++ "# || / _-----=> need-resched_lazy \n" ++ "# ||| / _----=> hardirq/softirq \n" ++ "# |||| / _---=> preempt-depth \n" ++ "# ||||| / _--=> preempt-lazy-depth\n" ++ "# |||||| / _-=> migrate-disable \n" ++ "# ||||||| / delay \n" ++ "# cmd pid |||||||| time | caller \n" ++ "# \\ / |||||||| \\ | / \n"); + } + + static void print_event_info(struct trace_buffer *buf, struct seq_file *m) +@@ -3397,15 +3401,17 @@ static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file + tgid ? tgid_space : space); + seq_printf(m, "# %s / _----=> need-resched\n", + tgid ? tgid_space : space); +- seq_printf(m, "# %s| / _---=> hardirq/softirq\n", ++ seq_printf(m, "# %s| / _---=> need-resched_lazy\n", + tgid ? tgid_space : space); +- seq_printf(m, "# %s|| / _--=> preempt-depth\n", ++ seq_printf(m, "# %s|| / _--=> hardirq/softirq\n", + tgid ? tgid_space : space); +- seq_printf(m, "# %s||| / delay\n", ++ seq_printf(m, "# %s||| / preempt-depth\n", + tgid ? tgid_space : space); +- seq_printf(m, "# TASK-PID %sCPU# |||| TIMESTAMP FUNCTION\n", ++ seq_printf(m, "# %s|||| / delay\n", ++ tgid ? tgid_space : space); ++ seq_printf(m, "# TASK-PID %sCPU# ||||| TIMESTAMP FUNCTION\n", + tgid ? " TGID " : space); +- seq_printf(m, "# | | %s | |||| | |\n", ++ seq_printf(m, "# | | %s | ||||| | |\n", + tgid ? " | " : space); + } + +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index ee0c6a313ed1..5986f494e2b0 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -127,6 +127,7 @@ struct kretprobe_trace_entry_head { + * NEED_RESCHED - reschedule is requested + * HARDIRQ - inside an interrupt handler + * SOFTIRQ - inside a softirq handler ++ * NEED_RESCHED_LAZY - lazy reschedule is requested + */ + enum trace_flag_type { + TRACE_FLAG_IRQS_OFF = 0x01, +@@ -136,6 +137,7 @@ enum trace_flag_type { + TRACE_FLAG_SOFTIRQ = 0x10, + TRACE_FLAG_PREEMPT_RESCHED = 0x20, + TRACE_FLAG_NMI = 0x40, ++ TRACE_FLAG_NEED_RESCHED_LAZY = 0x80, + }; + + #define TRACE_BUF_SIZE 1024 +diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c +index 46c96744f09d..3f78b0afb729 100644 +--- a/kernel/trace/trace_output.c ++++ b/kernel/trace/trace_output.c +@@ -448,6 +448,7 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) + { + char hardsoft_irq; + char need_resched; ++ char need_resched_lazy; + char irqs_off; + int hardirq; + int softirq; +@@ -478,6 +479,9 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) + break; + } + ++ need_resched_lazy = ++ (entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.'; ++ + hardsoft_irq = + (nmi && hardirq) ? 'Z' : + nmi ? 'z' : +@@ -486,14 +490,20 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) + softirq ? 's' : + '.' ; + +- trace_seq_printf(s, "%c%c%c", +- irqs_off, need_resched, hardsoft_irq); ++ trace_seq_printf(s, "%c%c%c%c", ++ irqs_off, need_resched, need_resched_lazy, ++ hardsoft_irq); + + if (entry->preempt_count) + trace_seq_printf(s, "%x", entry->preempt_count); + else + trace_seq_putc(s, '.'); + ++ if (entry->preempt_lazy_count) ++ trace_seq_printf(s, "%x", entry->preempt_lazy_count); ++ else ++ trace_seq_putc(s, '.'); ++ + if (entry->migrate_disable) + trace_seq_printf(s, "%x", entry->migrate_disable); + else +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0239-ftrace-Fix-trace-header-alignment.patch linux-4.19.118/debian/patches-rt/0239-ftrace-Fix-trace-header-alignment.patch --- linux-4.19.98/debian/patches-rt/0239-ftrace-Fix-trace-header-alignment.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0239-ftrace-Fix-trace-header-alignment.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,52 @@ +From 64b09bacabda019a04a3a3186650578b7a6c9ea6 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Sun, 16 Oct 2016 05:08:30 +0200 +Subject: [PATCH 239/325] ftrace: Fix trace header alignment +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Line up helper arrows to the right column. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Mike Galbraith +[bigeasy: fixup function tracer header] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/trace/trace.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index 89d54ed4f9a7..1d7fc29ac791 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -3353,17 +3353,17 @@ get_total_entries(struct trace_buffer *buf, + + static void print_lat_help_header(struct seq_file *m) + { +- seq_puts(m, "# _--------=> CPU# \n" +- "# / _-------=> irqs-off \n" +- "# | / _------=> need-resched \n" +- "# || / _-----=> need-resched_lazy \n" +- "# ||| / _----=> hardirq/softirq \n" +- "# |||| / _---=> preempt-depth \n" +- "# ||||| / _--=> preempt-lazy-depth\n" +- "# |||||| / _-=> migrate-disable \n" +- "# ||||||| / delay \n" +- "# cmd pid |||||||| time | caller \n" +- "# \\ / |||||||| \\ | / \n"); ++ seq_puts(m, "# _--------=> CPU# \n" ++ "# / _-------=> irqs-off \n" ++ "# | / _------=> need-resched \n" ++ "# || / _-----=> need-resched_lazy \n" ++ "# ||| / _----=> hardirq/softirq \n" ++ "# |||| / _---=> preempt-depth \n" ++ "# ||||| / _--=> preempt-lazy-depth\n" ++ "# |||||| / _-=> migrate-disable \n" ++ "# ||||||| / delay \n" ++ "# cmd pid |||||||| time | caller \n" ++ "# \\ / |||||||| \\ | / \n"); + } + + static void print_event_info(struct trace_buffer *buf, struct seq_file *m) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0239-sched-Add-support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0239-sched-Add-support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0239-sched-Add-support-for-lazy-preemption.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0239-sched-Add-support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,671 +0,0 @@ -From 0ea3e027332a92b240723b63d08f875461e0c208 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 26 Oct 2012 18:50:54 +0100 -Subject: [PATCH 239/290] sched: Add support for lazy preemption -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -It has become an obsession to mitigate the determinism vs. throughput -loss of RT. Looking at the mainline semantics of preemption points -gives a hint why RT sucks throughput wise for ordinary SCHED_OTHER -tasks. One major issue is the wakeup of tasks which are right away -preempting the waking task while the waking task holds a lock on which -the woken task will block right after having preempted the wakee. In -mainline this is prevented due to the implicit preemption disable of -spin/rw_lock held regions. On RT this is not possible due to the fully -preemptible nature of sleeping spinlocks. - -Though for a SCHED_OTHER task preempting another SCHED_OTHER task this -is really not a correctness issue. RT folks are concerned about -SCHED_FIFO/RR tasks preemption and not about the purely fairness -driven SCHED_OTHER preemption latencies. - -So I introduced a lazy preemption mechanism which only applies to -SCHED_OTHER tasks preempting another SCHED_OTHER task. Aside of the -existing preempt_count each tasks sports now a preempt_lazy_count -which is manipulated on lock acquiry and release. This is slightly -incorrect as for lazyness reasons I coupled this on -migrate_disable/enable so some other mechanisms get the same treatment -(e.g. get_cpu_light). - -Now on the scheduler side instead of setting NEED_RESCHED this sets -NEED_RESCHED_LAZY in case of a SCHED_OTHER/SCHED_OTHER preemption and -therefor allows to exit the waking task the lock held region before -the woken task preempts. That also works better for cross CPU wakeups -as the other side can stay in the adaptive spinning loop. - -For RT class preemption there is no change. This simply sets -NEED_RESCHED and forgoes the lazy preemption counter. - - Initial test do not expose any observable latency increasement, but -history shows that I've been proven wrong before :) - -The lazy preemption mode is per default on, but with -CONFIG_SCHED_DEBUG enabled it can be disabled via: - - # echo NO_PREEMPT_LAZY >/sys/kernel/debug/sched_features - -and reenabled via - - # echo PREEMPT_LAZY >/sys/kernel/debug/sched_features - -The test results so far are very machine and workload dependent, but -there is a clear trend that it enhances the non RT workload -performance. - -Signed-off-by: Thomas Gleixner ---- - include/linux/preempt.h | 35 ++++++++++++++- - include/linux/sched.h | 38 +++++++++++++++++ - include/linux/thread_info.h | 12 +++++- - include/linux/trace_events.h | 1 + - kernel/Kconfig.preempt | 6 +++ - kernel/cpu.c | 2 + - kernel/sched/core.c | 83 +++++++++++++++++++++++++++++++++++- - kernel/sched/fair.c | 16 +++---- - kernel/sched/features.h | 3 ++ - kernel/sched/sched.h | 9 ++++ - kernel/trace/trace.c | 36 +++++++++------- - kernel/trace/trace.h | 2 + - kernel/trace/trace_output.c | 14 +++++- - 13 files changed, 228 insertions(+), 29 deletions(-) - -diff --git a/include/linux/preempt.h b/include/linux/preempt.h -index ed8413e7140f..9c74a019bf57 100644 ---- a/include/linux/preempt.h -+++ b/include/linux/preempt.h -@@ -180,6 +180,20 @@ extern void preempt_count_sub(int val); - #define preempt_count_inc() preempt_count_add(1) - #define preempt_count_dec() preempt_count_sub(1) - -+#ifdef CONFIG_PREEMPT_LAZY -+#define add_preempt_lazy_count(val) do { preempt_lazy_count() += (val); } while (0) -+#define sub_preempt_lazy_count(val) do { preempt_lazy_count() -= (val); } while (0) -+#define inc_preempt_lazy_count() add_preempt_lazy_count(1) -+#define dec_preempt_lazy_count() sub_preempt_lazy_count(1) -+#define preempt_lazy_count() (current_thread_info()->preempt_lazy_count) -+#else -+#define add_preempt_lazy_count(val) do { } while (0) -+#define sub_preempt_lazy_count(val) do { } while (0) -+#define inc_preempt_lazy_count() do { } while (0) -+#define dec_preempt_lazy_count() do { } while (0) -+#define preempt_lazy_count() (0) -+#endif -+ - #ifdef CONFIG_PREEMPT_COUNT - - #define preempt_disable() \ -@@ -188,6 +202,12 @@ do { \ - barrier(); \ - } while (0) - -+#define preempt_lazy_disable() \ -+do { \ -+ inc_preempt_lazy_count(); \ -+ barrier(); \ -+} while (0) -+ - #define sched_preempt_enable_no_resched() \ - do { \ - barrier(); \ -@@ -250,6 +270,13 @@ do { \ - __preempt_schedule(); \ - } while (0) - -+#define preempt_lazy_enable() \ -+do { \ -+ dec_preempt_lazy_count(); \ -+ barrier(); \ -+ preempt_check_resched(); \ -+} while (0) -+ - #else /* !CONFIG_PREEMPT */ - #define preempt_enable() \ - do { \ -@@ -257,6 +284,12 @@ do { \ - preempt_count_dec(); \ - } while (0) - -+#define preempt_lazy_enable() \ -+do { \ -+ dec_preempt_lazy_count(); \ -+ barrier(); \ -+} while (0) -+ - #define preempt_enable_notrace() \ - do { \ - barrier(); \ -@@ -323,7 +356,7 @@ do { \ - } while (0) - #define preempt_fold_need_resched() \ - do { \ -- if (tif_need_resched()) \ -+ if (tif_need_resched_now()) \ - set_preempt_need_resched(); \ - } while (0) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 4559d8039c45..d2386fa9ed0f 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1733,6 +1733,44 @@ static inline int test_tsk_need_resched(struct task_struct *tsk) - return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); - } - -+#ifdef CONFIG_PREEMPT_LAZY -+static inline void set_tsk_need_resched_lazy(struct task_struct *tsk) -+{ -+ set_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); -+} -+ -+static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) -+{ -+ clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); -+} -+ -+static inline int test_tsk_need_resched_lazy(struct task_struct *tsk) -+{ -+ return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY)); -+} -+ -+static inline int need_resched_lazy(void) -+{ -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+} -+ -+static inline int need_resched_now(void) -+{ -+ return test_thread_flag(TIF_NEED_RESCHED); -+} -+ -+#else -+static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) { } -+static inline int need_resched_lazy(void) { return 0; } -+ -+static inline int need_resched_now(void) -+{ -+ return test_thread_flag(TIF_NEED_RESCHED); -+} -+ -+#endif -+ -+ - static inline bool __task_is_stopped_or_traced(struct task_struct *task) - { - if (task->state & (__TASK_STOPPED | __TASK_TRACED)) -diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h -index 8d8821b3689a..d3fcab20d2a3 100644 ---- a/include/linux/thread_info.h -+++ b/include/linux/thread_info.h -@@ -97,7 +97,17 @@ static inline int test_ti_thread_flag(struct thread_info *ti, int flag) - #define test_thread_flag(flag) \ - test_ti_thread_flag(current_thread_info(), flag) - --#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) -+#ifdef CONFIG_PREEMPT_LAZY -+#define tif_need_resched() (test_thread_flag(TIF_NEED_RESCHED) || \ -+ test_thread_flag(TIF_NEED_RESCHED_LAZY)) -+#define tif_need_resched_now() (test_thread_flag(TIF_NEED_RESCHED)) -+#define tif_need_resched_lazy() test_thread_flag(TIF_NEED_RESCHED_LAZY)) -+ -+#else -+#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) -+#define tif_need_resched_now() test_thread_flag(TIF_NEED_RESCHED) -+#define tif_need_resched_lazy() 0 -+#endif - - #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES - static inline int arch_within_stack_frames(const void * const stack, -diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h -index 1cc4d2da954c..72864a11cec0 100644 ---- a/include/linux/trace_events.h -+++ b/include/linux/trace_events.h -@@ -64,6 +64,7 @@ struct trace_entry { - int pid; - unsigned short migrate_disable; - unsigned short padding; -+ unsigned char preempt_lazy_count; - }; - - #define TRACE_EVENT_TYPE_MAX \ -diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt -index 907d72b3ba95..306567f72a3e 100644 ---- a/kernel/Kconfig.preempt -+++ b/kernel/Kconfig.preempt -@@ -6,6 +6,12 @@ config PREEMPT_RT_BASE - bool - select PREEMPT - -+config HAVE_PREEMPT_LAZY -+ bool -+ -+config PREEMPT_LAZY -+ def_bool y if HAVE_PREEMPT_LAZY && PREEMPT_RT_FULL -+ - choice - prompt "Preemption Model" - default PREEMPT_NONE -diff --git a/kernel/cpu.c b/kernel/cpu.c -index c8631e699ce2..00dac381da2e 100644 ---- a/kernel/cpu.c -+++ b/kernel/cpu.c -@@ -304,11 +304,13 @@ void pin_current_cpu(void) - return; - } - cpu = smp_processor_id(); -+ preempt_lazy_enable(); - preempt_enable(); - - __read_rt_lock(cpuhp_pin); - - preempt_disable(); -+ preempt_lazy_disable(); - if (cpu != smp_processor_id()) { - __read_rt_unlock(cpuhp_pin); - goto again; -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 6ef0dcea94d7..a17c765d3fcb 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -493,6 +493,48 @@ void resched_curr(struct rq *rq) - trace_sched_wake_idle_without_ipi(cpu); - } - -+#ifdef CONFIG_PREEMPT_LAZY -+ -+static int tsk_is_polling(struct task_struct *p) -+{ -+#ifdef TIF_POLLING_NRFLAG -+ return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); -+#else -+ return 0; -+#endif -+} -+ -+void resched_curr_lazy(struct rq *rq) -+{ -+ struct task_struct *curr = rq->curr; -+ int cpu; -+ -+ if (!sched_feat(PREEMPT_LAZY)) { -+ resched_curr(rq); -+ return; -+ } -+ -+ lockdep_assert_held(&rq->lock); -+ -+ if (test_tsk_need_resched(curr)) -+ return; -+ -+ if (test_tsk_need_resched_lazy(curr)) -+ return; -+ -+ set_tsk_need_resched_lazy(curr); -+ -+ cpu = cpu_of(rq); -+ if (cpu == smp_processor_id()) -+ return; -+ -+ /* NEED_RESCHED_LAZY must be visible before we test polling */ -+ smp_mb(); -+ if (!tsk_is_polling(curr)) -+ smp_send_reschedule(cpu); -+} -+#endif -+ - void resched_cpu(int cpu) - { - struct rq *rq = cpu_rq(cpu); -@@ -2405,6 +2447,9 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) - p->on_cpu = 0; - #endif - init_task_preempt_count(p); -+#ifdef CONFIG_HAVE_PREEMPT_LAZY -+ task_thread_info(p)->preempt_lazy_count = 0; -+#endif - #ifdef CONFIG_SMP - plist_node_init(&p->pushable_tasks, MAX_PRIO); - RB_CLEAR_NODE(&p->pushable_dl_tasks); -@@ -3513,6 +3558,7 @@ static void __sched notrace __schedule(bool preempt) - - next = pick_next_task(rq, prev, &rf); - clear_tsk_need_resched(prev); -+ clear_tsk_need_resched_lazy(prev); - clear_preempt_need_resched(); - - if (likely(prev != next)) { -@@ -3693,6 +3739,30 @@ static void __sched notrace preempt_schedule_common(void) - } while (need_resched()); - } - -+#ifdef CONFIG_PREEMPT_LAZY -+/* -+ * If TIF_NEED_RESCHED is then we allow to be scheduled away since this is -+ * set by a RT task. Oterwise we try to avoid beeing scheduled out as long as -+ * preempt_lazy_count counter >0. -+ */ -+static __always_inline int preemptible_lazy(void) -+{ -+ if (test_thread_flag(TIF_NEED_RESCHED)) -+ return 1; -+ if (current_thread_info()->preempt_lazy_count) -+ return 0; -+ return 1; -+} -+ -+#else -+ -+static inline int preemptible_lazy(void) -+{ -+ return 1; -+} -+ -+#endif -+ - #ifdef CONFIG_PREEMPT - /* - * this is the entry point to schedule() from in-kernel preemption -@@ -3707,7 +3777,8 @@ asmlinkage __visible void __sched notrace preempt_schedule(void) - */ - if (likely(!preemptible())) - return; -- -+ if (!preemptible_lazy()) -+ return; - preempt_schedule_common(); - } - NOKPROBE_SYMBOL(preempt_schedule); -@@ -3734,6 +3805,9 @@ asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) - if (likely(!preemptible())) - return; - -+ if (!preemptible_lazy()) -+ return; -+ - do { - /* - * Because the function tracer can trace preempt_count_sub() -@@ -5503,7 +5577,9 @@ void init_idle(struct task_struct *idle, int cpu) - - /* Set the preempt count _outside_ the spinlocks! */ - init_idle_preempt_count(idle, cpu); -- -+#ifdef CONFIG_HAVE_PREEMPT_LAZY -+ task_thread_info(idle)->preempt_lazy_count = 0; -+#endif - /* - * The idle tasks have their own, simple scheduling class: - */ -@@ -7228,6 +7304,7 @@ void migrate_disable(void) - } - - preempt_disable(); -+ preempt_lazy_disable(); - pin_current_cpu(); - - migrate_disable_update_cpus_allowed(p); -@@ -7295,6 +7372,7 @@ void migrate_enable(void) - arg.dest_cpu = dest_cpu; - - unpin_current_cpu(); -+ preempt_lazy_enable(); - preempt_enable(); - stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); - tlb_migrate_finish(p->mm); -@@ -7303,6 +7381,7 @@ void migrate_enable(void) - } - } - unpin_current_cpu(); -+ preempt_lazy_enable(); - preempt_enable(); - } - EXPORT_SYMBOL(migrate_enable); -diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c -index 6e6d9e999814..5e00ddd76749 100644 ---- a/kernel/sched/fair.c -+++ b/kernel/sched/fair.c -@@ -4075,7 +4075,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) - ideal_runtime = sched_slice(cfs_rq, curr); - delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; - if (delta_exec > ideal_runtime) { -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - /* - * The current task ran long enough, ensure it doesn't get - * re-elected due to buddy favours. -@@ -4099,7 +4099,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) - return; - - if (delta > ideal_runtime) -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - } - - static void -@@ -4241,7 +4241,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) - * validating it and just reschedule. - */ - if (queued) { -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - return; - } - /* -@@ -4375,7 +4375,7 @@ static void __account_cfs_rq_runtime(struct cfs_rq *cfs_rq, u64 delta_exec) - * hierarchy can be throttled - */ - if (!assign_cfs_rq_runtime(cfs_rq) && likely(cfs_rq->curr)) -- resched_curr(rq_of(cfs_rq)); -+ resched_curr_lazy(rq_of(cfs_rq)); - } - - static __always_inline -@@ -5069,7 +5069,7 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) - - if (delta < 0) { - if (rq->curr == p) -- resched_curr(rq); -+ resched_curr_lazy(rq); - return; - } - hrtick_start(rq, delta); -@@ -6645,7 +6645,7 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ - return; - - preempt: -- resched_curr(rq); -+ resched_curr_lazy(rq); - /* - * Only set the backward buddy when the current task is still - * on the rq. This can happen when a wakeup gets interleaved -@@ -9746,7 +9746,7 @@ static void task_fork_fair(struct task_struct *p) - * 'current' within the tree based on its new key value. - */ - swap(curr->vruntime, se->vruntime); -- resched_curr(rq); -+ resched_curr_lazy(rq); - } - - se->vruntime -= cfs_rq->min_vruntime; -@@ -9770,7 +9770,7 @@ prio_changed_fair(struct rq *rq, struct task_struct *p, int oldprio) - */ - if (rq->curr == p) { - if (p->prio > oldprio) -- resched_curr(rq); -+ resched_curr_lazy(rq); - } else - check_preempt_curr(rq, p, 0); - } -diff --git a/kernel/sched/features.h b/kernel/sched/features.h -index 68de18405857..12a12be6770b 100644 ---- a/kernel/sched/features.h -+++ b/kernel/sched/features.h -@@ -48,6 +48,9 @@ SCHED_FEAT(NONTASK_CAPACITY, true) - - #ifdef CONFIG_PREEMPT_RT_FULL - SCHED_FEAT(TTWU_QUEUE, false) -+# ifdef CONFIG_PREEMPT_LAZY -+SCHED_FEAT(PREEMPT_LAZY, true) -+# endif - #else - - /* -diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h -index c79e32488940..c90574112bca 100644 ---- a/kernel/sched/sched.h -+++ b/kernel/sched/sched.h -@@ -1634,6 +1634,15 @@ extern void reweight_task(struct task_struct *p, int prio); - extern void resched_curr(struct rq *rq); - extern void resched_cpu(int cpu); - -+#ifdef CONFIG_PREEMPT_LAZY -+extern void resched_curr_lazy(struct rq *rq); -+#else -+static inline void resched_curr_lazy(struct rq *rq) -+{ -+ resched_curr(rq); -+} -+#endif -+ - extern struct rt_bandwidth def_rt_bandwidth; - extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime); - -diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index 5eccf1c201db..d13b58073bce 100644 ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -2137,6 +2137,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, - struct task_struct *tsk = current; - - entry->preempt_count = pc & 0xff; -+ entry->preempt_lazy_count = preempt_lazy_count(); - entry->pid = (tsk) ? tsk->pid : 0; - entry->flags = - #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT -@@ -2147,7 +2148,8 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, - ((pc & NMI_MASK ) ? TRACE_FLAG_NMI : 0) | - ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | - ((pc & SOFTIRQ_OFFSET) ? TRACE_FLAG_SOFTIRQ : 0) | -- (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | -+ (tif_need_resched_now() ? TRACE_FLAG_NEED_RESCHED : 0) | -+ (need_resched_lazy() ? TRACE_FLAG_NEED_RESCHED_LAZY : 0) | - (test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0); - - entry->migrate_disable = (tsk) ? __migrate_disabled(tsk) & 0xFF : 0; -@@ -3349,15 +3351,17 @@ get_total_entries(struct trace_buffer *buf, - - static void print_lat_help_header(struct seq_file *m) - { -- seq_puts(m, "# _------=> CPU# \n" -- "# / _-----=> irqs-off \n" -- "# | / _----=> need-resched \n" -- "# || / _---=> hardirq/softirq \n" -- "# ||| / _--=> preempt-depth \n" -- "# |||| / _--=> migrate-disable\n" -- "# ||||| / delay \n" -- "# cmd pid |||||| time | caller \n" -- "# \\ / ||||| \\ | / \n"); -+ seq_puts(m, "# _--------=> CPU# \n" -+ "# / _-------=> irqs-off \n" -+ "# | / _------=> need-resched \n" -+ "# || / _-----=> need-resched_lazy \n" -+ "# ||| / _----=> hardirq/softirq \n" -+ "# |||| / _---=> preempt-depth \n" -+ "# ||||| / _--=> preempt-lazy-depth\n" -+ "# |||||| / _-=> migrate-disable \n" -+ "# ||||||| / delay \n" -+ "# cmd pid |||||||| time | caller \n" -+ "# \\ / |||||||| \\ | / \n"); - } - - static void print_event_info(struct trace_buffer *buf, struct seq_file *m) -@@ -3395,15 +3399,17 @@ static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file - tgid ? tgid_space : space); - seq_printf(m, "# %s / _----=> need-resched\n", - tgid ? tgid_space : space); -- seq_printf(m, "# %s| / _---=> hardirq/softirq\n", -+ seq_printf(m, "# %s| / _---=> need-resched_lazy\n", - tgid ? tgid_space : space); -- seq_printf(m, "# %s|| / _--=> preempt-depth\n", -+ seq_printf(m, "# %s|| / _--=> hardirq/softirq\n", - tgid ? tgid_space : space); -- seq_printf(m, "# %s||| / delay\n", -+ seq_printf(m, "# %s||| / preempt-depth\n", - tgid ? tgid_space : space); -- seq_printf(m, "# TASK-PID %sCPU# |||| TIMESTAMP FUNCTION\n", -+ seq_printf(m, "# %s|||| / delay\n", -+ tgid ? tgid_space : space); -+ seq_printf(m, "# TASK-PID %sCPU# ||||| TIMESTAMP FUNCTION\n", - tgid ? " TGID " : space); -- seq_printf(m, "# | | %s | |||| | |\n", -+ seq_printf(m, "# | | %s | ||||| | |\n", - tgid ? " | " : space); - } - -diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h -index d11d7bfc3fa5..6eba8c96f4bc 100644 ---- a/kernel/trace/trace.h -+++ b/kernel/trace/trace.h -@@ -127,6 +127,7 @@ struct kretprobe_trace_entry_head { - * NEED_RESCHED - reschedule is requested - * HARDIRQ - inside an interrupt handler - * SOFTIRQ - inside a softirq handler -+ * NEED_RESCHED_LAZY - lazy reschedule is requested - */ - enum trace_flag_type { - TRACE_FLAG_IRQS_OFF = 0x01, -@@ -136,6 +137,7 @@ enum trace_flag_type { - TRACE_FLAG_SOFTIRQ = 0x10, - TRACE_FLAG_PREEMPT_RESCHED = 0x20, - TRACE_FLAG_NMI = 0x40, -+ TRACE_FLAG_NEED_RESCHED_LAZY = 0x80, - }; - - #define TRACE_BUF_SIZE 1024 -diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c -index 46c96744f09d..3f78b0afb729 100644 ---- a/kernel/trace/trace_output.c -+++ b/kernel/trace/trace_output.c -@@ -448,6 +448,7 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) - { - char hardsoft_irq; - char need_resched; -+ char need_resched_lazy; - char irqs_off; - int hardirq; - int softirq; -@@ -478,6 +479,9 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) - break; - } - -+ need_resched_lazy = -+ (entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.'; -+ - hardsoft_irq = - (nmi && hardirq) ? 'Z' : - nmi ? 'z' : -@@ -486,14 +490,20 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) - softirq ? 's' : - '.' ; - -- trace_seq_printf(s, "%c%c%c", -- irqs_off, need_resched, hardsoft_irq); -+ trace_seq_printf(s, "%c%c%c%c", -+ irqs_off, need_resched, need_resched_lazy, -+ hardsoft_irq); - - if (entry->preempt_count) - trace_seq_printf(s, "%x", entry->preempt_count); - else - trace_seq_putc(s, '.'); - -+ if (entry->preempt_lazy_count) -+ trace_seq_printf(s, "%x", entry->preempt_lazy_count); -+ else -+ trace_seq_putc(s, '.'); -+ - if (entry->migrate_disable) - trace_seq_printf(s, "%x", entry->migrate_disable); - else --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0240-ftrace-Fix-trace-header-alignment.patch linux-4.19.118/debian/patches-rt/0240-ftrace-Fix-trace-header-alignment.patch --- linux-4.19.98/debian/patches-rt/0240-ftrace-Fix-trace-header-alignment.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0240-ftrace-Fix-trace-header-alignment.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -From d41ba5694f1fd54574be4bf3a9d7bc859ca6cb40 Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Sun, 16 Oct 2016 05:08:30 +0200 -Subject: [PATCH 240/290] ftrace: Fix trace header alignment -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Line up helper arrows to the right column. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Mike Galbraith -[bigeasy: fixup function tracer header] -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/trace/trace.c | 22 +++++++++++----------- - 1 file changed, 11 insertions(+), 11 deletions(-) - -diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index d13b58073bce..99dde9db6e3e 100644 ---- a/kernel/trace/trace.c -+++ b/kernel/trace/trace.c -@@ -3351,17 +3351,17 @@ get_total_entries(struct trace_buffer *buf, - - static void print_lat_help_header(struct seq_file *m) - { -- seq_puts(m, "# _--------=> CPU# \n" -- "# / _-------=> irqs-off \n" -- "# | / _------=> need-resched \n" -- "# || / _-----=> need-resched_lazy \n" -- "# ||| / _----=> hardirq/softirq \n" -- "# |||| / _---=> preempt-depth \n" -- "# ||||| / _--=> preempt-lazy-depth\n" -- "# |||||| / _-=> migrate-disable \n" -- "# ||||||| / delay \n" -- "# cmd pid |||||||| time | caller \n" -- "# \\ / |||||||| \\ | / \n"); -+ seq_puts(m, "# _--------=> CPU# \n" -+ "# / _-------=> irqs-off \n" -+ "# | / _------=> need-resched \n" -+ "# || / _-----=> need-resched_lazy \n" -+ "# ||| / _----=> hardirq/softirq \n" -+ "# |||| / _---=> preempt-depth \n" -+ "# ||||| / _--=> preempt-lazy-depth\n" -+ "# |||||| / _-=> migrate-disable \n" -+ "# ||||||| / delay \n" -+ "# cmd pid |||||||| time | caller \n" -+ "# \\ / |||||||| \\ | / \n"); - } - - static void print_event_info(struct trace_buffer *buf, struct seq_file *m) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0240-x86-Support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0240-x86-Support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0240-x86-Support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0240-x86-Support-for-lazy-preemption.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,240 @@ +From 4568f5dff51999abb9a5d5714f7989d5fe3896dd Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 1 Nov 2012 11:03:47 +0100 +Subject: [PATCH 240/325] x86: Support for lazy preemption +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Implement the x86 pieces for lazy preempt. + +Signed-off-by: Thomas Gleixner +--- + arch/x86/Kconfig | 1 + + arch/x86/entry/common.c | 4 ++-- + arch/x86/entry/entry_32.S | 17 ++++++++++++++++ + arch/x86/entry/entry_64.S | 16 +++++++++++++++ + arch/x86/include/asm/preempt.h | 31 +++++++++++++++++++++++++++++- + arch/x86/include/asm/thread_info.h | 11 +++++++++++ + arch/x86/kernel/asm-offsets.c | 2 ++ + 7 files changed, 79 insertions(+), 3 deletions(-) + +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index f22e787329cf..a56f57f95993 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -180,6 +180,7 @@ config X86 + select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select HAVE_RCU_TABLE_FREE if PARAVIRT + select HAVE_RCU_TABLE_INVALIDATE if HAVE_RCU_TABLE_FREE + select HAVE_REGS_AND_STACK_ACCESS_API +diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c +index 91676b0d2d4c..3b5e41d9b29d 100644 +--- a/arch/x86/entry/common.c ++++ b/arch/x86/entry/common.c +@@ -134,7 +134,7 @@ static long syscall_trace_enter(struct pt_regs *regs) + + #define EXIT_TO_USERMODE_LOOP_FLAGS \ + (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ +- _TIF_NEED_RESCHED | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING) ++ _TIF_NEED_RESCHED_MASK | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING) + + static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) + { +@@ -149,7 +149,7 @@ static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) + /* We have work to do. */ + local_irq_enable(); + +- if (cached_flags & _TIF_NEED_RESCHED) ++ if (cached_flags & _TIF_NEED_RESCHED_MASK) + schedule(); + + #ifdef ARCH_RT_DELAYS_SIGNAL_SEND +diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S +index d07432062ee6..d44f446a0e74 100644 +--- a/arch/x86/entry/entry_32.S ++++ b/arch/x86/entry/entry_32.S +@@ -750,8 +750,25 @@ END(ret_from_exception) + ENTRY(resume_kernel) + DISABLE_INTERRUPTS(CLBR_ANY) + .Lneed_resched: ++ # preempt count == 0 + NEED_RS set? + cmpl $0, PER_CPU_VAR(__preempt_count) ++#ifndef CONFIG_PREEMPT_LAZY + jnz restore_all_kernel ++#else ++ jz test_int_off ++ ++ # atleast preempt count == 0 ? ++ cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) ++ jne restore_all ++ ++ movl PER_CPU_VAR(current_task), %ebp ++ cmpl $0,TASK_TI_preempt_lazy_count(%ebp) # non-zero preempt_lazy_count ? ++ jnz restore_all ++ ++ testl $_TIF_NEED_RESCHED_LAZY, TASK_TI_flags(%ebp) ++ jz restore_all ++ test_int_off: ++#endif + testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ? + jz restore_all_kernel + call preempt_schedule_irq +diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S +index 7ffd83c57ef2..663a99f6320f 100644 +--- a/arch/x86/entry/entry_64.S ++++ b/arch/x86/entry/entry_64.S +@@ -732,7 +732,23 @@ retint_kernel: + btl $9, EFLAGS(%rsp) /* were interrupts off? */ + jnc 1f + 0: cmpl $0, PER_CPU_VAR(__preempt_count) ++#ifndef CONFIG_PREEMPT_LAZY + jnz 1f ++#else ++ jz do_preempt_schedule_irq ++ ++ # atleast preempt count == 0 ? ++ cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) ++ jnz 1f ++ ++ movq PER_CPU_VAR(current_task), %rcx ++ cmpl $0, TASK_TI_preempt_lazy_count(%rcx) ++ jnz 1f ++ ++ btl $TIF_NEED_RESCHED_LAZY,TASK_TI_flags(%rcx) ++ jnc 1f ++do_preempt_schedule_irq: ++#endif + call preempt_schedule_irq + jmp 0b + 1: +diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h +index 7f2dbd91fc74..22992c837795 100644 +--- a/arch/x86/include/asm/preempt.h ++++ b/arch/x86/include/asm/preempt.h +@@ -86,17 +86,46 @@ static __always_inline void __preempt_count_sub(int val) + * a decrement which hits zero means we have no preempt_count and should + * reschedule. + */ +-static __always_inline bool __preempt_count_dec_and_test(void) ++static __always_inline bool ____preempt_count_dec_and_test(void) + { + GEN_UNARY_RMWcc("decl", __preempt_count, __percpu_arg(0), e); + } + ++static __always_inline bool __preempt_count_dec_and_test(void) ++{ ++ if (____preempt_count_dec_and_test()) ++ return true; ++#ifdef CONFIG_PREEMPT_LAZY ++ if (current_thread_info()->preempt_lazy_count) ++ return false; ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++#else ++ return false; ++#endif ++} ++ + /* + * Returns true when we need to resched and can (barring IRQ state). + */ + static __always_inline bool should_resched(int preempt_offset) + { ++#ifdef CONFIG_PREEMPT_LAZY ++ u32 tmp; ++ ++ tmp = raw_cpu_read_4(__preempt_count); ++ if (tmp == preempt_offset) ++ return true; ++ ++ /* preempt count == 0 ? */ ++ tmp &= ~PREEMPT_NEED_RESCHED; ++ if (tmp) ++ return false; ++ if (current_thread_info()->preempt_lazy_count) ++ return false; ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++#else + return unlikely(raw_cpu_read_4(__preempt_count) == preempt_offset); ++#endif + } + + #ifdef CONFIG_PREEMPT +diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h +index 82b73b75d67c..dc267291f131 100644 +--- a/arch/x86/include/asm/thread_info.h ++++ b/arch/x86/include/asm/thread_info.h +@@ -56,17 +56,24 @@ struct task_struct; + struct thread_info { + unsigned long flags; /* low level flags */ + u32 status; /* thread synchronous flags */ ++ int preempt_lazy_count; /* 0 => lazy preemptable ++ <0 => BUG */ + }; + + #define INIT_THREAD_INFO(tsk) \ + { \ + .flags = 0, \ ++ .preempt_lazy_count = 0, \ + } + + #else /* !__ASSEMBLY__ */ + + #include + ++#define GET_THREAD_INFO(reg) \ ++ _ASM_MOV PER_CPU_VAR(cpu_current_top_of_stack),reg ; \ ++ _ASM_SUB $(THREAD_SIZE),reg ; ++ + #endif + + /* +@@ -91,6 +98,7 @@ struct thread_info { + #define TIF_NOCPUID 15 /* CPUID is not accessible in userland */ + #define TIF_NOTSC 16 /* TSC is not accessible in userland */ + #define TIF_IA32 17 /* IA32 compatibility process */ ++#define TIF_NEED_RESCHED_LAZY 18 /* lazy rescheduling necessary */ + #define TIF_NOHZ 19 /* in adaptive nohz mode */ + #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ + #define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */ +@@ -120,6 +128,7 @@ struct thread_info { + #define _TIF_NOCPUID (1 << TIF_NOCPUID) + #define _TIF_NOTSC (1 << TIF_NOTSC) + #define _TIF_IA32 (1 << TIF_IA32) ++#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) + #define _TIF_NOHZ (1 << TIF_NOHZ) + #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) + #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) +@@ -165,6 +174,8 @@ struct thread_info { + #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY) + #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) + ++#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) ++ + #define STACK_WARN (THREAD_SIZE/8) + + /* +diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c +index 01de31db300d..ce1c5b9fbd8c 100644 +--- a/arch/x86/kernel/asm-offsets.c ++++ b/arch/x86/kernel/asm-offsets.c +@@ -38,6 +38,7 @@ void common(void) { + + BLANK(); + OFFSET(TASK_TI_flags, task_struct, thread_info.flags); ++ OFFSET(TASK_TI_preempt_lazy_count, task_struct, thread_info.preempt_lazy_count); + OFFSET(TASK_addr_limit, task_struct, thread.addr_limit); + + BLANK(); +@@ -94,6 +95,7 @@ void common(void) { + + BLANK(); + DEFINE(PTREGS_SIZE, sizeof(struct pt_regs)); ++ DEFINE(_PREEMPT_ENABLED, PREEMPT_ENABLED); + + /* TLB state for the entry code */ + OFFSET(TLB_STATE_user_pcid_flush_mask, tlb_state, user_pcid_flush_mask); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0241-x86-Support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0241-x86-Support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0241-x86-Support-for-lazy-preemption.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0241-x86-Support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,240 +0,0 @@ -From e4cba91598b3be3d6bcadce513ffd80041895d70 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 1 Nov 2012 11:03:47 +0100 -Subject: [PATCH 241/290] x86: Support for lazy preemption -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Implement the x86 pieces for lazy preempt. - -Signed-off-by: Thomas Gleixner ---- - arch/x86/Kconfig | 1 + - arch/x86/entry/common.c | 4 ++-- - arch/x86/entry/entry_32.S | 17 ++++++++++++++++ - arch/x86/entry/entry_64.S | 16 +++++++++++++++ - arch/x86/include/asm/preempt.h | 31 +++++++++++++++++++++++++++++- - arch/x86/include/asm/thread_info.h | 11 +++++++++++ - arch/x86/kernel/asm-offsets.c | 2 ++ - 7 files changed, 79 insertions(+), 3 deletions(-) - -diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index f22e787329cf..a56f57f95993 100644 ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -180,6 +180,7 @@ config X86 - select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -+ select HAVE_PREEMPT_LAZY - select HAVE_RCU_TABLE_FREE if PARAVIRT - select HAVE_RCU_TABLE_INVALIDATE if HAVE_RCU_TABLE_FREE - select HAVE_REGS_AND_STACK_ACCESS_API -diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c -index 91676b0d2d4c..3b5e41d9b29d 100644 ---- a/arch/x86/entry/common.c -+++ b/arch/x86/entry/common.c -@@ -134,7 +134,7 @@ static long syscall_trace_enter(struct pt_regs *regs) - - #define EXIT_TO_USERMODE_LOOP_FLAGS \ - (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ -- _TIF_NEED_RESCHED | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING) -+ _TIF_NEED_RESCHED_MASK | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING) - - static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) - { -@@ -149,7 +149,7 @@ static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) - /* We have work to do. */ - local_irq_enable(); - -- if (cached_flags & _TIF_NEED_RESCHED) -+ if (cached_flags & _TIF_NEED_RESCHED_MASK) - schedule(); - - #ifdef ARCH_RT_DELAYS_SIGNAL_SEND -diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S -index 8059d4fd915c..985988227877 100644 ---- a/arch/x86/entry/entry_32.S -+++ b/arch/x86/entry/entry_32.S -@@ -766,8 +766,25 @@ END(ret_from_exception) - ENTRY(resume_kernel) - DISABLE_INTERRUPTS(CLBR_ANY) - .Lneed_resched: -+ # preempt count == 0 + NEED_RS set? - cmpl $0, PER_CPU_VAR(__preempt_count) -+#ifndef CONFIG_PREEMPT_LAZY - jnz restore_all_kernel -+#else -+ jz test_int_off -+ -+ # atleast preempt count == 0 ? -+ cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) -+ jne restore_all -+ -+ movl PER_CPU_VAR(current_task), %ebp -+ cmpl $0,TASK_TI_preempt_lazy_count(%ebp) # non-zero preempt_lazy_count ? -+ jnz restore_all -+ -+ testl $_TIF_NEED_RESCHED_LAZY, TASK_TI_flags(%ebp) -+ jz restore_all -+ test_int_off: -+#endif - testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ? - jz restore_all_kernel - call preempt_schedule_irq -diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S -index 7ffd83c57ef2..663a99f6320f 100644 ---- a/arch/x86/entry/entry_64.S -+++ b/arch/x86/entry/entry_64.S -@@ -732,7 +732,23 @@ retint_kernel: - btl $9, EFLAGS(%rsp) /* were interrupts off? */ - jnc 1f - 0: cmpl $0, PER_CPU_VAR(__preempt_count) -+#ifndef CONFIG_PREEMPT_LAZY - jnz 1f -+#else -+ jz do_preempt_schedule_irq -+ -+ # atleast preempt count == 0 ? -+ cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) -+ jnz 1f -+ -+ movq PER_CPU_VAR(current_task), %rcx -+ cmpl $0, TASK_TI_preempt_lazy_count(%rcx) -+ jnz 1f -+ -+ btl $TIF_NEED_RESCHED_LAZY,TASK_TI_flags(%rcx) -+ jnc 1f -+do_preempt_schedule_irq: -+#endif - call preempt_schedule_irq - jmp 0b - 1: -diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h -index 7f2dbd91fc74..22992c837795 100644 ---- a/arch/x86/include/asm/preempt.h -+++ b/arch/x86/include/asm/preempt.h -@@ -86,17 +86,46 @@ static __always_inline void __preempt_count_sub(int val) - * a decrement which hits zero means we have no preempt_count and should - * reschedule. - */ --static __always_inline bool __preempt_count_dec_and_test(void) -+static __always_inline bool ____preempt_count_dec_and_test(void) - { - GEN_UNARY_RMWcc("decl", __preempt_count, __percpu_arg(0), e); - } - -+static __always_inline bool __preempt_count_dec_and_test(void) -+{ -+ if (____preempt_count_dec_and_test()) -+ return true; -+#ifdef CONFIG_PREEMPT_LAZY -+ if (current_thread_info()->preempt_lazy_count) -+ return false; -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+#else -+ return false; -+#endif -+} -+ - /* - * Returns true when we need to resched and can (barring IRQ state). - */ - static __always_inline bool should_resched(int preempt_offset) - { -+#ifdef CONFIG_PREEMPT_LAZY -+ u32 tmp; -+ -+ tmp = raw_cpu_read_4(__preempt_count); -+ if (tmp == preempt_offset) -+ return true; -+ -+ /* preempt count == 0 ? */ -+ tmp &= ~PREEMPT_NEED_RESCHED; -+ if (tmp) -+ return false; -+ if (current_thread_info()->preempt_lazy_count) -+ return false; -+ return test_thread_flag(TIF_NEED_RESCHED_LAZY); -+#else - return unlikely(raw_cpu_read_4(__preempt_count) == preempt_offset); -+#endif - } - - #ifdef CONFIG_PREEMPT -diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h -index 82b73b75d67c..dc267291f131 100644 ---- a/arch/x86/include/asm/thread_info.h -+++ b/arch/x86/include/asm/thread_info.h -@@ -56,17 +56,24 @@ struct task_struct; - struct thread_info { - unsigned long flags; /* low level flags */ - u32 status; /* thread synchronous flags */ -+ int preempt_lazy_count; /* 0 => lazy preemptable -+ <0 => BUG */ - }; - - #define INIT_THREAD_INFO(tsk) \ - { \ - .flags = 0, \ -+ .preempt_lazy_count = 0, \ - } - - #else /* !__ASSEMBLY__ */ - - #include - -+#define GET_THREAD_INFO(reg) \ -+ _ASM_MOV PER_CPU_VAR(cpu_current_top_of_stack),reg ; \ -+ _ASM_SUB $(THREAD_SIZE),reg ; -+ - #endif - - /* -@@ -91,6 +98,7 @@ struct thread_info { - #define TIF_NOCPUID 15 /* CPUID is not accessible in userland */ - #define TIF_NOTSC 16 /* TSC is not accessible in userland */ - #define TIF_IA32 17 /* IA32 compatibility process */ -+#define TIF_NEED_RESCHED_LAZY 18 /* lazy rescheduling necessary */ - #define TIF_NOHZ 19 /* in adaptive nohz mode */ - #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ - #define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */ -@@ -120,6 +128,7 @@ struct thread_info { - #define _TIF_NOCPUID (1 << TIF_NOCPUID) - #define _TIF_NOTSC (1 << TIF_NOTSC) - #define _TIF_IA32 (1 << TIF_IA32) -+#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) - #define _TIF_NOHZ (1 << TIF_NOHZ) - #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) - #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) -@@ -165,6 +174,8 @@ struct thread_info { - #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY) - #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) - -+#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) -+ - #define STACK_WARN (THREAD_SIZE/8) - - /* -diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c -index 01de31db300d..ce1c5b9fbd8c 100644 ---- a/arch/x86/kernel/asm-offsets.c -+++ b/arch/x86/kernel/asm-offsets.c -@@ -38,6 +38,7 @@ void common(void) { - - BLANK(); - OFFSET(TASK_TI_flags, task_struct, thread_info.flags); -+ OFFSET(TASK_TI_preempt_lazy_count, task_struct, thread_info.preempt_lazy_count); - OFFSET(TASK_addr_limit, task_struct, thread.addr_limit); - - BLANK(); -@@ -94,6 +95,7 @@ void common(void) { - - BLANK(); - DEFINE(PTREGS_SIZE, sizeof(struct pt_regs)); -+ DEFINE(_PREEMPT_ENABLED, PREEMPT_ENABLED); - - /* TLB state for the entry code */ - OFFSET(TLB_STATE_user_pcid_flush_mask, tlb_state, user_pcid_flush_mask); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0241-x86-lazy-preempt-properly-check-against-preempt-mask.patch linux-4.19.118/debian/patches-rt/0241-x86-lazy-preempt-properly-check-against-preempt-mask.patch --- linux-4.19.98/debian/patches-rt/0241-x86-lazy-preempt-properly-check-against-preempt-mask.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0241-x86-lazy-preempt-properly-check-against-preempt-mask.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,33 @@ +From be6b5fb800c318f640ab6ec8eb4d73e6e66eaf40 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 18 Feb 2019 16:57:09 +0100 +Subject: [PATCH 241/325] x86: lazy-preempt: properly check against + preempt-mask +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +should_resched() should check against preempt_offset after unmasking the +need-resched-bit. Otherwise should_resched() won't work for +preempt_offset != 0 and lazy-preempt set. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/x86/include/asm/preempt.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h +index 22992c837795..f66708779274 100644 +--- a/arch/x86/include/asm/preempt.h ++++ b/arch/x86/include/asm/preempt.h +@@ -118,7 +118,7 @@ static __always_inline bool should_resched(int preempt_offset) + + /* preempt count == 0 ? */ + tmp &= ~PREEMPT_NEED_RESCHED; +- if (tmp) ++ if (tmp != preempt_offset) + return false; + if (current_thread_info()->preempt_lazy_count) + return false; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0242-x86-lazy-preempt-properly-check-against-preempt-mask.patch linux-4.19.118/debian/patches-rt/0242-x86-lazy-preempt-properly-check-against-preempt-mask.patch --- linux-4.19.98/debian/patches-rt/0242-x86-lazy-preempt-properly-check-against-preempt-mask.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0242-x86-lazy-preempt-properly-check-against-preempt-mask.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -From 9c314d19ce79b759d4978179077e8aa59cf1b1df Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 18 Feb 2019 16:57:09 +0100 -Subject: [PATCH 242/290] x86: lazy-preempt: properly check against - preempt-mask -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -should_resched() should check against preempt_offset after unmasking the -need-resched-bit. Otherwise should_resched() won't work for -preempt_offset != 0 and lazy-preempt set. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/include/asm/preempt.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h -index 22992c837795..f66708779274 100644 ---- a/arch/x86/include/asm/preempt.h -+++ b/arch/x86/include/asm/preempt.h -@@ -118,7 +118,7 @@ static __always_inline bool should_resched(int preempt_offset) - - /* preempt count == 0 ? */ - tmp &= ~PREEMPT_NEED_RESCHED; -- if (tmp) -+ if (tmp != preempt_offset) - return false; - if (current_thread_info()->preempt_lazy_count) - return false; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0242-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch linux-4.19.118/debian/patches-rt/0242-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch --- linux-4.19.98/debian/patches-rt/0242-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0242-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,45 @@ +From 8ffe4b93b950bae866bc4ea9089408f5b8328d5b Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 26 Feb 2019 14:53:49 +0100 +Subject: [PATCH 242/325] x86: lazy-preempt: use proper return label on + 32bit-x86 +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The lazy-preempt uses the wrong return label in case preemption isn't +possible. This results crash while returning to the kernel. + +Use the correct return label if preemption isn' possible. + +Reported-by: Andri Yngvason +Signed-off-by: Sebastian Andrzej Siewior +--- + arch/x86/entry/entry_32.S | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S +index d44f446a0e74..56398b07211b 100644 +--- a/arch/x86/entry/entry_32.S ++++ b/arch/x86/entry/entry_32.S +@@ -759,15 +759,15 @@ ENTRY(resume_kernel) + + # atleast preempt count == 0 ? + cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) +- jne restore_all ++ jne restore_all_kernel + + movl PER_CPU_VAR(current_task), %ebp + cmpl $0,TASK_TI_preempt_lazy_count(%ebp) # non-zero preempt_lazy_count ? +- jnz restore_all ++ jnz restore_all_kernel + + testl $_TIF_NEED_RESCHED_LAZY, TASK_TI_flags(%ebp) +- jz restore_all +- test_int_off: ++ jz restore_all_kernel ++test_int_off: + #endif + testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ? + jz restore_all_kernel +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0243-arm-Add-support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0243-arm-Add-support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0243-arm-Add-support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0243-arm-Add-support-for-lazy-preemption.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,168 @@ +From 43660867519b464d2fe3cda84c73f92020f2bf96 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 31 Oct 2012 12:04:11 +0100 +Subject: [PATCH 243/325] arm: Add support for lazy preemption +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Implement the arm pieces for lazy preempt. + +Signed-off-by: Thomas Gleixner +--- + arch/arm/Kconfig | 1 + + arch/arm/include/asm/thread_info.h | 8 ++++++-- + arch/arm/kernel/asm-offsets.c | 1 + + arch/arm/kernel/entry-armv.S | 19 ++++++++++++++++--- + arch/arm/kernel/entry-common.S | 9 +++++++-- + arch/arm/kernel/signal.c | 3 ++- + 6 files changed, 33 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index bd9d180db5c7..9945e699e0a4 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -90,6 +90,7 @@ config ARM + select HAVE_PERF_EVENTS + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select HAVE_RCU_TABLE_FREE if (SMP && ARM_LPAE) + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_RSEQ +diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h +index 8f55dc520a3e..4f834bfca470 100644 +--- a/arch/arm/include/asm/thread_info.h ++++ b/arch/arm/include/asm/thread_info.h +@@ -49,6 +49,7 @@ struct cpu_context_save { + struct thread_info { + unsigned long flags; /* low level flags */ + int preempt_count; /* 0 => preemptable, <0 => bug */ ++ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ + mm_segment_t addr_limit; /* address limit */ + struct task_struct *task; /* main task structure */ + __u32 cpu; /* cpu */ +@@ -139,7 +140,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + #define TIF_SYSCALL_TRACE 4 /* syscall trace active */ + #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ + #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ +-#define TIF_SECCOMP 7 /* seccomp syscall filtering active */ ++#define TIF_SECCOMP 8 /* seccomp syscall filtering active */ ++#define TIF_NEED_RESCHED_LAZY 7 + + #define TIF_NOHZ 12 /* in adaptive nohz mode */ + #define TIF_USING_IWMMXT 17 +@@ -149,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) + #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) + #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) ++#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) + #define _TIF_UPROBE (1 << TIF_UPROBE) + #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) + #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +@@ -164,7 +167,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + * Change these and you break ASM code in entry-common.S + */ + #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ +- _TIF_NOTIFY_RESUME | _TIF_UPROBE) ++ _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ ++ _TIF_NEED_RESCHED_LAZY) + + #endif /* __KERNEL__ */ + #endif /* __ASM_ARM_THREAD_INFO_H */ +diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c +index 3968d6c22455..b35d373fc982 100644 +--- a/arch/arm/kernel/asm-offsets.c ++++ b/arch/arm/kernel/asm-offsets.c +@@ -56,6 +56,7 @@ int main(void) + BLANK(); + DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); + DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); ++ DEFINE(TI_PREEMPT_LAZY, offsetof(struct thread_info, preempt_lazy_count)); + DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); + DEFINE(TI_TASK, offsetof(struct thread_info, task)); + DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); +diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S +index e85a3af9ddeb..cc67c0a3ae7b 100644 +--- a/arch/arm/kernel/entry-armv.S ++++ b/arch/arm/kernel/entry-armv.S +@@ -216,11 +216,18 @@ __irq_svc: + + #ifdef CONFIG_PREEMPT + ldr r8, [tsk, #TI_PREEMPT] @ get preempt count +- ldr r0, [tsk, #TI_FLAGS] @ get flags + teq r8, #0 @ if preempt count != 0 ++ bne 1f @ return from exeption ++ ldr r0, [tsk, #TI_FLAGS] @ get flags ++ tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set ++ blne svc_preempt @ preempt! ++ ++ ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count ++ teq r8, #0 @ if preempt lazy count != 0 + movne r0, #0 @ force flags to 0 +- tst r0, #_TIF_NEED_RESCHED ++ tst r0, #_TIF_NEED_RESCHED_LAZY + blne svc_preempt ++1: + #endif + + svc_exit r5, irq = 1 @ return from exception +@@ -235,8 +242,14 @@ svc_preempt: + 1: bl preempt_schedule_irq @ irq en/disable is done inside + ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS + tst r0, #_TIF_NEED_RESCHED ++ bne 1b ++ tst r0, #_TIF_NEED_RESCHED_LAZY + reteq r8 @ go again +- b 1b ++ ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count ++ teq r0, #0 @ if preempt lazy count != 0 ++ beq 1b ++ ret r8 @ go again ++ + #endif + + __und_fault: +diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S +index 0465d65d23de..47675830ed30 100644 +--- a/arch/arm/kernel/entry-common.S ++++ b/arch/arm/kernel/entry-common.S +@@ -56,7 +56,9 @@ __ret_fast_syscall: + cmp r2, #TASK_SIZE + blne addr_limit_check_failed + ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing +- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK ++ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) ++ bne fast_work_pending ++ tst r1, #_TIF_SECCOMP + bne fast_work_pending + + +@@ -93,8 +95,11 @@ __ret_fast_syscall: + cmp r2, #TASK_SIZE + blne addr_limit_check_failed + ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing +- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK ++ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) ++ bne do_slower_path ++ tst r1, #_TIF_SECCOMP + beq no_work_pending ++do_slower_path: + UNWIND(.fnend ) + ENDPROC(ret_fast_syscall) + +diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c +index b908382b69ff..339fbc281cf1 100644 +--- a/arch/arm/kernel/signal.c ++++ b/arch/arm/kernel/signal.c +@@ -652,7 +652,8 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) + */ + trace_hardirqs_off(); + do { +- if (likely(thread_flags & _TIF_NEED_RESCHED)) { ++ if (likely(thread_flags & (_TIF_NEED_RESCHED | ++ _TIF_NEED_RESCHED_LAZY))) { + schedule(); + } else { + if (unlikely(!user_mode(regs))) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0243-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch linux-4.19.118/debian/patches-rt/0243-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch --- linux-4.19.98/debian/patches-rt/0243-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0243-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -From 45c086ec4e89dcf9194c2b88b5ee38ffa79fe4ec Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 26 Feb 2019 14:53:49 +0100 -Subject: [PATCH 243/290] x86: lazy-preempt: use proper return label on - 32bit-x86 -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The lazy-preempt uses the wrong return label in case preemption isn't -possible. This results crash while returning to the kernel. - -Use the correct return label if preemption isn' possible. - -Reported-by: Andri Yngvason -Signed-off-by: Sebastian Andrzej Siewior ---- - arch/x86/entry/entry_32.S | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S -index 985988227877..d880352e410c 100644 ---- a/arch/x86/entry/entry_32.S -+++ b/arch/x86/entry/entry_32.S -@@ -775,15 +775,15 @@ ENTRY(resume_kernel) - - # atleast preempt count == 0 ? - cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count) -- jne restore_all -+ jne restore_all_kernel - - movl PER_CPU_VAR(current_task), %ebp - cmpl $0,TASK_TI_preempt_lazy_count(%ebp) # non-zero preempt_lazy_count ? -- jnz restore_all -+ jnz restore_all_kernel - - testl $_TIF_NEED_RESCHED_LAZY, TASK_TI_flags(%ebp) -- jz restore_all -- test_int_off: -+ jz restore_all_kernel -+test_int_off: - #endif - testl $X86_EFLAGS_IF, PT_EFLAGS(%esp) # interrupts off (exception path) ? - jz restore_all_kernel --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0244-arm-Add-support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0244-arm-Add-support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0244-arm-Add-support-for-lazy-preemption.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0244-arm-Add-support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,168 +0,0 @@ -From 61f1fec1af303a55b098a0228a82f9632f220cd8 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 31 Oct 2012 12:04:11 +0100 -Subject: [PATCH 244/290] arm: Add support for lazy preemption -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Implement the arm pieces for lazy preempt. - -Signed-off-by: Thomas Gleixner ---- - arch/arm/Kconfig | 1 + - arch/arm/include/asm/thread_info.h | 8 ++++++-- - arch/arm/kernel/asm-offsets.c | 1 + - arch/arm/kernel/entry-armv.S | 19 ++++++++++++++++--- - arch/arm/kernel/entry-common.S | 9 +++++++-- - arch/arm/kernel/signal.c | 3 ++- - 6 files changed, 33 insertions(+), 8 deletions(-) - -diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig -index c1cc28f0841f..26b1cdc94210 100644 ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -90,6 +90,7 @@ config ARM - select HAVE_PERF_EVENTS - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -+ select HAVE_PREEMPT_LAZY - select HAVE_RCU_TABLE_FREE if (SMP && ARM_LPAE) - select HAVE_REGS_AND_STACK_ACCESS_API - select HAVE_RSEQ -diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h -index 8f55dc520a3e..4f834bfca470 100644 ---- a/arch/arm/include/asm/thread_info.h -+++ b/arch/arm/include/asm/thread_info.h -@@ -49,6 +49,7 @@ struct cpu_context_save { - struct thread_info { - unsigned long flags; /* low level flags */ - int preempt_count; /* 0 => preemptable, <0 => bug */ -+ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ - mm_segment_t addr_limit; /* address limit */ - struct task_struct *task; /* main task structure */ - __u32 cpu; /* cpu */ -@@ -139,7 +140,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, - #define TIF_SYSCALL_TRACE 4 /* syscall trace active */ - #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ - #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ --#define TIF_SECCOMP 7 /* seccomp syscall filtering active */ -+#define TIF_SECCOMP 8 /* seccomp syscall filtering active */ -+#define TIF_NEED_RESCHED_LAZY 7 - - #define TIF_NOHZ 12 /* in adaptive nohz mode */ - #define TIF_USING_IWMMXT 17 -@@ -149,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, - #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) - #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) - #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) -+#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) - #define _TIF_UPROBE (1 << TIF_UPROBE) - #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) - #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) -@@ -164,7 +167,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, - * Change these and you break ASM code in entry-common.S - */ - #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ -- _TIF_NOTIFY_RESUME | _TIF_UPROBE) -+ _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ -+ _TIF_NEED_RESCHED_LAZY) - - #endif /* __KERNEL__ */ - #endif /* __ASM_ARM_THREAD_INFO_H */ -diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c -index 3968d6c22455..b35d373fc982 100644 ---- a/arch/arm/kernel/asm-offsets.c -+++ b/arch/arm/kernel/asm-offsets.c -@@ -56,6 +56,7 @@ int main(void) - BLANK(); - DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); - DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); -+ DEFINE(TI_PREEMPT_LAZY, offsetof(struct thread_info, preempt_lazy_count)); - DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); - DEFINE(TI_TASK, offsetof(struct thread_info, task)); - DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); -diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S -index e85a3af9ddeb..cc67c0a3ae7b 100644 ---- a/arch/arm/kernel/entry-armv.S -+++ b/arch/arm/kernel/entry-armv.S -@@ -216,11 +216,18 @@ __irq_svc: - - #ifdef CONFIG_PREEMPT - ldr r8, [tsk, #TI_PREEMPT] @ get preempt count -- ldr r0, [tsk, #TI_FLAGS] @ get flags - teq r8, #0 @ if preempt count != 0 -+ bne 1f @ return from exeption -+ ldr r0, [tsk, #TI_FLAGS] @ get flags -+ tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set -+ blne svc_preempt @ preempt! -+ -+ ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count -+ teq r8, #0 @ if preempt lazy count != 0 - movne r0, #0 @ force flags to 0 -- tst r0, #_TIF_NEED_RESCHED -+ tst r0, #_TIF_NEED_RESCHED_LAZY - blne svc_preempt -+1: - #endif - - svc_exit r5, irq = 1 @ return from exception -@@ -235,8 +242,14 @@ svc_preempt: - 1: bl preempt_schedule_irq @ irq en/disable is done inside - ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS - tst r0, #_TIF_NEED_RESCHED -+ bne 1b -+ tst r0, #_TIF_NEED_RESCHED_LAZY - reteq r8 @ go again -- b 1b -+ ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count -+ teq r0, #0 @ if preempt lazy count != 0 -+ beq 1b -+ ret r8 @ go again -+ - #endif - - __und_fault: -diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S -index 0465d65d23de..47675830ed30 100644 ---- a/arch/arm/kernel/entry-common.S -+++ b/arch/arm/kernel/entry-common.S -@@ -56,7 +56,9 @@ __ret_fast_syscall: - cmp r2, #TASK_SIZE - blne addr_limit_check_failed - ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing -- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK -+ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) -+ bne fast_work_pending -+ tst r1, #_TIF_SECCOMP - bne fast_work_pending - - -@@ -93,8 +95,11 @@ __ret_fast_syscall: - cmp r2, #TASK_SIZE - blne addr_limit_check_failed - ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing -- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK -+ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) -+ bne do_slower_path -+ tst r1, #_TIF_SECCOMP - beq no_work_pending -+do_slower_path: - UNWIND(.fnend ) - ENDPROC(ret_fast_syscall) - -diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c -index b908382b69ff..339fbc281cf1 100644 ---- a/arch/arm/kernel/signal.c -+++ b/arch/arm/kernel/signal.c -@@ -652,7 +652,8 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) - */ - trace_hardirqs_off(); - do { -- if (likely(thread_flags & _TIF_NEED_RESCHED)) { -+ if (likely(thread_flags & (_TIF_NEED_RESCHED | -+ _TIF_NEED_RESCHED_LAZY))) { - schedule(); - } else { - if (unlikely(!user_mode(regs))) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0244-powerpc-Add-support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0244-powerpc-Add-support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0244-powerpc-Add-support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0244-powerpc-Add-support-for-lazy-preemption.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,196 @@ +From 8e284ba9115056adda44a911dffce7bfa383fb6a Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Thu, 1 Nov 2012 10:14:11 +0100 +Subject: [PATCH 244/325] powerpc: Add support for lazy preemption +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Implement the powerpc pieces for lazy preempt. + +Signed-off-by: Thomas Gleixner +--- + arch/powerpc/Kconfig | 1 + + arch/powerpc/include/asm/thread_info.h | 9 +++++++-- + arch/powerpc/kernel/asm-offsets.c | 1 + + arch/powerpc/kernel/entry_32.S | 17 ++++++++++++----- + arch/powerpc/kernel/entry_64.S | 16 ++++++++++++---- + 5 files changed, 33 insertions(+), 11 deletions(-) + +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 1b332f69dd36..c8c2230c8aff 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -216,6 +216,7 @@ config PPC + select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select HAVE_RCU_TABLE_FREE if SMP + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_RELIABLE_STACKTRACE if PPC64 && CPU_LITTLE_ENDIAN +diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h +index 3c0002044bc9..ce316076bc52 100644 +--- a/arch/powerpc/include/asm/thread_info.h ++++ b/arch/powerpc/include/asm/thread_info.h +@@ -37,6 +37,8 @@ struct thread_info { + int cpu; /* cpu we're on */ + int preempt_count; /* 0 => preemptable, + <0 => BUG */ ++ int preempt_lazy_count; /* 0 => preemptable, ++ <0 => BUG */ + unsigned long local_flags; /* private flags for thread */ + #ifdef CONFIG_LIVEPATCH + unsigned long *livepatch_sp; +@@ -81,7 +83,7 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src + #define TIF_SIGPENDING 1 /* signal pending */ + #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ + #define TIF_FSCHECK 3 /* Check FS is USER_DS on return */ +-#define TIF_32BIT 4 /* 32 bit binary */ ++#define TIF_NEED_RESCHED_LAZY 4 /* lazy rescheduling necessary */ + #define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */ + #define TIF_PATCH_PENDING 6 /* pending live patching update */ + #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ +@@ -100,6 +102,7 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src + #define TIF_ELF2ABI 18 /* function descriptors must die! */ + #endif + #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ ++#define TIF_32BIT 20 /* 32 bit binary */ + + /* as above, but as bit values */ + #define _TIF_SYSCALL_TRACE (1< +Date: Thu, 14 May 2015 17:52:17 +0200 +Subject: [PATCH 245/325] arch/arm64: Add lazy preempt support +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +arm64 is missing support for PREEMPT_RT. The main feature which is +lacking is support for lazy preemption. The arch-specific entry code, +thread information structure definitions, and associated data tables +have to be extended to provide this support. Then the Kconfig file has +to be extended to indicate the support is available, and also to +indicate that support for full RT preemption is now available. + +Signed-off-by: Anders Roxell +--- + arch/arm64/Kconfig | 1 + + arch/arm64/include/asm/thread_info.h | 6 +++++- + arch/arm64/kernel/asm-offsets.c | 1 + + arch/arm64/kernel/entry.S | 12 +++++++++--- + arch/arm64/kernel/signal.c | 2 +- + 5 files changed, 17 insertions(+), 5 deletions(-) + +diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig +index 51fe21f5d078..9bf5be2d6024 100644 +--- a/arch/arm64/Kconfig ++++ b/arch/arm64/Kconfig +@@ -141,6 +141,7 @@ config ARM64 + select HAVE_PERF_EVENTS + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_RCU_TABLE_FREE + select HAVE_RSEQ +diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h +index cb2c10a8f0a8..f1820f7318b6 100644 +--- a/arch/arm64/include/asm/thread_info.h ++++ b/arch/arm64/include/asm/thread_info.h +@@ -43,6 +43,7 @@ struct thread_info { + u64 ttbr0; /* saved TTBR0_EL1 */ + #endif + int preempt_count; /* 0 => preemptable, <0 => bug */ ++ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ + }; + + #define thread_saved_pc(tsk) \ +@@ -76,6 +77,7 @@ void arch_release_task_struct(struct task_struct *tsk); + #define TIF_FOREIGN_FPSTATE 3 /* CPU's FP state is not current's */ + #define TIF_UPROBE 4 /* uprobe breakpoint or singlestep */ + #define TIF_FSCHECK 5 /* Check FS is USER_DS on return */ ++#define TIF_NEED_RESCHED_LAZY 6 + #define TIF_NOHZ 7 + #define TIF_SYSCALL_TRACE 8 + #define TIF_SYSCALL_AUDIT 9 +@@ -94,6 +96,7 @@ void arch_release_task_struct(struct task_struct *tsk); + #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) + #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) + #define _TIF_FOREIGN_FPSTATE (1 << TIF_FOREIGN_FPSTATE) ++#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) + #define _TIF_NOHZ (1 << TIF_NOHZ) + #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) + #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +@@ -106,8 +109,9 @@ void arch_release_task_struct(struct task_struct *tsk); + + #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ + _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ +- _TIF_UPROBE | _TIF_FSCHECK) ++ _TIF_UPROBE | _TIF_FSCHECK | _TIF_NEED_RESCHED_LAZY) + ++#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) + #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ + _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ + _TIF_NOHZ) +diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c +index 92fba851ce53..844c71bc865b 100644 +--- a/arch/arm64/kernel/asm-offsets.c ++++ b/arch/arm64/kernel/asm-offsets.c +@@ -41,6 +41,7 @@ int main(void) + BLANK(); + DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags)); + DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count)); ++ DEFINE(TSK_TI_PREEMPT_LAZY, offsetof(struct task_struct, thread_info.preempt_lazy_count)); + DEFINE(TSK_TI_ADDR_LIMIT, offsetof(struct task_struct, thread_info.addr_limit)); + #ifdef CONFIG_ARM64_SW_TTBR0_PAN + DEFINE(TSK_TI_TTBR0, offsetof(struct task_struct, thread_info.ttbr0)); +diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S +index 5f800384cb9a..b582580c8c4c 100644 +--- a/arch/arm64/kernel/entry.S ++++ b/arch/arm64/kernel/entry.S +@@ -623,11 +623,16 @@ el1_irq: + + #ifdef CONFIG_PREEMPT + ldr w24, [tsk, #TSK_TI_PREEMPT] // get preempt count +- cbnz w24, 1f // preempt count != 0 ++ cbnz w24, 2f // preempt count != 0 + ldr x0, [tsk, #TSK_TI_FLAGS] // get flags +- tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? +- bl el1_preempt ++ tbnz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? ++ ++ ldr w24, [tsk, #TSK_TI_PREEMPT_LAZY] // get preempt lazy count ++ cbnz w24, 2f // preempt lazy count != 0 ++ tbz x0, #TIF_NEED_RESCHED_LAZY, 2f // needs rescheduling? + 1: ++ bl el1_preempt ++2: + #endif + #ifdef CONFIG_TRACE_IRQFLAGS + bl trace_hardirqs_on +@@ -641,6 +646,7 @@ el1_preempt: + 1: bl preempt_schedule_irq // irq en/disable is done inside + ldr x0, [tsk, #TSK_TI_FLAGS] // get new tasks TI_FLAGS + tbnz x0, #TIF_NEED_RESCHED, 1b // needs rescheduling? ++ tbnz x0, #TIF_NEED_RESCHED_LAZY, 1b // needs rescheduling? + ret x24 + #endif + +diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c +index 5dcc942906db..4fec251fe147 100644 +--- a/arch/arm64/kernel/signal.c ++++ b/arch/arm64/kernel/signal.c +@@ -926,7 +926,7 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, + /* Check valid user FS if needed */ + addr_limit_user_check(); + +- if (thread_flags & _TIF_NEED_RESCHED) { ++ if (thread_flags & _TIF_NEED_RESCHED_MASK) { + /* Unmask Debug and SError for the next task */ + local_daif_restore(DAIF_PROCCTX_NOIRQ); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0245-powerpc-Add-support-for-lazy-preemption.patch linux-4.19.118/debian/patches-rt/0245-powerpc-Add-support-for-lazy-preemption.patch --- linux-4.19.98/debian/patches-rt/0245-powerpc-Add-support-for-lazy-preemption.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0245-powerpc-Add-support-for-lazy-preemption.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,196 +0,0 @@ -From dbdce4ec0b82c3bbd36c36c374d4f964ecc9f2f1 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Thu, 1 Nov 2012 10:14:11 +0100 -Subject: [PATCH 245/290] powerpc: Add support for lazy preemption -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Implement the powerpc pieces for lazy preempt. - -Signed-off-by: Thomas Gleixner ---- - arch/powerpc/Kconfig | 1 + - arch/powerpc/include/asm/thread_info.h | 9 +++++++-- - arch/powerpc/kernel/asm-offsets.c | 1 + - arch/powerpc/kernel/entry_32.S | 17 ++++++++++++----- - arch/powerpc/kernel/entry_64.S | 16 ++++++++++++---- - 5 files changed, 33 insertions(+), 11 deletions(-) - -diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig -index 1563820a37e8..d4835f8cfcf2 100644 ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -216,6 +216,7 @@ config PPC - select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -+ select HAVE_PREEMPT_LAZY - select HAVE_RCU_TABLE_FREE if SMP - select HAVE_REGS_AND_STACK_ACCESS_API - select HAVE_RELIABLE_STACKTRACE if PPC64 && CPU_LITTLE_ENDIAN -diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h -index 3c0002044bc9..ce316076bc52 100644 ---- a/arch/powerpc/include/asm/thread_info.h -+++ b/arch/powerpc/include/asm/thread_info.h -@@ -37,6 +37,8 @@ struct thread_info { - int cpu; /* cpu we're on */ - int preempt_count; /* 0 => preemptable, - <0 => BUG */ -+ int preempt_lazy_count; /* 0 => preemptable, -+ <0 => BUG */ - unsigned long local_flags; /* private flags for thread */ - #ifdef CONFIG_LIVEPATCH - unsigned long *livepatch_sp; -@@ -81,7 +83,7 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src - #define TIF_SIGPENDING 1 /* signal pending */ - #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ - #define TIF_FSCHECK 3 /* Check FS is USER_DS on return */ --#define TIF_32BIT 4 /* 32 bit binary */ -+#define TIF_NEED_RESCHED_LAZY 4 /* lazy rescheduling necessary */ - #define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */ - #define TIF_PATCH_PENDING 6 /* pending live patching update */ - #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ -@@ -100,6 +102,7 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src - #define TIF_ELF2ABI 18 /* function descriptors must die! */ - #endif - #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ -+#define TIF_32BIT 20 /* 32 bit binary */ - - /* as above, but as bit values */ - #define _TIF_SYSCALL_TRACE (1< -Date: Thu, 14 May 2015 17:52:17 +0200 -Subject: [PATCH 246/290] arch/arm64: Add lazy preempt support -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -arm64 is missing support for PREEMPT_RT. The main feature which is -lacking is support for lazy preemption. The arch-specific entry code, -thread information structure definitions, and associated data tables -have to be extended to provide this support. Then the Kconfig file has -to be extended to indicate the support is available, and also to -indicate that support for full RT preemption is now available. - -Signed-off-by: Anders Roxell ---- - arch/arm64/Kconfig | 1 + - arch/arm64/include/asm/thread_info.h | 6 +++++- - arch/arm64/kernel/asm-offsets.c | 1 + - arch/arm64/kernel/entry.S | 12 +++++++++--- - arch/arm64/kernel/signal.c | 2 +- - 5 files changed, 17 insertions(+), 5 deletions(-) - -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 51fe21f5d078..9bf5be2d6024 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -141,6 +141,7 @@ config ARM64 - select HAVE_PERF_EVENTS - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -+ select HAVE_PREEMPT_LAZY - select HAVE_REGS_AND_STACK_ACCESS_API - select HAVE_RCU_TABLE_FREE - select HAVE_RSEQ -diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h -index cb2c10a8f0a8..f1820f7318b6 100644 ---- a/arch/arm64/include/asm/thread_info.h -+++ b/arch/arm64/include/asm/thread_info.h -@@ -43,6 +43,7 @@ struct thread_info { - u64 ttbr0; /* saved TTBR0_EL1 */ - #endif - int preempt_count; /* 0 => preemptable, <0 => bug */ -+ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ - }; - - #define thread_saved_pc(tsk) \ -@@ -76,6 +77,7 @@ void arch_release_task_struct(struct task_struct *tsk); - #define TIF_FOREIGN_FPSTATE 3 /* CPU's FP state is not current's */ - #define TIF_UPROBE 4 /* uprobe breakpoint or singlestep */ - #define TIF_FSCHECK 5 /* Check FS is USER_DS on return */ -+#define TIF_NEED_RESCHED_LAZY 6 - #define TIF_NOHZ 7 - #define TIF_SYSCALL_TRACE 8 - #define TIF_SYSCALL_AUDIT 9 -@@ -94,6 +96,7 @@ void arch_release_task_struct(struct task_struct *tsk); - #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) - #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) - #define _TIF_FOREIGN_FPSTATE (1 << TIF_FOREIGN_FPSTATE) -+#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) - #define _TIF_NOHZ (1 << TIF_NOHZ) - #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) - #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) -@@ -106,8 +109,9 @@ void arch_release_task_struct(struct task_struct *tsk); - - #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ - _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ -- _TIF_UPROBE | _TIF_FSCHECK) -+ _TIF_UPROBE | _TIF_FSCHECK | _TIF_NEED_RESCHED_LAZY) - -+#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) - #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ - _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ - _TIF_NOHZ) -diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c -index 92fba851ce53..844c71bc865b 100644 ---- a/arch/arm64/kernel/asm-offsets.c -+++ b/arch/arm64/kernel/asm-offsets.c -@@ -41,6 +41,7 @@ int main(void) - BLANK(); - DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags)); - DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count)); -+ DEFINE(TSK_TI_PREEMPT_LAZY, offsetof(struct task_struct, thread_info.preempt_lazy_count)); - DEFINE(TSK_TI_ADDR_LIMIT, offsetof(struct task_struct, thread_info.addr_limit)); - #ifdef CONFIG_ARM64_SW_TTBR0_PAN - DEFINE(TSK_TI_TTBR0, offsetof(struct task_struct, thread_info.ttbr0)); -diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S -index 5f800384cb9a..b582580c8c4c 100644 ---- a/arch/arm64/kernel/entry.S -+++ b/arch/arm64/kernel/entry.S -@@ -623,11 +623,16 @@ el1_irq: - - #ifdef CONFIG_PREEMPT - ldr w24, [tsk, #TSK_TI_PREEMPT] // get preempt count -- cbnz w24, 1f // preempt count != 0 -+ cbnz w24, 2f // preempt count != 0 - ldr x0, [tsk, #TSK_TI_FLAGS] // get flags -- tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? -- bl el1_preempt -+ tbnz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? -+ -+ ldr w24, [tsk, #TSK_TI_PREEMPT_LAZY] // get preempt lazy count -+ cbnz w24, 2f // preempt lazy count != 0 -+ tbz x0, #TIF_NEED_RESCHED_LAZY, 2f // needs rescheduling? - 1: -+ bl el1_preempt -+2: - #endif - #ifdef CONFIG_TRACE_IRQFLAGS - bl trace_hardirqs_on -@@ -641,6 +646,7 @@ el1_preempt: - 1: bl preempt_schedule_irq // irq en/disable is done inside - ldr x0, [tsk, #TSK_TI_FLAGS] // get new tasks TI_FLAGS - tbnz x0, #TIF_NEED_RESCHED, 1b // needs rescheduling? -+ tbnz x0, #TIF_NEED_RESCHED_LAZY, 1b // needs rescheduling? - ret x24 - #endif - -diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c -index 5dcc942906db..4fec251fe147 100644 ---- a/arch/arm64/kernel/signal.c -+++ b/arch/arm64/kernel/signal.c -@@ -926,7 +926,7 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, - /* Check valid user FS if needed */ - addr_limit_user_check(); - -- if (thread_flags & _TIF_NEED_RESCHED) { -+ if (thread_flags & _TIF_NEED_RESCHED_MASK) { - /* Unmask Debug and SError for the next task */ - local_daif_restore(DAIF_PROCCTX_NOIRQ); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0246-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch linux-4.19.118/debian/patches-rt/0246-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch --- linux-4.19.98/debian/patches-rt/0246-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0246-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,74 @@ +From 1eed9b912ffd15cfa4b21eed03047caa1a342793 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Sun, 16 Oct 2016 05:11:54 +0200 +Subject: [PATCH 246/325] connector/cn_proc: Protect send_msg() with a local + lock on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:931 +|in_atomic(): 1, irqs_disabled(): 0, pid: 31807, name: sleep +|Preemption disabled at:[] proc_exit_connector+0xbb/0x140 +| +|CPU: 4 PID: 31807 Comm: sleep Tainted: G W E 4.8.0-rt11-rt #106 +|Call Trace: +| [] dump_stack+0x65/0x88 +| [] ___might_sleep+0xf5/0x180 +| [] __rt_spin_lock+0x20/0x50 +| [] rt_read_lock+0x28/0x30 +| [] netlink_broadcast_filtered+0x49/0x3f0 +| [] ? __kmalloc_reserve.isra.33+0x31/0x90 +| [] netlink_broadcast+0x1d/0x20 +| [] cn_netlink_send_mult+0x19a/0x1f0 +| [] cn_netlink_send+0x1b/0x20 +| [] proc_exit_connector+0xf8/0x140 +| [] do_exit+0x5d1/0xba0 +| [] do_group_exit+0x4c/0xc0 +| [] SyS_exit_group+0x14/0x20 +| [] entry_SYSCALL_64_fastpath+0x1a/0xa4 + +Since ab8ed951080e ("connector: fix out-of-order cn_proc netlink message +delivery") which is v4.7-rc6. + +Signed-off-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/connector/cn_proc.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c +index ad48fd52cb53..c5264b3ee0b0 100644 +--- a/drivers/connector/cn_proc.c ++++ b/drivers/connector/cn_proc.c +@@ -32,6 +32,7 @@ + #include + + #include ++#include + + /* + * Size of a cn_msg followed by a proc_event structure. Since the +@@ -54,10 +55,11 @@ static struct cb_id cn_proc_event_id = { CN_IDX_PROC, CN_VAL_PROC }; + + /* proc_event_counts is used as the sequence number of the netlink message */ + static DEFINE_PER_CPU(__u32, proc_event_counts) = { 0 }; ++static DEFINE_LOCAL_IRQ_LOCK(send_msg_lock); + + static inline void send_msg(struct cn_msg *msg) + { +- preempt_disable(); ++ local_lock(send_msg_lock); + + msg->seq = __this_cpu_inc_return(proc_event_counts) - 1; + ((struct proc_event *)msg->data)->cpu = smp_processor_id(); +@@ -70,7 +72,7 @@ static inline void send_msg(struct cn_msg *msg) + */ + cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_NOWAIT); + +- preempt_enable(); ++ local_unlock(send_msg_lock); + } + + void proc_fork_connector(struct task_struct *task) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0247-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch linux-4.19.118/debian/patches-rt/0247-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch --- linux-4.19.98/debian/patches-rt/0247-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0247-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -From f4dc4bd0a39f63d832830cf52a03dc9fdc628234 Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Sun, 16 Oct 2016 05:11:54 +0200 -Subject: [PATCH 247/290] connector/cn_proc: Protect send_msg() with a local - lock on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:931 -|in_atomic(): 1, irqs_disabled(): 0, pid: 31807, name: sleep -|Preemption disabled at:[] proc_exit_connector+0xbb/0x140 -| -|CPU: 4 PID: 31807 Comm: sleep Tainted: G W E 4.8.0-rt11-rt #106 -|Call Trace: -| [] dump_stack+0x65/0x88 -| [] ___might_sleep+0xf5/0x180 -| [] __rt_spin_lock+0x20/0x50 -| [] rt_read_lock+0x28/0x30 -| [] netlink_broadcast_filtered+0x49/0x3f0 -| [] ? __kmalloc_reserve.isra.33+0x31/0x90 -| [] netlink_broadcast+0x1d/0x20 -| [] cn_netlink_send_mult+0x19a/0x1f0 -| [] cn_netlink_send+0x1b/0x20 -| [] proc_exit_connector+0xf8/0x140 -| [] do_exit+0x5d1/0xba0 -| [] do_group_exit+0x4c/0xc0 -| [] SyS_exit_group+0x14/0x20 -| [] entry_SYSCALL_64_fastpath+0x1a/0xa4 - -Since ab8ed951080e ("connector: fix out-of-order cn_proc netlink message -delivery") which is v4.7-rc6. - -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/connector/cn_proc.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c -index ad48fd52cb53..c5264b3ee0b0 100644 ---- a/drivers/connector/cn_proc.c -+++ b/drivers/connector/cn_proc.c -@@ -32,6 +32,7 @@ - #include - - #include -+#include - - /* - * Size of a cn_msg followed by a proc_event structure. Since the -@@ -54,10 +55,11 @@ static struct cb_id cn_proc_event_id = { CN_IDX_PROC, CN_VAL_PROC }; - - /* proc_event_counts is used as the sequence number of the netlink message */ - static DEFINE_PER_CPU(__u32, proc_event_counts) = { 0 }; -+static DEFINE_LOCAL_IRQ_LOCK(send_msg_lock); - - static inline void send_msg(struct cn_msg *msg) - { -- preempt_disable(); -+ local_lock(send_msg_lock); - - msg->seq = __this_cpu_inc_return(proc_event_counts) - 1; - ((struct proc_event *)msg->data)->cpu = smp_processor_id(); -@@ -70,7 +72,7 @@ static inline void send_msg(struct cn_msg *msg) - */ - cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_NOWAIT); - -- preempt_enable(); -+ local_unlock(send_msg_lock); - } - - void proc_fork_connector(struct task_struct *task) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0247-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch linux-4.19.118/debian/patches-rt/0247-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch --- linux-4.19.98/debian/patches-rt/0247-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0247-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,104 @@ +From a7c2fa6469af6930d216847445366a31e578c551 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Thu, 31 Mar 2016 04:08:28 +0200 +Subject: [PATCH 247/325] drivers/block/zram: Replace bit spinlocks with + rtmutex for -rt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +They're nondeterministic, and lead to ___might_sleep() splats in -rt. +OTOH, they're a lot less wasteful than an rtmutex per page. + +Signed-off-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/block/zram/zram_drv.c | 38 +++++++++++++++++++++++++++++++++++ + drivers/block/zram/zram_drv.h | 3 +++ + 2 files changed, 41 insertions(+) + +diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c +index 76abe40bfa83..d6cf9508b80d 100644 +--- a/drivers/block/zram/zram_drv.c ++++ b/drivers/block/zram/zram_drv.c +@@ -53,6 +53,40 @@ static size_t huge_class_size; + + static void zram_free_page(struct zram *zram, size_t index); + ++#ifdef CONFIG_PREEMPT_RT_BASE ++static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) ++{ ++ size_t index; ++ ++ for (index = 0; index < num_pages; index++) ++ spin_lock_init(&zram->table[index].lock); ++} ++ ++static int zram_slot_trylock(struct zram *zram, u32 index) ++{ ++ int ret; ++ ++ ret = spin_trylock(&zram->table[index].lock); ++ if (ret) ++ __set_bit(ZRAM_LOCK, &zram->table[index].value); ++ return ret; ++} ++ ++static void zram_slot_lock(struct zram *zram, u32 index) ++{ ++ spin_lock(&zram->table[index].lock); ++ __set_bit(ZRAM_LOCK, &zram->table[index].value); ++} ++ ++static void zram_slot_unlock(struct zram *zram, u32 index) ++{ ++ __clear_bit(ZRAM_LOCK, &zram->table[index].value); ++ spin_unlock(&zram->table[index].lock); ++} ++ ++#else ++static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { } ++ + static int zram_slot_trylock(struct zram *zram, u32 index) + { + return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].value); +@@ -67,6 +101,7 @@ static void zram_slot_unlock(struct zram *zram, u32 index) + { + bit_spin_unlock(ZRAM_LOCK, &zram->table[index].value); + } ++#endif + + static inline bool init_done(struct zram *zram) + { +@@ -902,6 +937,8 @@ static DEVICE_ATTR_RO(io_stat); + static DEVICE_ATTR_RO(mm_stat); + static DEVICE_ATTR_RO(debug_stat); + ++ ++ + static void zram_meta_free(struct zram *zram, u64 disksize) + { + size_t num_pages = disksize >> PAGE_SHIFT; +@@ -932,6 +969,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize) + + if (!huge_class_size) + huge_class_size = zs_huge_class_size(zram->mem_pool); ++ zram_meta_init_table_locks(zram, num_pages); + return true; + } + +diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h +index d1095dfdffa8..144e91061df8 100644 +--- a/drivers/block/zram/zram_drv.h ++++ b/drivers/block/zram/zram_drv.h +@@ -61,6 +61,9 @@ struct zram_table_entry { + unsigned long element; + }; + unsigned long value; ++#ifdef CONFIG_PREEMPT_RT_BASE ++ spinlock_t lock; ++#endif + #ifdef CONFIG_ZRAM_MEMORY_TRACKING + ktime_t ac_time; + #endif +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0248-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch linux-4.19.118/debian/patches-rt/0248-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch --- linux-4.19.98/debian/patches-rt/0248-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0248-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -From 299edbde24f04fa915d7017d674aeee802a4426b Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Thu, 31 Mar 2016 04:08:28 +0200 -Subject: [PATCH 248/290] drivers/block/zram: Replace bit spinlocks with - rtmutex for -rt -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -They're nondeterministic, and lead to ___might_sleep() splats in -rt. -OTOH, they're a lot less wasteful than an rtmutex per page. - -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/block/zram/zram_drv.c | 38 +++++++++++++++++++++++++++++++++++ - drivers/block/zram/zram_drv.h | 3 +++ - 2 files changed, 41 insertions(+) - -diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c -index 76abe40bfa83..d6cf9508b80d 100644 ---- a/drivers/block/zram/zram_drv.c -+++ b/drivers/block/zram/zram_drv.c -@@ -53,6 +53,40 @@ static size_t huge_class_size; - - static void zram_free_page(struct zram *zram, size_t index); - -+#ifdef CONFIG_PREEMPT_RT_BASE -+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) -+{ -+ size_t index; -+ -+ for (index = 0; index < num_pages; index++) -+ spin_lock_init(&zram->table[index].lock); -+} -+ -+static int zram_slot_trylock(struct zram *zram, u32 index) -+{ -+ int ret; -+ -+ ret = spin_trylock(&zram->table[index].lock); -+ if (ret) -+ __set_bit(ZRAM_LOCK, &zram->table[index].value); -+ return ret; -+} -+ -+static void zram_slot_lock(struct zram *zram, u32 index) -+{ -+ spin_lock(&zram->table[index].lock); -+ __set_bit(ZRAM_LOCK, &zram->table[index].value); -+} -+ -+static void zram_slot_unlock(struct zram *zram, u32 index) -+{ -+ __clear_bit(ZRAM_LOCK, &zram->table[index].value); -+ spin_unlock(&zram->table[index].lock); -+} -+ -+#else -+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { } -+ - static int zram_slot_trylock(struct zram *zram, u32 index) - { - return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].value); -@@ -67,6 +101,7 @@ static void zram_slot_unlock(struct zram *zram, u32 index) - { - bit_spin_unlock(ZRAM_LOCK, &zram->table[index].value); - } -+#endif - - static inline bool init_done(struct zram *zram) - { -@@ -902,6 +937,8 @@ static DEVICE_ATTR_RO(io_stat); - static DEVICE_ATTR_RO(mm_stat); - static DEVICE_ATTR_RO(debug_stat); - -+ -+ - static void zram_meta_free(struct zram *zram, u64 disksize) - { - size_t num_pages = disksize >> PAGE_SHIFT; -@@ -932,6 +969,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize) - - if (!huge_class_size) - huge_class_size = zs_huge_class_size(zram->mem_pool); -+ zram_meta_init_table_locks(zram, num_pages); - return true; - } - -diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h -index d1095dfdffa8..144e91061df8 100644 ---- a/drivers/block/zram/zram_drv.h -+++ b/drivers/block/zram/zram_drv.h -@@ -61,6 +61,9 @@ struct zram_table_entry { - unsigned long element; - }; - unsigned long value; -+#ifdef CONFIG_PREEMPT_RT_BASE -+ spinlock_t lock; -+#endif - #ifdef CONFIG_ZRAM_MEMORY_TRACKING - ktime_t ac_time; - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0248-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch linux-4.19.118/debian/patches-rt/0248-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch --- linux-4.19.98/debian/patches-rt/0248-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0248-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,107 @@ +From 0df868e81dab3ab27436db83c1c4450762e18732 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Thu, 20 Oct 2016 11:15:22 +0200 +Subject: [PATCH 248/325] drivers/zram: Don't disable preemption in + zcomp_stream_get/put() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +In v4.7, the driver switched to percpu compression streams, disabling +preemption via get/put_cpu_ptr(). Use a per-zcomp_strm lock here. We +also have to fix an lock order issue in zram_decompress_page() such +that zs_map_object() nests inside of zcomp_stream_put() as it does in +zram_bvec_write(). + +Signed-off-by: Mike Galbraith +[bigeasy: get_locked_var() -> per zcomp_strm lock] +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/block/zram/zcomp.c | 12 ++++++++++-- + drivers/block/zram/zcomp.h | 1 + + drivers/block/zram/zram_drv.c | 5 +++-- + 3 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c +index 4ed0a78fdc09..dd65a27ae2cc 100644 +--- a/drivers/block/zram/zcomp.c ++++ b/drivers/block/zram/zcomp.c +@@ -116,12 +116,19 @@ ssize_t zcomp_available_show(const char *comp, char *buf) + + struct zcomp_strm *zcomp_stream_get(struct zcomp *comp) + { +- return *get_cpu_ptr(comp->stream); ++ struct zcomp_strm *zstrm; ++ ++ zstrm = *this_cpu_ptr(comp->stream); ++ spin_lock(&zstrm->zcomp_lock); ++ return zstrm; + } + + void zcomp_stream_put(struct zcomp *comp) + { +- put_cpu_ptr(comp->stream); ++ struct zcomp_strm *zstrm; ++ ++ zstrm = *this_cpu_ptr(comp->stream); ++ spin_unlock(&zstrm->zcomp_lock); + } + + int zcomp_compress(struct zcomp_strm *zstrm, +@@ -171,6 +178,7 @@ int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) + pr_err("Can't allocate a compression stream\n"); + return -ENOMEM; + } ++ spin_lock_init(&zstrm->zcomp_lock); + *per_cpu_ptr(comp->stream, cpu) = zstrm; + return 0; + } +diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h +index 41c1002a7d7d..d424eafcbf8e 100644 +--- a/drivers/block/zram/zcomp.h ++++ b/drivers/block/zram/zcomp.h +@@ -14,6 +14,7 @@ struct zcomp_strm { + /* compression/decompression buffer */ + void *buffer; + struct crypto_comp *tfm; ++ spinlock_t zcomp_lock; + }; + + /* dynamic per-device compression frontend */ +diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c +index d6cf9508b80d..71520199226a 100644 +--- a/drivers/block/zram/zram_drv.c ++++ b/drivers/block/zram/zram_drv.c +@@ -1028,6 +1028,7 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, + unsigned long handle; + unsigned int size; + void *src, *dst; ++ struct zcomp_strm *zstrm; + + if (zram_wb_enabled(zram)) { + zram_slot_lock(zram, index); +@@ -1062,6 +1063,7 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, + + size = zram_get_obj_size(zram, index); + ++ zstrm = zcomp_stream_get(zram->comp); + src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); + if (size == PAGE_SIZE) { + dst = kmap_atomic(page); +@@ -1069,14 +1071,13 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, + kunmap_atomic(dst); + ret = 0; + } else { +- struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp); + + dst = kmap_atomic(page); + ret = zcomp_decompress(zstrm, src, size, dst); + kunmap_atomic(dst); +- zcomp_stream_put(zram->comp); + } + zs_unmap_object(zram->mem_pool, handle); ++ zcomp_stream_put(zram->comp); + zram_slot_unlock(zram, index); + + /* Should NEVER happen. Return bio error if it does. */ +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0249-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch linux-4.19.118/debian/patches-rt/0249-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch --- linux-4.19.98/debian/patches-rt/0249-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0249-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -From 62ee8af11e220e642012e3364327cd4510578f07 Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Thu, 20 Oct 2016 11:15:22 +0200 -Subject: [PATCH 249/290] drivers/zram: Don't disable preemption in - zcomp_stream_get/put() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -In v4.7, the driver switched to percpu compression streams, disabling -preemption via get/put_cpu_ptr(). Use a per-zcomp_strm lock here. We -also have to fix an lock order issue in zram_decompress_page() such -that zs_map_object() nests inside of zcomp_stream_put() as it does in -zram_bvec_write(). - -Signed-off-by: Mike Galbraith -[bigeasy: get_locked_var() -> per zcomp_strm lock] -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/block/zram/zcomp.c | 12 ++++++++++-- - drivers/block/zram/zcomp.h | 1 + - drivers/block/zram/zram_drv.c | 5 +++-- - 3 files changed, 14 insertions(+), 4 deletions(-) - -diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c -index 4ed0a78fdc09..dd65a27ae2cc 100644 ---- a/drivers/block/zram/zcomp.c -+++ b/drivers/block/zram/zcomp.c -@@ -116,12 +116,19 @@ ssize_t zcomp_available_show(const char *comp, char *buf) - - struct zcomp_strm *zcomp_stream_get(struct zcomp *comp) - { -- return *get_cpu_ptr(comp->stream); -+ struct zcomp_strm *zstrm; -+ -+ zstrm = *this_cpu_ptr(comp->stream); -+ spin_lock(&zstrm->zcomp_lock); -+ return zstrm; - } - - void zcomp_stream_put(struct zcomp *comp) - { -- put_cpu_ptr(comp->stream); -+ struct zcomp_strm *zstrm; -+ -+ zstrm = *this_cpu_ptr(comp->stream); -+ spin_unlock(&zstrm->zcomp_lock); - } - - int zcomp_compress(struct zcomp_strm *zstrm, -@@ -171,6 +178,7 @@ int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) - pr_err("Can't allocate a compression stream\n"); - return -ENOMEM; - } -+ spin_lock_init(&zstrm->zcomp_lock); - *per_cpu_ptr(comp->stream, cpu) = zstrm; - return 0; - } -diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h -index 41c1002a7d7d..d424eafcbf8e 100644 ---- a/drivers/block/zram/zcomp.h -+++ b/drivers/block/zram/zcomp.h -@@ -14,6 +14,7 @@ struct zcomp_strm { - /* compression/decompression buffer */ - void *buffer; - struct crypto_comp *tfm; -+ spinlock_t zcomp_lock; - }; - - /* dynamic per-device compression frontend */ -diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c -index d6cf9508b80d..71520199226a 100644 ---- a/drivers/block/zram/zram_drv.c -+++ b/drivers/block/zram/zram_drv.c -@@ -1028,6 +1028,7 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, - unsigned long handle; - unsigned int size; - void *src, *dst; -+ struct zcomp_strm *zstrm; - - if (zram_wb_enabled(zram)) { - zram_slot_lock(zram, index); -@@ -1062,6 +1063,7 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, - - size = zram_get_obj_size(zram, index); - -+ zstrm = zcomp_stream_get(zram->comp); - src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); - if (size == PAGE_SIZE) { - dst = kmap_atomic(page); -@@ -1069,14 +1071,13 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, - kunmap_atomic(dst); - ret = 0; - } else { -- struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp); - - dst = kmap_atomic(page); - ret = zcomp_decompress(zstrm, src, size, dst); - kunmap_atomic(dst); -- zcomp_stream_put(zram->comp); - } - zs_unmap_object(zram->mem_pool, handle); -+ zcomp_stream_put(zram->comp); - zram_slot_unlock(zram, index); - - /* Should NEVER happen. Return bio error if it does. */ --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0249-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch linux-4.19.118/debian/patches-rt/0249-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch --- linux-4.19.98/debian/patches-rt/0249-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0249-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,44 @@ +From 44c6e90b8eb58224617f979562d4614543ec3df1 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Wed, 23 Aug 2017 11:57:29 +0200 +Subject: [PATCH 249/325] drivers/zram: fix zcomp_stream_get() + smp_processor_id() use in preemptible code +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Use get_local_ptr() instead this_cpu_ptr() to avoid a warning regarding +smp_processor_id() in preemptible code. +raw_cpu_ptr() would be fine, too because the per-CPU data structure is +protected with a spin lock so it does not matter much if we take the +other one. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/block/zram/zcomp.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c +index dd65a27ae2cc..eece02262000 100644 +--- a/drivers/block/zram/zcomp.c ++++ b/drivers/block/zram/zcomp.c +@@ -118,7 +118,7 @@ struct zcomp_strm *zcomp_stream_get(struct zcomp *comp) + { + struct zcomp_strm *zstrm; + +- zstrm = *this_cpu_ptr(comp->stream); ++ zstrm = *get_local_ptr(comp->stream); + spin_lock(&zstrm->zcomp_lock); + return zstrm; + } +@@ -129,6 +129,7 @@ void zcomp_stream_put(struct zcomp *comp) + + zstrm = *this_cpu_ptr(comp->stream); + spin_unlock(&zstrm->zcomp_lock); ++ put_local_ptr(zstrm); + } + + int zcomp_compress(struct zcomp_strm *zstrm, +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0250-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch linux-4.19.118/debian/patches-rt/0250-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch --- linux-4.19.98/debian/patches-rt/0250-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0250-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -From e68090808bef14283e17ecb7a6549728ffd2240b Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Wed, 23 Aug 2017 11:57:29 +0200 -Subject: [PATCH 250/290] drivers/zram: fix zcomp_stream_get() - smp_processor_id() use in preemptible code -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Use get_local_ptr() instead this_cpu_ptr() to avoid a warning regarding -smp_processor_id() in preemptible code. -raw_cpu_ptr() would be fine, too because the per-CPU data structure is -protected with a spin lock so it does not matter much if we take the -other one. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/block/zram/zcomp.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c -index dd65a27ae2cc..eece02262000 100644 ---- a/drivers/block/zram/zcomp.c -+++ b/drivers/block/zram/zcomp.c -@@ -118,7 +118,7 @@ struct zcomp_strm *zcomp_stream_get(struct zcomp *comp) - { - struct zcomp_strm *zstrm; - -- zstrm = *this_cpu_ptr(comp->stream); -+ zstrm = *get_local_ptr(comp->stream); - spin_lock(&zstrm->zcomp_lock); - return zstrm; - } -@@ -129,6 +129,7 @@ void zcomp_stream_put(struct zcomp *comp) - - zstrm = *this_cpu_ptr(comp->stream); - spin_unlock(&zstrm->zcomp_lock); -+ put_local_ptr(zstrm); - } - - int zcomp_compress(struct zcomp_strm *zstrm, --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0250-tpm_tis-fix-stall-after-iowrite-s.patch linux-4.19.118/debian/patches-rt/0250-tpm_tis-fix-stall-after-iowrite-s.patch --- linux-4.19.98/debian/patches-rt/0250-tpm_tis-fix-stall-after-iowrite-s.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0250-tpm_tis-fix-stall-after-iowrite-s.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,84 @@ +From 2fd4af0cf67e67ff4d6de0cd2302ebf9729c03a9 Mon Sep 17 00:00:00 2001 +From: Haris Okanovic +Date: Tue, 15 Aug 2017 15:13:08 -0500 +Subject: [PATCH 250/325] tpm_tis: fix stall after iowrite*()s +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +ioread8() operations to TPM MMIO addresses can stall the cpu when +immediately following a sequence of iowrite*()'s to the same region. + +For example, cyclitest measures ~400us latency spikes when a non-RT +usermode application communicates with an SPI-based TPM chip (Intel Atom +E3940 system, PREEMPT_RT_FULL kernel). The spikes are caused by a +stalling ioread8() operation following a sequence of 30+ iowrite8()s to +the same address. I believe this happens because the write sequence is +buffered (in cpu or somewhere along the bus), and gets flushed on the +first LOAD instruction (ioread*()) that follows. + +The enclosed change appears to fix this issue: read the TPM chip's +access register (status code) after every iowrite*() operation to +amortize the cost of flushing data to chip across multiple instructions. + +Signed-off-by: Haris Okanovic +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/char/tpm/tpm_tis.c | 29 +++++++++++++++++++++++++++-- + 1 file changed, 27 insertions(+), 2 deletions(-) + +diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c +index f08949a5f678..9fefcfcae593 100644 +--- a/drivers/char/tpm/tpm_tis.c ++++ b/drivers/char/tpm/tpm_tis.c +@@ -53,6 +53,31 @@ static inline struct tpm_tis_tcg_phy *to_tpm_tis_tcg_phy(struct tpm_tis_data *da + return container_of(data, struct tpm_tis_tcg_phy, priv); + } + ++#ifdef CONFIG_PREEMPT_RT_FULL ++/* ++ * Flushes previous write operations to chip so that a subsequent ++ * ioread*()s won't stall a cpu. ++ */ ++static inline void tpm_tis_flush(void __iomem *iobase) ++{ ++ ioread8(iobase + TPM_ACCESS(0)); ++} ++#else ++#define tpm_tis_flush(iobase) do { } while (0) ++#endif ++ ++static inline void tpm_tis_iowrite8(u8 b, void __iomem *iobase, u32 addr) ++{ ++ iowrite8(b, iobase + addr); ++ tpm_tis_flush(iobase); ++} ++ ++static inline void tpm_tis_iowrite32(u32 b, void __iomem *iobase, u32 addr) ++{ ++ iowrite32(b, iobase + addr); ++ tpm_tis_flush(iobase); ++} ++ + static bool interrupts = true; + module_param(interrupts, bool, 0444); + MODULE_PARM_DESC(interrupts, "Enable interrupts"); +@@ -150,7 +175,7 @@ static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len, + struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); + + while (len--) +- iowrite8(*value++, phy->iobase + addr); ++ tpm_tis_iowrite8(*value++, phy->iobase, addr); + + return 0; + } +@@ -177,7 +202,7 @@ static int tpm_tcg_write32(struct tpm_tis_data *data, u32 addr, u32 value) + { + struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); + +- iowrite32(value, phy->iobase + addr); ++ tpm_tis_iowrite32(value, phy->iobase, addr); + + return 0; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0251-tpm_tis-fix-stall-after-iowrite-s.patch linux-4.19.118/debian/patches-rt/0251-tpm_tis-fix-stall-after-iowrite-s.patch --- linux-4.19.98/debian/patches-rt/0251-tpm_tis-fix-stall-after-iowrite-s.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0251-tpm_tis-fix-stall-after-iowrite-s.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -From fb36406fa8141b155e8ff2b751a13f9607520c2d Mon Sep 17 00:00:00 2001 -From: Haris Okanovic -Date: Tue, 15 Aug 2017 15:13:08 -0500 -Subject: [PATCH 251/290] tpm_tis: fix stall after iowrite*()s -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -ioread8() operations to TPM MMIO addresses can stall the cpu when -immediately following a sequence of iowrite*()'s to the same region. - -For example, cyclitest measures ~400us latency spikes when a non-RT -usermode application communicates with an SPI-based TPM chip (Intel Atom -E3940 system, PREEMPT_RT_FULL kernel). The spikes are caused by a -stalling ioread8() operation following a sequence of 30+ iowrite8()s to -the same address. I believe this happens because the write sequence is -buffered (in cpu or somewhere along the bus), and gets flushed on the -first LOAD instruction (ioread*()) that follows. - -The enclosed change appears to fix this issue: read the TPM chip's -access register (status code) after every iowrite*() operation to -amortize the cost of flushing data to chip across multiple instructions. - -Signed-off-by: Haris Okanovic -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/char/tpm/tpm_tis.c | 29 +++++++++++++++++++++++++++-- - 1 file changed, 27 insertions(+), 2 deletions(-) - -diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c -index f08949a5f678..9fefcfcae593 100644 ---- a/drivers/char/tpm/tpm_tis.c -+++ b/drivers/char/tpm/tpm_tis.c -@@ -53,6 +53,31 @@ static inline struct tpm_tis_tcg_phy *to_tpm_tis_tcg_phy(struct tpm_tis_data *da - return container_of(data, struct tpm_tis_tcg_phy, priv); - } - -+#ifdef CONFIG_PREEMPT_RT_FULL -+/* -+ * Flushes previous write operations to chip so that a subsequent -+ * ioread*()s won't stall a cpu. -+ */ -+static inline void tpm_tis_flush(void __iomem *iobase) -+{ -+ ioread8(iobase + TPM_ACCESS(0)); -+} -+#else -+#define tpm_tis_flush(iobase) do { } while (0) -+#endif -+ -+static inline void tpm_tis_iowrite8(u8 b, void __iomem *iobase, u32 addr) -+{ -+ iowrite8(b, iobase + addr); -+ tpm_tis_flush(iobase); -+} -+ -+static inline void tpm_tis_iowrite32(u32 b, void __iomem *iobase, u32 addr) -+{ -+ iowrite32(b, iobase + addr); -+ tpm_tis_flush(iobase); -+} -+ - static bool interrupts = true; - module_param(interrupts, bool, 0444); - MODULE_PARM_DESC(interrupts, "Enable interrupts"); -@@ -150,7 +175,7 @@ static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len, - struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); - - while (len--) -- iowrite8(*value++, phy->iobase + addr); -+ tpm_tis_iowrite8(*value++, phy->iobase, addr); - - return 0; - } -@@ -177,7 +202,7 @@ static int tpm_tcg_write32(struct tpm_tis_data *data, u32 addr, u32 value) - { - struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); - -- iowrite32(value, phy->iobase + addr); -+ tpm_tis_iowrite32(value, phy->iobase, addr); - - return 0; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0251-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch linux-4.19.118/debian/patches-rt/0251-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch --- linux-4.19.98/debian/patches-rt/0251-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0251-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,81 @@ +From fb131ef07b6163f19997356ad5267dc46fbe0514 Mon Sep 17 00:00:00 2001 +From: Julia Cartwright +Date: Fri, 28 Sep 2018 21:03:51 +0000 +Subject: [PATCH 251/325] watchdog: prevent deferral of watchdogd wakeup on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +When PREEMPT_RT_FULL is enabled, all hrtimer expiry functions are +deferred for execution into the context of ktimersoftd unless otherwise +annotated. + +Deferring the expiry of the hrtimer used by the watchdog core, however, +is a waste, as the callback does nothing but queue a kthread work item +and wakeup watchdogd. + +It's worst then that, too: the deferral through ktimersoftd also means +that for correct behavior a user must adjust the scheduling parameters +of both watchdogd _and_ ktimersoftd, which is unnecessary and has other +side effects (like causing unrelated expiry functions to execute at +potentially elevated priority). + +Instead, mark the hrtimer used by the watchdog core as being _HARD to +allow it's execution directly from hardirq context. The work done in +this expiry function is well-bounded and minimal. + +A user still must adjust the scheduling parameters of the watchdogd +to be correct w.r.t. their application needs. + +Cc: Guenter Roeck +Reported-and-tested-by: Steffen Trumtrar +Reported-by: Tim Sander +Signed-off-by: Julia Cartwright +Acked-by: Guenter Roeck +[bigeasy: use only HRTIMER_MODE_REL_HARD] +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/watchdog/watchdog_dev.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c +index e64aa88e99da..11ba2c3b187f 100644 +--- a/drivers/watchdog/watchdog_dev.c ++++ b/drivers/watchdog/watchdog_dev.c +@@ -145,7 +145,7 @@ static inline void watchdog_update_worker(struct watchdog_device *wdd) + ktime_t t = watchdog_next_keepalive(wdd); + + if (t > 0) +- hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL); ++ hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL_HARD); + } else { + hrtimer_cancel(&wd_data->timer); + } +@@ -164,7 +164,7 @@ static int __watchdog_ping(struct watchdog_device *wdd) + if (ktime_after(earliest_keepalive, now)) { + hrtimer_start(&wd_data->timer, + ktime_sub(earliest_keepalive, now), +- HRTIMER_MODE_REL); ++ HRTIMER_MODE_REL_HARD); + return 0; + } + +@@ -947,7 +947,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd) + return -ENODEV; + + kthread_init_work(&wd_data->work, watchdog_ping_work); +- hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); + wd_data->timer.function = watchdog_timer_expired; + + if (wdd->id == 0) { +@@ -1004,7 +1004,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd) + __module_get(wdd->ops->owner); + get_device(&wd_data->dev); + if (handle_boot_enabled) +- hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL); ++ hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL_HARD); + else + pr_info("watchdog%d running and kernel based pre-userspace handler disabled\n", + wdd->id); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0252-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch linux-4.19.118/debian/patches-rt/0252-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch --- linux-4.19.98/debian/patches-rt/0252-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0252-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,61 @@ +From fa2aaf043441bd422f017ee044eec3e113cc18b9 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Sat, 27 Feb 2016 08:09:11 +0100 +Subject: [PATCH 252/325] drm,radeon,i915: Use preempt_disable/enable_rt() + where recommended +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +DRM folks identified the spots, so use them. + +Signed-off-by: Mike Galbraith +Cc: Sebastian Andrzej Siewior +Cc: linux-rt-users +Signed-off-by: Thomas Gleixner +--- + drivers/gpu/drm/i915/i915_irq.c | 2 ++ + drivers/gpu/drm/radeon/radeon_display.c | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c +index 29877969310d..f65817c51c2a 100644 +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -1025,6 +1025,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, + spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); + + /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_disable_rt(); + + /* Get optional system timestamp before query. */ + if (stime) +@@ -1076,6 +1077,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, + *etime = ktime_get(); + + /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_enable_rt(); + + spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); + +diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c +index 7d1e14f0140a..bcc3456749d6 100644 +--- a/drivers/gpu/drm/radeon/radeon_display.c ++++ b/drivers/gpu/drm/radeon/radeon_display.c +@@ -1815,6 +1815,7 @@ int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, + struct radeon_device *rdev = dev->dev_private; + + /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_disable_rt(); + + /* Get optional system timestamp before query. */ + if (stime) +@@ -1907,6 +1908,7 @@ int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, + *etime = ktime_get(); + + /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_enable_rt(); + + /* Decode into vertical and horizontal scanout position. */ + *vpos = position & 0x1fff; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0252-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch linux-4.19.118/debian/patches-rt/0252-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch --- linux-4.19.98/debian/patches-rt/0252-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0252-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -From 1a6947443058c0374db28d38e92671731ce32711 Mon Sep 17 00:00:00 2001 -From: Julia Cartwright -Date: Fri, 28 Sep 2018 21:03:51 +0000 -Subject: [PATCH 252/290] watchdog: prevent deferral of watchdogd wakeup on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -When PREEMPT_RT_FULL is enabled, all hrtimer expiry functions are -deferred for execution into the context of ktimersoftd unless otherwise -annotated. - -Deferring the expiry of the hrtimer used by the watchdog core, however, -is a waste, as the callback does nothing but queue a kthread work item -and wakeup watchdogd. - -It's worst then that, too: the deferral through ktimersoftd also means -that for correct behavior a user must adjust the scheduling parameters -of both watchdogd _and_ ktimersoftd, which is unnecessary and has other -side effects (like causing unrelated expiry functions to execute at -potentially elevated priority). - -Instead, mark the hrtimer used by the watchdog core as being _HARD to -allow it's execution directly from hardirq context. The work done in -this expiry function is well-bounded and minimal. - -A user still must adjust the scheduling parameters of the watchdogd -to be correct w.r.t. their application needs. - -Cc: Guenter Roeck -Reported-and-tested-by: Steffen Trumtrar -Reported-by: Tim Sander -Signed-off-by: Julia Cartwright -Acked-by: Guenter Roeck -[bigeasy: use only HRTIMER_MODE_REL_HARD] -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/watchdog/watchdog_dev.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c -index 4b89333e8eb4..ed12734e1e8c 100644 ---- a/drivers/watchdog/watchdog_dev.c -+++ b/drivers/watchdog/watchdog_dev.c -@@ -146,7 +146,7 @@ static inline void watchdog_update_worker(struct watchdog_device *wdd) - ktime_t t = watchdog_next_keepalive(wdd); - - if (t > 0) -- hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL); -+ hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL_HARD); - } else { - hrtimer_cancel(&wd_data->timer); - } -@@ -165,7 +165,7 @@ static int __watchdog_ping(struct watchdog_device *wdd) - if (ktime_after(earliest_keepalive, now)) { - hrtimer_start(&wd_data->timer, - ktime_sub(earliest_keepalive, now), -- HRTIMER_MODE_REL); -+ HRTIMER_MODE_REL_HARD); - return 0; - } - -@@ -948,7 +948,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd) - return -ENODEV; - - kthread_init_work(&wd_data->work, watchdog_ping_work); -- hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); - wd_data->timer.function = watchdog_timer_expired; - - if (wdd->id == 0) { -@@ -1005,7 +1005,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd) - __module_get(wdd->ops->owner); - get_device(&wd_data->dev); - if (handle_boot_enabled) -- hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL); -+ hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL_HARD); - else - pr_info("watchdog%d running and kernel based pre-userspace handler disabled\n", - wdd->id); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0253-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch linux-4.19.118/debian/patches-rt/0253-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch --- linux-4.19.98/debian/patches-rt/0253-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0253-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,128 @@ +From c034b59f5f74a92a5f458798943b0d403ec9b6fb Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Sat, 27 Feb 2016 09:01:42 +0100 +Subject: [PATCH 253/325] drm,i915: Use local_lock/unlock_irq() in + intel_pipe_update_start/end() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ 8.014039] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:918 +[ 8.014041] in_atomic(): 0, irqs_disabled(): 1, pid: 78, name: kworker/u4:4 +[ 8.014045] CPU: 1 PID: 78 Comm: kworker/u4:4 Not tainted 4.1.7-rt7 #5 +[ 8.014055] Workqueue: events_unbound async_run_entry_fn +[ 8.014059] 0000000000000000 ffff880037153748 ffffffff815f32c9 0000000000000002 +[ 8.014063] ffff88013a50e380 ffff880037153768 ffffffff815ef075 ffff8800372c06c8 +[ 8.014066] ffff8800372c06c8 ffff880037153778 ffffffff8107c0b3 ffff880037153798 +[ 8.014067] Call Trace: +[ 8.014074] [] dump_stack+0x4a/0x61 +[ 8.014078] [] ___might_sleep.part.93+0xe9/0xee +[ 8.014082] [] ___might_sleep+0x53/0x80 +[ 8.014086] [] rt_spin_lock+0x24/0x50 +[ 8.014090] [] prepare_to_wait+0x2b/0xa0 +[ 8.014152] [] intel_pipe_update_start+0x17c/0x300 [i915] +[ 8.014156] [] ? prepare_to_wait_event+0x120/0x120 +[ 8.014201] [] intel_begin_crtc_commit+0x166/0x1e0 [i915] +[ 8.014215] [] drm_atomic_helper_commit_planes+0x5d/0x1a0 [drm_kms_helper] +[ 8.014260] [] intel_atomic_commit+0xab/0xf0 [i915] +[ 8.014288] [] drm_atomic_commit+0x37/0x60 [drm] +[ 8.014298] [] drm_atomic_helper_plane_set_property+0x8d/0xd0 [drm_kms_helper] +[ 8.014301] [] ? __ww_mutex_lock+0x39/0x40 +[ 8.014319] [] drm_mode_plane_set_obj_prop+0x2d/0x90 [drm] +[ 8.014328] [] restore_fbdev_mode+0x6b/0xf0 [drm_kms_helper] +[ 8.014337] [] drm_fb_helper_restore_fbdev_mode_unlocked+0x29/0x80 [drm_kms_helper] +[ 8.014346] [] drm_fb_helper_set_par+0x22/0x50 [drm_kms_helper] +[ 8.014390] [] intel_fbdev_set_par+0x1a/0x60 [i915] +[ 8.014394] [] fbcon_init+0x4f4/0x580 +[ 8.014398] [] visual_init+0xbc/0x120 +[ 8.014401] [] do_bind_con_driver+0x163/0x330 +[ 8.014405] [] do_take_over_console+0x11c/0x1c0 +[ 8.014408] [] do_fbcon_takeover+0x63/0xd0 +[ 8.014410] [] fbcon_event_notify+0x785/0x8d0 +[ 8.014413] [] ? __might_sleep+0x4d/0x90 +[ 8.014416] [] notifier_call_chain+0x4e/0x80 +[ 8.014419] [] __blocking_notifier_call_chain+0x4d/0x70 +[ 8.014422] [] blocking_notifier_call_chain+0x16/0x20 +[ 8.014425] [] fb_notifier_call_chain+0x1b/0x20 +[ 8.014428] [] register_framebuffer+0x21a/0x350 +[ 8.014439] [] drm_fb_helper_initial_config+0x274/0x3e0 [drm_kms_helper] +[ 8.014483] [] intel_fbdev_initial_config+0x1b/0x20 [i915] +[ 8.014486] [] async_run_entry_fn+0x4c/0x160 +[ 8.014490] [] process_one_work+0x14a/0x470 +[ 8.014493] [] worker_thread+0x169/0x4c0 +[ 8.014496] [] ? process_one_work+0x470/0x470 +[ 8.014499] [] kthread+0xc6/0xe0 +[ 8.014502] [] ? queue_work_on+0x80/0x110 +[ 8.014506] [] ? kthread_worker_fn+0x1c0/0x1c0 + +Signed-off-by: Mike Galbraith +Cc: Sebastian Andrzej Siewior +Cc: linux-rt-users +Signed-off-by: Thomas Gleixner +--- + drivers/gpu/drm/i915/intel_sprite.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c +index f7026e887fa9..07e4ddebdd80 100644 +--- a/drivers/gpu/drm/i915/intel_sprite.c ++++ b/drivers/gpu/drm/i915/intel_sprite.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include "intel_drv.h" + #include "intel_frontbuffer.h" + #include +@@ -60,6 +61,8 @@ int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode, + #define VBLANK_EVASION_TIME_US 100 + #endif + ++static DEFINE_LOCAL_IRQ_LOCK(pipe_update_lock); ++ + /** + * intel_pipe_update_start() - start update of a set of display registers + * @new_crtc_state: the new crtc state +@@ -107,7 +110,7 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) + if (intel_psr_wait_for_idle(new_crtc_state)) + DRM_ERROR("PSR idle timed out, atomic update may fail\n"); + +- local_irq_disable(); ++ local_lock_irq(pipe_update_lock); + + crtc->debug.min_vbl = min; + crtc->debug.max_vbl = max; +@@ -131,11 +134,11 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) + break; + } + +- local_irq_enable(); ++ local_unlock_irq(pipe_update_lock); + + timeout = schedule_timeout(timeout); + +- local_irq_disable(); ++ local_lock_irq(pipe_update_lock); + } + + finish_wait(wq, &wait); +@@ -168,7 +171,7 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) + return; + + irq_disable: +- local_irq_disable(); ++ local_lock_irq(pipe_update_lock); + } + + /** +@@ -204,7 +207,7 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state) + new_crtc_state->base.event = NULL; + } + +- local_irq_enable(); ++ local_unlock_irq(pipe_update_lock); + + if (intel_vgpu_active(dev_priv)) + return; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0253-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch linux-4.19.118/debian/patches-rt/0253-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch --- linux-4.19.98/debian/patches-rt/0253-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0253-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -From d8adf6f9943f681b148d93d21014e8e41067067e Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Sat, 27 Feb 2016 08:09:11 +0100 -Subject: [PATCH 253/290] drm,radeon,i915: Use preempt_disable/enable_rt() - where recommended -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -DRM folks identified the spots, so use them. - -Signed-off-by: Mike Galbraith -Cc: Sebastian Andrzej Siewior -Cc: linux-rt-users -Signed-off-by: Thomas Gleixner ---- - drivers/gpu/drm/i915/i915_irq.c | 2 ++ - drivers/gpu/drm/radeon/radeon_display.c | 2 ++ - 2 files changed, 4 insertions(+) - -diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c -index 29877969310d..f65817c51c2a 100644 ---- a/drivers/gpu/drm/i915/i915_irq.c -+++ b/drivers/gpu/drm/i915/i915_irq.c -@@ -1025,6 +1025,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, - spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); - - /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_disable_rt(); - - /* Get optional system timestamp before query. */ - if (stime) -@@ -1076,6 +1077,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, - *etime = ktime_get(); - - /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_enable_rt(); - - spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); - -diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c -index d8e2d7b3b836..072b831aaf4f 100644 ---- a/drivers/gpu/drm/radeon/radeon_display.c -+++ b/drivers/gpu/drm/radeon/radeon_display.c -@@ -1813,6 +1813,7 @@ int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, - struct radeon_device *rdev = dev->dev_private; - - /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_disable_rt(); - - /* Get optional system timestamp before query. */ - if (stime) -@@ -1905,6 +1906,7 @@ int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, - *etime = ktime_get(); - - /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ -+ preempt_enable_rt(); - - /* Decode into vertical and horizontal scanout position. */ - *vpos = position & 0x1fff; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0254-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch linux-4.19.118/debian/patches-rt/0254-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch --- linux-4.19.98/debian/patches-rt/0254-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0254-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -From f020bb0cd2272c8d908dfd4eba9afb593eff70ab Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Sat, 27 Feb 2016 09:01:42 +0100 -Subject: [PATCH 254/290] drm,i915: Use local_lock/unlock_irq() in - intel_pipe_update_start/end() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ 8.014039] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:918 -[ 8.014041] in_atomic(): 0, irqs_disabled(): 1, pid: 78, name: kworker/u4:4 -[ 8.014045] CPU: 1 PID: 78 Comm: kworker/u4:4 Not tainted 4.1.7-rt7 #5 -[ 8.014055] Workqueue: events_unbound async_run_entry_fn -[ 8.014059] 0000000000000000 ffff880037153748 ffffffff815f32c9 0000000000000002 -[ 8.014063] ffff88013a50e380 ffff880037153768 ffffffff815ef075 ffff8800372c06c8 -[ 8.014066] ffff8800372c06c8 ffff880037153778 ffffffff8107c0b3 ffff880037153798 -[ 8.014067] Call Trace: -[ 8.014074] [] dump_stack+0x4a/0x61 -[ 8.014078] [] ___might_sleep.part.93+0xe9/0xee -[ 8.014082] [] ___might_sleep+0x53/0x80 -[ 8.014086] [] rt_spin_lock+0x24/0x50 -[ 8.014090] [] prepare_to_wait+0x2b/0xa0 -[ 8.014152] [] intel_pipe_update_start+0x17c/0x300 [i915] -[ 8.014156] [] ? prepare_to_wait_event+0x120/0x120 -[ 8.014201] [] intel_begin_crtc_commit+0x166/0x1e0 [i915] -[ 8.014215] [] drm_atomic_helper_commit_planes+0x5d/0x1a0 [drm_kms_helper] -[ 8.014260] [] intel_atomic_commit+0xab/0xf0 [i915] -[ 8.014288] [] drm_atomic_commit+0x37/0x60 [drm] -[ 8.014298] [] drm_atomic_helper_plane_set_property+0x8d/0xd0 [drm_kms_helper] -[ 8.014301] [] ? __ww_mutex_lock+0x39/0x40 -[ 8.014319] [] drm_mode_plane_set_obj_prop+0x2d/0x90 [drm] -[ 8.014328] [] restore_fbdev_mode+0x6b/0xf0 [drm_kms_helper] -[ 8.014337] [] drm_fb_helper_restore_fbdev_mode_unlocked+0x29/0x80 [drm_kms_helper] -[ 8.014346] [] drm_fb_helper_set_par+0x22/0x50 [drm_kms_helper] -[ 8.014390] [] intel_fbdev_set_par+0x1a/0x60 [i915] -[ 8.014394] [] fbcon_init+0x4f4/0x580 -[ 8.014398] [] visual_init+0xbc/0x120 -[ 8.014401] [] do_bind_con_driver+0x163/0x330 -[ 8.014405] [] do_take_over_console+0x11c/0x1c0 -[ 8.014408] [] do_fbcon_takeover+0x63/0xd0 -[ 8.014410] [] fbcon_event_notify+0x785/0x8d0 -[ 8.014413] [] ? __might_sleep+0x4d/0x90 -[ 8.014416] [] notifier_call_chain+0x4e/0x80 -[ 8.014419] [] __blocking_notifier_call_chain+0x4d/0x70 -[ 8.014422] [] blocking_notifier_call_chain+0x16/0x20 -[ 8.014425] [] fb_notifier_call_chain+0x1b/0x20 -[ 8.014428] [] register_framebuffer+0x21a/0x350 -[ 8.014439] [] drm_fb_helper_initial_config+0x274/0x3e0 [drm_kms_helper] -[ 8.014483] [] intel_fbdev_initial_config+0x1b/0x20 [i915] -[ 8.014486] [] async_run_entry_fn+0x4c/0x160 -[ 8.014490] [] process_one_work+0x14a/0x470 -[ 8.014493] [] worker_thread+0x169/0x4c0 -[ 8.014496] [] ? process_one_work+0x470/0x470 -[ 8.014499] [] kthread+0xc6/0xe0 -[ 8.014502] [] ? queue_work_on+0x80/0x110 -[ 8.014506] [] ? kthread_worker_fn+0x1c0/0x1c0 - -Signed-off-by: Mike Galbraith -Cc: Sebastian Andrzej Siewior -Cc: linux-rt-users -Signed-off-by: Thomas Gleixner ---- - drivers/gpu/drm/i915/intel_sprite.c | 13 ++++++++----- - 1 file changed, 8 insertions(+), 5 deletions(-) - -diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c -index f7026e887fa9..07e4ddebdd80 100644 ---- a/drivers/gpu/drm/i915/intel_sprite.c -+++ b/drivers/gpu/drm/i915/intel_sprite.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - #include "intel_drv.h" - #include "intel_frontbuffer.h" - #include -@@ -60,6 +61,8 @@ int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode, - #define VBLANK_EVASION_TIME_US 100 - #endif - -+static DEFINE_LOCAL_IRQ_LOCK(pipe_update_lock); -+ - /** - * intel_pipe_update_start() - start update of a set of display registers - * @new_crtc_state: the new crtc state -@@ -107,7 +110,7 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) - if (intel_psr_wait_for_idle(new_crtc_state)) - DRM_ERROR("PSR idle timed out, atomic update may fail\n"); - -- local_irq_disable(); -+ local_lock_irq(pipe_update_lock); - - crtc->debug.min_vbl = min; - crtc->debug.max_vbl = max; -@@ -131,11 +134,11 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) - break; - } - -- local_irq_enable(); -+ local_unlock_irq(pipe_update_lock); - - timeout = schedule_timeout(timeout); - -- local_irq_disable(); -+ local_lock_irq(pipe_update_lock); - } - - finish_wait(wq, &wait); -@@ -168,7 +171,7 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) - return; - - irq_disable: -- local_irq_disable(); -+ local_lock_irq(pipe_update_lock); - } - - /** -@@ -204,7 +207,7 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state) - new_crtc_state->base.event = NULL; - } - -- local_irq_enable(); -+ local_unlock_irq(pipe_update_lock); - - if (intel_vgpu_active(dev_priv)) - return; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0254-drm-i915-disable-tracing-on-RT.patch linux-4.19.118/debian/patches-rt/0254-drm-i915-disable-tracing-on-RT.patch --- linux-4.19.98/debian/patches-rt/0254-drm-i915-disable-tracing-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0254-drm-i915-disable-tracing-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,47 @@ +From b1e8ce0ff9f46bde59b57c93c8ead49803e285b6 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 6 Dec 2018 09:52:20 +0100 +Subject: [PATCH 254/325] drm/i915: disable tracing on -RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Luca Abeni reported this: +| BUG: scheduling while atomic: kworker/u8:2/15203/0x00000003 +| CPU: 1 PID: 15203 Comm: kworker/u8:2 Not tainted 4.19.1-rt3 #10 +| Call Trace: +| rt_spin_lock+0x3f/0x50 +| gen6_read32+0x45/0x1d0 [i915] +| g4x_get_vblank_counter+0x36/0x40 [i915] +| trace_event_raw_event_i915_pipe_update_start+0x7d/0xf0 [i915] + +The tracing events use trace_i915_pipe_update_start() among other events +use functions acquire spin locks. A few trace points use +intel_get_crtc_scanline(), others use ->get_vblank_counter() wich also +might acquire a sleeping lock. + +Based on this I don't see any other way than disable trace points on RT. + +Cc: stable-rt@vger.kernel.org +Reported-by: Luca Abeni +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/gpu/drm/i915/i915_trace.h | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h +index b50c6b829715..cc54ec0ef75c 100644 +--- a/drivers/gpu/drm/i915/i915_trace.h ++++ b/drivers/gpu/drm/i915/i915_trace.h +@@ -2,6 +2,10 @@ + #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) + #define _I915_TRACE_H_ + ++#ifdef CONFIG_PREEMPT_RT_BASE ++#define NOTRACE ++#endif ++ + #include + #include + #include +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0255-drm-i915-disable-tracing-on-RT.patch linux-4.19.118/debian/patches-rt/0255-drm-i915-disable-tracing-on-RT.patch --- linux-4.19.98/debian/patches-rt/0255-drm-i915-disable-tracing-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0255-drm-i915-disable-tracing-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -From 9c63af996fae22f9a543ba63986342b6c6225302 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Thu, 6 Dec 2018 09:52:20 +0100 -Subject: [PATCH 255/290] drm/i915: disable tracing on -RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Luca Abeni reported this: -| BUG: scheduling while atomic: kworker/u8:2/15203/0x00000003 -| CPU: 1 PID: 15203 Comm: kworker/u8:2 Not tainted 4.19.1-rt3 #10 -| Call Trace: -| rt_spin_lock+0x3f/0x50 -| gen6_read32+0x45/0x1d0 [i915] -| g4x_get_vblank_counter+0x36/0x40 [i915] -| trace_event_raw_event_i915_pipe_update_start+0x7d/0xf0 [i915] - -The tracing events use trace_i915_pipe_update_start() among other events -use functions acquire spin locks. A few trace points use -intel_get_crtc_scanline(), others use ->get_vblank_counter() wich also -might acquire a sleeping lock. - -Based on this I don't see any other way than disable trace points on RT. - -Cc: stable-rt@vger.kernel.org -Reported-by: Luca Abeni -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/gpu/drm/i915/i915_trace.h | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h -index b50c6b829715..cc54ec0ef75c 100644 ---- a/drivers/gpu/drm/i915/i915_trace.h -+++ b/drivers/gpu/drm/i915/i915_trace.h -@@ -2,6 +2,10 @@ - #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) - #define _I915_TRACE_H_ - -+#ifdef CONFIG_PREEMPT_RT_BASE -+#define NOTRACE -+#endif -+ - #include - #include - #include --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0255-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch linux-4.19.118/debian/patches-rt/0255-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch --- linux-4.19.98/debian/patches-rt/0255-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0255-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,33 @@ +From bca71bc9e1a90a3042f05c97da73dfb6320032d6 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 19 Dec 2018 10:47:02 +0100 +Subject: [PATCH 255/325] drm/i915: skip DRM_I915_LOW_LEVEL_TRACEPOINTS with + NOTRACE +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The order of the header files is important. If this header file is +included after tracepoint.h was included then the NOTRACE here becomes a +nop. Currently this happens for two .c files which use the tracepoitns +behind DRM_I915_LOW_LEVEL_TRACEPOINTS. + +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/gpu/drm/i915/i915_trace.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h +index cc54ec0ef75c..33028d8f470e 100644 +--- a/drivers/gpu/drm/i915/i915_trace.h ++++ b/drivers/gpu/drm/i915/i915_trace.h +@@ -683,7 +683,7 @@ DEFINE_EVENT(i915_request, i915_request_add, + TP_ARGS(rq) + ); + +-#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) ++#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) && !defined(NOTRACE) + DEFINE_EVENT(i915_request, i915_request_submit, + TP_PROTO(struct i915_request *rq), + TP_ARGS(rq) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0256-cgroups-use-simple-wait-in-css_release.patch linux-4.19.118/debian/patches-rt/0256-cgroups-use-simple-wait-in-css_release.patch --- linux-4.19.98/debian/patches-rt/0256-cgroups-use-simple-wait-in-css_release.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0256-cgroups-use-simple-wait-in-css_release.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,95 @@ +From 299712e35cd293828bfac75868a4306a17ac365d Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 13 Feb 2015 15:52:24 +0100 +Subject: [PATCH 256/325] cgroups: use simple wait in css_release() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +To avoid: +|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914 +|in_atomic(): 1, irqs_disabled(): 0, pid: 92, name: rcuc/11 +|2 locks held by rcuc/11/92: +| #0: (rcu_callback){......}, at: [] rcu_cpu_kthread+0x3de/0x940 +| #1: (rcu_read_lock_sched){......}, at: [] percpu_ref_call_confirm_rcu+0x0/0xd0 +|Preemption disabled at:[] percpu_ref_switch_to_atomic_rcu+0x82/0xc0 +|CPU: 11 PID: 92 Comm: rcuc/11 Not tainted 3.18.7-rt0+ #1 +| ffff8802398cdf80 ffff880235f0bc28 ffffffff815b3a12 0000000000000000 +| 0000000000000000 ffff880235f0bc48 ffffffff8109aa16 0000000000000000 +| ffff8802398cdf80 ffff880235f0bc78 ffffffff815b8dd4 000000000000df80 +|Call Trace: +| [] dump_stack+0x4f/0x7c +| [] __might_sleep+0x116/0x190 +| [] rt_spin_lock+0x24/0x60 +| [] queue_work_on+0x6d/0x1d0 +| [] css_release+0x81/0x90 +| [] percpu_ref_call_confirm_rcu+0xbe/0xd0 +| [] percpu_ref_switch_to_atomic_rcu+0x82/0xc0 +| [] rcu_cpu_kthread+0x445/0x940 +| [] smpboot_thread_fn+0x18d/0x2d0 +| [] kthread+0xe8/0x100 +| [] ret_from_fork+0x7c/0xb0 + +Signed-off-by: Sebastian Andrzej Siewior +--- + include/linux/cgroup-defs.h | 2 ++ + kernel/cgroup/cgroup.c | 9 +++++---- + 2 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h +index a01ebb630abc..34fb541e90be 100644 +--- a/include/linux/cgroup-defs.h ++++ b/include/linux/cgroup-defs.h +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + #ifdef CONFIG_CGROUPS + +@@ -157,6 +158,7 @@ struct cgroup_subsys_state { + + /* percpu_ref killing and RCU release */ + struct work_struct destroy_work; ++ struct swork_event destroy_swork; + struct rcu_work destroy_rwork; + + /* +diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c +index 877ba6dacca8..97ff80283248 100644 +--- a/kernel/cgroup/cgroup.c ++++ b/kernel/cgroup/cgroup.c +@@ -4680,10 +4680,10 @@ static void css_free_rwork_fn(struct work_struct *work) + } + } + +-static void css_release_work_fn(struct work_struct *work) ++static void css_release_work_fn(struct swork_event *sev) + { + struct cgroup_subsys_state *css = +- container_of(work, struct cgroup_subsys_state, destroy_work); ++ container_of(sev, struct cgroup_subsys_state, destroy_swork); + struct cgroup_subsys *ss = css->ss; + struct cgroup *cgrp = css->cgroup; + +@@ -4745,8 +4745,8 @@ static void css_release(struct percpu_ref *ref) + struct cgroup_subsys_state *css = + container_of(ref, struct cgroup_subsys_state, refcnt); + +- INIT_WORK(&css->destroy_work, css_release_work_fn); +- queue_work(cgroup_destroy_wq, &css->destroy_work); ++ INIT_SWORK(&css->destroy_swork, css_release_work_fn); ++ swork_queue(&css->destroy_swork); + } + + static void init_and_link_css(struct cgroup_subsys_state *css, +@@ -5472,6 +5472,7 @@ static int __init cgroup_wq_init(void) + */ + cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1); + BUG_ON(!cgroup_destroy_wq); ++ BUG_ON(swork_get()); + return 0; + } + core_initcall(cgroup_wq_init); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0256-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch linux-4.19.118/debian/patches-rt/0256-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch --- linux-4.19.98/debian/patches-rt/0256-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0256-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -From b34fadffa3608307de6514151f16cdd385c14ad8 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 19 Dec 2018 10:47:02 +0100 -Subject: [PATCH 256/290] drm/i915: skip DRM_I915_LOW_LEVEL_TRACEPOINTS with - NOTRACE -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The order of the header files is important. If this header file is -included after tracepoint.h was included then the NOTRACE here becomes a -nop. Currently this happens for two .c files which use the tracepoitns -behind DRM_I915_LOW_LEVEL_TRACEPOINTS. - -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/gpu/drm/i915/i915_trace.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h -index cc54ec0ef75c..33028d8f470e 100644 ---- a/drivers/gpu/drm/i915/i915_trace.h -+++ b/drivers/gpu/drm/i915/i915_trace.h -@@ -683,7 +683,7 @@ DEFINE_EVENT(i915_request, i915_request_add, - TP_ARGS(rq) - ); - --#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) -+#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) && !defined(NOTRACE) - DEFINE_EVENT(i915_request, i915_request_submit, - TP_PROTO(struct i915_request *rq), - TP_ARGS(rq) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0257-cgroups-use-simple-wait-in-css_release.patch linux-4.19.118/debian/patches-rt/0257-cgroups-use-simple-wait-in-css_release.patch --- linux-4.19.98/debian/patches-rt/0257-cgroups-use-simple-wait-in-css_release.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0257-cgroups-use-simple-wait-in-css_release.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -From b59ff060d2629b8e98f80af20df9e89d4aa31c5d Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Fri, 13 Feb 2015 15:52:24 +0100 -Subject: [PATCH 257/290] cgroups: use simple wait in css_release() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -To avoid: -|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914 -|in_atomic(): 1, irqs_disabled(): 0, pid: 92, name: rcuc/11 -|2 locks held by rcuc/11/92: -| #0: (rcu_callback){......}, at: [] rcu_cpu_kthread+0x3de/0x940 -| #1: (rcu_read_lock_sched){......}, at: [] percpu_ref_call_confirm_rcu+0x0/0xd0 -|Preemption disabled at:[] percpu_ref_switch_to_atomic_rcu+0x82/0xc0 -|CPU: 11 PID: 92 Comm: rcuc/11 Not tainted 3.18.7-rt0+ #1 -| ffff8802398cdf80 ffff880235f0bc28 ffffffff815b3a12 0000000000000000 -| 0000000000000000 ffff880235f0bc48 ffffffff8109aa16 0000000000000000 -| ffff8802398cdf80 ffff880235f0bc78 ffffffff815b8dd4 000000000000df80 -|Call Trace: -| [] dump_stack+0x4f/0x7c -| [] __might_sleep+0x116/0x190 -| [] rt_spin_lock+0x24/0x60 -| [] queue_work_on+0x6d/0x1d0 -| [] css_release+0x81/0x90 -| [] percpu_ref_call_confirm_rcu+0xbe/0xd0 -| [] percpu_ref_switch_to_atomic_rcu+0x82/0xc0 -| [] rcu_cpu_kthread+0x445/0x940 -| [] smpboot_thread_fn+0x18d/0x2d0 -| [] kthread+0xe8/0x100 -| [] ret_from_fork+0x7c/0xb0 - -Signed-off-by: Sebastian Andrzej Siewior ---- - include/linux/cgroup-defs.h | 2 ++ - kernel/cgroup/cgroup.c | 9 +++++---- - 2 files changed, 7 insertions(+), 4 deletions(-) - -diff --git a/include/linux/cgroup-defs.h b/include/linux/cgroup-defs.h -index a01ebb630abc..34fb541e90be 100644 ---- a/include/linux/cgroup-defs.h -+++ b/include/linux/cgroup-defs.h -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - - #ifdef CONFIG_CGROUPS - -@@ -157,6 +158,7 @@ struct cgroup_subsys_state { - - /* percpu_ref killing and RCU release */ - struct work_struct destroy_work; -+ struct swork_event destroy_swork; - struct rcu_work destroy_rwork; - - /* -diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c -index 78ef274b036e..30dd5754e62e 100644 ---- a/kernel/cgroup/cgroup.c -+++ b/kernel/cgroup/cgroup.c -@@ -4666,10 +4666,10 @@ static void css_free_rwork_fn(struct work_struct *work) - } - } - --static void css_release_work_fn(struct work_struct *work) -+static void css_release_work_fn(struct swork_event *sev) - { - struct cgroup_subsys_state *css = -- container_of(work, struct cgroup_subsys_state, destroy_work); -+ container_of(sev, struct cgroup_subsys_state, destroy_swork); - struct cgroup_subsys *ss = css->ss; - struct cgroup *cgrp = css->cgroup; - -@@ -4731,8 +4731,8 @@ static void css_release(struct percpu_ref *ref) - struct cgroup_subsys_state *css = - container_of(ref, struct cgroup_subsys_state, refcnt); - -- INIT_WORK(&css->destroy_work, css_release_work_fn); -- queue_work(cgroup_destroy_wq, &css->destroy_work); -+ INIT_SWORK(&css->destroy_swork, css_release_work_fn); -+ swork_queue(&css->destroy_swork); - } - - static void init_and_link_css(struct cgroup_subsys_state *css, -@@ -5458,6 +5458,7 @@ static int __init cgroup_wq_init(void) - */ - cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1); - BUG_ON(!cgroup_destroy_wq); -+ BUG_ON(swork_get()); - return 0; - } - core_initcall(cgroup_wq_init); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0257-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch linux-4.19.118/debian/patches-rt/0257-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch --- linux-4.19.98/debian/patches-rt/0257-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0257-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,293 @@ +From fc0fb050aa602ebda16444e1860d24f585ccb2e9 Mon Sep 17 00:00:00 2001 +From: Mike Galbraith +Date: Sun, 8 Jan 2017 09:32:25 +0100 +Subject: [PATCH 257/325] cpuset: Convert callback_lock to raw_spinlock_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The two commits below add up to a cpuset might_sleep() splat for RT: + +8447a0fee974 cpuset: convert callback_mutex to a spinlock +344736f29b35 cpuset: simplify cpuset_node_allowed API + +BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:995 +in_atomic(): 0, irqs_disabled(): 1, pid: 11718, name: cset +CPU: 135 PID: 11718 Comm: cset Tainted: G E 4.10.0-rt1-rt #4 +Hardware name: Intel Corporation BRICKLAND/BRICKLAND, BIOS BRHSXSD1.86B.0056.R01.1409242327 09/24/2014 +Call Trace: + ? dump_stack+0x5c/0x81 + ? ___might_sleep+0xf4/0x170 + ? rt_spin_lock+0x1c/0x50 + ? __cpuset_node_allowed+0x66/0xc0 + ? ___slab_alloc+0x390/0x570 + ? anon_vma_fork+0x8f/0x140 + ? copy_page_range+0x6cf/0xb00 + ? anon_vma_fork+0x8f/0x140 + ? __slab_alloc.isra.74+0x5a/0x81 + ? anon_vma_fork+0x8f/0x140 + ? kmem_cache_alloc+0x1b5/0x1f0 + ? anon_vma_fork+0x8f/0x140 + ? copy_process.part.35+0x1670/0x1ee0 + ? _do_fork+0xdd/0x3f0 + ? _do_fork+0xdd/0x3f0 + ? do_syscall_64+0x61/0x170 + ? entry_SYSCALL64_slow_path+0x25/0x25 + +The later ensured that a NUMA box WILL take callback_lock in atomic +context by removing the allocator and reclaim path __GFP_HARDWALL +usage which prevented such contexts from taking callback_mutex. + +One option would be to reinstate __GFP_HARDWALL protections for +RT, however, as the 8447a0fee974 changelog states: + +The callback_mutex is only used to synchronize reads/updates of cpusets' +flags and cpu/node masks. These operations should always proceed fast so +there's no reason why we can't use a spinlock instead of the mutex. + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Mike Galbraith +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/cgroup/cpuset.c | 66 +++++++++++++++++++++--------------------- + 1 file changed, 33 insertions(+), 33 deletions(-) + +diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c +index 7bb129c5b412..92575cb9b493 100644 +--- a/kernel/cgroup/cpuset.c ++++ b/kernel/cgroup/cpuset.c +@@ -288,7 +288,7 @@ static struct cpuset top_cpuset = { + */ + + static DEFINE_MUTEX(cpuset_mutex); +-static DEFINE_SPINLOCK(callback_lock); ++static DEFINE_RAW_SPINLOCK(callback_lock); + + static struct workqueue_struct *cpuset_migrate_mm_wq; + +@@ -922,9 +922,9 @@ static void update_cpumasks_hier(struct cpuset *cs, struct cpumask *new_cpus) + continue; + rcu_read_unlock(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cpumask_copy(cp->effective_cpus, new_cpus); +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + WARN_ON(!is_in_v2_mode() && + !cpumask_equal(cp->cpus_allowed, cp->effective_cpus)); +@@ -989,9 +989,9 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, + if (retval < 0) + return retval; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed); +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + /* use trialcs->cpus_allowed as a temp variable */ + update_cpumasks_hier(cs, trialcs->cpus_allowed); +@@ -1175,9 +1175,9 @@ static void update_nodemasks_hier(struct cpuset *cs, nodemask_t *new_mems) + continue; + rcu_read_unlock(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cp->effective_mems = *new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + WARN_ON(!is_in_v2_mode() && + !nodes_equal(cp->mems_allowed, cp->effective_mems)); +@@ -1245,9 +1245,9 @@ static int update_nodemask(struct cpuset *cs, struct cpuset *trialcs, + if (retval < 0) + goto done; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->mems_allowed = trialcs->mems_allowed; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + /* use trialcs->mems_allowed as a temp variable */ + update_nodemasks_hier(cs, &trialcs->mems_allowed); +@@ -1338,9 +1338,9 @@ static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, + spread_flag_changed = ((is_spread_slab(cs) != is_spread_slab(trialcs)) + || (is_spread_page(cs) != is_spread_page(trialcs))); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->flags = trialcs->flags; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed) + rebuild_sched_domains_locked(); +@@ -1755,7 +1755,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) + cpuset_filetype_t type = seq_cft(sf)->private; + int ret = 0; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + + switch (type) { + case FILE_CPULIST: +@@ -1774,7 +1774,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) + ret = -EINVAL; + } + +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + return ret; + } + +@@ -1989,12 +1989,12 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) + + cpuset_inc(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + if (is_in_v2_mode()) { + cpumask_copy(cs->effective_cpus, parent->effective_cpus); + cs->effective_mems = parent->effective_mems; + } +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags)) + goto out_unlock; +@@ -2021,12 +2021,12 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) + } + rcu_read_unlock(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->mems_allowed = parent->mems_allowed; + cs->effective_mems = parent->mems_allowed; + cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); + cpumask_copy(cs->effective_cpus, parent->cpus_allowed); +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + out_unlock: + mutex_unlock(&cpuset_mutex); + return 0; +@@ -2065,7 +2065,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css) + static void cpuset_bind(struct cgroup_subsys_state *root_css) + { + mutex_lock(&cpuset_mutex); +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + + if (is_in_v2_mode()) { + cpumask_copy(top_cpuset.cpus_allowed, cpu_possible_mask); +@@ -2076,7 +2076,7 @@ static void cpuset_bind(struct cgroup_subsys_state *root_css) + top_cpuset.mems_allowed = top_cpuset.effective_mems; + } + +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + mutex_unlock(&cpuset_mutex); + } + +@@ -2174,12 +2174,12 @@ hotplug_update_tasks_legacy(struct cpuset *cs, + { + bool is_empty; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cpumask_copy(cs->cpus_allowed, new_cpus); + cpumask_copy(cs->effective_cpus, new_cpus); + cs->mems_allowed = *new_mems; + cs->effective_mems = *new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + /* + * Don't call update_tasks_cpumask() if the cpuset becomes empty, +@@ -2216,10 +2216,10 @@ hotplug_update_tasks(struct cpuset *cs, + if (nodes_empty(*new_mems)) + *new_mems = parent_cs(cs)->effective_mems; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cpumask_copy(cs->effective_cpus, new_cpus); + cs->effective_mems = *new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + if (cpus_updated) + update_tasks_cpumask(cs); +@@ -2312,21 +2312,21 @@ static void cpuset_hotplug_workfn(struct work_struct *work) + + /* synchronize cpus_allowed to cpu_active_mask */ + if (cpus_updated) { +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + if (!on_dfl) + cpumask_copy(top_cpuset.cpus_allowed, &new_cpus); + cpumask_copy(top_cpuset.effective_cpus, &new_cpus); +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + /* we don't mess with cpumasks of tasks in top_cpuset */ + } + + /* synchronize mems_allowed to N_MEMORY */ + if (mems_updated) { +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + if (!on_dfl) + top_cpuset.mems_allowed = new_mems; + top_cpuset.effective_mems = new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + update_tasks_nodemask(&top_cpuset); + } + +@@ -2425,11 +2425,11 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask) + { + unsigned long flags; + +- spin_lock_irqsave(&callback_lock, flags); ++ raw_spin_lock_irqsave(&callback_lock, flags); + rcu_read_lock(); + guarantee_online_cpus(task_cs(tsk), pmask); + rcu_read_unlock(); +- spin_unlock_irqrestore(&callback_lock, flags); ++ raw_spin_unlock_irqrestore(&callback_lock, flags); + } + + /** +@@ -2490,11 +2490,11 @@ nodemask_t cpuset_mems_allowed(struct task_struct *tsk) + nodemask_t mask; + unsigned long flags; + +- spin_lock_irqsave(&callback_lock, flags); ++ raw_spin_lock_irqsave(&callback_lock, flags); + rcu_read_lock(); + guarantee_online_mems(task_cs(tsk), &mask); + rcu_read_unlock(); +- spin_unlock_irqrestore(&callback_lock, flags); ++ raw_spin_unlock_irqrestore(&callback_lock, flags); + + return mask; + } +@@ -2586,14 +2586,14 @@ bool __cpuset_node_allowed(int node, gfp_t gfp_mask) + return true; + + /* Not hardwall and node outside mems_allowed: scan up cpusets */ +- spin_lock_irqsave(&callback_lock, flags); ++ raw_spin_lock_irqsave(&callback_lock, flags); + + rcu_read_lock(); + cs = nearest_hardwall_ancestor(task_cs(current)); + allowed = node_isset(node, cs->mems_allowed); + rcu_read_unlock(); + +- spin_unlock_irqrestore(&callback_lock, flags); ++ raw_spin_unlock_irqrestore(&callback_lock, flags); + return allowed; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0258-apparmor-use-a-locallock-instead-preempt_disable.patch linux-4.19.118/debian/patches-rt/0258-apparmor-use-a-locallock-instead-preempt_disable.patch --- linux-4.19.98/debian/patches-rt/0258-apparmor-use-a-locallock-instead-preempt_disable.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0258-apparmor-use-a-locallock-instead-preempt_disable.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,85 @@ +From 59bd47021b903cbbfbead935035e188e9bf01ef4 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 11 Oct 2017 17:43:49 +0200 +Subject: [PATCH 258/325] apparmor: use a locallock instead preempt_disable() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +get_buffers() disables preemption which acts as a lock for the per-CPU +variable. Since we can't disable preemption here on RT, a local_lock is +lock is used in order to remain on the same CPU and not to have more +than one user within the critical section. + +Signed-off-by: Sebastian Andrzej Siewior +--- + security/apparmor/include/path.h | 19 ++++++++++++++++--- + security/apparmor/lsm.c | 2 +- + 2 files changed, 17 insertions(+), 4 deletions(-) + +diff --git a/security/apparmor/include/path.h b/security/apparmor/include/path.h +index b6380c5f0097..12abfddb19c9 100644 +--- a/security/apparmor/include/path.h ++++ b/security/apparmor/include/path.h +@@ -40,8 +40,10 @@ struct aa_buffers { + + #include + #include ++#include + + DECLARE_PER_CPU(struct aa_buffers, aa_buffers); ++DECLARE_LOCAL_IRQ_LOCK(aa_buffers_lock); + + #define ASSIGN(FN, A, X, N) ((X) = FN(A, N)) + #define EVAL1(FN, A, X) ASSIGN(FN, A, X, 0) /*X = FN(0)*/ +@@ -51,7 +53,17 @@ DECLARE_PER_CPU(struct aa_buffers, aa_buffers); + + #define for_each_cpu_buffer(I) for ((I) = 0; (I) < MAX_PATH_BUFFERS; (I)++) + +-#ifdef CONFIG_DEBUG_PREEMPT ++#ifdef CONFIG_PREEMPT_RT_BASE ++static inline void AA_BUG_PREEMPT_ENABLED(const char *s) ++{ ++ struct local_irq_lock *lv; ++ ++ lv = this_cpu_ptr(&aa_buffers_lock); ++ WARN_ONCE(lv->owner != current, ++ "__get_buffer without aa_buffers_lock\n"); ++} ++ ++#elif defined(CONFIG_DEBUG_PREEMPT) + #define AA_BUG_PREEMPT_ENABLED(X) AA_BUG(preempt_count() <= 0, X) + #else + #define AA_BUG_PREEMPT_ENABLED(X) /* nop */ +@@ -67,14 +79,15 @@ DECLARE_PER_CPU(struct aa_buffers, aa_buffers); + + #define get_buffers(X...) \ + do { \ +- struct aa_buffers *__cpu_var = get_cpu_ptr(&aa_buffers); \ ++ struct aa_buffers *__cpu_var; \ ++ __cpu_var = get_locked_ptr(aa_buffers_lock, &aa_buffers); \ + __get_buffers(__cpu_var, X); \ + } while (0) + + #define put_buffers(X, Y...) \ + do { \ + __put_buffers(X, Y); \ +- put_cpu_ptr(&aa_buffers); \ ++ put_locked_ptr(aa_buffers_lock, &aa_buffers); \ + } while (0) + + #endif /* __AA_PATH_H */ +diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c +index 730de4638b4e..edc911ff6a4d 100644 +--- a/security/apparmor/lsm.c ++++ b/security/apparmor/lsm.c +@@ -45,7 +45,7 @@ + int apparmor_initialized; + + DEFINE_PER_CPU(struct aa_buffers, aa_buffers); +- ++DEFINE_LOCAL_IRQ_LOCK(aa_buffers_lock); + + /* + * LSM hook functions +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0258-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch linux-4.19.118/debian/patches-rt/0258-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch --- linux-4.19.98/debian/patches-rt/0258-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0258-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,293 +0,0 @@ -From 81c16cc87fefa39b56e6c4bca4e83beddf6eac24 Mon Sep 17 00:00:00 2001 -From: Mike Galbraith -Date: Sun, 8 Jan 2017 09:32:25 +0100 -Subject: [PATCH 258/290] cpuset: Convert callback_lock to raw_spinlock_t -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The two commits below add up to a cpuset might_sleep() splat for RT: - -8447a0fee974 cpuset: convert callback_mutex to a spinlock -344736f29b35 cpuset: simplify cpuset_node_allowed API - -BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:995 -in_atomic(): 0, irqs_disabled(): 1, pid: 11718, name: cset -CPU: 135 PID: 11718 Comm: cset Tainted: G E 4.10.0-rt1-rt #4 -Hardware name: Intel Corporation BRICKLAND/BRICKLAND, BIOS BRHSXSD1.86B.0056.R01.1409242327 09/24/2014 -Call Trace: - ? dump_stack+0x5c/0x81 - ? ___might_sleep+0xf4/0x170 - ? rt_spin_lock+0x1c/0x50 - ? __cpuset_node_allowed+0x66/0xc0 - ? ___slab_alloc+0x390/0x570 - ? anon_vma_fork+0x8f/0x140 - ? copy_page_range+0x6cf/0xb00 - ? anon_vma_fork+0x8f/0x140 - ? __slab_alloc.isra.74+0x5a/0x81 - ? anon_vma_fork+0x8f/0x140 - ? kmem_cache_alloc+0x1b5/0x1f0 - ? anon_vma_fork+0x8f/0x140 - ? copy_process.part.35+0x1670/0x1ee0 - ? _do_fork+0xdd/0x3f0 - ? _do_fork+0xdd/0x3f0 - ? do_syscall_64+0x61/0x170 - ? entry_SYSCALL64_slow_path+0x25/0x25 - -The later ensured that a NUMA box WILL take callback_lock in atomic -context by removing the allocator and reclaim path __GFP_HARDWALL -usage which prevented such contexts from taking callback_mutex. - -One option would be to reinstate __GFP_HARDWALL protections for -RT, however, as the 8447a0fee974 changelog states: - -The callback_mutex is only used to synchronize reads/updates of cpusets' -flags and cpu/node masks. These operations should always proceed fast so -there's no reason why we can't use a spinlock instead of the mutex. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Mike Galbraith -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/cgroup/cpuset.c | 66 +++++++++++++++++++++--------------------- - 1 file changed, 33 insertions(+), 33 deletions(-) - -diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c -index 7bb129c5b412..92575cb9b493 100644 ---- a/kernel/cgroup/cpuset.c -+++ b/kernel/cgroup/cpuset.c -@@ -288,7 +288,7 @@ static struct cpuset top_cpuset = { - */ - - static DEFINE_MUTEX(cpuset_mutex); --static DEFINE_SPINLOCK(callback_lock); -+static DEFINE_RAW_SPINLOCK(callback_lock); - - static struct workqueue_struct *cpuset_migrate_mm_wq; - -@@ -922,9 +922,9 @@ static void update_cpumasks_hier(struct cpuset *cs, struct cpumask *new_cpus) - continue; - rcu_read_unlock(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cpumask_copy(cp->effective_cpus, new_cpus); -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - WARN_ON(!is_in_v2_mode() && - !cpumask_equal(cp->cpus_allowed, cp->effective_cpus)); -@@ -989,9 +989,9 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, - if (retval < 0) - return retval; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed); -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - /* use trialcs->cpus_allowed as a temp variable */ - update_cpumasks_hier(cs, trialcs->cpus_allowed); -@@ -1175,9 +1175,9 @@ static void update_nodemasks_hier(struct cpuset *cs, nodemask_t *new_mems) - continue; - rcu_read_unlock(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cp->effective_mems = *new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - WARN_ON(!is_in_v2_mode() && - !nodes_equal(cp->mems_allowed, cp->effective_mems)); -@@ -1245,9 +1245,9 @@ static int update_nodemask(struct cpuset *cs, struct cpuset *trialcs, - if (retval < 0) - goto done; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cs->mems_allowed = trialcs->mems_allowed; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - /* use trialcs->mems_allowed as a temp variable */ - update_nodemasks_hier(cs, &trialcs->mems_allowed); -@@ -1338,9 +1338,9 @@ static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, - spread_flag_changed = ((is_spread_slab(cs) != is_spread_slab(trialcs)) - || (is_spread_page(cs) != is_spread_page(trialcs))); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cs->flags = trialcs->flags; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed) - rebuild_sched_domains_locked(); -@@ -1755,7 +1755,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) - cpuset_filetype_t type = seq_cft(sf)->private; - int ret = 0; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - - switch (type) { - case FILE_CPULIST: -@@ -1774,7 +1774,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) - ret = -EINVAL; - } - -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - return ret; - } - -@@ -1989,12 +1989,12 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) - - cpuset_inc(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - if (is_in_v2_mode()) { - cpumask_copy(cs->effective_cpus, parent->effective_cpus); - cs->effective_mems = parent->effective_mems; - } -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags)) - goto out_unlock; -@@ -2021,12 +2021,12 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) - } - rcu_read_unlock(); - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cs->mems_allowed = parent->mems_allowed; - cs->effective_mems = parent->mems_allowed; - cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); - cpumask_copy(cs->effective_cpus, parent->cpus_allowed); -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - out_unlock: - mutex_unlock(&cpuset_mutex); - return 0; -@@ -2065,7 +2065,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css) - static void cpuset_bind(struct cgroup_subsys_state *root_css) - { - mutex_lock(&cpuset_mutex); -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - - if (is_in_v2_mode()) { - cpumask_copy(top_cpuset.cpus_allowed, cpu_possible_mask); -@@ -2076,7 +2076,7 @@ static void cpuset_bind(struct cgroup_subsys_state *root_css) - top_cpuset.mems_allowed = top_cpuset.effective_mems; - } - -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - mutex_unlock(&cpuset_mutex); - } - -@@ -2174,12 +2174,12 @@ hotplug_update_tasks_legacy(struct cpuset *cs, - { - bool is_empty; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cpumask_copy(cs->cpus_allowed, new_cpus); - cpumask_copy(cs->effective_cpus, new_cpus); - cs->mems_allowed = *new_mems; - cs->effective_mems = *new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - /* - * Don't call update_tasks_cpumask() if the cpuset becomes empty, -@@ -2216,10 +2216,10 @@ hotplug_update_tasks(struct cpuset *cs, - if (nodes_empty(*new_mems)) - *new_mems = parent_cs(cs)->effective_mems; - -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - cpumask_copy(cs->effective_cpus, new_cpus); - cs->effective_mems = *new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - - if (cpus_updated) - update_tasks_cpumask(cs); -@@ -2312,21 +2312,21 @@ static void cpuset_hotplug_workfn(struct work_struct *work) - - /* synchronize cpus_allowed to cpu_active_mask */ - if (cpus_updated) { -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - if (!on_dfl) - cpumask_copy(top_cpuset.cpus_allowed, &new_cpus); - cpumask_copy(top_cpuset.effective_cpus, &new_cpus); -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - /* we don't mess with cpumasks of tasks in top_cpuset */ - } - - /* synchronize mems_allowed to N_MEMORY */ - if (mems_updated) { -- spin_lock_irq(&callback_lock); -+ raw_spin_lock_irq(&callback_lock); - if (!on_dfl) - top_cpuset.mems_allowed = new_mems; - top_cpuset.effective_mems = new_mems; -- spin_unlock_irq(&callback_lock); -+ raw_spin_unlock_irq(&callback_lock); - update_tasks_nodemask(&top_cpuset); - } - -@@ -2425,11 +2425,11 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask) - { - unsigned long flags; - -- spin_lock_irqsave(&callback_lock, flags); -+ raw_spin_lock_irqsave(&callback_lock, flags); - rcu_read_lock(); - guarantee_online_cpus(task_cs(tsk), pmask); - rcu_read_unlock(); -- spin_unlock_irqrestore(&callback_lock, flags); -+ raw_spin_unlock_irqrestore(&callback_lock, flags); - } - - /** -@@ -2490,11 +2490,11 @@ nodemask_t cpuset_mems_allowed(struct task_struct *tsk) - nodemask_t mask; - unsigned long flags; - -- spin_lock_irqsave(&callback_lock, flags); -+ raw_spin_lock_irqsave(&callback_lock, flags); - rcu_read_lock(); - guarantee_online_mems(task_cs(tsk), &mask); - rcu_read_unlock(); -- spin_unlock_irqrestore(&callback_lock, flags); -+ raw_spin_unlock_irqrestore(&callback_lock, flags); - - return mask; - } -@@ -2586,14 +2586,14 @@ bool __cpuset_node_allowed(int node, gfp_t gfp_mask) - return true; - - /* Not hardwall and node outside mems_allowed: scan up cpusets */ -- spin_lock_irqsave(&callback_lock, flags); -+ raw_spin_lock_irqsave(&callback_lock, flags); - - rcu_read_lock(); - cs = nearest_hardwall_ancestor(task_cs(current)); - allowed = node_isset(node, cs->mems_allowed); - rcu_read_unlock(); - -- spin_unlock_irqrestore(&callback_lock, flags); -+ raw_spin_unlock_irqrestore(&callback_lock, flags); - return allowed; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0259-apparmor-use-a-locallock-instead-preempt_disable.patch linux-4.19.118/debian/patches-rt/0259-apparmor-use-a-locallock-instead-preempt_disable.patch --- linux-4.19.98/debian/patches-rt/0259-apparmor-use-a-locallock-instead-preempt_disable.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0259-apparmor-use-a-locallock-instead-preempt_disable.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -From aa1de601999a7958fa83e1dae7b0819b6d5106a9 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 11 Oct 2017 17:43:49 +0200 -Subject: [PATCH 259/290] apparmor: use a locallock instead preempt_disable() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -get_buffers() disables preemption which acts as a lock for the per-CPU -variable. Since we can't disable preemption here on RT, a local_lock is -lock is used in order to remain on the same CPU and not to have more -than one user within the critical section. - -Signed-off-by: Sebastian Andrzej Siewior ---- - security/apparmor/include/path.h | 19 ++++++++++++++++--- - security/apparmor/lsm.c | 2 +- - 2 files changed, 17 insertions(+), 4 deletions(-) - -diff --git a/security/apparmor/include/path.h b/security/apparmor/include/path.h -index b6380c5f0097..12abfddb19c9 100644 ---- a/security/apparmor/include/path.h -+++ b/security/apparmor/include/path.h -@@ -40,8 +40,10 @@ struct aa_buffers { - - #include - #include -+#include - - DECLARE_PER_CPU(struct aa_buffers, aa_buffers); -+DECLARE_LOCAL_IRQ_LOCK(aa_buffers_lock); - - #define ASSIGN(FN, A, X, N) ((X) = FN(A, N)) - #define EVAL1(FN, A, X) ASSIGN(FN, A, X, 0) /*X = FN(0)*/ -@@ -51,7 +53,17 @@ DECLARE_PER_CPU(struct aa_buffers, aa_buffers); - - #define for_each_cpu_buffer(I) for ((I) = 0; (I) < MAX_PATH_BUFFERS; (I)++) - --#ifdef CONFIG_DEBUG_PREEMPT -+#ifdef CONFIG_PREEMPT_RT_BASE -+static inline void AA_BUG_PREEMPT_ENABLED(const char *s) -+{ -+ struct local_irq_lock *lv; -+ -+ lv = this_cpu_ptr(&aa_buffers_lock); -+ WARN_ONCE(lv->owner != current, -+ "__get_buffer without aa_buffers_lock\n"); -+} -+ -+#elif defined(CONFIG_DEBUG_PREEMPT) - #define AA_BUG_PREEMPT_ENABLED(X) AA_BUG(preempt_count() <= 0, X) - #else - #define AA_BUG_PREEMPT_ENABLED(X) /* nop */ -@@ -67,14 +79,15 @@ DECLARE_PER_CPU(struct aa_buffers, aa_buffers); - - #define get_buffers(X...) \ - do { \ -- struct aa_buffers *__cpu_var = get_cpu_ptr(&aa_buffers); \ -+ struct aa_buffers *__cpu_var; \ -+ __cpu_var = get_locked_ptr(aa_buffers_lock, &aa_buffers); \ - __get_buffers(__cpu_var, X); \ - } while (0) - - #define put_buffers(X, Y...) \ - do { \ - __put_buffers(X, Y); \ -- put_cpu_ptr(&aa_buffers); \ -+ put_locked_ptr(aa_buffers_lock, &aa_buffers); \ - } while (0) - - #endif /* __AA_PATH_H */ -diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c -index 8b8b70620bbe..8330ef57a784 100644 ---- a/security/apparmor/lsm.c -+++ b/security/apparmor/lsm.c -@@ -45,7 +45,7 @@ - int apparmor_initialized; - - DEFINE_PER_CPU(struct aa_buffers, aa_buffers); -- -+DEFINE_LOCAL_IRQ_LOCK(aa_buffers_lock); - - /* - * LSM hook functions --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0259-workqueue-Prevent-deadlock-stall-on-RT.patch linux-4.19.118/debian/patches-rt/0259-workqueue-Prevent-deadlock-stall-on-RT.patch --- linux-4.19.98/debian/patches-rt/0259-workqueue-Prevent-deadlock-stall-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0259-workqueue-Prevent-deadlock-stall-on-RT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,207 @@ +From 2d869f40619ff62322b415c543fcb325846fe261 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 27 Jun 2014 16:24:52 +0200 +Subject: [PATCH 259/325] workqueue: Prevent deadlock/stall on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Austin reported a XFS deadlock/stall on RT where scheduled work gets +never exececuted and tasks are waiting for each other for ever. + +The underlying problem is the modification of the RT code to the +handling of workers which are about to go to sleep. In mainline a +worker thread which goes to sleep wakes an idle worker if there is +more work to do. This happens from the guts of the schedule() +function. On RT this must be outside and the accessed data structures +are not protected against scheduling due to the spinlock to rtmutex +conversion. So the naive solution to this was to move the code outside +of the scheduler and protect the data structures by the pool +lock. That approach turned out to be a little naive as we cannot call +into that code when the thread blocks on a lock, as it is not allowed +to block on two locks in parallel. So we dont call into the worker +wakeup magic when the worker is blocked on a lock, which causes the +deadlock/stall observed by Austin and Mike. + +Looking deeper into that worker code it turns out that the only +relevant data structure which needs to be protected is the list of +idle workers which can be woken up. + +So the solution is to protect the list manipulation operations with +preempt_enable/disable pairs on RT and call unconditionally into the +worker code even when the worker is blocked on a lock. The preemption +protection is safe as there is nothing which can fiddle with the list +outside of thread context. + +Reported-and_tested-by: Austin Schuh +Reported-and_tested-by: Mike Galbraith +Signed-off-by: Thomas Gleixner +Link: http://vger.kernel.org/r/alpine.DEB.2.10.1406271249510.5170@nanos +Cc: Richard Weinberger +Cc: Steven Rostedt +--- + kernel/sched/core.c | 6 +++-- + kernel/workqueue.c | 60 +++++++++++++++++++++++++++++++++++---------- + 2 files changed, 51 insertions(+), 15 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index a17c765d3fcb..cfde725e1017 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -3610,9 +3610,8 @@ void __noreturn do_task_dead(void) + + static inline void sched_submit_work(struct task_struct *tsk) + { +- if (!tsk->state || tsk_is_pi_blocked(tsk)) ++ if (!tsk->state) + return; +- + /* + * If a worker went to sleep, notify and ask workqueue whether + * it wants to wake up a task to maintain concurrency. +@@ -3626,6 +3625,9 @@ static inline void sched_submit_work(struct task_struct *tsk) + preempt_enable_no_resched(); + } + ++ if (tsk_is_pi_blocked(tsk)) ++ return; ++ + /* + * If we are going to sleep and we have plugged IO queued, + * make sure to submit it to avoid deadlocks. +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 77ae44a1a9ee..9c10264d2679 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -125,6 +125,11 @@ enum { + * cpu or grabbing pool->lock is enough for read access. If + * POOL_DISASSOCIATED is set, it's identical to L. + * ++ * On RT we need the extra protection via rt_lock_idle_list() for ++ * the list manipulations against read access from ++ * wq_worker_sleeping(). All other places are nicely serialized via ++ * pool->lock. ++ * + * A: wq_pool_attach_mutex protected. + * + * PL: wq_pool_mutex protected. +@@ -430,6 +435,31 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); + if (({ assert_rcu_or_wq_mutex(wq); false; })) { } \ + else + ++#ifdef CONFIG_PREEMPT_RT_BASE ++static inline void rt_lock_idle_list(struct worker_pool *pool) ++{ ++ preempt_disable(); ++} ++static inline void rt_unlock_idle_list(struct worker_pool *pool) ++{ ++ preempt_enable(); ++} ++static inline void sched_lock_idle_list(struct worker_pool *pool) { } ++static inline void sched_unlock_idle_list(struct worker_pool *pool) { } ++#else ++static inline void rt_lock_idle_list(struct worker_pool *pool) { } ++static inline void rt_unlock_idle_list(struct worker_pool *pool) { } ++static inline void sched_lock_idle_list(struct worker_pool *pool) ++{ ++ spin_lock_irq(&pool->lock); ++} ++static inline void sched_unlock_idle_list(struct worker_pool *pool) ++{ ++ spin_unlock_irq(&pool->lock); ++} ++#endif ++ ++ + #ifdef CONFIG_DEBUG_OBJECTS_WORK + + static struct debug_obj_descr work_debug_descr; +@@ -836,10 +866,16 @@ static struct worker *first_idle_worker(struct worker_pool *pool) + */ + static void wake_up_worker(struct worker_pool *pool) + { +- struct worker *worker = first_idle_worker(pool); ++ struct worker *worker; ++ ++ rt_lock_idle_list(pool); ++ ++ worker = first_idle_worker(pool); + + if (likely(worker)) + wake_up_process(worker->task); ++ ++ rt_unlock_idle_list(pool); + } + + /** +@@ -868,7 +904,7 @@ void wq_worker_running(struct task_struct *task) + */ + void wq_worker_sleeping(struct task_struct *task) + { +- struct worker *next, *worker = kthread_data(task); ++ struct worker *worker = kthread_data(task); + struct worker_pool *pool; + + /* +@@ -885,26 +921,18 @@ void wq_worker_sleeping(struct task_struct *task) + return; + + worker->sleeping = 1; +- spin_lock_irq(&pool->lock); + + /* + * The counterpart of the following dec_and_test, implied mb, + * worklist not empty test sequence is in insert_work(). + * Please read comment there. +- * +- * NOT_RUNNING is clear. This means that we're bound to and +- * running on the local cpu w/ rq lock held and preemption +- * disabled, which in turn means that none else could be +- * manipulating idle_list, so dereferencing idle_list without pool +- * lock is safe. + */ + if (atomic_dec_and_test(&pool->nr_running) && + !list_empty(&pool->worklist)) { +- next = first_idle_worker(pool); +- if (next) +- wake_up_process(next->task); ++ sched_lock_idle_list(pool); ++ wake_up_worker(pool); ++ sched_unlock_idle_list(pool); + } +- spin_unlock_irq(&pool->lock); + } + + /** +@@ -1677,7 +1705,9 @@ static void worker_enter_idle(struct worker *worker) + worker->last_active = jiffies; + + /* idle_list is LIFO */ ++ rt_lock_idle_list(pool); + list_add(&worker->entry, &pool->idle_list); ++ rt_unlock_idle_list(pool); + + if (too_many_workers(pool) && !timer_pending(&pool->idle_timer)) + mod_timer(&pool->idle_timer, jiffies + IDLE_WORKER_TIMEOUT); +@@ -1710,7 +1740,9 @@ static void worker_leave_idle(struct worker *worker) + return; + worker_clr_flags(worker, WORKER_IDLE); + pool->nr_idle--; ++ rt_lock_idle_list(pool); + list_del_init(&worker->entry); ++ rt_unlock_idle_list(pool); + } + + static struct worker *alloc_worker(int node) +@@ -1878,7 +1910,9 @@ static void destroy_worker(struct worker *worker) + pool->nr_workers--; + pool->nr_idle--; + ++ rt_lock_idle_list(pool); + list_del_init(&worker->entry); ++ rt_unlock_idle_list(pool); + worker->flags |= WORKER_DIE; + wake_up_process(worker->task); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0260-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch linux-4.19.118/debian/patches-rt/0260-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch --- linux-4.19.98/debian/patches-rt/0260-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0260-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,213 @@ +From 1bbb897c03f7cb3649001d6235621c4097871d52 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 3 Jul 2009 08:44:56 -0500 +Subject: [PATCH 260/325] signals: Allow rt tasks to cache one sigqueue struct +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +To avoid allocation allow rt tasks to cache one sigqueue struct in +task struct. + +Signed-off-by: Thomas Gleixner +--- + include/linux/sched.h | 2 ++ + include/linux/signal.h | 1 + + kernel/exit.c | 2 +- + kernel/fork.c | 1 + + kernel/signal.c | 69 +++++++++++++++++++++++++++++++++++++++--- + 5 files changed, 70 insertions(+), 5 deletions(-) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index a8ebd49c4f96..854a6cb456af 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -895,6 +895,8 @@ struct task_struct { + /* Signal handlers: */ + struct signal_struct *signal; + struct sighand_struct *sighand; ++ struct sigqueue *sigqueue_cache; ++ + sigset_t blocked; + sigset_t real_blocked; + /* Restored if set_restore_sigmask() was used: */ +diff --git a/include/linux/signal.h b/include/linux/signal.h +index 0be5ce2375cb..6495fda18c2c 100644 +--- a/include/linux/signal.h ++++ b/include/linux/signal.h +@@ -245,6 +245,7 @@ static inline void init_sigpending(struct sigpending *sig) + } + + extern void flush_sigqueue(struct sigpending *queue); ++extern void flush_task_sigqueue(struct task_struct *tsk); + + /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ + static inline int valid_signal(unsigned long sig) +diff --git a/kernel/exit.c b/kernel/exit.c +index 54c3269b8dda..c66f21193cf1 100644 +--- a/kernel/exit.c ++++ b/kernel/exit.c +@@ -160,7 +160,7 @@ static void __exit_signal(struct task_struct *tsk) + * Do this under ->siglock, we can race with another thread + * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. + */ +- flush_sigqueue(&tsk->pending); ++ flush_task_sigqueue(tsk); + tsk->sighand = NULL; + spin_unlock(&sighand->siglock); + +diff --git a/kernel/fork.c b/kernel/fork.c +index ecec0f8bef7e..234e0ca9a74b 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -1832,6 +1832,7 @@ static __latent_entropy struct task_struct *copy_process( + spin_lock_init(&p->alloc_lock); + + init_sigpending(&p->pending); ++ p->sigqueue_cache = NULL; + + p->utime = p->stime = p->gtime = 0; + #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME +diff --git a/kernel/signal.c b/kernel/signal.c +index d1fa3c405784..5c04f2891487 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -397,13 +398,30 @@ void task_join_group_stop(struct task_struct *task) + } + } + ++static inline struct sigqueue *get_task_cache(struct task_struct *t) ++{ ++ struct sigqueue *q = t->sigqueue_cache; ++ ++ if (cmpxchg(&t->sigqueue_cache, q, NULL) != q) ++ return NULL; ++ return q; ++} ++ ++static inline int put_task_cache(struct task_struct *t, struct sigqueue *q) ++{ ++ if (cmpxchg(&t->sigqueue_cache, NULL, q) == NULL) ++ return 0; ++ return 1; ++} ++ + /* + * allocate a new signal queue record + * - this may be called without locks if and only if t == current, otherwise an + * appropriate lock must be held to stop the target task from exiting + */ + static struct sigqueue * +-__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimit) ++__sigqueue_do_alloc(int sig, struct task_struct *t, gfp_t flags, ++ int override_rlimit, int fromslab) + { + struct sigqueue *q = NULL; + struct user_struct *user; +@@ -425,7 +443,10 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi + rcu_read_unlock(); + + if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) { +- q = kmem_cache_alloc(sigqueue_cachep, flags); ++ if (!fromslab) ++ q = get_task_cache(t); ++ if (!q) ++ q = kmem_cache_alloc(sigqueue_cachep, flags); + } else { + print_dropped_signal(sig); + } +@@ -442,6 +463,13 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi + return q; + } + ++static struct sigqueue * ++__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, ++ int override_rlimit) ++{ ++ return __sigqueue_do_alloc(sig, t, flags, override_rlimit, 0); ++} ++ + static void __sigqueue_free(struct sigqueue *q) + { + if (q->flags & SIGQUEUE_PREALLOC) +@@ -451,6 +479,21 @@ static void __sigqueue_free(struct sigqueue *q) + kmem_cache_free(sigqueue_cachep, q); + } + ++static void sigqueue_free_current(struct sigqueue *q) ++{ ++ struct user_struct *up; ++ ++ if (q->flags & SIGQUEUE_PREALLOC) ++ return; ++ ++ up = q->user; ++ if (rt_prio(current->normal_prio) && !put_task_cache(current, q)) { ++ atomic_dec(&up->sigpending); ++ free_uid(up); ++ } else ++ __sigqueue_free(q); ++} ++ + void flush_sigqueue(struct sigpending *queue) + { + struct sigqueue *q; +@@ -463,6 +506,21 @@ void flush_sigqueue(struct sigpending *queue) + } + } + ++/* ++ * Called from __exit_signal. Flush tsk->pending and ++ * tsk->sigqueue_cache ++ */ ++void flush_task_sigqueue(struct task_struct *tsk) ++{ ++ struct sigqueue *q; ++ ++ flush_sigqueue(&tsk->pending); ++ ++ q = get_task_cache(tsk); ++ if (q) ++ kmem_cache_free(sigqueue_cachep, q); ++} ++ + /* + * Flush all pending signals for this kthread. + */ +@@ -586,7 +644,7 @@ static void collect_signal(int sig, struct sigpending *list, siginfo_t *info, + (info->si_code == SI_TIMER) && + (info->si_sys_private); + +- __sigqueue_free(first); ++ sigqueue_free_current(first); + } else { + /* + * Ok, it wasn't in the queue. This must be +@@ -623,6 +681,8 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) + bool resched_timer = false; + int signr; + ++ WARN_ON_ONCE(tsk != current); ++ + /* We only dequeue private signals from ourselves, we don't let + * signalfd steal them + */ +@@ -1761,7 +1821,8 @@ EXPORT_SYMBOL(kill_pid); + */ + struct sigqueue *sigqueue_alloc(void) + { +- struct sigqueue *q = __sigqueue_alloc(-1, current, GFP_KERNEL, 0); ++ /* Preallocated sigqueue objects always from the slabcache ! */ ++ struct sigqueue *q = __sigqueue_do_alloc(-1, current, GFP_KERNEL, 0, 1); + + if (q) + q->flags |= SIGQUEUE_PREALLOC; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0260-workqueue-Prevent-deadlock-stall-on-RT.patch linux-4.19.118/debian/patches-rt/0260-workqueue-Prevent-deadlock-stall-on-RT.patch --- linux-4.19.98/debian/patches-rt/0260-workqueue-Prevent-deadlock-stall-on-RT.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0260-workqueue-Prevent-deadlock-stall-on-RT.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,207 +0,0 @@ -From 6b39a01e228fa1dd4b6e4a63ee0948b2e925a4c4 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 27 Jun 2014 16:24:52 +0200 -Subject: [PATCH 260/290] workqueue: Prevent deadlock/stall on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Austin reported a XFS deadlock/stall on RT where scheduled work gets -never exececuted and tasks are waiting for each other for ever. - -The underlying problem is the modification of the RT code to the -handling of workers which are about to go to sleep. In mainline a -worker thread which goes to sleep wakes an idle worker if there is -more work to do. This happens from the guts of the schedule() -function. On RT this must be outside and the accessed data structures -are not protected against scheduling due to the spinlock to rtmutex -conversion. So the naive solution to this was to move the code outside -of the scheduler and protect the data structures by the pool -lock. That approach turned out to be a little naive as we cannot call -into that code when the thread blocks on a lock, as it is not allowed -to block on two locks in parallel. So we dont call into the worker -wakeup magic when the worker is blocked on a lock, which causes the -deadlock/stall observed by Austin and Mike. - -Looking deeper into that worker code it turns out that the only -relevant data structure which needs to be protected is the list of -idle workers which can be woken up. - -So the solution is to protect the list manipulation operations with -preempt_enable/disable pairs on RT and call unconditionally into the -worker code even when the worker is blocked on a lock. The preemption -protection is safe as there is nothing which can fiddle with the list -outside of thread context. - -Reported-and_tested-by: Austin Schuh -Reported-and_tested-by: Mike Galbraith -Signed-off-by: Thomas Gleixner -Link: http://vger.kernel.org/r/alpine.DEB.2.10.1406271249510.5170@nanos -Cc: Richard Weinberger -Cc: Steven Rostedt ---- - kernel/sched/core.c | 6 +++-- - kernel/workqueue.c | 60 +++++++++++++++++++++++++++++++++++---------- - 2 files changed, 51 insertions(+), 15 deletions(-) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index a17c765d3fcb..cfde725e1017 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3610,9 +3610,8 @@ void __noreturn do_task_dead(void) - - static inline void sched_submit_work(struct task_struct *tsk) - { -- if (!tsk->state || tsk_is_pi_blocked(tsk)) -+ if (!tsk->state) - return; -- - /* - * If a worker went to sleep, notify and ask workqueue whether - * it wants to wake up a task to maintain concurrency. -@@ -3626,6 +3625,9 @@ static inline void sched_submit_work(struct task_struct *tsk) - preempt_enable_no_resched(); - } - -+ if (tsk_is_pi_blocked(tsk)) -+ return; -+ - /* - * If we are going to sleep and we have plugged IO queued, - * make sure to submit it to avoid deadlocks. -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 045b82ca0eb5..714d0cfe4d56 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -125,6 +125,11 @@ enum { - * cpu or grabbing pool->lock is enough for read access. If - * POOL_DISASSOCIATED is set, it's identical to L. - * -+ * On RT we need the extra protection via rt_lock_idle_list() for -+ * the list manipulations against read access from -+ * wq_worker_sleeping(). All other places are nicely serialized via -+ * pool->lock. -+ * - * A: wq_pool_attach_mutex protected. - * - * PL: wq_pool_mutex protected. -@@ -430,6 +435,31 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); - if (({ assert_rcu_or_wq_mutex(wq); false; })) { } \ - else - -+#ifdef CONFIG_PREEMPT_RT_BASE -+static inline void rt_lock_idle_list(struct worker_pool *pool) -+{ -+ preempt_disable(); -+} -+static inline void rt_unlock_idle_list(struct worker_pool *pool) -+{ -+ preempt_enable(); -+} -+static inline void sched_lock_idle_list(struct worker_pool *pool) { } -+static inline void sched_unlock_idle_list(struct worker_pool *pool) { } -+#else -+static inline void rt_lock_idle_list(struct worker_pool *pool) { } -+static inline void rt_unlock_idle_list(struct worker_pool *pool) { } -+static inline void sched_lock_idle_list(struct worker_pool *pool) -+{ -+ spin_lock_irq(&pool->lock); -+} -+static inline void sched_unlock_idle_list(struct worker_pool *pool) -+{ -+ spin_unlock_irq(&pool->lock); -+} -+#endif -+ -+ - #ifdef CONFIG_DEBUG_OBJECTS_WORK - - static struct debug_obj_descr work_debug_descr; -@@ -836,10 +866,16 @@ static struct worker *first_idle_worker(struct worker_pool *pool) - */ - static void wake_up_worker(struct worker_pool *pool) - { -- struct worker *worker = first_idle_worker(pool); -+ struct worker *worker; -+ -+ rt_lock_idle_list(pool); -+ -+ worker = first_idle_worker(pool); - - if (likely(worker)) - wake_up_process(worker->task); -+ -+ rt_unlock_idle_list(pool); - } - - /** -@@ -868,7 +904,7 @@ void wq_worker_running(struct task_struct *task) - */ - void wq_worker_sleeping(struct task_struct *task) - { -- struct worker *next, *worker = kthread_data(task); -+ struct worker *worker = kthread_data(task); - struct worker_pool *pool; - - /* -@@ -885,26 +921,18 @@ void wq_worker_sleeping(struct task_struct *task) - return; - - worker->sleeping = 1; -- spin_lock_irq(&pool->lock); - - /* - * The counterpart of the following dec_and_test, implied mb, - * worklist not empty test sequence is in insert_work(). - * Please read comment there. -- * -- * NOT_RUNNING is clear. This means that we're bound to and -- * running on the local cpu w/ rq lock held and preemption -- * disabled, which in turn means that none else could be -- * manipulating idle_list, so dereferencing idle_list without pool -- * lock is safe. - */ - if (atomic_dec_and_test(&pool->nr_running) && - !list_empty(&pool->worklist)) { -- next = first_idle_worker(pool); -- if (next) -- wake_up_process(next->task); -+ sched_lock_idle_list(pool); -+ wake_up_worker(pool); -+ sched_unlock_idle_list(pool); - } -- spin_unlock_irq(&pool->lock); - } - - /** -@@ -1675,7 +1703,9 @@ static void worker_enter_idle(struct worker *worker) - worker->last_active = jiffies; - - /* idle_list is LIFO */ -+ rt_lock_idle_list(pool); - list_add(&worker->entry, &pool->idle_list); -+ rt_unlock_idle_list(pool); - - if (too_many_workers(pool) && !timer_pending(&pool->idle_timer)) - mod_timer(&pool->idle_timer, jiffies + IDLE_WORKER_TIMEOUT); -@@ -1708,7 +1738,9 @@ static void worker_leave_idle(struct worker *worker) - return; - worker_clr_flags(worker, WORKER_IDLE); - pool->nr_idle--; -+ rt_lock_idle_list(pool); - list_del_init(&worker->entry); -+ rt_unlock_idle_list(pool); - } - - static struct worker *alloc_worker(int node) -@@ -1876,7 +1908,9 @@ static void destroy_worker(struct worker *worker) - pool->nr_workers--; - pool->nr_idle--; - -+ rt_lock_idle_list(pool); - list_del_init(&worker->entry); -+ rt_unlock_idle_list(pool); - worker->flags |= WORKER_DIE; - wake_up_process(worker->task); - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0261-Add-localversion-for-RT-release.patch linux-4.19.118/debian/patches-rt/0261-Add-localversion-for-RT-release.patch --- linux-4.19.98/debian/patches-rt/0261-Add-localversion-for-RT-release.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0261-Add-localversion-for-RT-release.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,22 @@ +From 1bda071743a7670613cfe289a43ac9db4d6648cc Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 8 Jul 2011 20:25:16 +0200 +Subject: [PATCH 261/325] Add localversion for -RT release +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Signed-off-by: Thomas Gleixner +--- + localversion-rt | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 localversion-rt + +diff --git a/localversion-rt b/localversion-rt +new file mode 100644 +index 000000000000..1199ebade17b +--- /dev/null ++++ b/localversion-rt +@@ -0,0 +1 @@ ++-rt16 +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0261-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch linux-4.19.118/debian/patches-rt/0261-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch --- linux-4.19.98/debian/patches-rt/0261-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0261-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,213 +0,0 @@ -From 3bbe691ca13a581aeb69342fe32522906eefba3c Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 3 Jul 2009 08:44:56 -0500 -Subject: [PATCH 261/290] signals: Allow rt tasks to cache one sigqueue struct -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -To avoid allocation allow rt tasks to cache one sigqueue struct in -task struct. - -Signed-off-by: Thomas Gleixner ---- - include/linux/sched.h | 2 ++ - include/linux/signal.h | 1 + - kernel/exit.c | 2 +- - kernel/fork.c | 1 + - kernel/signal.c | 69 +++++++++++++++++++++++++++++++++++++++--- - 5 files changed, 70 insertions(+), 5 deletions(-) - -diff --git a/include/linux/sched.h b/include/linux/sched.h -index d2386fa9ed0f..3c213ec3d3b5 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -895,6 +895,8 @@ struct task_struct { - /* Signal handlers: */ - struct signal_struct *signal; - struct sighand_struct *sighand; -+ struct sigqueue *sigqueue_cache; -+ - sigset_t blocked; - sigset_t real_blocked; - /* Restored if set_restore_sigmask() was used: */ -diff --git a/include/linux/signal.h b/include/linux/signal.h -index e4d01469ed60..746dd5d28c54 100644 ---- a/include/linux/signal.h -+++ b/include/linux/signal.h -@@ -245,6 +245,7 @@ static inline void init_sigpending(struct sigpending *sig) - } - - extern void flush_sigqueue(struct sigpending *queue); -+extern void flush_task_sigqueue(struct task_struct *tsk); - - /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ - static inline int valid_signal(unsigned long sig) -diff --git a/kernel/exit.c b/kernel/exit.c -index 54c3269b8dda..c66f21193cf1 100644 ---- a/kernel/exit.c -+++ b/kernel/exit.c -@@ -160,7 +160,7 @@ static void __exit_signal(struct task_struct *tsk) - * Do this under ->siglock, we can race with another thread - * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. - */ -- flush_sigqueue(&tsk->pending); -+ flush_task_sigqueue(tsk); - tsk->sighand = NULL; - spin_unlock(&sighand->siglock); - -diff --git a/kernel/fork.c b/kernel/fork.c -index 7399bff2e08d..9bcf8f5e77ae 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -1822,6 +1822,7 @@ static __latent_entropy struct task_struct *copy_process( - spin_lock_init(&p->alloc_lock); - - init_sigpending(&p->pending); -+ p->sigqueue_cache = NULL; - - p->utime = p->stime = p->gtime = 0; - #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME -diff --git a/kernel/signal.c b/kernel/signal.c -index 3565221b4fac..c84f13dd8626 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -19,6 +19,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -392,13 +393,30 @@ void task_join_group_stop(struct task_struct *task) - } - } - -+static inline struct sigqueue *get_task_cache(struct task_struct *t) -+{ -+ struct sigqueue *q = t->sigqueue_cache; -+ -+ if (cmpxchg(&t->sigqueue_cache, q, NULL) != q) -+ return NULL; -+ return q; -+} -+ -+static inline int put_task_cache(struct task_struct *t, struct sigqueue *q) -+{ -+ if (cmpxchg(&t->sigqueue_cache, NULL, q) == NULL) -+ return 0; -+ return 1; -+} -+ - /* - * allocate a new signal queue record - * - this may be called without locks if and only if t == current, otherwise an - * appropriate lock must be held to stop the target task from exiting - */ - static struct sigqueue * --__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimit) -+__sigqueue_do_alloc(int sig, struct task_struct *t, gfp_t flags, -+ int override_rlimit, int fromslab) - { - struct sigqueue *q = NULL; - struct user_struct *user; -@@ -415,7 +433,10 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi - if (override_rlimit || - atomic_read(&user->sigpending) <= - task_rlimit(t, RLIMIT_SIGPENDING)) { -- q = kmem_cache_alloc(sigqueue_cachep, flags); -+ if (!fromslab) -+ q = get_task_cache(t); -+ if (!q) -+ q = kmem_cache_alloc(sigqueue_cachep, flags); - } else { - print_dropped_signal(sig); - } -@@ -432,6 +453,13 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi - return q; - } - -+static struct sigqueue * -+__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, -+ int override_rlimit) -+{ -+ return __sigqueue_do_alloc(sig, t, flags, override_rlimit, 0); -+} -+ - static void __sigqueue_free(struct sigqueue *q) - { - if (q->flags & SIGQUEUE_PREALLOC) -@@ -441,6 +469,21 @@ static void __sigqueue_free(struct sigqueue *q) - kmem_cache_free(sigqueue_cachep, q); - } - -+static void sigqueue_free_current(struct sigqueue *q) -+{ -+ struct user_struct *up; -+ -+ if (q->flags & SIGQUEUE_PREALLOC) -+ return; -+ -+ up = q->user; -+ if (rt_prio(current->normal_prio) && !put_task_cache(current, q)) { -+ atomic_dec(&up->sigpending); -+ free_uid(up); -+ } else -+ __sigqueue_free(q); -+} -+ - void flush_sigqueue(struct sigpending *queue) - { - struct sigqueue *q; -@@ -453,6 +496,21 @@ void flush_sigqueue(struct sigpending *queue) - } - } - -+/* -+ * Called from __exit_signal. Flush tsk->pending and -+ * tsk->sigqueue_cache -+ */ -+void flush_task_sigqueue(struct task_struct *tsk) -+{ -+ struct sigqueue *q; -+ -+ flush_sigqueue(&tsk->pending); -+ -+ q = get_task_cache(tsk); -+ if (q) -+ kmem_cache_free(sigqueue_cachep, q); -+} -+ - /* - * Flush all pending signals for this kthread. - */ -@@ -576,7 +634,7 @@ static void collect_signal(int sig, struct sigpending *list, siginfo_t *info, - (info->si_code == SI_TIMER) && - (info->si_sys_private); - -- __sigqueue_free(first); -+ sigqueue_free_current(first); - } else { - /* - * Ok, it wasn't in the queue. This must be -@@ -613,6 +671,8 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info) - bool resched_timer = false; - int signr; - -+ WARN_ON_ONCE(tsk != current); -+ - /* We only dequeue private signals from ourselves, we don't let - * signalfd steal them - */ -@@ -1751,7 +1811,8 @@ EXPORT_SYMBOL(kill_pid); - */ - struct sigqueue *sigqueue_alloc(void) - { -- struct sigqueue *q = __sigqueue_alloc(-1, current, GFP_KERNEL, 0); -+ /* Preallocated sigqueue objects always from the slabcache ! */ -+ struct sigqueue *q = __sigqueue_do_alloc(-1, current, GFP_KERNEL, 0, 1); - - if (q) - q->flags |= SIGQUEUE_PREALLOC; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0262-Add-localversion-for-RT-release.patch linux-4.19.118/debian/patches-rt/0262-Add-localversion-for-RT-release.patch --- linux-4.19.98/debian/patches-rt/0262-Add-localversion-for-RT-release.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0262-Add-localversion-for-RT-release.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -From 1ce039a98b3970742c177d167d323f4a51fa51f0 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Fri, 8 Jul 2011 20:25:16 +0200 -Subject: [PATCH 262/290] Add localversion for -RT release -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Signed-off-by: Thomas Gleixner ---- - localversion-rt | 1 + - 1 file changed, 1 insertion(+) - create mode 100644 localversion-rt - -diff --git a/localversion-rt b/localversion-rt -new file mode 100644 -index 000000000000..1199ebade17b ---- /dev/null -+++ b/localversion-rt -@@ -0,0 +1 @@ -+-rt16 --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0262-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch linux-4.19.118/debian/patches-rt/0262-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch --- linux-4.19.98/debian/patches-rt/0262-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0262-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,97 @@ +From 1038e9afab3fe09ade4404d6185b1ab081594593 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 26 Mar 2019 18:31:54 +0100 +Subject: [PATCH 262/325] powerpc/pseries/iommu: Use a locallock instead + local_irq_save() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The locallock protects the per-CPU variable tce_page. The function +attempts to allocate memory while tce_page is protected (by disabling +interrupts). + +Use local_irq_save() instead of local_irq_disable(). + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + arch/powerpc/platforms/pseries/iommu.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c +index b1a08cb760e0..8ef818ad83ec 100644 +--- a/arch/powerpc/platforms/pseries/iommu.c ++++ b/arch/powerpc/platforms/pseries/iommu.c +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -212,6 +213,7 @@ static int tce_build_pSeriesLP(unsigned long liobn, long tcenum, long tceshift, + } + + static DEFINE_PER_CPU(__be64 *, tce_page); ++static DEFINE_LOCAL_IRQ_LOCK(tcp_page_lock); + + static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + long npages, unsigned long uaddr, +@@ -233,7 +235,8 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + direction, attrs); + } + +- local_irq_save(flags); /* to protect tcep and the page behind it */ ++ /* to protect tcep and the page behind it */ ++ local_lock_irqsave(tcp_page_lock, flags); + + tcep = __this_cpu_read(tce_page); + +@@ -244,7 +247,7 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + tcep = (__be64 *)__get_free_page(GFP_ATOMIC); + /* If allocation fails, fall back to the loop implementation */ + if (!tcep) { +- local_irq_restore(flags); ++ local_unlock_irqrestore(tcp_page_lock, flags); + return tce_build_pSeriesLP(tbl->it_index, tcenum, + tbl->it_page_shift, + npages, uaddr, direction, attrs); +@@ -279,7 +282,7 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + tcenum += limit; + } while (npages > 0 && !rc); + +- local_irq_restore(flags); ++ local_unlock_irqrestore(tcp_page_lock, flags); + + if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) { + ret = (int)rc; +@@ -450,13 +453,14 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn, + DMA_BIDIRECTIONAL, 0); + } + +- local_irq_disable(); /* to protect tcep and the page behind it */ ++ /* to protect tcep and the page behind it */ ++ local_lock_irq(tcp_page_lock); + tcep = __this_cpu_read(tce_page); + + if (!tcep) { + tcep = (__be64 *)__get_free_page(GFP_ATOMIC); + if (!tcep) { +- local_irq_enable(); ++ local_unlock_irq(tcp_page_lock); + return -ENOMEM; + } + __this_cpu_write(tce_page, tcep); +@@ -502,7 +506,7 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn, + + /* error cleanup: caller will clear whole range */ + +- local_irq_enable(); ++ local_unlock_irq(tcp_page_lock); + return rc; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0263-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch linux-4.19.118/debian/patches-rt/0263-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch --- linux-4.19.98/debian/patches-rt/0263-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0263-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -From 225db3efbd37d13d5f2f72e2371da7d6bd9a2405 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 26 Mar 2019 18:31:54 +0100 -Subject: [PATCH 263/290] powerpc/pseries/iommu: Use a locallock instead - local_irq_save() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The locallock protects the per-CPU variable tce_page. The function -attempts to allocate memory while tce_page is protected (by disabling -interrupts). - -Use local_irq_save() instead of local_irq_disable(). - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - arch/powerpc/platforms/pseries/iommu.c | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - -diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c -index 06f02960b439..d80d919c78d3 100644 ---- a/arch/powerpc/platforms/pseries/iommu.c -+++ b/arch/powerpc/platforms/pseries/iommu.c -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -212,6 +213,7 @@ static int tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, - } - - static DEFINE_PER_CPU(__be64 *, tce_page); -+static DEFINE_LOCAL_IRQ_LOCK(tcp_page_lock); - - static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, - long npages, unsigned long uaddr, -@@ -232,7 +234,8 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, - direction, attrs); - } - -- local_irq_save(flags); /* to protect tcep and the page behind it */ -+ /* to protect tcep and the page behind it */ -+ local_lock_irqsave(tcp_page_lock, flags); - - tcep = __this_cpu_read(tce_page); - -@@ -243,7 +246,7 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, - tcep = (__be64 *)__get_free_page(GFP_ATOMIC); - /* If allocation fails, fall back to the loop implementation */ - if (!tcep) { -- local_irq_restore(flags); -+ local_unlock_irqrestore(tcp_page_lock, flags); - return tce_build_pSeriesLP(tbl, tcenum, npages, uaddr, - direction, attrs); - } -@@ -277,7 +280,7 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, - tcenum += limit; - } while (npages > 0 && !rc); - -- local_irq_restore(flags); -+ local_unlock_irqrestore(tcp_page_lock, flags); - - if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) { - ret = (int)rc; -@@ -435,13 +438,14 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn, - u64 rc = 0; - long l, limit; - -- local_irq_disable(); /* to protect tcep and the page behind it */ -+ /* to protect tcep and the page behind it */ -+ local_lock_irq(tcp_page_lock); - tcep = __this_cpu_read(tce_page); - - if (!tcep) { - tcep = (__be64 *)__get_free_page(GFP_ATOMIC); - if (!tcep) { -- local_irq_enable(); -+ local_unlock_irq(tcp_page_lock); - return -ENOMEM; - } - __this_cpu_write(tce_page, tcep); -@@ -487,7 +491,7 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn, - - /* error cleanup: caller will clear whole range */ - -- local_irq_enable(); -+ local_unlock_irq(tcp_page_lock); - return rc; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0263-powerpc-reshuffle-TIF-bits.patch linux-4.19.118/debian/patches-rt/0263-powerpc-reshuffle-TIF-bits.patch --- linux-4.19.98/debian/patches-rt/0263-powerpc-reshuffle-TIF-bits.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0263-powerpc-reshuffle-TIF-bits.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,152 @@ +From 88b8c212455534d5cda58f57dd35faa8ce864011 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 22 Mar 2019 17:15:58 +0100 +Subject: [PATCH 263/325] powerpc: reshuffle TIF bits +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Powerpc32/64 does not compile because TIF_SYSCALL_TRACE's bit is higher +than 15 and the assembly instructions don't expect that. + +Move TIF_RESTOREALL, TIF_NOERROR to the higher bits and keep +TIF_NEED_RESCHED_LAZY in the lower range. As a result one split load is +needed and otherwise we can use immediates. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + arch/powerpc/include/asm/thread_info.h | 11 +++++++---- + arch/powerpc/kernel/entry_32.S | 12 +++++++----- + arch/powerpc/kernel/entry_64.S | 12 +++++++----- + 3 files changed, 21 insertions(+), 14 deletions(-) + +diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h +index ce316076bc52..64c3d1a720e2 100644 +--- a/arch/powerpc/include/asm/thread_info.h ++++ b/arch/powerpc/include/asm/thread_info.h +@@ -83,18 +83,18 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src + #define TIF_SIGPENDING 1 /* signal pending */ + #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ + #define TIF_FSCHECK 3 /* Check FS is USER_DS on return */ +-#define TIF_NEED_RESCHED_LAZY 4 /* lazy rescheduling necessary */ + #define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */ + #define TIF_PATCH_PENDING 6 /* pending live patching update */ + #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ + #define TIF_SINGLESTEP 8 /* singlestepping active */ + #define TIF_NOHZ 9 /* in adaptive nohz mode */ + #define TIF_SECCOMP 10 /* secure computing */ +-#define TIF_RESTOREALL 11 /* Restore all regs (implies NOERROR) */ +-#define TIF_NOERROR 12 /* Force successful syscall return */ ++ ++#define TIF_NEED_RESCHED_LAZY 11 /* lazy rescheduling necessary */ ++#define TIF_SYSCALL_TRACEPOINT 12 /* syscall tracepoint instrumentation */ ++ + #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ + #define TIF_UPROBE 14 /* breakpointed or single-stepping */ +-#define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ + #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation + for stack store? */ + #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ +@@ -103,6 +103,9 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src + #endif + #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ + #define TIF_32BIT 20 /* 32 bit binary */ ++#define TIF_RESTOREALL 21 /* Restore all regs (implies NOERROR) */ ++#define TIF_NOERROR 22 /* Force successful syscall return */ ++ + + /* as above, but as bit values */ + #define _TIF_SYSCALL_TRACE (1< -Date: Fri, 22 Mar 2019 17:15:58 +0100 -Subject: [PATCH 264/290] powerpc: reshuffle TIF bits -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Powerpc32/64 does not compile because TIF_SYSCALL_TRACE's bit is higher -than 15 and the assembly instructions don't expect that. - -Move TIF_RESTOREALL, TIF_NOERROR to the higher bits and keep -TIF_NEED_RESCHED_LAZY in the lower range. As a result one split load is -needed and otherwise we can use immediates. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - arch/powerpc/include/asm/thread_info.h | 11 +++++++---- - arch/powerpc/kernel/entry_32.S | 12 +++++++----- - arch/powerpc/kernel/entry_64.S | 12 +++++++----- - 3 files changed, 21 insertions(+), 14 deletions(-) - -diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h -index ce316076bc52..64c3d1a720e2 100644 ---- a/arch/powerpc/include/asm/thread_info.h -+++ b/arch/powerpc/include/asm/thread_info.h -@@ -83,18 +83,18 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src - #define TIF_SIGPENDING 1 /* signal pending */ - #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ - #define TIF_FSCHECK 3 /* Check FS is USER_DS on return */ --#define TIF_NEED_RESCHED_LAZY 4 /* lazy rescheduling necessary */ - #define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */ - #define TIF_PATCH_PENDING 6 /* pending live patching update */ - #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ - #define TIF_SINGLESTEP 8 /* singlestepping active */ - #define TIF_NOHZ 9 /* in adaptive nohz mode */ - #define TIF_SECCOMP 10 /* secure computing */ --#define TIF_RESTOREALL 11 /* Restore all regs (implies NOERROR) */ --#define TIF_NOERROR 12 /* Force successful syscall return */ -+ -+#define TIF_NEED_RESCHED_LAZY 11 /* lazy rescheduling necessary */ -+#define TIF_SYSCALL_TRACEPOINT 12 /* syscall tracepoint instrumentation */ -+ - #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ - #define TIF_UPROBE 14 /* breakpointed or single-stepping */ --#define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ - #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation - for stack store? */ - #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ -@@ -103,6 +103,9 @@ extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src - #endif - #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ - #define TIF_32BIT 20 /* 32 bit binary */ -+#define TIF_RESTOREALL 21 /* Restore all regs (implies NOERROR) */ -+#define TIF_NOERROR 22 /* Force successful syscall return */ -+ - - /* as above, but as bit values */ - #define _TIF_SYSCALL_TRACE (1< +Date: Wed, 13 Mar 2019 11:40:34 +0000 +Subject: [PATCH 264/325] tty/sysrq: Convert show_lock to raw_spinlock_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Systems which don't provide arch_trigger_cpumask_backtrace() will +invoke showacpu() from a smp_call_function() function which is invoked +with disabled interrupts even on -RT systems. + +The function acquires the show_lock lock which only purpose is to +ensure that the CPUs don't print simultaneously. Otherwise the +output would clash and it would be hard to tell the output from CPUx +apart from CPUy. + +On -RT the spin_lock() can not be acquired from this context. A +raw_spin_lock() is required. It will introduce the system's latency +by performing the sysrq request and other CPUs will block on the lock +until the request is done. This is okay because the user asked for a +backtrace of all active CPUs and under "normal circumstances in +production" this path should not be triggered. + +Signed-off-by: Julien Grall +Signed-off-by: Steven Rostedt (VMware) +[bigeasy@linuxtronix.de: commit description] +Signed-off-by: Sebastian Andrzej Siewior +Acked-by: Sebastian Andrzej Siewior +Signed-off-by: Greg Kroah-Hartman +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/tty/sysrq.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c +index cee0274806c5..f785ca55fb85 100644 +--- a/drivers/tty/sysrq.c ++++ b/drivers/tty/sysrq.c +@@ -215,7 +215,7 @@ static struct sysrq_key_op sysrq_showlocks_op = { + #endif + + #ifdef CONFIG_SMP +-static DEFINE_SPINLOCK(show_lock); ++static DEFINE_RAW_SPINLOCK(show_lock); + + static void showacpu(void *dummy) + { +@@ -225,10 +225,10 @@ static void showacpu(void *dummy) + if (idle_cpu(smp_processor_id())) + return; + +- spin_lock_irqsave(&show_lock, flags); ++ raw_spin_lock_irqsave(&show_lock, flags); + pr_info("CPU%d:\n", smp_processor_id()); + show_stack(NULL, NULL); +- spin_unlock_irqrestore(&show_lock, flags); ++ raw_spin_unlock_irqrestore(&show_lock, flags); + } + + static void sysrq_showregs_othercpus(struct work_struct *dummy) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0265-drm-i915-Don-t-disable-interrupts-independently-of-t.patch linux-4.19.118/debian/patches-rt/0265-drm-i915-Don-t-disable-interrupts-independently-of-t.patch --- linux-4.19.98/debian/patches-rt/0265-drm-i915-Don-t-disable-interrupts-independently-of-t.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0265-drm-i915-Don-t-disable-interrupts-independently-of-t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,51 @@ +From 0a78b08d39369e6a8d6092e1e5f1fdb7baf61dbc Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 10 Apr 2019 11:01:37 +0200 +Subject: [PATCH 265/325] drm/i915: Don't disable interrupts independently of + the lock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +The locks (timeline->lock and rq->lock) need to be taken with disabled +interrupts. This is done in __retire_engine_request() by disabling the +interrupts independently of the locks itself. +While local_irq_disable()+spin_lock() equals spin_lock_irq() on vanilla +it does not on RT. Also, it is not obvious if there is a special reason +to why the interrupts are disabled independently of the lock. + +Enable/disable interrupts as part of the locking instruction. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/gpu/drm/i915/i915_request.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c +index 5c2c93cbab12..7124510b9131 100644 +--- a/drivers/gpu/drm/i915/i915_request.c ++++ b/drivers/gpu/drm/i915/i915_request.c +@@ -356,9 +356,7 @@ static void __retire_engine_request(struct intel_engine_cs *engine, + + GEM_BUG_ON(!i915_request_completed(rq)); + +- local_irq_disable(); +- +- spin_lock(&engine->timeline.lock); ++ spin_lock_irq(&engine->timeline.lock); + GEM_BUG_ON(!list_is_first(&rq->link, &engine->timeline.requests)); + list_del_init(&rq->link); + spin_unlock(&engine->timeline.lock); +@@ -372,9 +370,7 @@ static void __retire_engine_request(struct intel_engine_cs *engine, + GEM_BUG_ON(!atomic_read(&rq->i915->gt_pm.rps.num_waiters)); + atomic_dec(&rq->i915->gt_pm.rps.num_waiters); + } +- spin_unlock(&rq->lock); +- +- local_irq_enable(); ++ spin_unlock_irq(&rq->lock); + + /* + * The backing object for the context is done after switching to the +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0265-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch linux-4.19.118/debian/patches-rt/0265-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch --- linux-4.19.98/debian/patches-rt/0265-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0265-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -From 80e49fd34b0d5b3dd5f122c074ce833b9d727ae8 Mon Sep 17 00:00:00 2001 -From: Julien Grall -Date: Wed, 13 Mar 2019 11:40:34 +0000 -Subject: [PATCH 265/290] tty/sysrq: Convert show_lock to raw_spinlock_t -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Systems which don't provide arch_trigger_cpumask_backtrace() will -invoke showacpu() from a smp_call_function() function which is invoked -with disabled interrupts even on -RT systems. - -The function acquires the show_lock lock which only purpose is to -ensure that the CPUs don't print simultaneously. Otherwise the -output would clash and it would be hard to tell the output from CPUx -apart from CPUy. - -On -RT the spin_lock() can not be acquired from this context. A -raw_spin_lock() is required. It will introduce the system's latency -by performing the sysrq request and other CPUs will block on the lock -until the request is done. This is okay because the user asked for a -backtrace of all active CPUs and under "normal circumstances in -production" this path should not be triggered. - -Signed-off-by: Julien Grall -Signed-off-by: Steven Rostedt (VMware) -[bigeasy@linuxtronix.de: commit description] -Signed-off-by: Sebastian Andrzej Siewior -Acked-by: Sebastian Andrzej Siewior -Signed-off-by: Greg Kroah-Hartman -Cc: stable-rt@vger.kernel.org -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/tty/sysrq.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c -index 06ed20dd01ba..627517ad55bf 100644 ---- a/drivers/tty/sysrq.c -+++ b/drivers/tty/sysrq.c -@@ -215,7 +215,7 @@ static struct sysrq_key_op sysrq_showlocks_op = { - #endif - - #ifdef CONFIG_SMP --static DEFINE_SPINLOCK(show_lock); -+static DEFINE_RAW_SPINLOCK(show_lock); - - static void showacpu(void *dummy) - { -@@ -225,10 +225,10 @@ static void showacpu(void *dummy) - if (idle_cpu(smp_processor_id())) - return; - -- spin_lock_irqsave(&show_lock, flags); -+ raw_spin_lock_irqsave(&show_lock, flags); - pr_info("CPU%d:\n", smp_processor_id()); - show_stack(NULL, NULL); -- spin_unlock_irqrestore(&show_lock, flags); -+ raw_spin_unlock_irqrestore(&show_lock, flags); - } - - static void sysrq_showregs_othercpus(struct work_struct *dummy) --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0266-drm-i915-Don-t-disable-interrupts-independently-of-t.patch linux-4.19.118/debian/patches-rt/0266-drm-i915-Don-t-disable-interrupts-independently-of-t.patch --- linux-4.19.98/debian/patches-rt/0266-drm-i915-Don-t-disable-interrupts-independently-of-t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0266-drm-i915-Don-t-disable-interrupts-independently-of-t.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -From 7bfefce1f534227fddc8cc519a813c04f7f6c1da Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 10 Apr 2019 11:01:37 +0200 -Subject: [PATCH 266/290] drm/i915: Don't disable interrupts independently of - the lock -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -The locks (timeline->lock and rq->lock) need to be taken with disabled -interrupts. This is done in __retire_engine_request() by disabling the -interrupts independently of the locks itself. -While local_irq_disable()+spin_lock() equals spin_lock_irq() on vanilla -it does not on RT. Also, it is not obvious if there is a special reason -to why the interrupts are disabled independently of the lock. - -Enable/disable interrupts as part of the locking instruction. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - drivers/gpu/drm/i915/i915_request.c | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c -index 5c2c93cbab12..7124510b9131 100644 ---- a/drivers/gpu/drm/i915/i915_request.c -+++ b/drivers/gpu/drm/i915/i915_request.c -@@ -356,9 +356,7 @@ static void __retire_engine_request(struct intel_engine_cs *engine, - - GEM_BUG_ON(!i915_request_completed(rq)); - -- local_irq_disable(); -- -- spin_lock(&engine->timeline.lock); -+ spin_lock_irq(&engine->timeline.lock); - GEM_BUG_ON(!list_is_first(&rq->link, &engine->timeline.requests)); - list_del_init(&rq->link); - spin_unlock(&engine->timeline.lock); -@@ -372,9 +370,7 @@ static void __retire_engine_request(struct intel_engine_cs *engine, - GEM_BUG_ON(!atomic_read(&rq->i915->gt_pm.rps.num_waiters)); - atomic_dec(&rq->i915->gt_pm.rps.num_waiters); - } -- spin_unlock(&rq->lock); -- -- local_irq_enable(); -+ spin_unlock_irq(&rq->lock); - - /* - * The backing object for the context is done after switching to the --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0266-sched-completion-Fix-a-lockup-in-wait_for_completion.patch linux-4.19.118/debian/patches-rt/0266-sched-completion-Fix-a-lockup-in-wait_for_completion.patch --- linux-4.19.98/debian/patches-rt/0266-sched-completion-Fix-a-lockup-in-wait_for_completion.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0266-sched-completion-Fix-a-lockup-in-wait_for_completion.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,69 @@ +From 03e061f70cacf8cd22a7d1bc073f9b70e5b85c71 Mon Sep 17 00:00:00 2001 +From: Corey Minyard +Date: Thu, 9 May 2019 14:33:20 -0500 +Subject: [PATCH 266/325] sched/completion: Fix a lockup in + wait_for_completion() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Consider following race: + + T0 T1 T2 + wait_for_completion() + do_wait_for_common() + __prepare_to_swait() + schedule() + complete() + x->done++ (0 -> 1) + raw_spin_lock_irqsave() + swake_up_locked() wait_for_completion() + wake_up_process(T0) + list_del_init() + raw_spin_unlock_irqrestore() + raw_spin_lock_irq(&x->wait.lock) + raw_spin_lock_irq(&x->wait.lock) x->done != UINT_MAX, 1 -> 0 + raw_spin_unlock_irq(&x->wait.lock) + return 1 + while (!x->done && timeout), + continue loop, not enqueued + on &x->wait + +Basically, the problem is that the original wait queues used in +completions did not remove the item from the queue in the wakeup +function, but swake_up_locked() does. + +Fix it by adding the thread to the wait queue inside the do loop. +The design of swait detects if it is already in the list and doesn't +do the list add again. + +Cc: stable-rt@vger.kernel.org +Fixes: a04ff6b4ec4ee7e ("completion: Use simple wait queues") +Signed-off-by: Corey Minyard +Acked-by: Steven Rostedt (VMware) +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: shorten commit message ] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/sched/completion.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/sched/completion.c b/kernel/sched/completion.c +index 755a58084978..49c14137988e 100644 +--- a/kernel/sched/completion.c ++++ b/kernel/sched/completion.c +@@ -72,12 +72,12 @@ do_wait_for_common(struct completion *x, + if (!x->done) { + DECLARE_SWAITQUEUE(wait); + +- __prepare_to_swait(&x->wait, &wait); + do { + if (signal_pending_state(state, current)) { + timeout = -ERESTARTSYS; + break; + } ++ __prepare_to_swait(&x->wait, &wait); + __set_current_state(state); + raw_spin_unlock_irq(&x->wait.lock); + timeout = action(timeout); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0267-kthread-add-a-global-worker-thread.patch linux-4.19.118/debian/patches-rt/0267-kthread-add-a-global-worker-thread.patch --- linux-4.19.98/debian/patches-rt/0267-kthread-add-a-global-worker-thread.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0267-kthread-add-a-global-worker-thread.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,180 @@ +From a344e1caa7443342c35e83701b2e1abb3124bb99 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 12 Feb 2019 15:09:38 +0100 +Subject: [PATCH 267/325] kthread: add a global worker thread. +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 0532e87d9d44795221aa921ba7024bde689cc894 ] + +Add kthread_schedule_work() which uses a global kthread for all its +jobs. +Split the cgroup include to avoid recussive includes from interrupt.h. +Fixup everything that fails to build (and did not include all header). + +Signed-off-by: Sebastian Andrzej Siewior +[ + Fixed up include in blk-cgroup.h reported by Juri Lelli + http://lkml.kernel.org/r/20190722083009.GE25636@localhost.localdomain +] +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/block/loop.c | 2 +- + drivers/spi/spi-rockchip.c | 1 + + include/linux/blk-cgroup.h | 2 +- + include/linux/kthread-cgroup.h | 17 +++++++++++++++++ + include/linux/kthread.h | 17 +++++++---------- + init/main.c | 1 + + kernel/kthread.c | 14 ++++++++++++++ + 7 files changed, 42 insertions(+), 12 deletions(-) + create mode 100644 include/linux/kthread-cgroup.h + +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index 9cd231a27328..351ea22ffb56 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -70,7 +70,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c +index 185bbdce62b1..63b10236eb05 100644 +--- a/drivers/spi/spi-rockchip.c ++++ b/drivers/spi/spi-rockchip.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #define DRIVER_NAME "rockchip-spi" + +diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h +index 6d766a19f2bb..0473efda4c65 100644 +--- a/include/linux/blk-cgroup.h ++++ b/include/linux/blk-cgroup.h +@@ -14,7 +14,7 @@ + * Nauman Rafique + */ + +-#include ++#include + #include + #include + #include +diff --git a/include/linux/kthread-cgroup.h b/include/linux/kthread-cgroup.h +new file mode 100644 +index 000000000000..53d34bca9d72 +--- /dev/null ++++ b/include/linux/kthread-cgroup.h +@@ -0,0 +1,17 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef _LINUX_KTHREAD_CGROUP_H ++#define _LINUX_KTHREAD_CGROUP_H ++#include ++#include ++ ++#ifdef CONFIG_BLK_CGROUP ++void kthread_associate_blkcg(struct cgroup_subsys_state *css); ++struct cgroup_subsys_state *kthread_blkcg(void); ++#else ++static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } ++static inline struct cgroup_subsys_state *kthread_blkcg(void) ++{ ++ return NULL; ++} ++#endif ++#endif +diff --git a/include/linux/kthread.h b/include/linux/kthread.h +index ad292898f7f2..7cf56eb54103 100644 +--- a/include/linux/kthread.h ++++ b/include/linux/kthread.h +@@ -4,7 +4,6 @@ + /* Simple interface for creating and stopping kernel threads without mess. */ + #include + #include +-#include + + __printf(4, 5) + struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), +@@ -106,7 +105,7 @@ struct kthread_delayed_work { + }; + + #define KTHREAD_WORKER_INIT(worker) { \ +- .lock = __SPIN_LOCK_UNLOCKED((worker).lock), \ ++ .lock = __RAW_SPIN_LOCK_UNLOCKED((worker).lock), \ + .work_list = LIST_HEAD_INIT((worker).work_list), \ + .delayed_work_list = LIST_HEAD_INIT((worker).delayed_work_list),\ + } +@@ -198,14 +197,12 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work); + + void kthread_destroy_worker(struct kthread_worker *worker); + +-#ifdef CONFIG_BLK_CGROUP +-void kthread_associate_blkcg(struct cgroup_subsys_state *css); +-struct cgroup_subsys_state *kthread_blkcg(void); +-#else +-static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } +-static inline struct cgroup_subsys_state *kthread_blkcg(void) ++extern struct kthread_worker kthread_global_worker; ++void kthread_init_global_worker(void); ++ ++static inline bool kthread_schedule_work(struct kthread_work *work) + { +- return NULL; ++ return kthread_queue_work(&kthread_global_worker, work); + } +-#endif ++ + #endif /* _LINUX_KTHREAD_H */ +diff --git a/init/main.c b/init/main.c +index 6e02188386a7..e514dd93de76 100644 +--- a/init/main.c ++++ b/init/main.c +@@ -1129,6 +1129,7 @@ static noinline void __init kernel_init_freeable(void) + smp_prepare_cpus(setup_max_cpus); + + workqueue_init(); ++ kthread_init_global_worker(); + + init_mm_internals(); + +diff --git a/kernel/kthread.c b/kernel/kthread.c +index 5641b55783a6..9db017761a1f 100644 +--- a/kernel/kthread.c ++++ b/kernel/kthread.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + + static DEFINE_SPINLOCK(kthread_create_lock); +@@ -1180,6 +1181,19 @@ void kthread_destroy_worker(struct kthread_worker *worker) + } + EXPORT_SYMBOL(kthread_destroy_worker); + ++DEFINE_KTHREAD_WORKER(kthread_global_worker); ++EXPORT_SYMBOL(kthread_global_worker); ++ ++__init void kthread_init_global_worker(void) ++{ ++ kthread_global_worker.task = kthread_create(kthread_worker_fn, ++ &kthread_global_worker, ++ "kswork"); ++ if (WARN_ON(IS_ERR(kthread_global_worker.task))) ++ return; ++ wake_up_process(kthread_global_worker.task); ++} ++ + #ifdef CONFIG_BLK_CGROUP + /** + * kthread_associate_blkcg - associate blkcg to current kthread +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0267-sched-completion-Fix-a-lockup-in-wait_for_completion.patch linux-4.19.118/debian/patches-rt/0267-sched-completion-Fix-a-lockup-in-wait_for_completion.patch --- linux-4.19.98/debian/patches-rt/0267-sched-completion-Fix-a-lockup-in-wait_for_completion.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0267-sched-completion-Fix-a-lockup-in-wait_for_completion.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -From d3bae006e096e47f22baad0a9cdf3f496f2bee6a Mon Sep 17 00:00:00 2001 -From: Corey Minyard -Date: Thu, 9 May 2019 14:33:20 -0500 -Subject: [PATCH 267/290] sched/completion: Fix a lockup in - wait_for_completion() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Consider following race: - - T0 T1 T2 - wait_for_completion() - do_wait_for_common() - __prepare_to_swait() - schedule() - complete() - x->done++ (0 -> 1) - raw_spin_lock_irqsave() - swake_up_locked() wait_for_completion() - wake_up_process(T0) - list_del_init() - raw_spin_unlock_irqrestore() - raw_spin_lock_irq(&x->wait.lock) - raw_spin_lock_irq(&x->wait.lock) x->done != UINT_MAX, 1 -> 0 - raw_spin_unlock_irq(&x->wait.lock) - return 1 - while (!x->done && timeout), - continue loop, not enqueued - on &x->wait - -Basically, the problem is that the original wait queues used in -completions did not remove the item from the queue in the wakeup -function, but swake_up_locked() does. - -Fix it by adding the thread to the wait queue inside the do loop. -The design of swait detects if it is already in the list and doesn't -do the list add again. - -Cc: stable-rt@vger.kernel.org -Fixes: a04ff6b4ec4ee7e ("completion: Use simple wait queues") -Signed-off-by: Corey Minyard -Acked-by: Steven Rostedt (VMware) -Signed-off-by: Steven Rostedt (VMware) -[bigeasy: shorten commit message ] -Signed-off-by: Sebastian Andrzej Siewior ---- - kernel/sched/completion.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/kernel/sched/completion.c b/kernel/sched/completion.c -index 755a58084978..49c14137988e 100644 ---- a/kernel/sched/completion.c -+++ b/kernel/sched/completion.c -@@ -72,12 +72,12 @@ do_wait_for_common(struct completion *x, - if (!x->done) { - DECLARE_SWAITQUEUE(wait); - -- __prepare_to_swait(&x->wait, &wait); - do { - if (signal_pending_state(state, current)) { - timeout = -ERESTARTSYS; - break; - } -+ __prepare_to_swait(&x->wait, &wait); - __set_current_state(state); - raw_spin_unlock_irq(&x->wait.lock); - timeout = action(timeout); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0268-arm-imx6-cpuidle-Use-raw_spinlock_t.patch linux-4.19.118/debian/patches-rt/0268-arm-imx6-cpuidle-Use-raw_spinlock_t.patch --- linux-4.19.98/debian/patches-rt/0268-arm-imx6-cpuidle-Use-raw_spinlock_t.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0268-arm-imx6-cpuidle-Use-raw_spinlock_t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,52 @@ +From cbc9d01e75de1a578f850190725900af27d430c6 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 14 May 2019 17:07:44 +0200 +Subject: [PATCH 268/325] arm: imx6: cpuidle: Use raw_spinlock_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 40d0332ec8312e9c090f0a5414d9c90e12b13611 ] + +The idle call back is invoked with disabled interrupts and requires +raw_spinlock_t locks to work. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + arch/arm/mach-imx/cpuidle-imx6q.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/arch/arm/mach-imx/cpuidle-imx6q.c b/arch/arm/mach-imx/cpuidle-imx6q.c +index 326e870d7123..d9ac80aa1eb0 100644 +--- a/arch/arm/mach-imx/cpuidle-imx6q.c ++++ b/arch/arm/mach-imx/cpuidle-imx6q.c +@@ -17,22 +17,22 @@ + #include "hardware.h" + + static int num_idle_cpus = 0; +-static DEFINE_SPINLOCK(cpuidle_lock); ++static DEFINE_RAW_SPINLOCK(cpuidle_lock); + + static int imx6q_enter_wait(struct cpuidle_device *dev, + struct cpuidle_driver *drv, int index) + { +- spin_lock(&cpuidle_lock); ++ raw_spin_lock(&cpuidle_lock); + if (++num_idle_cpus == num_online_cpus()) + imx6_set_lpm(WAIT_UNCLOCKED); +- spin_unlock(&cpuidle_lock); ++ raw_spin_unlock(&cpuidle_lock); + + cpu_do_idle(); + +- spin_lock(&cpuidle_lock); ++ raw_spin_lock(&cpuidle_lock); + if (num_idle_cpus-- == num_online_cpus()) + imx6_set_lpm(WAIT_CLOCKED); +- spin_unlock(&cpuidle_lock); ++ raw_spin_unlock(&cpuidle_lock); + + return index; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0268-kthread-add-a-global-worker-thread.patch linux-4.19.118/debian/patches-rt/0268-kthread-add-a-global-worker-thread.patch --- linux-4.19.98/debian/patches-rt/0268-kthread-add-a-global-worker-thread.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0268-kthread-add-a-global-worker-thread.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,180 +0,0 @@ -From 9ec5aac95c498d3cd970b50a838ee738fe3861fc Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 12 Feb 2019 15:09:38 +0100 -Subject: [PATCH 268/290] kthread: add a global worker thread. -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 0532e87d9d44795221aa921ba7024bde689cc894 ] - -Add kthread_schedule_work() which uses a global kthread for all its -jobs. -Split the cgroup include to avoid recussive includes from interrupt.h. -Fixup everything that fails to build (and did not include all header). - -Signed-off-by: Sebastian Andrzej Siewior -[ - Fixed up include in blk-cgroup.h reported by Juri Lelli - http://lkml.kernel.org/r/20190722083009.GE25636@localhost.localdomain -] -Signed-off-by: Steven Rostedt (VMware) ---- - drivers/block/loop.c | 2 +- - drivers/spi/spi-rockchip.c | 1 + - include/linux/blk-cgroup.h | 2 +- - include/linux/kthread-cgroup.h | 17 +++++++++++++++++ - include/linux/kthread.h | 17 +++++++---------- - init/main.c | 1 + - kernel/kthread.c | 14 ++++++++++++++ - 7 files changed, 42 insertions(+), 12 deletions(-) - create mode 100644 include/linux/kthread-cgroup.h - -diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index 9cd231a27328..351ea22ffb56 100644 ---- a/drivers/block/loop.c -+++ b/drivers/block/loop.c -@@ -70,7 +70,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include -diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c -index 185bbdce62b1..63b10236eb05 100644 ---- a/drivers/spi/spi-rockchip.c -+++ b/drivers/spi/spi-rockchip.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - #define DRIVER_NAME "rockchip-spi" - -diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h -index 6d766a19f2bb..0473efda4c65 100644 ---- a/include/linux/blk-cgroup.h -+++ b/include/linux/blk-cgroup.h -@@ -14,7 +14,7 @@ - * Nauman Rafique - */ - --#include -+#include - #include - #include - #include -diff --git a/include/linux/kthread-cgroup.h b/include/linux/kthread-cgroup.h -new file mode 100644 -index 000000000000..53d34bca9d72 ---- /dev/null -+++ b/include/linux/kthread-cgroup.h -@@ -0,0 +1,17 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+#ifndef _LINUX_KTHREAD_CGROUP_H -+#define _LINUX_KTHREAD_CGROUP_H -+#include -+#include -+ -+#ifdef CONFIG_BLK_CGROUP -+void kthread_associate_blkcg(struct cgroup_subsys_state *css); -+struct cgroup_subsys_state *kthread_blkcg(void); -+#else -+static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } -+static inline struct cgroup_subsys_state *kthread_blkcg(void) -+{ -+ return NULL; -+} -+#endif -+#endif -diff --git a/include/linux/kthread.h b/include/linux/kthread.h -index ad292898f7f2..7cf56eb54103 100644 ---- a/include/linux/kthread.h -+++ b/include/linux/kthread.h -@@ -4,7 +4,6 @@ - /* Simple interface for creating and stopping kernel threads without mess. */ - #include - #include --#include - - __printf(4, 5) - struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), -@@ -106,7 +105,7 @@ struct kthread_delayed_work { - }; - - #define KTHREAD_WORKER_INIT(worker) { \ -- .lock = __SPIN_LOCK_UNLOCKED((worker).lock), \ -+ .lock = __RAW_SPIN_LOCK_UNLOCKED((worker).lock), \ - .work_list = LIST_HEAD_INIT((worker).work_list), \ - .delayed_work_list = LIST_HEAD_INIT((worker).delayed_work_list),\ - } -@@ -198,14 +197,12 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work); - - void kthread_destroy_worker(struct kthread_worker *worker); - --#ifdef CONFIG_BLK_CGROUP --void kthread_associate_blkcg(struct cgroup_subsys_state *css); --struct cgroup_subsys_state *kthread_blkcg(void); --#else --static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } --static inline struct cgroup_subsys_state *kthread_blkcg(void) -+extern struct kthread_worker kthread_global_worker; -+void kthread_init_global_worker(void); -+ -+static inline bool kthread_schedule_work(struct kthread_work *work) - { -- return NULL; -+ return kthread_queue_work(&kthread_global_worker, work); - } --#endif -+ - #endif /* _LINUX_KTHREAD_H */ -diff --git a/init/main.c b/init/main.c -index 6e02188386a7..e514dd93de76 100644 ---- a/init/main.c -+++ b/init/main.c -@@ -1129,6 +1129,7 @@ static noinline void __init kernel_init_freeable(void) - smp_prepare_cpus(setup_max_cpus); - - workqueue_init(); -+ kthread_init_global_worker(); - - init_mm_internals(); - -diff --git a/kernel/kthread.c b/kernel/kthread.c -index 5641b55783a6..9db017761a1f 100644 ---- a/kernel/kthread.c -+++ b/kernel/kthread.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - - static DEFINE_SPINLOCK(kthread_create_lock); -@@ -1180,6 +1181,19 @@ void kthread_destroy_worker(struct kthread_worker *worker) - } - EXPORT_SYMBOL(kthread_destroy_worker); - -+DEFINE_KTHREAD_WORKER(kthread_global_worker); -+EXPORT_SYMBOL(kthread_global_worker); -+ -+__init void kthread_init_global_worker(void) -+{ -+ kthread_global_worker.task = kthread_create(kthread_worker_fn, -+ &kthread_global_worker, -+ "kswork"); -+ if (WARN_ON(IS_ERR(kthread_global_worker.task))) -+ return; -+ wake_up_process(kthread_global_worker.task); -+} -+ - #ifdef CONFIG_BLK_CGROUP - /** - * kthread_associate_blkcg - associate blkcg to current kthread --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0269-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch linux-4.19.118/debian/patches-rt/0269-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch --- linux-4.19.98/debian/patches-rt/0269-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0269-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -From 0fcd7c5cee291d12eb90409cad4636cc17be0973 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 21 Aug 2013 17:48:46 +0200 -Subject: [PATCH 269/290] genirq: Do not invoke the affinity callback via a - workqueue on RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 2122adbe011cdc0eb62ad62494e181005b23c76a ] - -Joe Korty reported, that __irq_set_affinity_locked() schedules a -workqueue while holding a rawlock which results in a might_sleep() -warning. -This patch uses swork_queue() instead. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - include/linux/interrupt.h | 5 ++--- - kernel/irq/manage.c | 19 ++++--------------- - 2 files changed, 6 insertions(+), 18 deletions(-) - -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index 72333899f043..a9321f6429f2 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -13,7 +13,7 @@ - #include - #include - #include --#include -+#include - - #include - #include -@@ -228,7 +228,6 @@ extern void resume_device_irqs(void); - * struct irq_affinity_notify - context for notification of IRQ affinity changes - * @irq: Interrupt to which notification applies - * @kref: Reference count, for internal use -- * @swork: Swork item, for internal use - * @work: Work item, for internal use - * @notify: Function to be called on change. This will be - * called in process context. -@@ -241,7 +240,7 @@ struct irq_affinity_notify { - unsigned int irq; - struct kref kref; - #ifdef CONFIG_PREEMPT_RT_BASE -- struct swork_event swork; -+ struct kthread_work work; - #else - struct work_struct work; - #endif -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index ce86341a9e19..d5539e04e00a 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -287,7 +287,7 @@ int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, - kref_get(&desc->affinity_notify->kref); - - #ifdef CONFIG_PREEMPT_RT_BASE -- swork_queue(&desc->affinity_notify->swork); -+ kthread_schedule_work(&desc->affinity_notify->work); - #else - schedule_work(&desc->affinity_notify->work); - #endif -@@ -352,21 +352,11 @@ static void _irq_affinity_notify(struct irq_affinity_notify *notify) - } - - #ifdef CONFIG_PREEMPT_RT_BASE --static void init_helper_thread(void) --{ -- static int init_sworker_once; -- -- if (init_sworker_once) -- return; -- if (WARN_ON(swork_get())) -- return; -- init_sworker_once = 1; --} - --static void irq_affinity_notify(struct swork_event *swork) -+static void irq_affinity_notify(struct kthread_work *work) - { - struct irq_affinity_notify *notify = -- container_of(swork, struct irq_affinity_notify, swork); -+ container_of(work, struct irq_affinity_notify, work); - _irq_affinity_notify(notify); - } - -@@ -409,8 +399,7 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) - notify->irq = irq; - kref_init(¬ify->kref); - #ifdef CONFIG_PREEMPT_RT_BASE -- INIT_SWORK(¬ify->swork, irq_affinity_notify); -- init_helper_thread(); -+ kthread_init_work(¬ify->work, irq_affinity_notify); - #else - INIT_WORK(¬ify->work, irq_affinity_notify); - #endif --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0269-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch linux-4.19.118/debian/patches-rt/0269-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch --- linux-4.19.98/debian/patches-rt/0269-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0269-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,36 @@ +From 29483b5cb7e491f38927246ae4b2838bc300f5e8 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 24 Jun 2019 18:29:13 +0200 +Subject: [PATCH 269/325] rcu: Don't allow to change rcu_normal_after_boot on + RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit c6c058c10577815a2491ce661876cff00a4c3b15 ] + +On RT rcu_normal_after_boot is enabled by default. +Don't allow to disable it on RT because the "expedited rcu" would +introduce latency spikes. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/rcu/update.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c +index 16d8dba23329..ed75addd3ccd 100644 +--- a/kernel/rcu/update.c ++++ b/kernel/rcu/update.c +@@ -69,7 +69,9 @@ module_param(rcu_expedited, int, 0); + extern int rcu_normal; /* from sysctl */ + module_param(rcu_normal, int, 0); + static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); ++#ifndef CONFIG_PREEMPT_RT_FULL + module_param(rcu_normal_after_boot, int, 0); ++#endif + #endif /* #ifndef CONFIG_TINY_RCU */ + + #ifdef CONFIG_DEBUG_LOCK_ALLOC +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0270-genirq-Handle-missing-work_struct-in-irq_set_affinit.patch linux-4.19.118/debian/patches-rt/0270-genirq-Handle-missing-work_struct-in-irq_set_affinit.patch --- linux-4.19.98/debian/patches-rt/0270-genirq-Handle-missing-work_struct-in-irq_set_affinit.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0270-genirq-Handle-missing-work_struct-in-irq_set_affinit.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -From 5f103966da617ccbc58a5db958144f55725dd823 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 28 May 2019 10:42:15 +0200 -Subject: [PATCH 270/290] genirq: Handle missing work_struct in - irq_set_affinity_notifier() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit bbc4d2a7d6ff54ba923640d9a42c7bef7185fe98 ] - -The backported stable commit - 59c39840f5abf ("genirq: Prevent use-after-free and work list corruption") - -added cancel_work_sync() on a work_struct element which is not available -in RT. - -Replace cancel_work_sync() with kthread_cancel_work_sync() on RT. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/irq/manage.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index d5539e04e00a..290cd520dba1 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -411,8 +411,9 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) - raw_spin_unlock_irqrestore(&desc->lock, flags); - - if (old_notify) { --#ifndef CONFIG_PREEMPT_RT_BASE -- /* Need to address this for PREEMPT_RT */ -+#ifdef CONFIG_PREEMPT_RT_BASE -+ kthread_cancel_work_sync(¬ify->work); -+#else - cancel_work_sync(&old_notify->work); - #endif - kref_put(&old_notify->kref, old_notify->release); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0270-pci-switchtec-fix-stream_open.cocci-warnings.patch linux-4.19.118/debian/patches-rt/0270-pci-switchtec-fix-stream_open.cocci-warnings.patch --- linux-4.19.98/debian/patches-rt/0270-pci-switchtec-fix-stream_open.cocci-warnings.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0270-pci-switchtec-fix-stream_open.cocci-warnings.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,40 @@ +From 6566c0af08d10f160b57f889133e227a9334f9d4 Mon Sep 17 00:00:00 2001 +From: kbuild test robot +Date: Sat, 13 Apr 2019 11:22:51 +0800 +Subject: [PATCH 270/325] pci/switchtec: fix stream_open.cocci warnings +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 9462c69e29307adc95c289f50839d5d683973891 ] + +drivers/pci/switch/switchtec.c:395:1-17: ERROR: switchtec_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix. + +Generated by: scripts/coccinelle/api/stream_open.cocci + +Cc: Kirill Smelkov +Cc: Julia Lawall +Fixes: 8a29a3bae2a2 ("pci/switchtec: Don't use completion's wait queue") +Cc: stable-rt@vger.kernel.org # where it applies to +Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1904131849350.2536@hadrien +Signed-off-by: kbuild test robot +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/pci/switch/switchtec.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c +index a8df847bedee..25d1f96cddc1 100644 +--- a/drivers/pci/switch/switchtec.c ++++ b/drivers/pci/switch/switchtec.c +@@ -356,7 +356,7 @@ static int switchtec_dev_open(struct inode *inode, struct file *filp) + return PTR_ERR(stuser); + + filp->private_data = stuser; +- nonseekable_open(inode, filp); ++ stream_open(inode, filp); + + dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0271-arm-imx6-cpuidle-Use-raw_spinlock_t.patch linux-4.19.118/debian/patches-rt/0271-arm-imx6-cpuidle-Use-raw_spinlock_t.patch --- linux-4.19.98/debian/patches-rt/0271-arm-imx6-cpuidle-Use-raw_spinlock_t.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0271-arm-imx6-cpuidle-Use-raw_spinlock_t.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -From 499b81170e694652eb759044a65b1d2de8a02540 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 14 May 2019 17:07:44 +0200 -Subject: [PATCH 271/290] arm: imx6: cpuidle: Use raw_spinlock_t -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 40d0332ec8312e9c090f0a5414d9c90e12b13611 ] - -The idle call back is invoked with disabled interrupts and requires -raw_spinlock_t locks to work. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - arch/arm/mach-imx/cpuidle-imx6q.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/arch/arm/mach-imx/cpuidle-imx6q.c b/arch/arm/mach-imx/cpuidle-imx6q.c -index 326e870d7123..d9ac80aa1eb0 100644 ---- a/arch/arm/mach-imx/cpuidle-imx6q.c -+++ b/arch/arm/mach-imx/cpuidle-imx6q.c -@@ -17,22 +17,22 @@ - #include "hardware.h" - - static int num_idle_cpus = 0; --static DEFINE_SPINLOCK(cpuidle_lock); -+static DEFINE_RAW_SPINLOCK(cpuidle_lock); - - static int imx6q_enter_wait(struct cpuidle_device *dev, - struct cpuidle_driver *drv, int index) - { -- spin_lock(&cpuidle_lock); -+ raw_spin_lock(&cpuidle_lock); - if (++num_idle_cpus == num_online_cpus()) - imx6_set_lpm(WAIT_UNCLOCKED); -- spin_unlock(&cpuidle_lock); -+ raw_spin_unlock(&cpuidle_lock); - - cpu_do_idle(); - -- spin_lock(&cpuidle_lock); -+ raw_spin_lock(&cpuidle_lock); - if (num_idle_cpus-- == num_online_cpus()) - imx6_set_lpm(WAIT_CLOCKED); -- spin_unlock(&cpuidle_lock); -+ raw_spin_unlock(&cpuidle_lock); - - return index; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0271-sched-core-Drop-a-preempt_disable_rt-statement.patch linux-4.19.118/debian/patches-rt/0271-sched-core-Drop-a-preempt_disable_rt-statement.patch --- linux-4.19.98/debian/patches-rt/0271-sched-core-Drop-a-preempt_disable_rt-statement.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0271-sched-core-Drop-a-preempt_disable_rt-statement.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,50 @@ +From f0b092a791f59beb56cf987be5fbe18bb68df764 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 24 Jun 2019 19:33:16 +0200 +Subject: [PATCH 271/325] sched/core: Drop a preempt_disable_rt() statement +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 761126efdcbe3fa3e99c9079fa0ad6eca2f251f2 ] + +The caller holds a lock which already disables preemption. +Drop the preempt_disable_rt() statement in get_nohz_timer_target(). + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index cfde725e1017..678c2c4de4f5 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -558,14 +558,11 @@ void resched_cpu(int cpu) + */ + int get_nohz_timer_target(void) + { +- int i, cpu; ++ int i, cpu = smp_processor_id(); + struct sched_domain *sd; + +- preempt_disable_rt(); +- cpu = smp_processor_id(); +- + if (!idle_cpu(cpu) && housekeeping_cpu(cpu, HK_FLAG_TIMER)) +- goto preempt_en_rt; ++ return cpu; + + rcu_read_lock(); + for_each_domain(cpu, sd) { +@@ -584,8 +581,6 @@ int get_nohz_timer_target(void) + cpu = housekeeping_any_cpu(HK_FLAG_TIMER); + unlock: + rcu_read_unlock(); +-preempt_en_rt: +- preempt_enable_rt(); + return cpu; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0272-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch linux-4.19.118/debian/patches-rt/0272-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch --- linux-4.19.98/debian/patches-rt/0272-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0272-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -From 8ffd7db75f55aa4a603b0a6a83eb05fe77ca543c Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 24 Jun 2019 18:29:13 +0200 -Subject: [PATCH 272/290] rcu: Don't allow to change rcu_normal_after_boot on - RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit c6c058c10577815a2491ce661876cff00a4c3b15 ] - -On RT rcu_normal_after_boot is enabled by default. -Don't allow to disable it on RT because the "expedited rcu" would -introduce latency spikes. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/rcu/update.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c -index 16d8dba23329..ed75addd3ccd 100644 ---- a/kernel/rcu/update.c -+++ b/kernel/rcu/update.c -@@ -69,7 +69,9 @@ module_param(rcu_expedited, int, 0); - extern int rcu_normal; /* from sysctl */ - module_param(rcu_normal, int, 0); - static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); -+#ifndef CONFIG_PREEMPT_RT_FULL - module_param(rcu_normal_after_boot, int, 0); -+#endif - #endif /* #ifndef CONFIG_TINY_RCU */ - - #ifdef CONFIG_DEBUG_LOCK_ALLOC --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0272-timers-Redo-the-notification-of-canceling-timers-on-.patch linux-4.19.118/debian/patches-rt/0272-timers-Redo-the-notification-of-canceling-timers-on-.patch --- linux-4.19.98/debian/patches-rt/0272-timers-Redo-the-notification-of-canceling-timers-on-.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0272-timers-Redo-the-notification-of-canceling-timers-on-.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,650 @@ +From 97fc8e3efcfeae8f91109c03a560a35a2f560985 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 24 Jun 2019 19:39:06 +0200 +Subject: [PATCH 272/325] timers: Redo the notification of canceling timers on + -RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit c71273154c2ad12e13333aada340ff30e826a11b ] + +Rework of the hrtimer, timer and posix-timer cancelation interface +on -RT. Instead of the swait/schedule interface we now have locks +which are taken while timer is active. During the cancellation of an +active timer the lock is acquired. The lock will then either +PI-boost the timer or block and wait until the timer completed. +The new code looks simpler and does not trigger a warning from +rcu_note_context_switch() anymore like reported by Grygorii Strashko +and Daniel Wagner. +The patches were contributed by Anna-Maria Gleixner. + +This is an all in one commit of the following patches: +| [PATCH] timers: Introduce expiry spin lock +| [PATCH] timers: Drop expiry lock after each timer invocation +| [PATCH] hrtimer: Introduce expiry spin lock +| [PATCH] posix-timers: move rcu out of union +| [PATCH] posix-timers: Add expiry lock + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + fs/timerfd.c | 5 +- + include/linux/hrtimer.h | 17 ++---- + include/linux/posix-timers.h | 1 + + kernel/time/alarmtimer.c | 2 +- + kernel/time/hrtimer.c | 36 ++++--------- + kernel/time/itimer.c | 2 +- + kernel/time/posix-cpu-timers.c | 23 ++++++++ + kernel/time/posix-timers.c | 69 ++++++++++-------------- + kernel/time/posix-timers.h | 2 + + kernel/time/timer.c | 96 ++++++++++++++++------------------ + 10 files changed, 118 insertions(+), 135 deletions(-) + +diff --git a/fs/timerfd.c b/fs/timerfd.c +index 82d0f52414a6..f845093466be 100644 +--- a/fs/timerfd.c ++++ b/fs/timerfd.c +@@ -471,10 +471,11 @@ static int do_timerfd_settime(int ufd, int flags, + break; + } + spin_unlock_irq(&ctx->wqh.lock); ++ + if (isalarm(ctx)) +- hrtimer_wait_for_timer(&ctx->t.alarm.timer); ++ hrtimer_grab_expiry_lock(&ctx->t.alarm.timer); + else +- hrtimer_wait_for_timer(&ctx->t.tmr); ++ hrtimer_grab_expiry_lock(&ctx->t.tmr); + } + + /* +diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h +index 082147c07831..aee31b1f0cc3 100644 +--- a/include/linux/hrtimer.h ++++ b/include/linux/hrtimer.h +@@ -22,7 +22,6 @@ + #include + #include + #include +-#include + + struct hrtimer_clock_base; + struct hrtimer_cpu_base; +@@ -193,6 +192,8 @@ enum hrtimer_base_type { + * @nr_retries: Total number of hrtimer interrupt retries + * @nr_hangs: Total number of hrtimer interrupt hangs + * @max_hang_time: Maximum time spent in hrtimer_interrupt ++ * @softirq_expiry_lock: Lock which is taken while softirq based hrtimer are ++ * expired + * @expires_next: absolute time of the next event, is required for remote + * hrtimer enqueue; it is the total first expiry time (hard + * and soft hrtimer are taken into account) +@@ -220,12 +221,10 @@ struct hrtimer_cpu_base { + unsigned short nr_hangs; + unsigned int max_hang_time; + #endif ++ spinlock_t softirq_expiry_lock; + ktime_t expires_next; + struct hrtimer *next_timer; + ktime_t softirq_expires_next; +-#ifdef CONFIG_PREEMPT_RT_BASE +- wait_queue_head_t wait; +-#endif + struct hrtimer *softirq_next_timer; + struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; + } ____cacheline_aligned; +@@ -426,6 +425,7 @@ static inline void hrtimer_start(struct hrtimer *timer, ktime_t tim, + + extern int hrtimer_cancel(struct hrtimer *timer); + extern int hrtimer_try_to_cancel(struct hrtimer *timer); ++extern void hrtimer_grab_expiry_lock(const struct hrtimer *timer); + + static inline void hrtimer_start_expires(struct hrtimer *timer, + enum hrtimer_mode mode) +@@ -443,13 +443,6 @@ static inline void hrtimer_restart(struct hrtimer *timer) + hrtimer_start_expires(timer, HRTIMER_MODE_ABS); + } + +-/* Softirq preemption could deadlock timer removal */ +-#ifdef CONFIG_PREEMPT_RT_BASE +- extern void hrtimer_wait_for_timer(const struct hrtimer *timer); +-#else +-# define hrtimer_wait_for_timer(timer) do { cpu_relax(); } while (0) +-#endif +- + /* Query timers: */ + extern ktime_t __hrtimer_get_remaining(const struct hrtimer *timer, bool adjust); + +@@ -481,7 +474,7 @@ static inline bool hrtimer_is_queued(struct hrtimer *timer) + * Helper function to check, whether the timer is running the callback + * function + */ +-static inline int hrtimer_callback_running(const struct hrtimer *timer) ++static inline int hrtimer_callback_running(struct hrtimer *timer) + { + return timer->base->running == timer; + } +diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h +index 0571b498db73..3e6c91bdf2ef 100644 +--- a/include/linux/posix-timers.h ++++ b/include/linux/posix-timers.h +@@ -15,6 +15,7 @@ struct cpu_timer_list { + u64 expires, incr; + struct task_struct *task; + int firing; ++ int firing_cpu; + }; + + /* +diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c +index a465564367ec..dcf0204264f1 100644 +--- a/kernel/time/alarmtimer.c ++++ b/kernel/time/alarmtimer.c +@@ -438,7 +438,7 @@ int alarm_cancel(struct alarm *alarm) + int ret = alarm_try_to_cancel(alarm); + if (ret >= 0) + return ret; +- hrtimer_wait_for_timer(&alarm->timer); ++ hrtimer_grab_expiry_lock(&alarm->timer); + } + } + EXPORT_SYMBOL_GPL(alarm_cancel); +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index f16cbc98c47a..ed5d8d51ca91 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -963,33 +963,16 @@ u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval) + } + EXPORT_SYMBOL_GPL(hrtimer_forward); + +-#ifdef CONFIG_PREEMPT_RT_BASE +-# define wake_up_timer_waiters(b) wake_up(&(b)->wait) +- +-/** +- * hrtimer_wait_for_timer - Wait for a running timer +- * +- * @timer: timer to wait for +- * +- * The function waits in case the timers callback function is +- * currently executed on the waitqueue of the timer base. The +- * waitqueue is woken up after the timer callback function has +- * finished execution. +- */ +-void hrtimer_wait_for_timer(const struct hrtimer *timer) ++void hrtimer_grab_expiry_lock(const struct hrtimer *timer) + { + struct hrtimer_clock_base *base = timer->base; + +- if (base && base->cpu_base && +- base->index >= HRTIMER_BASE_MONOTONIC_SOFT) +- wait_event(base->cpu_base->wait, +- !(hrtimer_callback_running(timer))); ++ if (base && base->cpu_base) { ++ spin_lock(&base->cpu_base->softirq_expiry_lock); ++ spin_unlock(&base->cpu_base->softirq_expiry_lock); ++ } + } + +-#else +-# define wake_up_timer_waiters(b) do { } while (0) +-#endif +- + /* + * enqueue_hrtimer - internal function to (re)start a timer + * +@@ -1227,7 +1210,7 @@ int hrtimer_cancel(struct hrtimer *timer) + + if (ret >= 0) + return ret; +- hrtimer_wait_for_timer(timer); ++ hrtimer_grab_expiry_lock(timer); + } + } + EXPORT_SYMBOL_GPL(hrtimer_cancel); +@@ -1531,6 +1514,7 @@ static __latent_entropy void hrtimer_run_softirq(struct softirq_action *h) + unsigned long flags; + ktime_t now; + ++ spin_lock(&cpu_base->softirq_expiry_lock); + raw_spin_lock_irqsave(&cpu_base->lock, flags); + + now = hrtimer_update_base(cpu_base); +@@ -1540,7 +1524,7 @@ static __latent_entropy void hrtimer_run_softirq(struct softirq_action *h) + hrtimer_update_softirq_timer(cpu_base, true); + + raw_spin_unlock_irqrestore(&cpu_base->lock, flags); +- wake_up_timer_waiters(cpu_base); ++ spin_unlock(&cpu_base->softirq_expiry_lock); + } + + #ifdef CONFIG_HIGH_RES_TIMERS +@@ -1950,9 +1934,7 @@ int hrtimers_prepare_cpu(unsigned int cpu) + cpu_base->softirq_next_timer = NULL; + cpu_base->expires_next = KTIME_MAX; + cpu_base->softirq_expires_next = KTIME_MAX; +-#ifdef CONFIG_PREEMPT_RT_BASE +- init_waitqueue_head(&cpu_base->wait); +-#endif ++ spin_lock_init(&cpu_base->softirq_expiry_lock); + return 0; + } + +diff --git a/kernel/time/itimer.c b/kernel/time/itimer.c +index 55b0e58368bf..a5ff222df4c7 100644 +--- a/kernel/time/itimer.c ++++ b/kernel/time/itimer.c +@@ -215,7 +215,7 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) + /* We are sharing ->siglock with it_real_fn() */ + if (hrtimer_try_to_cancel(timer) < 0) { + spin_unlock_irq(&tsk->sighand->siglock); +- hrtimer_wait_for_timer(&tsk->signal->real_timer); ++ hrtimer_grab_expiry_lock(timer); + goto again; + } + expires = timeval_to_ktime(value->it_value); +diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c +index 8d95e8de98b2..765e700962ab 100644 +--- a/kernel/time/posix-cpu-timers.c ++++ b/kernel/time/posix-cpu-timers.c +@@ -792,6 +792,7 @@ check_timers_list(struct list_head *timers, + return t->expires; + + t->firing = 1; ++ t->firing_cpu = smp_processor_id(); + list_move_tail(&t->entry, firing); + } + +@@ -1138,6 +1139,20 @@ static inline int fastpath_timer_check(struct task_struct *tsk) + return 0; + } + ++static DEFINE_PER_CPU(spinlock_t, cpu_timer_expiry_lock) = __SPIN_LOCK_UNLOCKED(cpu_timer_expiry_lock); ++ ++void cpu_timers_grab_expiry_lock(struct k_itimer *timer) ++{ ++ int cpu = timer->it.cpu.firing_cpu; ++ ++ if (cpu >= 0) { ++ spinlock_t *expiry_lock = per_cpu_ptr(&cpu_timer_expiry_lock, cpu); ++ ++ spin_lock_irq(expiry_lock); ++ spin_unlock_irq(expiry_lock); ++ } ++} ++ + /* + * This is called from the timer interrupt handler. The irq handler has + * already updated our counts. We need to check if any timers fire now. +@@ -1148,6 +1163,7 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) + LIST_HEAD(firing); + struct k_itimer *timer, *next; + unsigned long flags; ++ spinlock_t *expiry_lock; + + /* + * The fast path checks that there are no expired thread or thread +@@ -1156,6 +1172,9 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) + if (!fastpath_timer_check(tsk)) + return; + ++ expiry_lock = this_cpu_ptr(&cpu_timer_expiry_lock); ++ spin_lock(expiry_lock); ++ + if (!lock_task_sighand(tsk, &flags)) + return; + /* +@@ -1190,6 +1209,7 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) + list_del_init(&timer->it.cpu.entry); + cpu_firing = timer->it.cpu.firing; + timer->it.cpu.firing = 0; ++ timer->it.cpu.firing_cpu = -1; + /* + * The firing flag is -1 if we collided with a reset + * of the timer, which already reported this +@@ -1199,6 +1219,7 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) + cpu_timer_fire(timer); + spin_unlock(&timer->it_lock); + } ++ spin_unlock(expiry_lock); + } + + #ifdef CONFIG_PREEMPT_RT_BASE +@@ -1466,6 +1487,8 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags, + spin_unlock_irq(&timer.it_lock); + + while (error == TIMER_RETRY) { ++ ++ cpu_timers_grab_expiry_lock(&timer); + /* + * We need to handle case when timer was or is in the + * middle of firing. In other cases we already freed +diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c +index a5ec421e3437..c7e97d421590 100644 +--- a/kernel/time/posix-timers.c ++++ b/kernel/time/posix-timers.c +@@ -821,25 +821,20 @@ static void common_hrtimer_arm(struct k_itimer *timr, ktime_t expires, + hrtimer_start_expires(timer, HRTIMER_MODE_ABS); + } + +-/* +- * Protected by RCU! +- */ +-static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timr) ++static int common_hrtimer_try_to_cancel(struct k_itimer *timr) + { +-#ifdef CONFIG_PREEMPT_RT_FULL +- if (kc->timer_arm == common_hrtimer_arm) +- hrtimer_wait_for_timer(&timr->it.real.timer); +- else if (kc == &alarm_clock) +- hrtimer_wait_for_timer(&timr->it.alarm.alarmtimer.timer); +- else +- /* FIXME: Whacky hack for posix-cpu-timers */ +- schedule_timeout(1); +-#endif ++ return hrtimer_try_to_cancel(&timr->it.real.timer); + } + +-static int common_hrtimer_try_to_cancel(struct k_itimer *timr) ++static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timer) + { +- return hrtimer_try_to_cancel(&timr->it.real.timer); ++ if (kc->timer_arm == common_hrtimer_arm) ++ hrtimer_grab_expiry_lock(&timer->it.real.timer); ++ else if (kc == &alarm_clock) ++ hrtimer_grab_expiry_lock(&timer->it.alarm.alarmtimer.timer); ++ else ++ /* posix-cpu-timers */ ++ cpu_timers_grab_expiry_lock(timer); + } + + /* Set a POSIX.1b interval timer. */ +@@ -901,21 +896,21 @@ static int do_timer_settime(timer_t timer_id, int flags, + if (!timr) + return -EINVAL; + +- rcu_read_lock(); + kc = timr->kclock; + if (WARN_ON_ONCE(!kc || !kc->timer_set)) + error = -EINVAL; + else + error = kc->timer_set(timr, flags, new_spec64, old_spec64); + +- unlock_timer(timr, flag); + if (error == TIMER_RETRY) { ++ rcu_read_lock(); ++ unlock_timer(timr, flag); + timer_wait_for_callback(kc, timr); +- old_spec64 = NULL; // We already got the old time... + rcu_read_unlock(); ++ old_spec64 = NULL; // We already got the old time... + goto retry; + } +- rcu_read_unlock(); ++ unlock_timer(timr, flag); + + return error; + } +@@ -977,13 +972,21 @@ int common_timer_del(struct k_itimer *timer) + return 0; + } + +-static inline int timer_delete_hook(struct k_itimer *timer) ++static int timer_delete_hook(struct k_itimer *timer) + { + const struct k_clock *kc = timer->kclock; ++ int ret; + + if (WARN_ON_ONCE(!kc || !kc->timer_del)) + return -EINVAL; +- return kc->timer_del(timer); ++ ret = kc->timer_del(timer); ++ if (ret == TIMER_RETRY) { ++ rcu_read_lock(); ++ spin_unlock_irq(&timer->it_lock); ++ timer_wait_for_callback(kc, timer); ++ rcu_read_unlock(); ++ } ++ return ret; + } + + /* Delete a POSIX.1b interval timer. */ +@@ -997,15 +1000,8 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id) + if (!timer) + return -EINVAL; + +- rcu_read_lock(); +- if (timer_delete_hook(timer) == TIMER_RETRY) { +- unlock_timer(timer, flags); +- timer_wait_for_callback(clockid_to_kclock(timer->it_clock), +- timer); +- rcu_read_unlock(); ++ if (timer_delete_hook(timer) == TIMER_RETRY) + goto retry_delete; +- } +- rcu_read_unlock(); + + spin_lock(¤t->sighand->siglock); + list_del(&timer->list); +@@ -1031,20 +1027,9 @@ static void itimer_delete(struct k_itimer *timer) + retry_delete: + spin_lock_irqsave(&timer->it_lock, flags); + +- /* On RT we can race with a deletion */ +- if (!timer->it_signal) { +- unlock_timer(timer, flags); +- return; +- } +- +- if (timer_delete_hook(timer) == TIMER_RETRY) { +- rcu_read_lock(); +- unlock_timer(timer, flags); +- timer_wait_for_callback(clockid_to_kclock(timer->it_clock), +- timer); +- rcu_read_unlock(); ++ if (timer_delete_hook(timer) == TIMER_RETRY) + goto retry_delete; +- } ++ + list_del(&timer->list); + /* + * This keeps any tasks waiting on the spin lock from thinking +diff --git a/kernel/time/posix-timers.h b/kernel/time/posix-timers.h +index ddb21145211a..725bd230a8db 100644 +--- a/kernel/time/posix-timers.h ++++ b/kernel/time/posix-timers.h +@@ -32,6 +32,8 @@ extern const struct k_clock clock_process; + extern const struct k_clock clock_thread; + extern const struct k_clock alarm_clock; + ++extern void cpu_timers_grab_expiry_lock(struct k_itimer *timer); ++ + int posix_timer_event(struct k_itimer *timr, int si_private); + + void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting); +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index 2fcd56aa6092..1c67aab34ff5 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -44,7 +44,6 @@ + #include + #include + #include +-#include + + #include + #include +@@ -198,9 +197,7 @@ EXPORT_SYMBOL(jiffies_64); + struct timer_base { + raw_spinlock_t lock; + struct timer_list *running_timer; +-#ifdef CONFIG_PREEMPT_RT_FULL +- struct swait_queue_head wait_for_running_timer; +-#endif ++ spinlock_t expiry_lock; + unsigned long clk; + unsigned long next_expiry; + unsigned int cpu; +@@ -1189,33 +1186,6 @@ void add_timer_on(struct timer_list *timer, int cpu) + } + EXPORT_SYMBOL_GPL(add_timer_on); + +-#ifdef CONFIG_PREEMPT_RT_FULL +-/* +- * Wait for a running timer +- */ +-static void wait_for_running_timer(struct timer_list *timer) +-{ +- struct timer_base *base; +- u32 tf = timer->flags; +- +- if (tf & TIMER_MIGRATING) +- return; +- +- base = get_timer_base(tf); +- swait_event_exclusive(base->wait_for_running_timer, +- base->running_timer != timer); +-} +- +-# define wakeup_timer_waiters(b) swake_up_all(&(b)->wait_for_running_timer) +-#else +-static inline void wait_for_running_timer(struct timer_list *timer) +-{ +- cpu_relax(); +-} +- +-# define wakeup_timer_waiters(b) do { } while (0) +-#endif +- + /** + * del_timer - deactivate a timer. + * @timer: the timer to be deactivated +@@ -1245,14 +1215,8 @@ int del_timer(struct timer_list *timer) + } + EXPORT_SYMBOL(del_timer); + +-/** +- * try_to_del_timer_sync - Try to deactivate a timer +- * @timer: timer to delete +- * +- * This function tries to deactivate a timer. Upon successful (ret >= 0) +- * exit the timer is not queued and the handler is not running on any CPU. +- */ +-int try_to_del_timer_sync(struct timer_list *timer) ++static int __try_to_del_timer_sync(struct timer_list *timer, ++ struct timer_base **basep) + { + struct timer_base *base; + unsigned long flags; +@@ -1260,7 +1224,7 @@ int try_to_del_timer_sync(struct timer_list *timer) + + debug_assert_init(timer); + +- base = lock_timer_base(timer, &flags); ++ *basep = base = lock_timer_base(timer, &flags); + + if (base->running_timer != timer) + ret = detach_if_pending(timer, base, true); +@@ -1269,9 +1233,42 @@ int try_to_del_timer_sync(struct timer_list *timer) + + return ret; + } ++ ++/** ++ * try_to_del_timer_sync - Try to deactivate a timer ++ * @timer: timer to delete ++ * ++ * This function tries to deactivate a timer. Upon successful (ret >= 0) ++ * exit the timer is not queued and the handler is not running on any CPU. ++ */ ++int try_to_del_timer_sync(struct timer_list *timer) ++{ ++ struct timer_base *base; ++ ++ return __try_to_del_timer_sync(timer, &base); ++} + EXPORT_SYMBOL(try_to_del_timer_sync); + + #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) ++static int __del_timer_sync(struct timer_list *timer) ++{ ++ struct timer_base *base; ++ int ret; ++ ++ for (;;) { ++ ret = __try_to_del_timer_sync(timer, &base); ++ if (ret >= 0) ++ return ret; ++ ++ /* ++ * When accessing the lock, timers of base are no longer expired ++ * and so timer is no longer running. ++ */ ++ spin_lock(&base->expiry_lock); ++ spin_unlock(&base->expiry_lock); ++ } ++} ++ + /** + * del_timer_sync - deactivate a timer and wait for the handler to finish. + * @timer: the timer to be deactivated +@@ -1327,12 +1324,8 @@ int del_timer_sync(struct timer_list *timer) + * could lead to deadlock. + */ + WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE)); +- for (;;) { +- int ret = try_to_del_timer_sync(timer); +- if (ret >= 0) +- return ret; +- wait_for_running_timer(timer); +- } ++ ++ return __del_timer_sync(timer); + } + EXPORT_SYMBOL(del_timer_sync); + #endif +@@ -1397,11 +1390,15 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head) + raw_spin_unlock(&base->lock); + call_timer_fn(timer, fn); + base->running_timer = NULL; ++ spin_unlock(&base->expiry_lock); ++ spin_lock(&base->expiry_lock); + raw_spin_lock(&base->lock); + } else { + raw_spin_unlock_irq(&base->lock); + call_timer_fn(timer, fn); + base->running_timer = NULL; ++ spin_unlock(&base->expiry_lock); ++ spin_lock(&base->expiry_lock); + raw_spin_lock_irq(&base->lock); + } + } +@@ -1698,6 +1695,7 @@ static inline void __run_timers(struct timer_base *base) + if (!time_after_eq(jiffies, base->clk)) + return; + ++ spin_lock(&base->expiry_lock); + raw_spin_lock_irq(&base->lock); + + /* +@@ -1725,7 +1723,7 @@ static inline void __run_timers(struct timer_base *base) + expire_timers(base, heads + levels); + } + raw_spin_unlock_irq(&base->lock); +- wakeup_timer_waiters(base); ++ spin_unlock(&base->expiry_lock); + } + + /* +@@ -1972,9 +1970,7 @@ static void __init init_timer_cpu(int cpu) + base->cpu = cpu; + raw_spin_lock_init(&base->lock); + base->clk = jiffies; +-#ifdef CONFIG_PREEMPT_RT_FULL +- init_swait_queue_head(&base->wait_for_running_timer); +-#endif ++ spin_lock_init(&base->expiry_lock); + } + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0273-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch linux-4.19.118/debian/patches-rt/0273-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch --- linux-4.19.98/debian/patches-rt/0273-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0273-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,35 @@ +From e1744f07e1c8a1ac358a3488d40bfc17164dc397 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 26 Jun 2019 17:44:13 +0200 +Subject: [PATCH 273/325] Revert "futex: Ensure lock/unlock symetry versus + pi_lock and hash bucket lock" +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 6a773b70cf105b46298ed3b44e77c102ce31d9ec ] + +Drop the RT fixup, the futex code will be changed to avoid the need for +the workaround. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/futex.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/kernel/futex.c b/kernel/futex.c +index 084527af43d4..b99266393c52 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -938,9 +938,7 @@ void exit_pi_state_list(struct task_struct *curr) + if (head->next != next) { + /* retain curr->pi_lock for the loop invariant */ + raw_spin_unlock(&pi_state->pi_mutex.wait_lock); +- raw_spin_unlock_irq(&curr->pi_lock); + spin_unlock(&hb->lock); +- raw_spin_lock_irq(&curr->pi_lock); + put_pi_state(pi_state); + continue; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0273-pci-switchtec-fix-stream_open.cocci-warnings.patch linux-4.19.118/debian/patches-rt/0273-pci-switchtec-fix-stream_open.cocci-warnings.patch --- linux-4.19.98/debian/patches-rt/0273-pci-switchtec-fix-stream_open.cocci-warnings.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0273-pci-switchtec-fix-stream_open.cocci-warnings.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -From 6c25ddefabb7f6bd4adaa2de6a0fdce865eb4c0c Mon Sep 17 00:00:00 2001 -From: kbuild test robot -Date: Sat, 13 Apr 2019 11:22:51 +0800 -Subject: [PATCH 273/290] pci/switchtec: fix stream_open.cocci warnings -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 9462c69e29307adc95c289f50839d5d683973891 ] - -drivers/pci/switch/switchtec.c:395:1-17: ERROR: switchtec_fops: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix. - -Generated by: scripts/coccinelle/api/stream_open.cocci - -Cc: Kirill Smelkov -Cc: Julia Lawall -Fixes: 8a29a3bae2a2 ("pci/switchtec: Don't use completion's wait queue") -Cc: stable-rt@vger.kernel.org # where it applies to -Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1904131849350.2536@hadrien -Signed-off-by: kbuild test robot -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - drivers/pci/switch/switchtec.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c -index 77d4fb86d05b..ea70bc0b06e9 100644 ---- a/drivers/pci/switch/switchtec.c -+++ b/drivers/pci/switch/switchtec.c -@@ -360,7 +360,7 @@ static int switchtec_dev_open(struct inode *inode, struct file *filp) - return PTR_ERR(stuser); - - filp->private_data = stuser; -- nonseekable_open(inode, filp); -+ stream_open(inode, filp); - - dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser); - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0274-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch linux-4.19.118/debian/patches-rt/0274-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch --- linux-4.19.98/debian/patches-rt/0274-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0274-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,83 @@ +From ce2eb15023161fb6b08da540631b9245997a35ca Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 26 Jun 2019 17:44:18 +0200 +Subject: [PATCH 274/325] Revert "futex: Fix bug on when a requeued RT task + times out" +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit f1a170cb3289a48df26cae3c60d77608f7a988bb ] + +Drop the RT fixup, the futex code will be changed to avoid the need for +the workaround. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/locking/rtmutex.c | 31 +------------------------------ + kernel/locking/rtmutex_common.h | 1 - + 2 files changed, 1 insertion(+), 31 deletions(-) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 2a9bf2443acc..7f6f402e04ae 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -144,8 +144,7 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) + + static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) + { +- return waiter && waiter != PI_WAKEUP_INPROGRESS && +- waiter != PI_REQUEUE_INPROGRESS; ++ return waiter && waiter != PI_WAKEUP_INPROGRESS; + } + + /* +@@ -2350,34 +2349,6 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + if (try_to_take_rt_mutex(lock, task, NULL)) + return 1; + +-#ifdef CONFIG_PREEMPT_RT_FULL +- /* +- * In PREEMPT_RT there's an added race. +- * If the task, that we are about to requeue, times out, +- * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue +- * to skip this task. But right after the task sets +- * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then +- * block on the spin_lock(&hb->lock), which in RT is an rtmutex. +- * This will replace the PI_WAKEUP_INPROGRESS with the actual +- * lock that it blocks on. We *must not* place this task +- * on this proxy lock in that case. +- * +- * To prevent this race, we first take the task's pi_lock +- * and check if it has updated its pi_blocked_on. If it has, +- * we assume that it woke up and we return -EAGAIN. +- * Otherwise, we set the task's pi_blocked_on to +- * PI_REQUEUE_INPROGRESS, so that if the task is waking up +- * it will know that we are in the process of requeuing it. +- */ +- raw_spin_lock(&task->pi_lock); +- if (task->pi_blocked_on) { +- raw_spin_unlock(&task->pi_lock); +- return -EAGAIN; +- } +- task->pi_blocked_on = PI_REQUEUE_INPROGRESS; +- raw_spin_unlock(&task->pi_lock); +-#endif +- + /* We enforce deadlock detection for futexes */ + ret = task_blocks_on_rt_mutex(lock, waiter, task, + RT_MUTEX_FULL_CHAINWALK); +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index 546aaf058b9e..a501f3b47081 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -133,7 +133,6 @@ enum rtmutex_chainwalk { + * PI-futex support (proxy locking functions, etc.): + */ + #define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) +-#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) + + extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); + extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0274-sched-core-Drop-a-preempt_disable_rt-statement.patch linux-4.19.118/debian/patches-rt/0274-sched-core-Drop-a-preempt_disable_rt-statement.patch --- linux-4.19.98/debian/patches-rt/0274-sched-core-Drop-a-preempt_disable_rt-statement.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0274-sched-core-Drop-a-preempt_disable_rt-statement.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -From e92a326589d8cf6722dac937b84c265aa10fdf1b Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 24 Jun 2019 19:33:16 +0200 -Subject: [PATCH 274/290] sched/core: Drop a preempt_disable_rt() statement -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 761126efdcbe3fa3e99c9079fa0ad6eca2f251f2 ] - -The caller holds a lock which already disables preemption. -Drop the preempt_disable_rt() statement in get_nohz_timer_target(). - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/sched/core.c | 9 ++------- - 1 file changed, 2 insertions(+), 7 deletions(-) - -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index cfde725e1017..678c2c4de4f5 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -558,14 +558,11 @@ void resched_cpu(int cpu) - */ - int get_nohz_timer_target(void) - { -- int i, cpu; -+ int i, cpu = smp_processor_id(); - struct sched_domain *sd; - -- preempt_disable_rt(); -- cpu = smp_processor_id(); -- - if (!idle_cpu(cpu) && housekeeping_cpu(cpu, HK_FLAG_TIMER)) -- goto preempt_en_rt; -+ return cpu; - - rcu_read_lock(); - for_each_domain(cpu, sd) { -@@ -584,8 +581,6 @@ int get_nohz_timer_target(void) - cpu = housekeeping_any_cpu(HK_FLAG_TIMER); - unlock: - rcu_read_unlock(); --preempt_en_rt: -- preempt_enable_rt(); - return cpu; - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0275-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch linux-4.19.118/debian/patches-rt/0275-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch --- linux-4.19.98/debian/patches-rt/0275-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0275-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,258 @@ +From 239b06f7ca78e179c96acf891fd3ab78b534f44e Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 26 Jun 2019 17:44:21 +0200 +Subject: [PATCH 275/325] Revert "rtmutex: Handle the various new futex race + conditions" +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 9e0265c21af4d6388d47dcd5ce20f76ec3a2e468 ] + +Drop the RT fixup, the futex code will be changed to avoid the need for +the workaround. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/futex.c | 77 +++++++-------------------------- + kernel/locking/rtmutex.c | 36 +++------------ + kernel/locking/rtmutex_common.h | 2 - + 3 files changed, 21 insertions(+), 94 deletions(-) + +diff --git a/kernel/futex.c b/kernel/futex.c +index b99266393c52..1f9dd186b00c 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -2167,16 +2167,6 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + requeue_pi_wake_futex(this, &key2, hb2); + drop_count++; + continue; +- } else if (ret == -EAGAIN) { +- /* +- * Waiter was woken by timeout or +- * signal and has set pi_blocked_on to +- * PI_WAKEUP_INPROGRESS before we +- * tried to enqueue it on the rtmutex. +- */ +- this->pi_state = NULL; +- put_pi_state(pi_state); +- continue; + } else if (ret) { + /* + * rt_mutex_start_proxy_lock() detected a +@@ -3255,7 +3245,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + struct hrtimer_sleeper timeout, *to = NULL; + struct futex_pi_state *pi_state = NULL; + struct rt_mutex_waiter rt_waiter; +- struct futex_hash_bucket *hb, *hb2; ++ struct futex_hash_bucket *hb; + union futex_key key2 = FUTEX_KEY_INIT; + struct futex_q q = futex_q_init; + int res, ret; +@@ -3313,55 +3303,20 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + /* Queue the futex_q, drop the hb lock, wait for wakeup. */ + futex_wait_queue_me(hb, &q, to); + +- /* +- * On RT we must avoid races with requeue and trying to block +- * on two mutexes (hb->lock and uaddr2's rtmutex) by +- * serializing access to pi_blocked_on with pi_lock. +- */ +- raw_spin_lock_irq(¤t->pi_lock); +- if (current->pi_blocked_on) { +- /* +- * We have been requeued or are in the process of +- * being requeued. +- */ +- raw_spin_unlock_irq(¤t->pi_lock); +- } else { +- /* +- * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS +- * prevents a concurrent requeue from moving us to the +- * uaddr2 rtmutex. After that we can safely acquire +- * (and possibly block on) hb->lock. +- */ +- current->pi_blocked_on = PI_WAKEUP_INPROGRESS; +- raw_spin_unlock_irq(¤t->pi_lock); +- +- spin_lock(&hb->lock); +- +- /* +- * Clean up pi_blocked_on. We might leak it otherwise +- * when we succeeded with the hb->lock in the fast +- * path. +- */ +- raw_spin_lock_irq(¤t->pi_lock); +- current->pi_blocked_on = NULL; +- raw_spin_unlock_irq(¤t->pi_lock); +- +- ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); +- spin_unlock(&hb->lock); +- if (ret) +- goto out_put_keys; +- } ++ spin_lock(&hb->lock); ++ ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); ++ spin_unlock(&hb->lock); ++ if (ret) ++ goto out_put_keys; + + /* +- * In order to be here, we have either been requeued, are in +- * the process of being requeued, or requeue successfully +- * acquired uaddr2 on our behalf. If pi_blocked_on was +- * non-null above, we may be racing with a requeue. Do not +- * rely on q->lock_ptr to be hb2->lock until after blocking on +- * hb->lock or hb2->lock. The futex_requeue dropped our key1 +- * reference and incremented our key2 reference count. ++ * In order for us to be here, we know our q.key == key2, and since ++ * we took the hb->lock above, we also know that futex_requeue() has ++ * completed and we no longer have to concern ourselves with a wakeup ++ * race with the atomic proxy lock acquisition by the requeue code. The ++ * futex_requeue dropped our key1 reference and incremented our key2 ++ * reference count. + */ +- hb2 = hash_futex(&key2); + + /* Check if the requeue code acquired the second futex for us. */ + if (!q.rt_waiter) { +@@ -3370,8 +3325,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * did a lock-steal - fix up the PI-state in that case. + */ + if (q.pi_state && (q.pi_state->owner != current)) { +- spin_lock(&hb2->lock); +- BUG_ON(&hb2->lock != q.lock_ptr); ++ spin_lock(q.lock_ptr); + ret = fixup_pi_state_owner(uaddr2, &q, current); + if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { + pi_state = q.pi_state; +@@ -3382,7 +3336,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * the requeue_pi() code acquired for us. + */ + put_pi_state(q.pi_state); +- spin_unlock(&hb2->lock); ++ spin_unlock(q.lock_ptr); + } + } else { + struct rt_mutex *pi_mutex; +@@ -3396,8 +3350,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + pi_mutex = &q.pi_state->pi_mutex; + ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); + +- spin_lock(&hb2->lock); +- BUG_ON(&hb2->lock != q.lock_ptr); ++ spin_lock(q.lock_ptr); + if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) + ret = 0; + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 7f6f402e04ae..44a33057a83a 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -142,11 +142,6 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) + WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); + } + +-static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) +-{ +- return waiter && waiter != PI_WAKEUP_INPROGRESS; +-} +- + /* + * We can speed up the acquire/release, if there's no debugging state to be + * set up. +@@ -420,8 +415,7 @@ int max_lock_depth = 1024; + + static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) + { +- return rt_mutex_real_waiter(p->pi_blocked_on) ? +- p->pi_blocked_on->lock : NULL; ++ return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; + } + + /* +@@ -557,7 +551,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * reached or the state of the chain has changed while we + * dropped the locks. + */ +- if (!rt_mutex_real_waiter(waiter)) ++ if (!waiter) + goto out_unlock_pi; + + /* +@@ -1327,22 +1321,6 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + return -EDEADLK; + + raw_spin_lock(&task->pi_lock); +- /* +- * In the case of futex requeue PI, this will be a proxy +- * lock. The task will wake unaware that it is enqueueed on +- * this lock. Avoid blocking on two locks and corrupting +- * pi_blocked_on via the PI_WAKEUP_INPROGRESS +- * flag. futex_wait_requeue_pi() sets this when it wakes up +- * before requeue (due to a signal or timeout). Do not enqueue +- * the task if PI_WAKEUP_INPROGRESS is set. +- */ +- if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { +- raw_spin_unlock(&task->pi_lock); +- return -EAGAIN; +- } +- +- BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); +- + waiter->task = task; + waiter->lock = lock; + waiter->prio = task->prio; +@@ -1366,7 +1344,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + rt_mutex_enqueue_pi(owner, waiter); + + rt_mutex_adjust_prio(owner); +- if (rt_mutex_real_waiter(owner->pi_blocked_on)) ++ if (owner->pi_blocked_on) + chain_walk = 1; + } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { + chain_walk = 1; +@@ -1466,7 +1444,7 @@ static void remove_waiter(struct rt_mutex *lock, + { + bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); + struct task_struct *owner = rt_mutex_owner(lock); +- struct rt_mutex *next_lock = NULL; ++ struct rt_mutex *next_lock; + + lockdep_assert_held(&lock->wait_lock); + +@@ -1492,8 +1470,7 @@ static void remove_waiter(struct rt_mutex *lock, + rt_mutex_adjust_prio(owner); + + /* Store the lock on which owner is blocked or NULL */ +- if (rt_mutex_real_waiter(owner->pi_blocked_on)) +- next_lock = task_blocked_on_lock(owner); ++ next_lock = task_blocked_on_lock(owner); + + raw_spin_unlock(&owner->pi_lock); + +@@ -1529,8 +1506,7 @@ void rt_mutex_adjust_pi(struct task_struct *task) + raw_spin_lock_irqsave(&task->pi_lock, flags); + + waiter = task->pi_blocked_on; +- if (!rt_mutex_real_waiter(waiter) || +- rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { ++ if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { + raw_spin_unlock_irqrestore(&task->pi_lock, flags); + return; + } +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index a501f3b47081..758dc43872e5 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -132,8 +132,6 @@ enum rtmutex_chainwalk { + /* + * PI-futex support (proxy locking functions, etc.): + */ +-#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) +- + extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); + extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, + struct task_struct *proxy_owner); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0275-timers-Redo-the-notification-of-canceling-timers-on-.patch linux-4.19.118/debian/patches-rt/0275-timers-Redo-the-notification-of-canceling-timers-on-.patch --- linux-4.19.98/debian/patches-rt/0275-timers-Redo-the-notification-of-canceling-timers-on-.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0275-timers-Redo-the-notification-of-canceling-timers-on-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,650 +0,0 @@ -From 07d9aaa5917187845b59efdf55fa02d70f35cad2 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 24 Jun 2019 19:39:06 +0200 -Subject: [PATCH 275/290] timers: Redo the notification of canceling timers on - -RT -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit c71273154c2ad12e13333aada340ff30e826a11b ] - -Rework of the hrtimer, timer and posix-timer cancelation interface -on -RT. Instead of the swait/schedule interface we now have locks -which are taken while timer is active. During the cancellation of an -active timer the lock is acquired. The lock will then either -PI-boost the timer or block and wait until the timer completed. -The new code looks simpler and does not trigger a warning from -rcu_note_context_switch() anymore like reported by Grygorii Strashko -and Daniel Wagner. -The patches were contributed by Anna-Maria Gleixner. - -This is an all in one commit of the following patches: -| [PATCH] timers: Introduce expiry spin lock -| [PATCH] timers: Drop expiry lock after each timer invocation -| [PATCH] hrtimer: Introduce expiry spin lock -| [PATCH] posix-timers: move rcu out of union -| [PATCH] posix-timers: Add expiry lock - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - fs/timerfd.c | 5 +- - include/linux/hrtimer.h | 17 ++---- - include/linux/posix-timers.h | 1 + - kernel/time/alarmtimer.c | 2 +- - kernel/time/hrtimer.c | 36 ++++--------- - kernel/time/itimer.c | 2 +- - kernel/time/posix-cpu-timers.c | 23 ++++++++ - kernel/time/posix-timers.c | 69 ++++++++++-------------- - kernel/time/posix-timers.h | 2 + - kernel/time/timer.c | 96 ++++++++++++++++------------------ - 10 files changed, 118 insertions(+), 135 deletions(-) - -diff --git a/fs/timerfd.c b/fs/timerfd.c -index 82d0f52414a6..f845093466be 100644 ---- a/fs/timerfd.c -+++ b/fs/timerfd.c -@@ -471,10 +471,11 @@ static int do_timerfd_settime(int ufd, int flags, - break; - } - spin_unlock_irq(&ctx->wqh.lock); -+ - if (isalarm(ctx)) -- hrtimer_wait_for_timer(&ctx->t.alarm.timer); -+ hrtimer_grab_expiry_lock(&ctx->t.alarm.timer); - else -- hrtimer_wait_for_timer(&ctx->t.tmr); -+ hrtimer_grab_expiry_lock(&ctx->t.tmr); - } - - /* -diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h -index 082147c07831..aee31b1f0cc3 100644 ---- a/include/linux/hrtimer.h -+++ b/include/linux/hrtimer.h -@@ -22,7 +22,6 @@ - #include - #include - #include --#include - - struct hrtimer_clock_base; - struct hrtimer_cpu_base; -@@ -193,6 +192,8 @@ enum hrtimer_base_type { - * @nr_retries: Total number of hrtimer interrupt retries - * @nr_hangs: Total number of hrtimer interrupt hangs - * @max_hang_time: Maximum time spent in hrtimer_interrupt -+ * @softirq_expiry_lock: Lock which is taken while softirq based hrtimer are -+ * expired - * @expires_next: absolute time of the next event, is required for remote - * hrtimer enqueue; it is the total first expiry time (hard - * and soft hrtimer are taken into account) -@@ -220,12 +221,10 @@ struct hrtimer_cpu_base { - unsigned short nr_hangs; - unsigned int max_hang_time; - #endif -+ spinlock_t softirq_expiry_lock; - ktime_t expires_next; - struct hrtimer *next_timer; - ktime_t softirq_expires_next; --#ifdef CONFIG_PREEMPT_RT_BASE -- wait_queue_head_t wait; --#endif - struct hrtimer *softirq_next_timer; - struct hrtimer_clock_base clock_base[HRTIMER_MAX_CLOCK_BASES]; - } ____cacheline_aligned; -@@ -426,6 +425,7 @@ static inline void hrtimer_start(struct hrtimer *timer, ktime_t tim, - - extern int hrtimer_cancel(struct hrtimer *timer); - extern int hrtimer_try_to_cancel(struct hrtimer *timer); -+extern void hrtimer_grab_expiry_lock(const struct hrtimer *timer); - - static inline void hrtimer_start_expires(struct hrtimer *timer, - enum hrtimer_mode mode) -@@ -443,13 +443,6 @@ static inline void hrtimer_restart(struct hrtimer *timer) - hrtimer_start_expires(timer, HRTIMER_MODE_ABS); - } - --/* Softirq preemption could deadlock timer removal */ --#ifdef CONFIG_PREEMPT_RT_BASE -- extern void hrtimer_wait_for_timer(const struct hrtimer *timer); --#else --# define hrtimer_wait_for_timer(timer) do { cpu_relax(); } while (0) --#endif -- - /* Query timers: */ - extern ktime_t __hrtimer_get_remaining(const struct hrtimer *timer, bool adjust); - -@@ -481,7 +474,7 @@ static inline bool hrtimer_is_queued(struct hrtimer *timer) - * Helper function to check, whether the timer is running the callback - * function - */ --static inline int hrtimer_callback_running(const struct hrtimer *timer) -+static inline int hrtimer_callback_running(struct hrtimer *timer) - { - return timer->base->running == timer; - } -diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h -index 0571b498db73..3e6c91bdf2ef 100644 ---- a/include/linux/posix-timers.h -+++ b/include/linux/posix-timers.h -@@ -15,6 +15,7 @@ struct cpu_timer_list { - u64 expires, incr; - struct task_struct *task; - int firing; -+ int firing_cpu; - }; - - /* -diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c -index 1d1f077cffb3..61ab2c923579 100644 ---- a/kernel/time/alarmtimer.c -+++ b/kernel/time/alarmtimer.c -@@ -436,7 +436,7 @@ int alarm_cancel(struct alarm *alarm) - int ret = alarm_try_to_cancel(alarm); - if (ret >= 0) - return ret; -- hrtimer_wait_for_timer(&alarm->timer); -+ hrtimer_grab_expiry_lock(&alarm->timer); - } - } - EXPORT_SYMBOL_GPL(alarm_cancel); -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index f16cbc98c47a..ed5d8d51ca91 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -963,33 +963,16 @@ u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval) - } - EXPORT_SYMBOL_GPL(hrtimer_forward); - --#ifdef CONFIG_PREEMPT_RT_BASE --# define wake_up_timer_waiters(b) wake_up(&(b)->wait) -- --/** -- * hrtimer_wait_for_timer - Wait for a running timer -- * -- * @timer: timer to wait for -- * -- * The function waits in case the timers callback function is -- * currently executed on the waitqueue of the timer base. The -- * waitqueue is woken up after the timer callback function has -- * finished execution. -- */ --void hrtimer_wait_for_timer(const struct hrtimer *timer) -+void hrtimer_grab_expiry_lock(const struct hrtimer *timer) - { - struct hrtimer_clock_base *base = timer->base; - -- if (base && base->cpu_base && -- base->index >= HRTIMER_BASE_MONOTONIC_SOFT) -- wait_event(base->cpu_base->wait, -- !(hrtimer_callback_running(timer))); -+ if (base && base->cpu_base) { -+ spin_lock(&base->cpu_base->softirq_expiry_lock); -+ spin_unlock(&base->cpu_base->softirq_expiry_lock); -+ } - } - --#else --# define wake_up_timer_waiters(b) do { } while (0) --#endif -- - /* - * enqueue_hrtimer - internal function to (re)start a timer - * -@@ -1227,7 +1210,7 @@ int hrtimer_cancel(struct hrtimer *timer) - - if (ret >= 0) - return ret; -- hrtimer_wait_for_timer(timer); -+ hrtimer_grab_expiry_lock(timer); - } - } - EXPORT_SYMBOL_GPL(hrtimer_cancel); -@@ -1531,6 +1514,7 @@ static __latent_entropy void hrtimer_run_softirq(struct softirq_action *h) - unsigned long flags; - ktime_t now; - -+ spin_lock(&cpu_base->softirq_expiry_lock); - raw_spin_lock_irqsave(&cpu_base->lock, flags); - - now = hrtimer_update_base(cpu_base); -@@ -1540,7 +1524,7 @@ static __latent_entropy void hrtimer_run_softirq(struct softirq_action *h) - hrtimer_update_softirq_timer(cpu_base, true); - - raw_spin_unlock_irqrestore(&cpu_base->lock, flags); -- wake_up_timer_waiters(cpu_base); -+ spin_unlock(&cpu_base->softirq_expiry_lock); - } - - #ifdef CONFIG_HIGH_RES_TIMERS -@@ -1950,9 +1934,7 @@ int hrtimers_prepare_cpu(unsigned int cpu) - cpu_base->softirq_next_timer = NULL; - cpu_base->expires_next = KTIME_MAX; - cpu_base->softirq_expires_next = KTIME_MAX; --#ifdef CONFIG_PREEMPT_RT_BASE -- init_waitqueue_head(&cpu_base->wait); --#endif -+ spin_lock_init(&cpu_base->softirq_expiry_lock); - return 0; - } - -diff --git a/kernel/time/itimer.c b/kernel/time/itimer.c -index 55b0e58368bf..a5ff222df4c7 100644 ---- a/kernel/time/itimer.c -+++ b/kernel/time/itimer.c -@@ -215,7 +215,7 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) - /* We are sharing ->siglock with it_real_fn() */ - if (hrtimer_try_to_cancel(timer) < 0) { - spin_unlock_irq(&tsk->sighand->siglock); -- hrtimer_wait_for_timer(&tsk->signal->real_timer); -+ hrtimer_grab_expiry_lock(timer); - goto again; - } - expires = timeval_to_ktime(value->it_value); -diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c -index 8d95e8de98b2..765e700962ab 100644 ---- a/kernel/time/posix-cpu-timers.c -+++ b/kernel/time/posix-cpu-timers.c -@@ -792,6 +792,7 @@ check_timers_list(struct list_head *timers, - return t->expires; - - t->firing = 1; -+ t->firing_cpu = smp_processor_id(); - list_move_tail(&t->entry, firing); - } - -@@ -1138,6 +1139,20 @@ static inline int fastpath_timer_check(struct task_struct *tsk) - return 0; - } - -+static DEFINE_PER_CPU(spinlock_t, cpu_timer_expiry_lock) = __SPIN_LOCK_UNLOCKED(cpu_timer_expiry_lock); -+ -+void cpu_timers_grab_expiry_lock(struct k_itimer *timer) -+{ -+ int cpu = timer->it.cpu.firing_cpu; -+ -+ if (cpu >= 0) { -+ spinlock_t *expiry_lock = per_cpu_ptr(&cpu_timer_expiry_lock, cpu); -+ -+ spin_lock_irq(expiry_lock); -+ spin_unlock_irq(expiry_lock); -+ } -+} -+ - /* - * This is called from the timer interrupt handler. The irq handler has - * already updated our counts. We need to check if any timers fire now. -@@ -1148,6 +1163,7 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) - LIST_HEAD(firing); - struct k_itimer *timer, *next; - unsigned long flags; -+ spinlock_t *expiry_lock; - - /* - * The fast path checks that there are no expired thread or thread -@@ -1156,6 +1172,9 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) - if (!fastpath_timer_check(tsk)) - return; - -+ expiry_lock = this_cpu_ptr(&cpu_timer_expiry_lock); -+ spin_lock(expiry_lock); -+ - if (!lock_task_sighand(tsk, &flags)) - return; - /* -@@ -1190,6 +1209,7 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) - list_del_init(&timer->it.cpu.entry); - cpu_firing = timer->it.cpu.firing; - timer->it.cpu.firing = 0; -+ timer->it.cpu.firing_cpu = -1; - /* - * The firing flag is -1 if we collided with a reset - * of the timer, which already reported this -@@ -1199,6 +1219,7 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) - cpu_timer_fire(timer); - spin_unlock(&timer->it_lock); - } -+ spin_unlock(expiry_lock); - } - - #ifdef CONFIG_PREEMPT_RT_BASE -@@ -1466,6 +1487,8 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags, - spin_unlock_irq(&timer.it_lock); - - while (error == TIMER_RETRY) { -+ -+ cpu_timers_grab_expiry_lock(&timer); - /* - * We need to handle case when timer was or is in the - * middle of firing. In other cases we already freed -diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c -index a5ec421e3437..c7e97d421590 100644 ---- a/kernel/time/posix-timers.c -+++ b/kernel/time/posix-timers.c -@@ -821,25 +821,20 @@ static void common_hrtimer_arm(struct k_itimer *timr, ktime_t expires, - hrtimer_start_expires(timer, HRTIMER_MODE_ABS); - } - --/* -- * Protected by RCU! -- */ --static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timr) -+static int common_hrtimer_try_to_cancel(struct k_itimer *timr) - { --#ifdef CONFIG_PREEMPT_RT_FULL -- if (kc->timer_arm == common_hrtimer_arm) -- hrtimer_wait_for_timer(&timr->it.real.timer); -- else if (kc == &alarm_clock) -- hrtimer_wait_for_timer(&timr->it.alarm.alarmtimer.timer); -- else -- /* FIXME: Whacky hack for posix-cpu-timers */ -- schedule_timeout(1); --#endif -+ return hrtimer_try_to_cancel(&timr->it.real.timer); - } - --static int common_hrtimer_try_to_cancel(struct k_itimer *timr) -+static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timer) - { -- return hrtimer_try_to_cancel(&timr->it.real.timer); -+ if (kc->timer_arm == common_hrtimer_arm) -+ hrtimer_grab_expiry_lock(&timer->it.real.timer); -+ else if (kc == &alarm_clock) -+ hrtimer_grab_expiry_lock(&timer->it.alarm.alarmtimer.timer); -+ else -+ /* posix-cpu-timers */ -+ cpu_timers_grab_expiry_lock(timer); - } - - /* Set a POSIX.1b interval timer. */ -@@ -901,21 +896,21 @@ static int do_timer_settime(timer_t timer_id, int flags, - if (!timr) - return -EINVAL; - -- rcu_read_lock(); - kc = timr->kclock; - if (WARN_ON_ONCE(!kc || !kc->timer_set)) - error = -EINVAL; - else - error = kc->timer_set(timr, flags, new_spec64, old_spec64); - -- unlock_timer(timr, flag); - if (error == TIMER_RETRY) { -+ rcu_read_lock(); -+ unlock_timer(timr, flag); - timer_wait_for_callback(kc, timr); -- old_spec64 = NULL; // We already got the old time... - rcu_read_unlock(); -+ old_spec64 = NULL; // We already got the old time... - goto retry; - } -- rcu_read_unlock(); -+ unlock_timer(timr, flag); - - return error; - } -@@ -977,13 +972,21 @@ int common_timer_del(struct k_itimer *timer) - return 0; - } - --static inline int timer_delete_hook(struct k_itimer *timer) -+static int timer_delete_hook(struct k_itimer *timer) - { - const struct k_clock *kc = timer->kclock; -+ int ret; - - if (WARN_ON_ONCE(!kc || !kc->timer_del)) - return -EINVAL; -- return kc->timer_del(timer); -+ ret = kc->timer_del(timer); -+ if (ret == TIMER_RETRY) { -+ rcu_read_lock(); -+ spin_unlock_irq(&timer->it_lock); -+ timer_wait_for_callback(kc, timer); -+ rcu_read_unlock(); -+ } -+ return ret; - } - - /* Delete a POSIX.1b interval timer. */ -@@ -997,15 +1000,8 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id) - if (!timer) - return -EINVAL; - -- rcu_read_lock(); -- if (timer_delete_hook(timer) == TIMER_RETRY) { -- unlock_timer(timer, flags); -- timer_wait_for_callback(clockid_to_kclock(timer->it_clock), -- timer); -- rcu_read_unlock(); -+ if (timer_delete_hook(timer) == TIMER_RETRY) - goto retry_delete; -- } -- rcu_read_unlock(); - - spin_lock(¤t->sighand->siglock); - list_del(&timer->list); -@@ -1031,20 +1027,9 @@ static void itimer_delete(struct k_itimer *timer) - retry_delete: - spin_lock_irqsave(&timer->it_lock, flags); - -- /* On RT we can race with a deletion */ -- if (!timer->it_signal) { -- unlock_timer(timer, flags); -- return; -- } -- -- if (timer_delete_hook(timer) == TIMER_RETRY) { -- rcu_read_lock(); -- unlock_timer(timer, flags); -- timer_wait_for_callback(clockid_to_kclock(timer->it_clock), -- timer); -- rcu_read_unlock(); -+ if (timer_delete_hook(timer) == TIMER_RETRY) - goto retry_delete; -- } -+ - list_del(&timer->list); - /* - * This keeps any tasks waiting on the spin lock from thinking -diff --git a/kernel/time/posix-timers.h b/kernel/time/posix-timers.h -index ddb21145211a..725bd230a8db 100644 ---- a/kernel/time/posix-timers.h -+++ b/kernel/time/posix-timers.h -@@ -32,6 +32,8 @@ extern const struct k_clock clock_process; - extern const struct k_clock clock_thread; - extern const struct k_clock alarm_clock; - -+extern void cpu_timers_grab_expiry_lock(struct k_itimer *timer); -+ - int posix_timer_event(struct k_itimer *timr, int si_private); - - void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting); -diff --git a/kernel/time/timer.c b/kernel/time/timer.c -index 2fcd56aa6092..1c67aab34ff5 100644 ---- a/kernel/time/timer.c -+++ b/kernel/time/timer.c -@@ -44,7 +44,6 @@ - #include - #include - #include --#include - - #include - #include -@@ -198,9 +197,7 @@ EXPORT_SYMBOL(jiffies_64); - struct timer_base { - raw_spinlock_t lock; - struct timer_list *running_timer; --#ifdef CONFIG_PREEMPT_RT_FULL -- struct swait_queue_head wait_for_running_timer; --#endif -+ spinlock_t expiry_lock; - unsigned long clk; - unsigned long next_expiry; - unsigned int cpu; -@@ -1189,33 +1186,6 @@ void add_timer_on(struct timer_list *timer, int cpu) - } - EXPORT_SYMBOL_GPL(add_timer_on); - --#ifdef CONFIG_PREEMPT_RT_FULL --/* -- * Wait for a running timer -- */ --static void wait_for_running_timer(struct timer_list *timer) --{ -- struct timer_base *base; -- u32 tf = timer->flags; -- -- if (tf & TIMER_MIGRATING) -- return; -- -- base = get_timer_base(tf); -- swait_event_exclusive(base->wait_for_running_timer, -- base->running_timer != timer); --} -- --# define wakeup_timer_waiters(b) swake_up_all(&(b)->wait_for_running_timer) --#else --static inline void wait_for_running_timer(struct timer_list *timer) --{ -- cpu_relax(); --} -- --# define wakeup_timer_waiters(b) do { } while (0) --#endif -- - /** - * del_timer - deactivate a timer. - * @timer: the timer to be deactivated -@@ -1245,14 +1215,8 @@ int del_timer(struct timer_list *timer) - } - EXPORT_SYMBOL(del_timer); - --/** -- * try_to_del_timer_sync - Try to deactivate a timer -- * @timer: timer to delete -- * -- * This function tries to deactivate a timer. Upon successful (ret >= 0) -- * exit the timer is not queued and the handler is not running on any CPU. -- */ --int try_to_del_timer_sync(struct timer_list *timer) -+static int __try_to_del_timer_sync(struct timer_list *timer, -+ struct timer_base **basep) - { - struct timer_base *base; - unsigned long flags; -@@ -1260,7 +1224,7 @@ int try_to_del_timer_sync(struct timer_list *timer) - - debug_assert_init(timer); - -- base = lock_timer_base(timer, &flags); -+ *basep = base = lock_timer_base(timer, &flags); - - if (base->running_timer != timer) - ret = detach_if_pending(timer, base, true); -@@ -1269,9 +1233,42 @@ int try_to_del_timer_sync(struct timer_list *timer) - - return ret; - } -+ -+/** -+ * try_to_del_timer_sync - Try to deactivate a timer -+ * @timer: timer to delete -+ * -+ * This function tries to deactivate a timer. Upon successful (ret >= 0) -+ * exit the timer is not queued and the handler is not running on any CPU. -+ */ -+int try_to_del_timer_sync(struct timer_list *timer) -+{ -+ struct timer_base *base; -+ -+ return __try_to_del_timer_sync(timer, &base); -+} - EXPORT_SYMBOL(try_to_del_timer_sync); - - #if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) -+static int __del_timer_sync(struct timer_list *timer) -+{ -+ struct timer_base *base; -+ int ret; -+ -+ for (;;) { -+ ret = __try_to_del_timer_sync(timer, &base); -+ if (ret >= 0) -+ return ret; -+ -+ /* -+ * When accessing the lock, timers of base are no longer expired -+ * and so timer is no longer running. -+ */ -+ spin_lock(&base->expiry_lock); -+ spin_unlock(&base->expiry_lock); -+ } -+} -+ - /** - * del_timer_sync - deactivate a timer and wait for the handler to finish. - * @timer: the timer to be deactivated -@@ -1327,12 +1324,8 @@ int del_timer_sync(struct timer_list *timer) - * could lead to deadlock. - */ - WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE)); -- for (;;) { -- int ret = try_to_del_timer_sync(timer); -- if (ret >= 0) -- return ret; -- wait_for_running_timer(timer); -- } -+ -+ return __del_timer_sync(timer); - } - EXPORT_SYMBOL(del_timer_sync); - #endif -@@ -1397,11 +1390,15 @@ static void expire_timers(struct timer_base *base, struct hlist_head *head) - raw_spin_unlock(&base->lock); - call_timer_fn(timer, fn); - base->running_timer = NULL; -+ spin_unlock(&base->expiry_lock); -+ spin_lock(&base->expiry_lock); - raw_spin_lock(&base->lock); - } else { - raw_spin_unlock_irq(&base->lock); - call_timer_fn(timer, fn); - base->running_timer = NULL; -+ spin_unlock(&base->expiry_lock); -+ spin_lock(&base->expiry_lock); - raw_spin_lock_irq(&base->lock); - } - } -@@ -1698,6 +1695,7 @@ static inline void __run_timers(struct timer_base *base) - if (!time_after_eq(jiffies, base->clk)) - return; - -+ spin_lock(&base->expiry_lock); - raw_spin_lock_irq(&base->lock); - - /* -@@ -1725,7 +1723,7 @@ static inline void __run_timers(struct timer_base *base) - expire_timers(base, heads + levels); - } - raw_spin_unlock_irq(&base->lock); -- wakeup_timer_waiters(base); -+ spin_unlock(&base->expiry_lock); - } - - /* -@@ -1972,9 +1970,7 @@ static void __init init_timer_cpu(int cpu) - base->cpu = cpu; - raw_spin_lock_init(&base->lock); - base->clk = jiffies; --#ifdef CONFIG_PREEMPT_RT_FULL -- init_swait_queue_head(&base->wait_for_running_timer); --#endif -+ spin_lock_init(&base->expiry_lock); - } - } - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0276-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch linux-4.19.118/debian/patches-rt/0276-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch --- linux-4.19.98/debian/patches-rt/0276-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0276-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -From 9aa540150db0e795f552585505278527b6011665 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 26 Jun 2019 17:44:13 +0200 -Subject: [PATCH 276/290] Revert "futex: Ensure lock/unlock symetry versus - pi_lock and hash bucket lock" -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 6a773b70cf105b46298ed3b44e77c102ce31d9ec ] - -Drop the RT fixup, the futex code will be changed to avoid the need for -the workaround. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/futex.c | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/kernel/futex.c b/kernel/futex.c -index 4c448dddce3c..38f53b95e370 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -921,9 +921,7 @@ void exit_pi_state_list(struct task_struct *curr) - if (head->next != next) { - /* retain curr->pi_lock for the loop invariant */ - raw_spin_unlock(&pi_state->pi_mutex.wait_lock); -- raw_spin_unlock_irq(&curr->pi_lock); - spin_unlock(&hb->lock); -- raw_spin_lock_irq(&curr->pi_lock); - put_pi_state(pi_state); - continue; - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0276-Revert-futex-workaround-migrate_disable-enable-in-di.patch linux-4.19.118/debian/patches-rt/0276-Revert-futex-workaround-migrate_disable-enable-in-di.patch --- linux-4.19.98/debian/patches-rt/0276-Revert-futex-workaround-migrate_disable-enable-in-di.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0276-Revert-futex-workaround-migrate_disable-enable-in-di.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,70 @@ +From 8e9071d524a0b1b0539aba8b3e2e30cba6871be3 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 26 Jun 2019 17:44:27 +0200 +Subject: [PATCH 276/325] Revert "futex: workaround migrate_disable/enable in + different context" +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit a71221d81cc4873891ae44f3aa02df596079b786 ] + +Drop the RT fixup, the futex code will be changed to avoid the need for +the workaround. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/futex.c | 19 ------------------- + 1 file changed, 19 deletions(-) + +diff --git a/kernel/futex.c b/kernel/futex.c +index 1f9dd186b00c..9900c3f30124 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -2895,14 +2895,6 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + * before __rt_mutex_start_proxy_lock() is done. + */ + raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock); +- /* +- * the migrate_disable() here disables migration in the in_atomic() fast +- * path which is enabled again in the following spin_unlock(). We have +- * one migrate_disable() pending in the slow-path which is reversed +- * after the raw_spin_unlock_irq() where we leave the atomic context. +- */ +- migrate_disable(); +- + spin_unlock(q.lock_ptr); + /* + * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter +@@ -2911,7 +2903,6 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + */ + ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current); + raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock); +- migrate_enable(); + + if (ret) { + if (ret == 1) +@@ -3060,21 +3051,11 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + * rt_waiter. Also see the WARN in wake_futex_pi(). + */ + raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); +- /* +- * Magic trickery for now to make the RT migrate disable +- * logic happy. The following spin_unlock() happens with +- * interrupts disabled so the internal migrate_enable() +- * won't undo the migrate_disable() which was issued when +- * locking hb->lock. +- */ +- migrate_disable(); + spin_unlock(&hb->lock); + + /* drops pi_state->pi_mutex.wait_lock */ + ret = wake_futex_pi(uaddr, uval, pi_state); + +- migrate_enable(); +- + put_pi_state(pi_state); + + /* +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0277-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch linux-4.19.118/debian/patches-rt/0277-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch --- linux-4.19.98/debian/patches-rt/0277-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0277-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -From 6d3fa5ea1a0500d5a53e8698f6e426785017db89 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 26 Jun 2019 17:44:18 +0200 -Subject: [PATCH 277/290] Revert "futex: Fix bug on when a requeued RT task - times out" -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit f1a170cb3289a48df26cae3c60d77608f7a988bb ] - -Drop the RT fixup, the futex code will be changed to avoid the need for -the workaround. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/locking/rtmutex.c | 31 +------------------------------ - kernel/locking/rtmutex_common.h | 1 - - 2 files changed, 1 insertion(+), 31 deletions(-) - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 2a9bf2443acc..7f6f402e04ae 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -144,8 +144,7 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) - - static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) - { -- return waiter && waiter != PI_WAKEUP_INPROGRESS && -- waiter != PI_REQUEUE_INPROGRESS; -+ return waiter && waiter != PI_WAKEUP_INPROGRESS; - } - - /* -@@ -2350,34 +2349,6 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, - if (try_to_take_rt_mutex(lock, task, NULL)) - return 1; - --#ifdef CONFIG_PREEMPT_RT_FULL -- /* -- * In PREEMPT_RT there's an added race. -- * If the task, that we are about to requeue, times out, -- * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue -- * to skip this task. But right after the task sets -- * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then -- * block on the spin_lock(&hb->lock), which in RT is an rtmutex. -- * This will replace the PI_WAKEUP_INPROGRESS with the actual -- * lock that it blocks on. We *must not* place this task -- * on this proxy lock in that case. -- * -- * To prevent this race, we first take the task's pi_lock -- * and check if it has updated its pi_blocked_on. If it has, -- * we assume that it woke up and we return -EAGAIN. -- * Otherwise, we set the task's pi_blocked_on to -- * PI_REQUEUE_INPROGRESS, so that if the task is waking up -- * it will know that we are in the process of requeuing it. -- */ -- raw_spin_lock(&task->pi_lock); -- if (task->pi_blocked_on) { -- raw_spin_unlock(&task->pi_lock); -- return -EAGAIN; -- } -- task->pi_blocked_on = PI_REQUEUE_INPROGRESS; -- raw_spin_unlock(&task->pi_lock); --#endif -- - /* We enforce deadlock detection for futexes */ - ret = task_blocks_on_rt_mutex(lock, waiter, task, - RT_MUTEX_FULL_CHAINWALK); -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index 546aaf058b9e..a501f3b47081 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -133,7 +133,6 @@ enum rtmutex_chainwalk { - * PI-futex support (proxy locking functions, etc.): - */ - #define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) --#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) - - extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); - extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0277-futex-Make-the-futex_hash_bucket-lock-raw.patch linux-4.19.118/debian/patches-rt/0277-futex-Make-the-futex_hash_bucket-lock-raw.patch --- linux-4.19.98/debian/patches-rt/0277-futex-Make-the-futex_hash_bucket-lock-raw.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0277-futex-Make-the-futex_hash_bucket-lock-raw.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,349 @@ +From 4da5579cff42dcfc92f67bdcff08cdb3c440178b Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 26 Jun 2019 11:59:44 +0200 +Subject: [PATCH 277/325] futex: Make the futex_hash_bucket lock raw +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit f646521aadedab78801c9befe193e2e8a0c99298 ] + +Since commit 1a1fb985f2e2b ("futex: Handle early deadlock return +correctly") we can deadlock while we attempt to acquire the HB lock if +we fail to acquire the lock. +The RT waiter (for the futex lock) is still enqueued and acquiring the +HB lock may build up a lock chain which leads to a deadlock if the owner +of the lock futex-lock holds the HB lock. + +Make the hash bucket lock raw so it does not participate in the +lockchain. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/futex.c | 88 +++++++++++++++++++++++++------------------------- + 1 file changed, 44 insertions(+), 44 deletions(-) + +diff --git a/kernel/futex.c b/kernel/futex.c +index 9900c3f30124..8e8658df69d9 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -243,7 +243,7 @@ struct futex_q { + struct plist_node list; + + struct task_struct *task; +- spinlock_t *lock_ptr; ++ raw_spinlock_t *lock_ptr; + union futex_key key; + struct futex_pi_state *pi_state; + struct rt_mutex_waiter *rt_waiter; +@@ -264,7 +264,7 @@ static const struct futex_q futex_q_init = { + */ + struct futex_hash_bucket { + atomic_t waiters; +- spinlock_t lock; ++ raw_spinlock_t lock; + struct plist_head chain; + } ____cacheline_aligned_in_smp; + +@@ -928,7 +928,7 @@ void exit_pi_state_list(struct task_struct *curr) + } + raw_spin_unlock_irq(&curr->pi_lock); + +- spin_lock(&hb->lock); ++ raw_spin_lock(&hb->lock); + raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); + raw_spin_lock(&curr->pi_lock); + /* +@@ -938,7 +938,7 @@ void exit_pi_state_list(struct task_struct *curr) + if (head->next != next) { + /* retain curr->pi_lock for the loop invariant */ + raw_spin_unlock(&pi_state->pi_mutex.wait_lock); +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + put_pi_state(pi_state); + continue; + } +@@ -950,7 +950,7 @@ void exit_pi_state_list(struct task_struct *curr) + + raw_spin_unlock(&curr->pi_lock); + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + + rt_mutex_futex_unlock(&pi_state->pi_mutex); + put_pi_state(pi_state); +@@ -1444,7 +1444,7 @@ static void __unqueue_futex(struct futex_q *q) + { + struct futex_hash_bucket *hb; + +- if (WARN_ON_SMP(!q->lock_ptr || !spin_is_locked(q->lock_ptr)) ++ if (WARN_ON_SMP(!q->lock_ptr || !raw_spin_is_locked(q->lock_ptr)) + || WARN_ON(plist_node_empty(&q->list))) + return; + +@@ -1572,21 +1572,21 @@ static inline void + double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) + { + if (hb1 <= hb2) { +- spin_lock(&hb1->lock); ++ raw_spin_lock(&hb1->lock); + if (hb1 < hb2) +- spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING); ++ raw_spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING); + } else { /* hb1 > hb2 */ +- spin_lock(&hb2->lock); +- spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING); ++ raw_spin_lock(&hb2->lock); ++ raw_spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING); + } + } + + static inline void + double_unlock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) + { +- spin_unlock(&hb1->lock); ++ raw_spin_unlock(&hb1->lock); + if (hb1 != hb2) +- spin_unlock(&hb2->lock); ++ raw_spin_unlock(&hb2->lock); + } + + /* +@@ -1614,7 +1614,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) + if (!hb_waiters_pending(hb)) + goto out_put_key; + +- spin_lock(&hb->lock); ++ raw_spin_lock(&hb->lock); + + plist_for_each_entry_safe(this, next, &hb->chain, list) { + if (match_futex (&this->key, &key)) { +@@ -1633,7 +1633,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) + } + } + +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + wake_up_q(&wake_q); + out_put_key: + put_futex_key(&key); +@@ -2238,7 +2238,7 @@ static inline struct futex_hash_bucket *queue_lock(struct futex_q *q) + + q->lock_ptr = &hb->lock; + +- spin_lock(&hb->lock); /* implies smp_mb(); (A) */ ++ raw_spin_lock(&hb->lock); /* implies smp_mb(); (A) */ + return hb; + } + +@@ -2246,7 +2246,7 @@ static inline void + queue_unlock(struct futex_hash_bucket *hb) + __releases(&hb->lock) + { +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + hb_waiters_dec(hb); + } + +@@ -2285,7 +2285,7 @@ static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb) + __releases(&hb->lock) + { + __queue_me(q, hb); +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + } + + /** +@@ -2301,41 +2301,41 @@ static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb) + */ + static int unqueue_me(struct futex_q *q) + { +- spinlock_t *lock_ptr; ++ raw_spinlock_t *lock_ptr; + int ret = 0; + + /* In the common case we don't take the spinlock, which is nice. */ + retry: + /* +- * q->lock_ptr can change between this read and the following spin_lock. +- * Use READ_ONCE to forbid the compiler from reloading q->lock_ptr and +- * optimizing lock_ptr out of the logic below. ++ * q->lock_ptr can change between this read and the following ++ * raw_spin_lock. Use READ_ONCE to forbid the compiler from reloading ++ * q->lock_ptr and optimizing lock_ptr out of the logic below. + */ + lock_ptr = READ_ONCE(q->lock_ptr); + if (lock_ptr != NULL) { +- spin_lock(lock_ptr); ++ raw_spin_lock(lock_ptr); + /* + * q->lock_ptr can change between reading it and +- * spin_lock(), causing us to take the wrong lock. This ++ * raw_spin_lock(), causing us to take the wrong lock. This + * corrects the race condition. + * + * Reasoning goes like this: if we have the wrong lock, + * q->lock_ptr must have changed (maybe several times) +- * between reading it and the spin_lock(). It can +- * change again after the spin_lock() but only if it was +- * already changed before the spin_lock(). It cannot, ++ * between reading it and the raw_spin_lock(). It can ++ * change again after the raw_spin_lock() but only if it was ++ * already changed before the raw_spin_lock(). It cannot, + * however, change back to the original value. Therefore + * we can detect whether we acquired the correct lock. + */ + if (unlikely(lock_ptr != q->lock_ptr)) { +- spin_unlock(lock_ptr); ++ raw_spin_unlock(lock_ptr); + goto retry; + } + __unqueue_futex(q); + + BUG_ON(q->pi_state); + +- spin_unlock(lock_ptr); ++ raw_spin_unlock(lock_ptr); + ret = 1; + } + +@@ -2357,7 +2357,7 @@ static void unqueue_me_pi(struct futex_q *q) + put_pi_state(q->pi_state); + q->pi_state = NULL; + +- spin_unlock(q->lock_ptr); ++ raw_spin_unlock(q->lock_ptr); + } + + static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, +@@ -2490,7 +2490,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, + */ + handle_err: + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); +- spin_unlock(q->lock_ptr); ++ raw_spin_unlock(q->lock_ptr); + + switch (err) { + case -EFAULT: +@@ -2508,7 +2508,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, + break; + } + +- spin_lock(q->lock_ptr); ++ raw_spin_lock(q->lock_ptr); + raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); + + /* +@@ -2604,7 +2604,7 @@ static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q, + /* + * The task state is guaranteed to be set before another task can + * wake it. set_current_state() is implemented using smp_store_mb() and +- * queue_me() calls spin_unlock() upon completion, both serializing ++ * queue_me() calls raw_spin_unlock() upon completion, both serializing + * access to the hash list and forcing another memory barrier. + */ + set_current_state(TASK_INTERRUPTIBLE); +@@ -2895,7 +2895,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + * before __rt_mutex_start_proxy_lock() is done. + */ + raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock); +- spin_unlock(q.lock_ptr); ++ raw_spin_unlock(q.lock_ptr); + /* + * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter + * such that futex_unlock_pi() is guaranteed to observe the waiter when +@@ -2916,7 +2916,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + ret = rt_mutex_wait_proxy_lock(&q.pi_state->pi_mutex, to, &rt_waiter); + + cleanup: +- spin_lock(q.lock_ptr); ++ raw_spin_lock(q.lock_ptr); + /* + * If we failed to acquire the lock (deadlock/signal/timeout), we must + * first acquire the hb->lock before removing the lock from the +@@ -3017,7 +3017,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + return ret; + + hb = hash_futex(&key); +- spin_lock(&hb->lock); ++ raw_spin_lock(&hb->lock); + + /* + * Check waiters first. We do not trust user space values at +@@ -3051,7 +3051,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + * rt_waiter. Also see the WARN in wake_futex_pi(). + */ + raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + + /* drops pi_state->pi_mutex.wait_lock */ + ret = wake_futex_pi(uaddr, uval, pi_state); +@@ -3090,7 +3090,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + * owner. + */ + if ((ret = cmpxchg_futex_value_locked(&curval, uaddr, uval, 0))) { +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + switch (ret) { + case -EFAULT: + goto pi_faulted; +@@ -3110,7 +3110,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + ret = (curval == uval) ? 0 : -EAGAIN; + + out_unlock: +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + out_putkey: + put_futex_key(&key); + return ret; +@@ -3284,9 +3284,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + /* Queue the futex_q, drop the hb lock, wait for wakeup. */ + futex_wait_queue_me(hb, &q, to); + +- spin_lock(&hb->lock); ++ raw_spin_lock(&hb->lock); + ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); +- spin_unlock(&hb->lock); ++ raw_spin_unlock(&hb->lock); + if (ret) + goto out_put_keys; + +@@ -3306,7 +3306,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * did a lock-steal - fix up the PI-state in that case. + */ + if (q.pi_state && (q.pi_state->owner != current)) { +- spin_lock(q.lock_ptr); ++ raw_spin_lock(q.lock_ptr); + ret = fixup_pi_state_owner(uaddr2, &q, current); + if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { + pi_state = q.pi_state; +@@ -3317,7 +3317,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * the requeue_pi() code acquired for us. + */ + put_pi_state(q.pi_state); +- spin_unlock(q.lock_ptr); ++ raw_spin_unlock(q.lock_ptr); + } + } else { + struct rt_mutex *pi_mutex; +@@ -3331,7 +3331,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + pi_mutex = &q.pi_state->pi_mutex; + ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); + +- spin_lock(q.lock_ptr); ++ raw_spin_lock(q.lock_ptr); + if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) + ret = 0; + +@@ -3998,7 +3998,7 @@ static int __init futex_init(void) + for (i = 0; i < futex_hashsize; i++) { + atomic_set(&futex_queues[i].waiters, 0); + plist_head_init(&futex_queues[i].chain); +- spin_lock_init(&futex_queues[i].lock); ++ raw_spin_lock_init(&futex_queues[i].lock); + } + + return 0; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0278-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch linux-4.19.118/debian/patches-rt/0278-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch --- linux-4.19.98/debian/patches-rt/0278-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0278-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,258 +0,0 @@ -From 6c64748ffc7a2dbc641b4364267f7218bd29c9c5 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 26 Jun 2019 17:44:21 +0200 -Subject: [PATCH 278/290] Revert "rtmutex: Handle the various new futex race - conditions" -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 9e0265c21af4d6388d47dcd5ce20f76ec3a2e468 ] - -Drop the RT fixup, the futex code will be changed to avoid the need for -the workaround. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/futex.c | 77 +++++++-------------------------- - kernel/locking/rtmutex.c | 36 +++------------ - kernel/locking/rtmutex_common.h | 2 - - 3 files changed, 21 insertions(+), 94 deletions(-) - -diff --git a/kernel/futex.c b/kernel/futex.c -index 38f53b95e370..6ee55df4f3de 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -2150,16 +2150,6 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, - requeue_pi_wake_futex(this, &key2, hb2); - drop_count++; - continue; -- } else if (ret == -EAGAIN) { -- /* -- * Waiter was woken by timeout or -- * signal and has set pi_blocked_on to -- * PI_WAKEUP_INPROGRESS before we -- * tried to enqueue it on the rtmutex. -- */ -- this->pi_state = NULL; -- put_pi_state(pi_state); -- continue; - } else if (ret) { - /* - * rt_mutex_start_proxy_lock() detected a -@@ -3238,7 +3228,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - struct hrtimer_sleeper timeout, *to = NULL; - struct futex_pi_state *pi_state = NULL; - struct rt_mutex_waiter rt_waiter; -- struct futex_hash_bucket *hb, *hb2; -+ struct futex_hash_bucket *hb; - union futex_key key2 = FUTEX_KEY_INIT; - struct futex_q q = futex_q_init; - int res, ret; -@@ -3296,55 +3286,20 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - /* Queue the futex_q, drop the hb lock, wait for wakeup. */ - futex_wait_queue_me(hb, &q, to); - -- /* -- * On RT we must avoid races with requeue and trying to block -- * on two mutexes (hb->lock and uaddr2's rtmutex) by -- * serializing access to pi_blocked_on with pi_lock. -- */ -- raw_spin_lock_irq(¤t->pi_lock); -- if (current->pi_blocked_on) { -- /* -- * We have been requeued or are in the process of -- * being requeued. -- */ -- raw_spin_unlock_irq(¤t->pi_lock); -- } else { -- /* -- * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS -- * prevents a concurrent requeue from moving us to the -- * uaddr2 rtmutex. After that we can safely acquire -- * (and possibly block on) hb->lock. -- */ -- current->pi_blocked_on = PI_WAKEUP_INPROGRESS; -- raw_spin_unlock_irq(¤t->pi_lock); -- -- spin_lock(&hb->lock); -- -- /* -- * Clean up pi_blocked_on. We might leak it otherwise -- * when we succeeded with the hb->lock in the fast -- * path. -- */ -- raw_spin_lock_irq(¤t->pi_lock); -- current->pi_blocked_on = NULL; -- raw_spin_unlock_irq(¤t->pi_lock); -- -- ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); -- spin_unlock(&hb->lock); -- if (ret) -- goto out_put_keys; -- } -+ spin_lock(&hb->lock); -+ ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); -+ spin_unlock(&hb->lock); -+ if (ret) -+ goto out_put_keys; - - /* -- * In order to be here, we have either been requeued, are in -- * the process of being requeued, or requeue successfully -- * acquired uaddr2 on our behalf. If pi_blocked_on was -- * non-null above, we may be racing with a requeue. Do not -- * rely on q->lock_ptr to be hb2->lock until after blocking on -- * hb->lock or hb2->lock. The futex_requeue dropped our key1 -- * reference and incremented our key2 reference count. -+ * In order for us to be here, we know our q.key == key2, and since -+ * we took the hb->lock above, we also know that futex_requeue() has -+ * completed and we no longer have to concern ourselves with a wakeup -+ * race with the atomic proxy lock acquisition by the requeue code. The -+ * futex_requeue dropped our key1 reference and incremented our key2 -+ * reference count. - */ -- hb2 = hash_futex(&key2); - - /* Check if the requeue code acquired the second futex for us. */ - if (!q.rt_waiter) { -@@ -3353,8 +3308,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * did a lock-steal - fix up the PI-state in that case. - */ - if (q.pi_state && (q.pi_state->owner != current)) { -- spin_lock(&hb2->lock); -- BUG_ON(&hb2->lock != q.lock_ptr); -+ spin_lock(q.lock_ptr); - ret = fixup_pi_state_owner(uaddr2, &q, current); - if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { - pi_state = q.pi_state; -@@ -3365,7 +3319,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * the requeue_pi() code acquired for us. - */ - put_pi_state(q.pi_state); -- spin_unlock(&hb2->lock); -+ spin_unlock(q.lock_ptr); - } - } else { - struct rt_mutex *pi_mutex; -@@ -3379,8 +3333,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - pi_mutex = &q.pi_state->pi_mutex; - ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); - -- spin_lock(&hb2->lock); -- BUG_ON(&hb2->lock != q.lock_ptr); -+ spin_lock(q.lock_ptr); - if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) - ret = 0; - -diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 7f6f402e04ae..44a33057a83a 100644 ---- a/kernel/locking/rtmutex.c -+++ b/kernel/locking/rtmutex.c -@@ -142,11 +142,6 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) - WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); - } - --static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) --{ -- return waiter && waiter != PI_WAKEUP_INPROGRESS; --} -- - /* - * We can speed up the acquire/release, if there's no debugging state to be - * set up. -@@ -420,8 +415,7 @@ int max_lock_depth = 1024; - - static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) - { -- return rt_mutex_real_waiter(p->pi_blocked_on) ? -- p->pi_blocked_on->lock : NULL; -+ return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; - } - - /* -@@ -557,7 +551,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, - * reached or the state of the chain has changed while we - * dropped the locks. - */ -- if (!rt_mutex_real_waiter(waiter)) -+ if (!waiter) - goto out_unlock_pi; - - /* -@@ -1327,22 +1321,6 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, - return -EDEADLK; - - raw_spin_lock(&task->pi_lock); -- /* -- * In the case of futex requeue PI, this will be a proxy -- * lock. The task will wake unaware that it is enqueueed on -- * this lock. Avoid blocking on two locks and corrupting -- * pi_blocked_on via the PI_WAKEUP_INPROGRESS -- * flag. futex_wait_requeue_pi() sets this when it wakes up -- * before requeue (due to a signal or timeout). Do not enqueue -- * the task if PI_WAKEUP_INPROGRESS is set. -- */ -- if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { -- raw_spin_unlock(&task->pi_lock); -- return -EAGAIN; -- } -- -- BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); -- - waiter->task = task; - waiter->lock = lock; - waiter->prio = task->prio; -@@ -1366,7 +1344,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, - rt_mutex_enqueue_pi(owner, waiter); - - rt_mutex_adjust_prio(owner); -- if (rt_mutex_real_waiter(owner->pi_blocked_on)) -+ if (owner->pi_blocked_on) - chain_walk = 1; - } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { - chain_walk = 1; -@@ -1466,7 +1444,7 @@ static void remove_waiter(struct rt_mutex *lock, - { - bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); - struct task_struct *owner = rt_mutex_owner(lock); -- struct rt_mutex *next_lock = NULL; -+ struct rt_mutex *next_lock; - - lockdep_assert_held(&lock->wait_lock); - -@@ -1492,8 +1470,7 @@ static void remove_waiter(struct rt_mutex *lock, - rt_mutex_adjust_prio(owner); - - /* Store the lock on which owner is blocked or NULL */ -- if (rt_mutex_real_waiter(owner->pi_blocked_on)) -- next_lock = task_blocked_on_lock(owner); -+ next_lock = task_blocked_on_lock(owner); - - raw_spin_unlock(&owner->pi_lock); - -@@ -1529,8 +1506,7 @@ void rt_mutex_adjust_pi(struct task_struct *task) - raw_spin_lock_irqsave(&task->pi_lock, flags); - - waiter = task->pi_blocked_on; -- if (!rt_mutex_real_waiter(waiter) || -- rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { -+ if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { - raw_spin_unlock_irqrestore(&task->pi_lock, flags); - return; - } -diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h -index a501f3b47081..758dc43872e5 100644 ---- a/kernel/locking/rtmutex_common.h -+++ b/kernel/locking/rtmutex_common.h -@@ -132,8 +132,6 @@ enum rtmutex_chainwalk { - /* - * PI-futex support (proxy locking functions, etc.): - */ --#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) -- - extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); - extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, - struct task_struct *proxy_owner); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0278-futex-Delay-deallocation-of-pi_state.patch linux-4.19.118/debian/patches-rt/0278-futex-Delay-deallocation-of-pi_state.patch --- linux-4.19.98/debian/patches-rt/0278-futex-Delay-deallocation-of-pi_state.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0278-futex-Delay-deallocation-of-pi_state.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,183 @@ +From e66a69b90bc31990bfb8bff7b02090e7664cf97b Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Wed, 26 Jun 2019 13:35:36 +0200 +Subject: [PATCH 278/325] futex: Delay deallocation of pi_state +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit d7c7cf8cb68b7df17e6e50be1f25f35d83e686c7 ] + +On -RT we can't invoke kfree() in a non-preemptible context. + +Defer the deallocation of pi_state to preemptible context. + +Signed-off-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/futex.c | 55 ++++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 44 insertions(+), 11 deletions(-) + +diff --git a/kernel/futex.c b/kernel/futex.c +index 8e8658df69d9..3c604e3eb20a 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -842,13 +842,13 @@ static void get_pi_state(struct futex_pi_state *pi_state) + * Drops a reference to the pi_state object and frees or caches it + * when the last reference is gone. + */ +-static void put_pi_state(struct futex_pi_state *pi_state) ++static struct futex_pi_state *__put_pi_state(struct futex_pi_state *pi_state) + { + if (!pi_state) +- return; ++ return NULL; + + if (!atomic_dec_and_test(&pi_state->refcount)) +- return; ++ return NULL; + + /* + * If pi_state->owner is NULL, the owner is most probably dying +@@ -868,9 +868,7 @@ static void put_pi_state(struct futex_pi_state *pi_state) + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); + } + +- if (current->pi_state_cache) { +- kfree(pi_state); +- } else { ++ if (!current->pi_state_cache) { + /* + * pi_state->list is already empty. + * clear pi_state->owner. +@@ -879,6 +877,30 @@ static void put_pi_state(struct futex_pi_state *pi_state) + pi_state->owner = NULL; + atomic_set(&pi_state->refcount, 1); + current->pi_state_cache = pi_state; ++ pi_state = NULL; ++ } ++ return pi_state; ++} ++ ++static void put_pi_state(struct futex_pi_state *pi_state) ++{ ++ kfree(__put_pi_state(pi_state)); ++} ++ ++static void put_pi_state_atomic(struct futex_pi_state *pi_state, ++ struct list_head *to_free) ++{ ++ if (__put_pi_state(pi_state)) ++ list_add(&pi_state->list, to_free); ++} ++ ++static void free_pi_state_list(struct list_head *to_free) ++{ ++ struct futex_pi_state *p, *next; ++ ++ list_for_each_entry_safe(p, next, to_free, list) { ++ list_del(&p->list); ++ kfree(p); + } + } + +@@ -895,6 +917,7 @@ void exit_pi_state_list(struct task_struct *curr) + struct futex_pi_state *pi_state; + struct futex_hash_bucket *hb; + union futex_key key = FUTEX_KEY_INIT; ++ LIST_HEAD(to_free); + + if (!futex_cmpxchg_enabled) + return; +@@ -939,7 +962,7 @@ void exit_pi_state_list(struct task_struct *curr) + /* retain curr->pi_lock for the loop invariant */ + raw_spin_unlock(&pi_state->pi_mutex.wait_lock); + raw_spin_unlock(&hb->lock); +- put_pi_state(pi_state); ++ put_pi_state_atomic(pi_state, &to_free); + continue; + } + +@@ -958,6 +981,8 @@ void exit_pi_state_list(struct task_struct *curr) + raw_spin_lock_irq(&curr->pi_lock); + } + raw_spin_unlock_irq(&curr->pi_lock); ++ ++ free_pi_state_list(&to_free); + } + + #endif +@@ -1940,6 +1965,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + struct futex_hash_bucket *hb1, *hb2; + struct futex_q *this, *next; + DEFINE_WAKE_Q(wake_q); ++ LIST_HEAD(to_free); + + if (nr_wake < 0 || nr_requeue < 0) + return -EINVAL; +@@ -2177,7 +2203,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + * object. + */ + this->pi_state = NULL; +- put_pi_state(pi_state); ++ put_pi_state_atomic(pi_state, &to_free); + /* + * We stop queueing more waiters and let user + * space deal with the mess. +@@ -2194,7 +2220,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + * in futex_proxy_trylock_atomic() or in lookup_pi_state(). We + * need to drop it here again. + */ +- put_pi_state(pi_state); ++ put_pi_state_atomic(pi_state, &to_free); + + out_unlock: + double_unlock_hb(hb1, hb2); +@@ -2215,6 +2241,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + out_put_key1: + put_futex_key(&key1); + out: ++ free_pi_state_list(&to_free); + return ret ? ret : task_count; + } + +@@ -2351,13 +2378,16 @@ static int unqueue_me(struct futex_q *q) + static void unqueue_me_pi(struct futex_q *q) + __releases(q->lock_ptr) + { ++ struct futex_pi_state *ps; ++ + __unqueue_futex(q); + + BUG_ON(!q->pi_state); +- put_pi_state(q->pi_state); ++ ps = __put_pi_state(q->pi_state); + q->pi_state = NULL; + + raw_spin_unlock(q->lock_ptr); ++ kfree(ps); + } + + static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, +@@ -3306,6 +3336,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * did a lock-steal - fix up the PI-state in that case. + */ + if (q.pi_state && (q.pi_state->owner != current)) { ++ struct futex_pi_state *ps_free; ++ + raw_spin_lock(q.lock_ptr); + ret = fixup_pi_state_owner(uaddr2, &q, current); + if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { +@@ -3316,8 +3348,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * Drop the reference to the pi state which + * the requeue_pi() code acquired for us. + */ +- put_pi_state(q.pi_state); ++ ps_free = __put_pi_state(q.pi_state); + raw_spin_unlock(q.lock_ptr); ++ kfree(ps_free); + } + } else { + struct rt_mutex *pi_mutex; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0279-Revert-futex-workaround-migrate_disable-enable-in-di.patch linux-4.19.118/debian/patches-rt/0279-Revert-futex-workaround-migrate_disable-enable-in-di.patch --- linux-4.19.98/debian/patches-rt/0279-Revert-futex-workaround-migrate_disable-enable-in-di.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0279-Revert-futex-workaround-migrate_disable-enable-in-di.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -From 5aac8105ead1e975578ef5085e3e1be3721ab3f5 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 26 Jun 2019 17:44:27 +0200 -Subject: [PATCH 279/290] Revert "futex: workaround migrate_disable/enable in - different context" -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit a71221d81cc4873891ae44f3aa02df596079b786 ] - -Drop the RT fixup, the futex code will be changed to avoid the need for -the workaround. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/futex.c | 19 ------------------- - 1 file changed, 19 deletions(-) - -diff --git a/kernel/futex.c b/kernel/futex.c -index 6ee55df4f3de..f636dcc706ec 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -2878,14 +2878,6 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, - * before __rt_mutex_start_proxy_lock() is done. - */ - raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock); -- /* -- * the migrate_disable() here disables migration in the in_atomic() fast -- * path which is enabled again in the following spin_unlock(). We have -- * one migrate_disable() pending in the slow-path which is reversed -- * after the raw_spin_unlock_irq() where we leave the atomic context. -- */ -- migrate_disable(); -- - spin_unlock(q.lock_ptr); - /* - * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter -@@ -2894,7 +2886,6 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, - */ - ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current); - raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock); -- migrate_enable(); - - if (ret) { - if (ret == 1) -@@ -3043,21 +3034,11 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) - * rt_waiter. Also see the WARN in wake_futex_pi(). - */ - raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); -- /* -- * Magic trickery for now to make the RT migrate disable -- * logic happy. The following spin_unlock() happens with -- * interrupts disabled so the internal migrate_enable() -- * won't undo the migrate_disable() which was issued when -- * locking hb->lock. -- */ -- migrate_disable(); - spin_unlock(&hb->lock); - - /* drops pi_state->pi_mutex.wait_lock */ - ret = wake_futex_pi(uaddr, uval, pi_state); - -- migrate_enable(); -- - put_pi_state(pi_state); - - /* --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0279-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch linux-4.19.118/debian/patches-rt/0279-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch --- linux-4.19.98/debian/patches-rt/0279-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0279-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,127 @@ +From 46c3a76e3d5c44d8f02e3aa42b0a8c34aae326a1 Mon Sep 17 00:00:00 2001 +From: "Luis Claudio R. Goncalves" +Date: Tue, 25 Jun 2019 11:28:04 -0300 +Subject: [PATCH 279/325] mm/zswap: Do not disable preemption in + zswap_frontswap_store() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 4e4cf4be79635e67144632d9135286381acbc95a ] + +Zswap causes "BUG: scheduling while atomic" by blocking on a rt_spin_lock() with +preemption disabled. The preemption is disabled by get_cpu_var() in +zswap_frontswap_store() to protect the access of the zswap_dstmem percpu variable. + +Use get_locked_var() to protect the percpu zswap_dstmem variable, making the +code preemptive. + +As get_cpu_ptr() also disables preemption, replace it by this_cpu_ptr() and +remove the counterpart put_cpu_ptr(). + +Steps to Reproduce: + + 1. # grubby --args "zswap.enabled=1" --update-kernel DEFAULT + 2. # reboot + 3. Calculate the amount o memory to be used by the test: + ---> grep MemAvailable /proc/meminfo + ---> Add 25% ~ 50% to that value + 4. # stress --vm 1 --vm-bytes ${MemAvailable+25%} --timeout 240s + +Usually, in less than 5 minutes the backtrace listed below appears, followed +by a kernel panic: + +| BUG: scheduling while atomic: kswapd1/181/0x00000002 +| +| Preemption disabled at: +| [] zswap_frontswap_store+0x21a/0x6e1 +| +| Kernel panic - not syncing: scheduling while atomic +| CPU: 14 PID: 181 Comm: kswapd1 Kdump: loaded Not tainted 5.0.14-rt9 #1 +| Hardware name: AMD Pence/Pence, BIOS WPN2321X_Weekly_12_03_21 03/19/2012 +| Call Trace: +| panic+0x106/0x2a7 +| __schedule_bug.cold+0x3f/0x51 +| __schedule+0x5cb/0x6f0 +| schedule+0x43/0xd0 +| rt_spin_lock_slowlock_locked+0x114/0x2b0 +| rt_spin_lock_slowlock+0x51/0x80 +| zbud_alloc+0x1da/0x2d0 +| zswap_frontswap_store+0x31a/0x6e1 +| __frontswap_store+0xab/0x130 +| swap_writepage+0x39/0x70 +| pageout.isra.0+0xe3/0x320 +| shrink_page_list+0xa8e/0xd10 +| shrink_inactive_list+0x251/0x840 +| shrink_node_memcg+0x213/0x770 +| shrink_node+0xd9/0x450 +| balance_pgdat+0x2d5/0x510 +| kswapd+0x218/0x470 +| kthread+0xfb/0x130 +| ret_from_fork+0x27/0x50 + +Cc: stable-rt@vger.kernel.org +Reported-by: Ping Fang +Signed-off-by: Luis Claudio R. Goncalves +Reviewed-by: Daniel Bristot de Oliveira +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + mm/zswap.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/mm/zswap.c b/mm/zswap.c +index cd91fd9d96b8..420225d3ff0b 100644 +--- a/mm/zswap.c ++++ b/mm/zswap.c +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -990,6 +991,8 @@ static void zswap_fill_page(void *ptr, unsigned long value) + memset_l(page, value, PAGE_SIZE / sizeof(unsigned long)); + } + ++/* protect zswap_dstmem from concurrency */ ++static DEFINE_LOCAL_IRQ_LOCK(zswap_dstmem_lock); + /********************************* + * frontswap hooks + **********************************/ +@@ -1066,12 +1069,11 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, + } + + /* compress */ +- dst = get_cpu_var(zswap_dstmem); +- tfm = *get_cpu_ptr(entry->pool->tfm); ++ dst = get_locked_var(zswap_dstmem_lock, zswap_dstmem); ++ tfm = *this_cpu_ptr(entry->pool->tfm); + src = kmap_atomic(page); + ret = crypto_comp_compress(tfm, src, PAGE_SIZE, dst, &dlen); + kunmap_atomic(src); +- put_cpu_ptr(entry->pool->tfm); + if (ret) { + ret = -EINVAL; + goto put_dstmem; +@@ -1094,7 +1096,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, + memcpy(buf, &zhdr, hlen); + memcpy(buf + hlen, dst, dlen); + zpool_unmap_handle(entry->pool->zpool, handle); +- put_cpu_var(zswap_dstmem); ++ put_locked_var(zswap_dstmem_lock, zswap_dstmem); + + /* populate entry */ + entry->offset = offset; +@@ -1122,7 +1124,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, + return 0; + + put_dstmem: +- put_cpu_var(zswap_dstmem); ++ put_locked_var(zswap_dstmem_lock, zswap_dstmem); + zswap_pool_put(entry->pool); + freepage: + zswap_entry_cache_free(entry); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0280-futex-Make-the-futex_hash_bucket-lock-raw.patch linux-4.19.118/debian/patches-rt/0280-futex-Make-the-futex_hash_bucket-lock-raw.patch --- linux-4.19.98/debian/patches-rt/0280-futex-Make-the-futex_hash_bucket-lock-raw.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0280-futex-Make-the-futex_hash_bucket-lock-raw.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,349 +0,0 @@ -From 61b70039f1df8a7dca7776bf3f15ffb4f07e2fb4 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 26 Jun 2019 11:59:44 +0200 -Subject: [PATCH 280/290] futex: Make the futex_hash_bucket lock raw -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit f646521aadedab78801c9befe193e2e8a0c99298 ] - -Since commit 1a1fb985f2e2b ("futex: Handle early deadlock return -correctly") we can deadlock while we attempt to acquire the HB lock if -we fail to acquire the lock. -The RT waiter (for the futex lock) is still enqueued and acquiring the -HB lock may build up a lock chain which leads to a deadlock if the owner -of the lock futex-lock holds the HB lock. - -Make the hash bucket lock raw so it does not participate in the -lockchain. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/futex.c | 88 +++++++++++++++++++++++++------------------------- - 1 file changed, 44 insertions(+), 44 deletions(-) - -diff --git a/kernel/futex.c b/kernel/futex.c -index f636dcc706ec..a9d9283605e5 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -243,7 +243,7 @@ struct futex_q { - struct plist_node list; - - struct task_struct *task; -- spinlock_t *lock_ptr; -+ raw_spinlock_t *lock_ptr; - union futex_key key; - struct futex_pi_state *pi_state; - struct rt_mutex_waiter *rt_waiter; -@@ -264,7 +264,7 @@ static const struct futex_q futex_q_init = { - */ - struct futex_hash_bucket { - atomic_t waiters; -- spinlock_t lock; -+ raw_spinlock_t lock; - struct plist_head chain; - } ____cacheline_aligned_in_smp; - -@@ -911,7 +911,7 @@ void exit_pi_state_list(struct task_struct *curr) - } - raw_spin_unlock_irq(&curr->pi_lock); - -- spin_lock(&hb->lock); -+ raw_spin_lock(&hb->lock); - raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); - raw_spin_lock(&curr->pi_lock); - /* -@@ -921,7 +921,7 @@ void exit_pi_state_list(struct task_struct *curr) - if (head->next != next) { - /* retain curr->pi_lock for the loop invariant */ - raw_spin_unlock(&pi_state->pi_mutex.wait_lock); -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - put_pi_state(pi_state); - continue; - } -@@ -933,7 +933,7 @@ void exit_pi_state_list(struct task_struct *curr) - - raw_spin_unlock(&curr->pi_lock); - raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - - rt_mutex_futex_unlock(&pi_state->pi_mutex); - put_pi_state(pi_state); -@@ -1427,7 +1427,7 @@ static void __unqueue_futex(struct futex_q *q) - { - struct futex_hash_bucket *hb; - -- if (WARN_ON_SMP(!q->lock_ptr || !spin_is_locked(q->lock_ptr)) -+ if (WARN_ON_SMP(!q->lock_ptr || !raw_spin_is_locked(q->lock_ptr)) - || WARN_ON(plist_node_empty(&q->list))) - return; - -@@ -1555,21 +1555,21 @@ static inline void - double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) - { - if (hb1 <= hb2) { -- spin_lock(&hb1->lock); -+ raw_spin_lock(&hb1->lock); - if (hb1 < hb2) -- spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING); -+ raw_spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING); - } else { /* hb1 > hb2 */ -- spin_lock(&hb2->lock); -- spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING); -+ raw_spin_lock(&hb2->lock); -+ raw_spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING); - } - } - - static inline void - double_unlock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) - { -- spin_unlock(&hb1->lock); -+ raw_spin_unlock(&hb1->lock); - if (hb1 != hb2) -- spin_unlock(&hb2->lock); -+ raw_spin_unlock(&hb2->lock); - } - - /* -@@ -1597,7 +1597,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) - if (!hb_waiters_pending(hb)) - goto out_put_key; - -- spin_lock(&hb->lock); -+ raw_spin_lock(&hb->lock); - - plist_for_each_entry_safe(this, next, &hb->chain, list) { - if (match_futex (&this->key, &key)) { -@@ -1616,7 +1616,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) - } - } - -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - wake_up_q(&wake_q); - out_put_key: - put_futex_key(&key); -@@ -2221,7 +2221,7 @@ static inline struct futex_hash_bucket *queue_lock(struct futex_q *q) - - q->lock_ptr = &hb->lock; - -- spin_lock(&hb->lock); /* implies smp_mb(); (A) */ -+ raw_spin_lock(&hb->lock); /* implies smp_mb(); (A) */ - return hb; - } - -@@ -2229,7 +2229,7 @@ static inline void - queue_unlock(struct futex_hash_bucket *hb) - __releases(&hb->lock) - { -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - hb_waiters_dec(hb); - } - -@@ -2268,7 +2268,7 @@ static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb) - __releases(&hb->lock) - { - __queue_me(q, hb); -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - } - - /** -@@ -2284,41 +2284,41 @@ static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb) - */ - static int unqueue_me(struct futex_q *q) - { -- spinlock_t *lock_ptr; -+ raw_spinlock_t *lock_ptr; - int ret = 0; - - /* In the common case we don't take the spinlock, which is nice. */ - retry: - /* -- * q->lock_ptr can change between this read and the following spin_lock. -- * Use READ_ONCE to forbid the compiler from reloading q->lock_ptr and -- * optimizing lock_ptr out of the logic below. -+ * q->lock_ptr can change between this read and the following -+ * raw_spin_lock. Use READ_ONCE to forbid the compiler from reloading -+ * q->lock_ptr and optimizing lock_ptr out of the logic below. - */ - lock_ptr = READ_ONCE(q->lock_ptr); - if (lock_ptr != NULL) { -- spin_lock(lock_ptr); -+ raw_spin_lock(lock_ptr); - /* - * q->lock_ptr can change between reading it and -- * spin_lock(), causing us to take the wrong lock. This -+ * raw_spin_lock(), causing us to take the wrong lock. This - * corrects the race condition. - * - * Reasoning goes like this: if we have the wrong lock, - * q->lock_ptr must have changed (maybe several times) -- * between reading it and the spin_lock(). It can -- * change again after the spin_lock() but only if it was -- * already changed before the spin_lock(). It cannot, -+ * between reading it and the raw_spin_lock(). It can -+ * change again after the raw_spin_lock() but only if it was -+ * already changed before the raw_spin_lock(). It cannot, - * however, change back to the original value. Therefore - * we can detect whether we acquired the correct lock. - */ - if (unlikely(lock_ptr != q->lock_ptr)) { -- spin_unlock(lock_ptr); -+ raw_spin_unlock(lock_ptr); - goto retry; - } - __unqueue_futex(q); - - BUG_ON(q->pi_state); - -- spin_unlock(lock_ptr); -+ raw_spin_unlock(lock_ptr); - ret = 1; - } - -@@ -2340,7 +2340,7 @@ static void unqueue_me_pi(struct futex_q *q) - put_pi_state(q->pi_state); - q->pi_state = NULL; - -- spin_unlock(q->lock_ptr); -+ raw_spin_unlock(q->lock_ptr); - } - - static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, -@@ -2473,7 +2473,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, - */ - handle_err: - raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); -- spin_unlock(q->lock_ptr); -+ raw_spin_unlock(q->lock_ptr); - - switch (err) { - case -EFAULT: -@@ -2491,7 +2491,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, - break; - } - -- spin_lock(q->lock_ptr); -+ raw_spin_lock(q->lock_ptr); - raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); - - /* -@@ -2587,7 +2587,7 @@ static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q, - /* - * The task state is guaranteed to be set before another task can - * wake it. set_current_state() is implemented using smp_store_mb() and -- * queue_me() calls spin_unlock() upon completion, both serializing -+ * queue_me() calls raw_spin_unlock() upon completion, both serializing - * access to the hash list and forcing another memory barrier. - */ - set_current_state(TASK_INTERRUPTIBLE); -@@ -2878,7 +2878,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, - * before __rt_mutex_start_proxy_lock() is done. - */ - raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock); -- spin_unlock(q.lock_ptr); -+ raw_spin_unlock(q.lock_ptr); - /* - * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter - * such that futex_unlock_pi() is guaranteed to observe the waiter when -@@ -2899,7 +2899,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, - ret = rt_mutex_wait_proxy_lock(&q.pi_state->pi_mutex, to, &rt_waiter); - - cleanup: -- spin_lock(q.lock_ptr); -+ raw_spin_lock(q.lock_ptr); - /* - * If we failed to acquire the lock (deadlock/signal/timeout), we must - * first acquire the hb->lock before removing the lock from the -@@ -3000,7 +3000,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) - return ret; - - hb = hash_futex(&key); -- spin_lock(&hb->lock); -+ raw_spin_lock(&hb->lock); - - /* - * Check waiters first. We do not trust user space values at -@@ -3034,7 +3034,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) - * rt_waiter. Also see the WARN in wake_futex_pi(). - */ - raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - - /* drops pi_state->pi_mutex.wait_lock */ - ret = wake_futex_pi(uaddr, uval, pi_state); -@@ -3073,7 +3073,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) - * owner. - */ - if ((ret = cmpxchg_futex_value_locked(&curval, uaddr, uval, 0))) { -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - switch (ret) { - case -EFAULT: - goto pi_faulted; -@@ -3093,7 +3093,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) - ret = (curval == uval) ? 0 : -EAGAIN; - - out_unlock: -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - out_putkey: - put_futex_key(&key); - return ret; -@@ -3267,9 +3267,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - /* Queue the futex_q, drop the hb lock, wait for wakeup. */ - futex_wait_queue_me(hb, &q, to); - -- spin_lock(&hb->lock); -+ raw_spin_lock(&hb->lock); - ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); -- spin_unlock(&hb->lock); -+ raw_spin_unlock(&hb->lock); - if (ret) - goto out_put_keys; - -@@ -3289,7 +3289,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * did a lock-steal - fix up the PI-state in that case. - */ - if (q.pi_state && (q.pi_state->owner != current)) { -- spin_lock(q.lock_ptr); -+ raw_spin_lock(q.lock_ptr); - ret = fixup_pi_state_owner(uaddr2, &q, current); - if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { - pi_state = q.pi_state; -@@ -3300,7 +3300,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * the requeue_pi() code acquired for us. - */ - put_pi_state(q.pi_state); -- spin_unlock(q.lock_ptr); -+ raw_spin_unlock(q.lock_ptr); - } - } else { - struct rt_mutex *pi_mutex; -@@ -3314,7 +3314,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - pi_mutex = &q.pi_state->pi_mutex; - ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); - -- spin_lock(q.lock_ptr); -+ raw_spin_lock(q.lock_ptr); - if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) - ret = 0; - -@@ -3981,7 +3981,7 @@ static int __init futex_init(void) - for (i = 0; i < futex_hashsize; i++) { - atomic_set(&futex_queues[i].waiters, 0); - plist_head_init(&futex_queues[i].chain); -- spin_lock_init(&futex_queues[i].lock); -+ raw_spin_lock_init(&futex_queues[i].lock); - } - - return 0; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0280-revert-aio.patch linux-4.19.118/debian/patches-rt/0280-revert-aio.patch --- linux-4.19.98/debian/patches-rt/0280-revert-aio.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0280-revert-aio.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,71 @@ +From 7a9d62da76af5ba2a2a0002d4955115fa7e2c018 Mon Sep 17 00:00:00 2001 +From: "Steven Rostedt (VMware)" +Date: Fri, 20 Sep 2019 17:50:53 -0400 +Subject: [PATCH 280/325] revert-aio +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +revert: fs/aio: simple simple work + +Signed-off-by: Steven Rostedt (VMware) +--- + fs/aio.c | 15 ++------------- + 1 file changed, 2 insertions(+), 13 deletions(-) + +diff --git a/fs/aio.c b/fs/aio.c +index 93f8cf7fdeab..b5fbf2061868 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -42,7 +42,6 @@ + #include + #include + #include +-#include + + #include + #include +@@ -122,7 +121,6 @@ struct kioctx { + long nr_pages; + + struct rcu_work free_rwork; /* see free_ioctx() */ +- struct swork_event free_swork; /* see free_ioctx() */ + + /* + * signals when all in-flight requests are done +@@ -267,7 +265,6 @@ static int __init aio_setup(void) + .mount = aio_mount, + .kill_sb = kill_anon_super, + }; +- BUG_ON(swork_get()); + aio_mnt = kern_mount(&aio_fs); + if (IS_ERR(aio_mnt)) + panic("Failed to create aio fs mount."); +@@ -609,9 +606,9 @@ static void free_ioctx_reqs(struct percpu_ref *ref) + * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted - + * now it's safe to cancel any that need to be. + */ +-static void free_ioctx_users_work(struct swork_event *sev) ++static void free_ioctx_users(struct percpu_ref *ref) + { +- struct kioctx *ctx = container_of(sev, struct kioctx, free_swork); ++ struct kioctx *ctx = container_of(ref, struct kioctx, users); + struct aio_kiocb *req; + + spin_lock_irq(&ctx->ctx_lock); +@@ -629,14 +626,6 @@ static void free_ioctx_users_work(struct swork_event *sev) + percpu_ref_put(&ctx->reqs); + } + +-static void free_ioctx_users(struct percpu_ref *ref) +-{ +- struct kioctx *ctx = container_of(ref, struct kioctx, users); +- +- INIT_SWORK(&ctx->free_swork, free_ioctx_users_work); +- swork_queue(&ctx->free_swork); +-} +- + static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm) + { + unsigned i, new_nr; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0281-fs-aio-simple-simple-work.patch linux-4.19.118/debian/patches-rt/0281-fs-aio-simple-simple-work.patch --- linux-4.19.98/debian/patches-rt/0281-fs-aio-simple-simple-work.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0281-fs-aio-simple-simple-work.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,76 @@ +From 4bb78531ae9d77ab3d0b681c733db6e53eb754a4 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 16 Feb 2015 18:49:10 +0100 +Subject: [PATCH 281/325] fs/aio: simple simple work +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 1a142116f6435ef070ecebb66d2d599507c10601 ] + +|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:768 +|in_atomic(): 1, irqs_disabled(): 0, pid: 26, name: rcuos/2 +|2 locks held by rcuos/2/26: +| #0: (rcu_callback){.+.+..}, at: [] rcu_nocb_kthread+0x1e2/0x380 +| #1: (rcu_read_lock_sched){.+.+..}, at: [] percpu_ref_kill_rcu+0xa6/0x1c0 +|Preemption disabled at:[] rcu_nocb_kthread+0x263/0x380 +|Call Trace: +| [] dump_stack+0x4e/0x9c +| [] __might_sleep+0xfb/0x170 +| [] rt_spin_lock+0x24/0x70 +| [] free_ioctx_users+0x30/0x130 +| [] percpu_ref_kill_rcu+0x1b4/0x1c0 +| [] rcu_nocb_kthread+0x263/0x380 +| [] kthread+0xd6/0xf0 +| [] ret_from_fork+0x7c/0xb0 + +replace this preempt_disable() friendly swork. + +Reported-By: Mike Galbraith +Suggested-by: Benjamin LaHaise +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + fs/aio.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/fs/aio.c b/fs/aio.c +index b5fbf2061868..a92119e05869 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -121,6 +121,7 @@ struct kioctx { + long nr_pages; + + struct rcu_work free_rwork; /* see free_ioctx() */ ++ struct kthread_work free_kwork; /* see free_ioctx() */ + + /* + * signals when all in-flight requests are done +@@ -606,9 +607,9 @@ static void free_ioctx_reqs(struct percpu_ref *ref) + * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted - + * now it's safe to cancel any that need to be. + */ +-static void free_ioctx_users(struct percpu_ref *ref) ++static void free_ioctx_users_work(struct kthread_work *work) + { +- struct kioctx *ctx = container_of(ref, struct kioctx, users); ++ struct kioctx *ctx = container_of(work, struct kioctx, free_kwork); + struct aio_kiocb *req; + + spin_lock_irq(&ctx->ctx_lock); +@@ -626,6 +627,14 @@ static void free_ioctx_users(struct percpu_ref *ref) + percpu_ref_put(&ctx->reqs); + } + ++static void free_ioctx_users(struct percpu_ref *ref) ++{ ++ struct kioctx *ctx = container_of(ref, struct kioctx, users); ++ ++ kthread_init_work(&ctx->free_kwork, free_ioctx_users_work); ++ kthread_schedule_work(&ctx->free_kwork); ++} ++ + static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm) + { + unsigned i, new_nr; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0281-futex-Delay-deallocation-of-pi_state.patch linux-4.19.118/debian/patches-rt/0281-futex-Delay-deallocation-of-pi_state.patch --- linux-4.19.98/debian/patches-rt/0281-futex-Delay-deallocation-of-pi_state.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0281-futex-Delay-deallocation-of-pi_state.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,183 +0,0 @@ -From ebba085e584e2dafd1d06328a5d4f3b3f3fc0269 Mon Sep 17 00:00:00 2001 -From: Thomas Gleixner -Date: Wed, 26 Jun 2019 13:35:36 +0200 -Subject: [PATCH 281/290] futex: Delay deallocation of pi_state -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit d7c7cf8cb68b7df17e6e50be1f25f35d83e686c7 ] - -On -RT we can't invoke kfree() in a non-preemptible context. - -Defer the deallocation of pi_state to preemptible context. - -Signed-off-by: Thomas Gleixner -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - kernel/futex.c | 55 ++++++++++++++++++++++++++++++++++++++++---------- - 1 file changed, 44 insertions(+), 11 deletions(-) - -diff --git a/kernel/futex.c b/kernel/futex.c -index a9d9283605e5..0b8cff8d9162 100644 ---- a/kernel/futex.c -+++ b/kernel/futex.c -@@ -825,13 +825,13 @@ static void get_pi_state(struct futex_pi_state *pi_state) - * Drops a reference to the pi_state object and frees or caches it - * when the last reference is gone. - */ --static void put_pi_state(struct futex_pi_state *pi_state) -+static struct futex_pi_state *__put_pi_state(struct futex_pi_state *pi_state) - { - if (!pi_state) -- return; -+ return NULL; - - if (!atomic_dec_and_test(&pi_state->refcount)) -- return; -+ return NULL; - - /* - * If pi_state->owner is NULL, the owner is most probably dying -@@ -851,9 +851,7 @@ static void put_pi_state(struct futex_pi_state *pi_state) - raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); - } - -- if (current->pi_state_cache) { -- kfree(pi_state); -- } else { -+ if (!current->pi_state_cache) { - /* - * pi_state->list is already empty. - * clear pi_state->owner. -@@ -862,6 +860,30 @@ static void put_pi_state(struct futex_pi_state *pi_state) - pi_state->owner = NULL; - atomic_set(&pi_state->refcount, 1); - current->pi_state_cache = pi_state; -+ pi_state = NULL; -+ } -+ return pi_state; -+} -+ -+static void put_pi_state(struct futex_pi_state *pi_state) -+{ -+ kfree(__put_pi_state(pi_state)); -+} -+ -+static void put_pi_state_atomic(struct futex_pi_state *pi_state, -+ struct list_head *to_free) -+{ -+ if (__put_pi_state(pi_state)) -+ list_add(&pi_state->list, to_free); -+} -+ -+static void free_pi_state_list(struct list_head *to_free) -+{ -+ struct futex_pi_state *p, *next; -+ -+ list_for_each_entry_safe(p, next, to_free, list) { -+ list_del(&p->list); -+ kfree(p); - } - } - -@@ -878,6 +900,7 @@ void exit_pi_state_list(struct task_struct *curr) - struct futex_pi_state *pi_state; - struct futex_hash_bucket *hb; - union futex_key key = FUTEX_KEY_INIT; -+ LIST_HEAD(to_free); - - if (!futex_cmpxchg_enabled) - return; -@@ -922,7 +945,7 @@ void exit_pi_state_list(struct task_struct *curr) - /* retain curr->pi_lock for the loop invariant */ - raw_spin_unlock(&pi_state->pi_mutex.wait_lock); - raw_spin_unlock(&hb->lock); -- put_pi_state(pi_state); -+ put_pi_state_atomic(pi_state, &to_free); - continue; - } - -@@ -941,6 +964,8 @@ void exit_pi_state_list(struct task_struct *curr) - raw_spin_lock_irq(&curr->pi_lock); - } - raw_spin_unlock_irq(&curr->pi_lock); -+ -+ free_pi_state_list(&to_free); - } - - #endif -@@ -1923,6 +1948,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, - struct futex_hash_bucket *hb1, *hb2; - struct futex_q *this, *next; - DEFINE_WAKE_Q(wake_q); -+ LIST_HEAD(to_free); - - if (nr_wake < 0 || nr_requeue < 0) - return -EINVAL; -@@ -2160,7 +2186,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, - * object. - */ - this->pi_state = NULL; -- put_pi_state(pi_state); -+ put_pi_state_atomic(pi_state, &to_free); - /* - * We stop queueing more waiters and let user - * space deal with the mess. -@@ -2177,7 +2203,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, - * in futex_proxy_trylock_atomic() or in lookup_pi_state(). We - * need to drop it here again. - */ -- put_pi_state(pi_state); -+ put_pi_state_atomic(pi_state, &to_free); - - out_unlock: - double_unlock_hb(hb1, hb2); -@@ -2198,6 +2224,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, - out_put_key1: - put_futex_key(&key1); - out: -+ free_pi_state_list(&to_free); - return ret ? ret : task_count; - } - -@@ -2334,13 +2361,16 @@ static int unqueue_me(struct futex_q *q) - static void unqueue_me_pi(struct futex_q *q) - __releases(q->lock_ptr) - { -+ struct futex_pi_state *ps; -+ - __unqueue_futex(q); - - BUG_ON(!q->pi_state); -- put_pi_state(q->pi_state); -+ ps = __put_pi_state(q->pi_state); - q->pi_state = NULL; - - raw_spin_unlock(q->lock_ptr); -+ kfree(ps); - } - - static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, -@@ -3289,6 +3319,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * did a lock-steal - fix up the PI-state in that case. - */ - if (q.pi_state && (q.pi_state->owner != current)) { -+ struct futex_pi_state *ps_free; -+ - raw_spin_lock(q.lock_ptr); - ret = fixup_pi_state_owner(uaddr2, &q, current); - if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { -@@ -3299,8 +3331,9 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, - * Drop the reference to the pi state which - * the requeue_pi() code acquired for us. - */ -- put_pi_state(q.pi_state); -+ ps_free = __put_pi_state(q.pi_state); - raw_spin_unlock(q.lock_ptr); -+ kfree(ps_free); - } - } else { - struct rt_mutex *pi_mutex; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0282-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch linux-4.19.118/debian/patches-rt/0282-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch --- linux-4.19.98/debian/patches-rt/0282-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0282-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -From b68bca0d18af8b42c058485dfde37d4acfbabcc5 Mon Sep 17 00:00:00 2001 -From: "Luis Claudio R. Goncalves" -Date: Tue, 25 Jun 2019 11:28:04 -0300 -Subject: [PATCH 282/290] mm/zswap: Do not disable preemption in - zswap_frontswap_store() -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 4e4cf4be79635e67144632d9135286381acbc95a ] - -Zswap causes "BUG: scheduling while atomic" by blocking on a rt_spin_lock() with -preemption disabled. The preemption is disabled by get_cpu_var() in -zswap_frontswap_store() to protect the access of the zswap_dstmem percpu variable. - -Use get_locked_var() to protect the percpu zswap_dstmem variable, making the -code preemptive. - -As get_cpu_ptr() also disables preemption, replace it by this_cpu_ptr() and -remove the counterpart put_cpu_ptr(). - -Steps to Reproduce: - - 1. # grubby --args "zswap.enabled=1" --update-kernel DEFAULT - 2. # reboot - 3. Calculate the amount o memory to be used by the test: - ---> grep MemAvailable /proc/meminfo - ---> Add 25% ~ 50% to that value - 4. # stress --vm 1 --vm-bytes ${MemAvailable+25%} --timeout 240s - -Usually, in less than 5 minutes the backtrace listed below appears, followed -by a kernel panic: - -| BUG: scheduling while atomic: kswapd1/181/0x00000002 -| -| Preemption disabled at: -| [] zswap_frontswap_store+0x21a/0x6e1 -| -| Kernel panic - not syncing: scheduling while atomic -| CPU: 14 PID: 181 Comm: kswapd1 Kdump: loaded Not tainted 5.0.14-rt9 #1 -| Hardware name: AMD Pence/Pence, BIOS WPN2321X_Weekly_12_03_21 03/19/2012 -| Call Trace: -| panic+0x106/0x2a7 -| __schedule_bug.cold+0x3f/0x51 -| __schedule+0x5cb/0x6f0 -| schedule+0x43/0xd0 -| rt_spin_lock_slowlock_locked+0x114/0x2b0 -| rt_spin_lock_slowlock+0x51/0x80 -| zbud_alloc+0x1da/0x2d0 -| zswap_frontswap_store+0x31a/0x6e1 -| __frontswap_store+0xab/0x130 -| swap_writepage+0x39/0x70 -| pageout.isra.0+0xe3/0x320 -| shrink_page_list+0xa8e/0xd10 -| shrink_inactive_list+0x251/0x840 -| shrink_node_memcg+0x213/0x770 -| shrink_node+0xd9/0x450 -| balance_pgdat+0x2d5/0x510 -| kswapd+0x218/0x470 -| kthread+0xfb/0x130 -| ret_from_fork+0x27/0x50 - -Cc: stable-rt@vger.kernel.org -Reported-by: Ping Fang -Signed-off-by: Luis Claudio R. Goncalves -Reviewed-by: Daniel Bristot de Oliveira -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - mm/zswap.c | 12 +++++++----- - 1 file changed, 7 insertions(+), 5 deletions(-) - -diff --git a/mm/zswap.c b/mm/zswap.c -index cd91fd9d96b8..420225d3ff0b 100644 ---- a/mm/zswap.c -+++ b/mm/zswap.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -990,6 +991,8 @@ static void zswap_fill_page(void *ptr, unsigned long value) - memset_l(page, value, PAGE_SIZE / sizeof(unsigned long)); - } - -+/* protect zswap_dstmem from concurrency */ -+static DEFINE_LOCAL_IRQ_LOCK(zswap_dstmem_lock); - /********************************* - * frontswap hooks - **********************************/ -@@ -1066,12 +1069,11 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, - } - - /* compress */ -- dst = get_cpu_var(zswap_dstmem); -- tfm = *get_cpu_ptr(entry->pool->tfm); -+ dst = get_locked_var(zswap_dstmem_lock, zswap_dstmem); -+ tfm = *this_cpu_ptr(entry->pool->tfm); - src = kmap_atomic(page); - ret = crypto_comp_compress(tfm, src, PAGE_SIZE, dst, &dlen); - kunmap_atomic(src); -- put_cpu_ptr(entry->pool->tfm); - if (ret) { - ret = -EINVAL; - goto put_dstmem; -@@ -1094,7 +1096,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, - memcpy(buf, &zhdr, hlen); - memcpy(buf + hlen, dst, dlen); - zpool_unmap_handle(entry->pool->zpool, handle); -- put_cpu_var(zswap_dstmem); -+ put_locked_var(zswap_dstmem_lock, zswap_dstmem); - - /* populate entry */ - entry->offset = offset; -@@ -1122,7 +1124,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, - return 0; - - put_dstmem: -- put_cpu_var(zswap_dstmem); -+ put_locked_var(zswap_dstmem_lock, zswap_dstmem); - zswap_pool_put(entry->pool); - freepage: - zswap_entry_cache_free(entry); --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0282-revert-thermal.patch linux-4.19.118/debian/patches-rt/0282-revert-thermal.patch --- linux-4.19.98/debian/patches-rt/0282-revert-thermal.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0282-revert-thermal.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,120 @@ +From 267418caf8f37f685310bb311fe5fa28e3e25dfe Mon Sep 17 00:00:00 2001 +From: "Steven Rostedt (VMware)" +Date: Fri, 20 Sep 2019 17:50:53 -0400 +Subject: [PATCH 282/325] revert-thermal +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Revert: thermal: Defer thermal wakups to threads + +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/thermal/x86_pkg_temp_thermal.c | 52 ++------------------------ + 1 file changed, 3 insertions(+), 49 deletions(-) + +diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c +index a5991cbb408f..1ef937d799e4 100644 +--- a/drivers/thermal/x86_pkg_temp_thermal.c ++++ b/drivers/thermal/x86_pkg_temp_thermal.c +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -330,7 +329,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) + schedule_delayed_work_on(cpu, work, ms); + } + +-static void pkg_thermal_notify_work(struct swork_event *event) ++static int pkg_thermal_notify(u64 msr_val) + { + int cpu = smp_processor_id(); + struct pkg_device *pkgdev; +@@ -349,47 +348,9 @@ static void pkg_thermal_notify_work(struct swork_event *event) + } + + spin_unlock_irqrestore(&pkg_temp_lock, flags); +-} +- +-#ifdef CONFIG_PREEMPT_RT_FULL +-static struct swork_event notify_work; +- +-static int pkg_thermal_notify_work_init(void) +-{ +- int err; +- +- err = swork_get(); +- if (err) +- return err; +- +- INIT_SWORK(¬ify_work, pkg_thermal_notify_work); + return 0; + } + +-static void pkg_thermal_notify_work_cleanup(void) +-{ +- swork_put(); +-} +- +-static int pkg_thermal_notify(u64 msr_val) +-{ +- swork_queue(¬ify_work); +- return 0; +-} +- +-#else /* !CONFIG_PREEMPT_RT_FULL */ +- +-static int pkg_thermal_notify_work_init(void) { return 0; } +- +-static void pkg_thermal_notify_work_cleanup(void) { } +- +-static int pkg_thermal_notify(u64 msr_val) +-{ +- pkg_thermal_notify_work(NULL); +- return 0; +-} +-#endif /* CONFIG_PREEMPT_RT_FULL */ +- + static int pkg_temp_thermal_device_add(unsigned int cpu) + { + int pkgid = topology_logical_package_id(cpu); +@@ -554,16 +515,11 @@ static int __init pkg_temp_thermal_init(void) + if (!x86_match_cpu(pkg_temp_thermal_ids)) + return -ENODEV; + +- if (!pkg_thermal_notify_work_init()) +- return -ENODEV; +- + max_packages = topology_max_packages(); + packages = kcalloc(max_packages, sizeof(struct pkg_device *), + GFP_KERNEL); +- if (!packages) { +- ret = -ENOMEM; +- goto err; +- } ++ if (!packages) ++ return -ENOMEM; + + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "thermal/x86_pkg:online", + pkg_thermal_cpu_online, pkg_thermal_cpu_offline); +@@ -581,7 +537,6 @@ static int __init pkg_temp_thermal_init(void) + return 0; + + err: +- pkg_thermal_notify_work_cleanup(); + kfree(packages); + return ret; + } +@@ -595,7 +550,6 @@ static void __exit pkg_temp_thermal_exit(void) + cpuhp_remove_state(pkg_thermal_hp_state); + debugfs_remove_recursive(debugfs); + kfree(packages); +- pkg_thermal_notify_work_cleanup(); + } + module_exit(pkg_temp_thermal_exit) + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0283-revert-aio.patch linux-4.19.118/debian/patches-rt/0283-revert-aio.patch --- linux-4.19.98/debian/patches-rt/0283-revert-aio.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0283-revert-aio.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -From a127a24d65e5ec18ec4af24df6695fbaccf925ca Mon Sep 17 00:00:00 2001 -From: "Steven Rostedt (VMware)" -Date: Fri, 20 Sep 2019 17:50:53 -0400 -Subject: [PATCH 283/290] revert-aio -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -revert: fs/aio: simple simple work - -Signed-off-by: Steven Rostedt (VMware) ---- - fs/aio.c | 15 ++------------- - 1 file changed, 2 insertions(+), 13 deletions(-) - -diff --git a/fs/aio.c b/fs/aio.c -index 16dcf8521c2c..911e23087dfb 100644 ---- a/fs/aio.c -+++ b/fs/aio.c -@@ -42,7 +42,6 @@ - #include - #include - #include --#include - - #include - #include -@@ -122,7 +121,6 @@ struct kioctx { - long nr_pages; - - struct rcu_work free_rwork; /* see free_ioctx() */ -- struct swork_event free_swork; /* see free_ioctx() */ - - /* - * signals when all in-flight requests are done -@@ -267,7 +265,6 @@ static int __init aio_setup(void) - .mount = aio_mount, - .kill_sb = kill_anon_super, - }; -- BUG_ON(swork_get()); - aio_mnt = kern_mount(&aio_fs); - if (IS_ERR(aio_mnt)) - panic("Failed to create aio fs mount."); -@@ -609,9 +606,9 @@ static void free_ioctx_reqs(struct percpu_ref *ref) - * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted - - * now it's safe to cancel any that need to be. - */ --static void free_ioctx_users_work(struct swork_event *sev) -+static void free_ioctx_users(struct percpu_ref *ref) - { -- struct kioctx *ctx = container_of(sev, struct kioctx, free_swork); -+ struct kioctx *ctx = container_of(ref, struct kioctx, users); - struct aio_kiocb *req; - - spin_lock_irq(&ctx->ctx_lock); -@@ -629,14 +626,6 @@ static void free_ioctx_users_work(struct swork_event *sev) - percpu_ref_put(&ctx->reqs); - } - --static void free_ioctx_users(struct percpu_ref *ref) --{ -- struct kioctx *ctx = container_of(ref, struct kioctx, users); -- -- INIT_SWORK(&ctx->free_swork, free_ioctx_users_work); -- swork_queue(&ctx->free_swork); --} -- - static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm) - { - unsigned i, new_nr; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0283-thermal-Defer-thermal-wakups-to-threads.patch linux-4.19.118/debian/patches-rt/0283-thermal-Defer-thermal-wakups-to-threads.patch --- linux-4.19.98/debian/patches-rt/0283-thermal-Defer-thermal-wakups-to-threads.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0283-thermal-Defer-thermal-wakups-to-threads.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,98 @@ +From bba3e5357a4fc4ecfbee11c3bd4d20f790ef81f3 Mon Sep 17 00:00:00 2001 +From: Daniel Wagner +Date: Tue, 17 Feb 2015 09:37:44 +0100 +Subject: [PATCH 283/325] thermal: Defer thermal wakups to threads +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit ad2408dc248fe58536eef5b2b5734d8f9d3a280b ] + +On RT the spin lock in pkg_temp_thermal_platfrom_thermal_notify will +call schedule while we run in irq context. + +[] dump_stack+0x4e/0x8f +[] __schedule_bug+0xa6/0xb4 +[] __schedule+0x5b4/0x700 +[] schedule+0x2a/0x90 +[] rt_spin_lock_slowlock+0xe5/0x2d0 +[] rt_spin_lock+0x25/0x30 +[] pkg_temp_thermal_platform_thermal_notify+0x45/0x134 [x86_pkg_temp_thermal] +[] ? therm_throt_process+0x1b/0x160 +[] intel_thermal_interrupt+0x211/0x250 +[] smp_thermal_interrupt+0x21/0x40 +[] thermal_interrupt+0x6d/0x80 + +Let's defer the work to a kthread. + +Signed-off-by: Daniel Wagner +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: reoder init/denit position. TODO: flush swork on exit] +Signed-off-by: Sebastian Andrzej Siewior +--- + drivers/thermal/x86_pkg_temp_thermal.c | 28 +++++++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c +index 1ef937d799e4..82f21fd4afb0 100644 +--- a/drivers/thermal/x86_pkg_temp_thermal.c ++++ b/drivers/thermal/x86_pkg_temp_thermal.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -329,7 +330,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) + schedule_delayed_work_on(cpu, work, ms); + } + +-static int pkg_thermal_notify(u64 msr_val) ++static void pkg_thermal_notify_work(struct kthread_work *work) + { + int cpu = smp_processor_id(); + struct pkg_device *pkgdev; +@@ -348,8 +349,32 @@ static int pkg_thermal_notify(u64 msr_val) + } + + spin_unlock_irqrestore(&pkg_temp_lock, flags); ++} ++ ++#ifdef CONFIG_PREEMPT_RT_FULL ++static DEFINE_KTHREAD_WORK(notify_work, pkg_thermal_notify_work); ++ ++static int pkg_thermal_notify(u64 msr_val) ++{ ++ kthread_schedule_work(¬ify_work); ++ return 0; ++} ++ ++static void pkg_thermal_notify_flush(void) ++{ ++ kthread_flush_work(¬ify_work); ++} ++ ++#else /* !CONFIG_PREEMPT_RT_FULL */ ++ ++static void pkg_thermal_notify_flush(void) { } ++ ++static int pkg_thermal_notify(u64 msr_val) ++{ ++ pkg_thermal_notify_work(NULL); + return 0; + } ++#endif /* CONFIG_PREEMPT_RT_FULL */ + + static int pkg_temp_thermal_device_add(unsigned int cpu) + { +@@ -548,6 +573,7 @@ static void __exit pkg_temp_thermal_exit(void) + platform_thermal_package_rate_control = NULL; + + cpuhp_remove_state(pkg_thermal_hp_state); ++ pkg_thermal_notify_flush(); + debugfs_remove_recursive(debugfs); + kfree(packages); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0284-fs-aio-simple-simple-work.patch linux-4.19.118/debian/patches-rt/0284-fs-aio-simple-simple-work.patch --- linux-4.19.98/debian/patches-rt/0284-fs-aio-simple-simple-work.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0284-fs-aio-simple-simple-work.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -From fb686d1f8844133f15f617e0effa288bcbef4a18 Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Mon, 16 Feb 2015 18:49:10 +0100 -Subject: [PATCH 284/290] fs/aio: simple simple work -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 1a142116f6435ef070ecebb66d2d599507c10601 ] - -|BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:768 -|in_atomic(): 1, irqs_disabled(): 0, pid: 26, name: rcuos/2 -|2 locks held by rcuos/2/26: -| #0: (rcu_callback){.+.+..}, at: [] rcu_nocb_kthread+0x1e2/0x380 -| #1: (rcu_read_lock_sched){.+.+..}, at: [] percpu_ref_kill_rcu+0xa6/0x1c0 -|Preemption disabled at:[] rcu_nocb_kthread+0x263/0x380 -|Call Trace: -| [] dump_stack+0x4e/0x9c -| [] __might_sleep+0xfb/0x170 -| [] rt_spin_lock+0x24/0x70 -| [] free_ioctx_users+0x30/0x130 -| [] percpu_ref_kill_rcu+0x1b4/0x1c0 -| [] rcu_nocb_kthread+0x263/0x380 -| [] kthread+0xd6/0xf0 -| [] ret_from_fork+0x7c/0xb0 - -replace this preempt_disable() friendly swork. - -Reported-By: Mike Galbraith -Suggested-by: Benjamin LaHaise -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - fs/aio.c | 13 +++++++++++-- - 1 file changed, 11 insertions(+), 2 deletions(-) - -diff --git a/fs/aio.c b/fs/aio.c -index 911e23087dfb..0c613d805bf1 100644 ---- a/fs/aio.c -+++ b/fs/aio.c -@@ -121,6 +121,7 @@ struct kioctx { - long nr_pages; - - struct rcu_work free_rwork; /* see free_ioctx() */ -+ struct kthread_work free_kwork; /* see free_ioctx() */ - - /* - * signals when all in-flight requests are done -@@ -606,9 +607,9 @@ static void free_ioctx_reqs(struct percpu_ref *ref) - * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted - - * now it's safe to cancel any that need to be. - */ --static void free_ioctx_users(struct percpu_ref *ref) -+static void free_ioctx_users_work(struct kthread_work *work) - { -- struct kioctx *ctx = container_of(ref, struct kioctx, users); -+ struct kioctx *ctx = container_of(work, struct kioctx, free_kwork); - struct aio_kiocb *req; - - spin_lock_irq(&ctx->ctx_lock); -@@ -626,6 +627,14 @@ static void free_ioctx_users(struct percpu_ref *ref) - percpu_ref_put(&ctx->reqs); - } - -+static void free_ioctx_users(struct percpu_ref *ref) -+{ -+ struct kioctx *ctx = container_of(ref, struct kioctx, users); -+ -+ kthread_init_work(&ctx->free_kwork, free_ioctx_users_work); -+ kthread_schedule_work(&ctx->free_kwork); -+} -+ - static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm) - { - unsigned i, new_nr; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0284-revert-block.patch linux-4.19.118/debian/patches-rt/0284-revert-block.patch --- linux-4.19.98/debian/patches-rt/0284-revert-block.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0284-revert-block.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,83 @@ +From 171ac6b8fbc78b0623d086b254df171edb190cbe Mon Sep 17 00:00:00 2001 +From: "Steven Rostedt (VMware)" +Date: Fri, 20 Sep 2019 17:50:54 -0400 +Subject: [PATCH 284/325] revert-block +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Revert swork version of: block: blk-mq: move blk_queue_usage_counter_release() into process context + +In order to switch to upstream, we need to revert the swork code. + +Signed-off-by: Steven Rostedt (VMware) +--- + block/blk-core.c | 14 +------------- + include/linux/blkdev.h | 2 -- + 2 files changed, 1 insertion(+), 15 deletions(-) + +diff --git a/block/blk-core.c b/block/blk-core.c +index 13bf37156bb0..4860cd26cd5a 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -973,21 +973,12 @@ void blk_queue_exit(struct request_queue *q) + percpu_ref_put(&q->q_usage_counter); + } + +-static void blk_queue_usage_counter_release_swork(struct swork_event *sev) +-{ +- struct request_queue *q = +- container_of(sev, struct request_queue, mq_pcpu_wake); +- +- wake_up_all(&q->mq_freeze_wq); +-} +- + static void blk_queue_usage_counter_release(struct percpu_ref *ref) + { + struct request_queue *q = + container_of(ref, struct request_queue, q_usage_counter); + +- if (wq_has_sleeper(&q->mq_freeze_wq)) +- swork_queue(&q->mq_pcpu_wake); ++ wake_up_all(&q->mq_freeze_wq); + } + + static void blk_rq_timed_out_timer(struct timer_list *t) +@@ -1084,7 +1075,6 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, + queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); + + init_waitqueue_head(&q->mq_freeze_wq); +- INIT_SWORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_swork); + + /* + * Init percpu_ref in atomic mode so that it's faster to shutdown. +@@ -3974,8 +3964,6 @@ int __init blk_dev_init(void) + if (!kblockd_workqueue) + panic("Failed to create kblockd\n"); + +- BUG_ON(swork_get()); +- + request_cachep = kmem_cache_create("blkdev_requests", + sizeof(struct request), 0, SLAB_PANIC, NULL); + +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 2f3b2e5196eb..111ab4209797 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -27,7 +27,6 @@ + #include + #include + #include +-#include + + struct module; + struct scsi_ioctl_command; +@@ -656,7 +655,6 @@ struct request_queue { + #endif + struct rcu_head rcu_head; + wait_queue_head_t mq_freeze_wq; +- struct swork_event mq_pcpu_wake; + struct percpu_ref q_usage_counter; + struct list_head all_q_node; + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0285-block-blk-mq-move-blk_queue_usage_counter_release-in.patch linux-4.19.118/debian/patches-rt/0285-block-blk-mq-move-blk_queue_usage_counter_release-in.patch --- linux-4.19.98/debian/patches-rt/0285-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0285-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,114 @@ +From 4621d1e6d5d9c259cd3fc808ea502b2fdaf859f6 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 13 Mar 2018 13:49:16 +0100 +Subject: [PATCH 285/325] block: blk-mq: move blk_queue_usage_counter_release() + into process context +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 61c928ecf4fe200bda9b49a0813b5ba0f43995b5 ] + +| BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914 +| in_atomic(): 1, irqs_disabled(): 0, pid: 255, name: kworker/u257:6 +| 5 locks held by kworker/u257:6/255: +| #0: ("events_unbound"){.+.+.+}, at: [] process_one_work+0x171/0x5e0 +| #1: ((&entry->work)){+.+.+.}, at: [] process_one_work+0x171/0x5e0 +| #2: (&shost->scan_mutex){+.+.+.}, at: [] __scsi_add_device+0xa3/0x130 [scsi_mod] +| #3: (&set->tag_list_lock){+.+...}, at: [] blk_mq_init_queue+0x96a/0xa50 +| #4: (rcu_read_lock_sched){......}, at: [] percpu_ref_kill_and_confirm+0x1d/0x120 +| Preemption disabled at:[] blk_mq_freeze_queue_start+0x56/0x70 +| +| CPU: 2 PID: 255 Comm: kworker/u257:6 Not tainted 3.18.7-rt0+ #1 +| Workqueue: events_unbound async_run_entry_fn +| 0000000000000003 ffff8800bc29f998 ffffffff815b3a12 0000000000000000 +| 0000000000000000 ffff8800bc29f9b8 ffffffff8109aa16 ffff8800bc29fa28 +| ffff8800bc5d1bc8 ffff8800bc29f9e8 ffffffff815b8dd4 ffff880000000000 +| Call Trace: +| [] dump_stack+0x4f/0x7c +| [] __might_sleep+0x116/0x190 +| [] rt_spin_lock+0x24/0x60 +| [] __wake_up+0x29/0x60 +| [] blk_mq_usage_counter_release+0x1e/0x20 +| [] percpu_ref_kill_and_confirm+0x106/0x120 +| [] blk_mq_freeze_queue_start+0x56/0x70 +| [] blk_mq_update_tag_set_depth+0x40/0xd0 +| [] blk_mq_init_queue+0x98c/0xa50 +| [] scsi_mq_alloc_queue+0x20/0x60 [scsi_mod] +| [] scsi_alloc_sdev+0x2f5/0x370 [scsi_mod] +| [] scsi_probe_and_add_lun+0x9e4/0xdd0 [scsi_mod] +| [] __scsi_add_device+0x126/0x130 [scsi_mod] +| [] ata_scsi_scan_host+0xaf/0x200 [libata] +| [] async_port_probe+0x46/0x60 [libata] +| [] async_run_entry_fn+0x3b/0xf0 +| [] process_one_work+0x201/0x5e0 + +percpu_ref_kill_and_confirm() invokes blk_mq_usage_counter_release() in +a rcu-sched region. swait based wake queue can't be used due to +wake_up_all() usage and disabled interrupts in !RT configs (as reported +by Corey Minyard). +The wq_has_sleeper() check has been suggested by Peter Zijlstra. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + block/blk-core.c | 12 +++++++++++- + include/linux/blkdev.h | 2 ++ + 2 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/block/blk-core.c b/block/blk-core.c +index 4860cd26cd5a..7d709465876e 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -973,12 +973,21 @@ void blk_queue_exit(struct request_queue *q) + percpu_ref_put(&q->q_usage_counter); + } + ++static void blk_queue_usage_counter_release_wrk(struct kthread_work *work) ++{ ++ struct request_queue *q = ++ container_of(work, struct request_queue, mq_pcpu_wake); ++ ++ wake_up_all(&q->mq_freeze_wq); ++} ++ + static void blk_queue_usage_counter_release(struct percpu_ref *ref) + { + struct request_queue *q = + container_of(ref, struct request_queue, q_usage_counter); + +- wake_up_all(&q->mq_freeze_wq); ++ if (wq_has_sleeper(&q->mq_freeze_wq)) ++ kthread_schedule_work(&q->mq_pcpu_wake); + } + + static void blk_rq_timed_out_timer(struct timer_list *t) +@@ -1075,6 +1084,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, + queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); + + init_waitqueue_head(&q->mq_freeze_wq); ++ kthread_init_work(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk); + + /* + * Init percpu_ref in atomic mode so that it's faster to shutdown. +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 111ab4209797..981103415cd8 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -655,6 +656,7 @@ struct request_queue { + #endif + struct rcu_head rcu_head; + wait_queue_head_t mq_freeze_wq; ++ struct kthread_work mq_pcpu_wake; + struct percpu_ref q_usage_counter; + struct list_head all_q_node; + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0285-revert-thermal.patch linux-4.19.118/debian/patches-rt/0285-revert-thermal.patch --- linux-4.19.98/debian/patches-rt/0285-revert-thermal.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0285-revert-thermal.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -From 466a66edbba9ee1f7405d51c674dd3dc11bbdb13 Mon Sep 17 00:00:00 2001 -From: "Steven Rostedt (VMware)" -Date: Fri, 20 Sep 2019 17:50:53 -0400 -Subject: [PATCH 285/290] revert-thermal -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Revert: thermal: Defer thermal wakups to threads - -Signed-off-by: Steven Rostedt (VMware) ---- - drivers/thermal/x86_pkg_temp_thermal.c | 52 ++------------------------ - 1 file changed, 3 insertions(+), 49 deletions(-) - -diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c -index a5991cbb408f..1ef937d799e4 100644 ---- a/drivers/thermal/x86_pkg_temp_thermal.c -+++ b/drivers/thermal/x86_pkg_temp_thermal.c -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - #include - #include - -@@ -330,7 +329,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) - schedule_delayed_work_on(cpu, work, ms); - } - --static void pkg_thermal_notify_work(struct swork_event *event) -+static int pkg_thermal_notify(u64 msr_val) - { - int cpu = smp_processor_id(); - struct pkg_device *pkgdev; -@@ -349,47 +348,9 @@ static void pkg_thermal_notify_work(struct swork_event *event) - } - - spin_unlock_irqrestore(&pkg_temp_lock, flags); --} -- --#ifdef CONFIG_PREEMPT_RT_FULL --static struct swork_event notify_work; -- --static int pkg_thermal_notify_work_init(void) --{ -- int err; -- -- err = swork_get(); -- if (err) -- return err; -- -- INIT_SWORK(¬ify_work, pkg_thermal_notify_work); - return 0; - } - --static void pkg_thermal_notify_work_cleanup(void) --{ -- swork_put(); --} -- --static int pkg_thermal_notify(u64 msr_val) --{ -- swork_queue(¬ify_work); -- return 0; --} -- --#else /* !CONFIG_PREEMPT_RT_FULL */ -- --static int pkg_thermal_notify_work_init(void) { return 0; } -- --static void pkg_thermal_notify_work_cleanup(void) { } -- --static int pkg_thermal_notify(u64 msr_val) --{ -- pkg_thermal_notify_work(NULL); -- return 0; --} --#endif /* CONFIG_PREEMPT_RT_FULL */ -- - static int pkg_temp_thermal_device_add(unsigned int cpu) - { - int pkgid = topology_logical_package_id(cpu); -@@ -554,16 +515,11 @@ static int __init pkg_temp_thermal_init(void) - if (!x86_match_cpu(pkg_temp_thermal_ids)) - return -ENODEV; - -- if (!pkg_thermal_notify_work_init()) -- return -ENODEV; -- - max_packages = topology_max_packages(); - packages = kcalloc(max_packages, sizeof(struct pkg_device *), - GFP_KERNEL); -- if (!packages) { -- ret = -ENOMEM; -- goto err; -- } -+ if (!packages) -+ return -ENOMEM; - - ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "thermal/x86_pkg:online", - pkg_thermal_cpu_online, pkg_thermal_cpu_offline); -@@ -581,7 +537,6 @@ static int __init pkg_temp_thermal_init(void) - return 0; - - err: -- pkg_thermal_notify_work_cleanup(); - kfree(packages); - return ret; - } -@@ -595,7 +550,6 @@ static void __exit pkg_temp_thermal_exit(void) - cpuhp_remove_state(pkg_thermal_hp_state); - debugfs_remove_recursive(debugfs); - kfree(packages); -- pkg_thermal_notify_work_cleanup(); - } - module_exit(pkg_temp_thermal_exit) - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0286-thermal-Defer-thermal-wakups-to-threads.patch linux-4.19.118/debian/patches-rt/0286-thermal-Defer-thermal-wakups-to-threads.patch --- linux-4.19.98/debian/patches-rt/0286-thermal-Defer-thermal-wakups-to-threads.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0286-thermal-Defer-thermal-wakups-to-threads.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -From d68ea3ebd9e76e3a78a5034c6af647c0c948b6a8 Mon Sep 17 00:00:00 2001 -From: Daniel Wagner -Date: Tue, 17 Feb 2015 09:37:44 +0100 -Subject: [PATCH 286/290] thermal: Defer thermal wakups to threads -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit ad2408dc248fe58536eef5b2b5734d8f9d3a280b ] - -On RT the spin lock in pkg_temp_thermal_platfrom_thermal_notify will -call schedule while we run in irq context. - -[] dump_stack+0x4e/0x8f -[] __schedule_bug+0xa6/0xb4 -[] __schedule+0x5b4/0x700 -[] schedule+0x2a/0x90 -[] rt_spin_lock_slowlock+0xe5/0x2d0 -[] rt_spin_lock+0x25/0x30 -[] pkg_temp_thermal_platform_thermal_notify+0x45/0x134 [x86_pkg_temp_thermal] -[] ? therm_throt_process+0x1b/0x160 -[] intel_thermal_interrupt+0x211/0x250 -[] smp_thermal_interrupt+0x21/0x40 -[] thermal_interrupt+0x6d/0x80 - -Let's defer the work to a kthread. - -Signed-off-by: Daniel Wagner -Signed-off-by: Steven Rostedt (VMware) -[bigeasy: reoder init/denit position. TODO: flush swork on exit] -Signed-off-by: Sebastian Andrzej Siewior ---- - drivers/thermal/x86_pkg_temp_thermal.c | 28 +++++++++++++++++++++++++- - 1 file changed, 27 insertions(+), 1 deletion(-) - -diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c -index 1ef937d799e4..82f21fd4afb0 100644 ---- a/drivers/thermal/x86_pkg_temp_thermal.c -+++ b/drivers/thermal/x86_pkg_temp_thermal.c -@@ -29,6 +29,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -329,7 +330,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) - schedule_delayed_work_on(cpu, work, ms); - } - --static int pkg_thermal_notify(u64 msr_val) -+static void pkg_thermal_notify_work(struct kthread_work *work) - { - int cpu = smp_processor_id(); - struct pkg_device *pkgdev; -@@ -348,8 +349,32 @@ static int pkg_thermal_notify(u64 msr_val) - } - - spin_unlock_irqrestore(&pkg_temp_lock, flags); -+} -+ -+#ifdef CONFIG_PREEMPT_RT_FULL -+static DEFINE_KTHREAD_WORK(notify_work, pkg_thermal_notify_work); -+ -+static int pkg_thermal_notify(u64 msr_val) -+{ -+ kthread_schedule_work(¬ify_work); -+ return 0; -+} -+ -+static void pkg_thermal_notify_flush(void) -+{ -+ kthread_flush_work(¬ify_work); -+} -+ -+#else /* !CONFIG_PREEMPT_RT_FULL */ -+ -+static void pkg_thermal_notify_flush(void) { } -+ -+static int pkg_thermal_notify(u64 msr_val) -+{ -+ pkg_thermal_notify_work(NULL); - return 0; - } -+#endif /* CONFIG_PREEMPT_RT_FULL */ - - static int pkg_temp_thermal_device_add(unsigned int cpu) - { -@@ -548,6 +573,7 @@ static void __exit pkg_temp_thermal_exit(void) - platform_thermal_package_rate_control = NULL; - - cpuhp_remove_state(pkg_thermal_hp_state); -+ pkg_thermal_notify_flush(); - debugfs_remove_recursive(debugfs); - kfree(packages); - } --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0286-workqueue-rework.patch linux-4.19.118/debian/patches-rt/0286-workqueue-rework.patch --- linux-4.19.98/debian/patches-rt/0286-workqueue-rework.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0286-workqueue-rework.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,1464 @@ +From 9fff0e73dcf79af1aab70aae151379fe86845cff Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 29 May 2019 18:52:27 +0200 +Subject: [PATCH 286/325] workqueue: rework +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit d15a862f24df983458533aebd6fa207ecdd1095a ] + +This is an all-in change of the workqueue rework. +The worker_pool.lock is made to raw_spinlock_t. With this change we can +schedule workitems from preempt-disable sections and sections with disabled +interrupts. This change allows to remove all kthread_.* workarounds we used to +have. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + block/blk-core.c | 6 +- + drivers/block/loop.c | 2 +- + drivers/spi/spi-rockchip.c | 1 - + drivers/thermal/x86_pkg_temp_thermal.c | 28 +-- + fs/aio.c | 10 +- + include/linux/blk-cgroup.h | 2 +- + include/linux/blkdev.h | 2 +- + include/linux/kthread-cgroup.h | 17 -- + include/linux/kthread.h | 15 +- + include/linux/swait.h | 14 ++ + include/linux/workqueue.h | 4 - + init/main.c | 1 - + kernel/kthread.c | 14 -- + kernel/sched/core.c | 1 + + kernel/time/hrtimer.c | 24 -- + kernel/workqueue.c | 304 +++++++++++-------------- + 16 files changed, 163 insertions(+), 282 deletions(-) + delete mode 100644 include/linux/kthread-cgroup.h + +diff --git a/block/blk-core.c b/block/blk-core.c +index 7d709465876e..752c9e754509 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -973,7 +973,7 @@ void blk_queue_exit(struct request_queue *q) + percpu_ref_put(&q->q_usage_counter); + } + +-static void blk_queue_usage_counter_release_wrk(struct kthread_work *work) ++static void blk_queue_usage_counter_release_wrk(struct work_struct *work) + { + struct request_queue *q = + container_of(work, struct request_queue, mq_pcpu_wake); +@@ -987,7 +987,7 @@ static void blk_queue_usage_counter_release(struct percpu_ref *ref) + container_of(ref, struct request_queue, q_usage_counter); + + if (wq_has_sleeper(&q->mq_freeze_wq)) +- kthread_schedule_work(&q->mq_pcpu_wake); ++ schedule_work(&q->mq_pcpu_wake); + } + + static void blk_rq_timed_out_timer(struct timer_list *t) +@@ -1084,7 +1084,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, + queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); + + init_waitqueue_head(&q->mq_freeze_wq); +- kthread_init_work(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk); ++ INIT_WORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk); + + /* + * Init percpu_ref in atomic mode so that it's faster to shutdown. +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index 351ea22ffb56..9cd231a27328 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -70,7 +70,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c +index 63b10236eb05..185bbdce62b1 100644 +--- a/drivers/spi/spi-rockchip.c ++++ b/drivers/spi/spi-rockchip.c +@@ -22,7 +22,6 @@ + #include + #include + #include +-#include + + #define DRIVER_NAME "rockchip-spi" + +diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c +index 82f21fd4afb0..1ef937d799e4 100644 +--- a/drivers/thermal/x86_pkg_temp_thermal.c ++++ b/drivers/thermal/x86_pkg_temp_thermal.c +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -330,7 +329,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) + schedule_delayed_work_on(cpu, work, ms); + } + +-static void pkg_thermal_notify_work(struct kthread_work *work) ++static int pkg_thermal_notify(u64 msr_val) + { + int cpu = smp_processor_id(); + struct pkg_device *pkgdev; +@@ -349,32 +348,8 @@ static void pkg_thermal_notify_work(struct kthread_work *work) + } + + spin_unlock_irqrestore(&pkg_temp_lock, flags); +-} +- +-#ifdef CONFIG_PREEMPT_RT_FULL +-static DEFINE_KTHREAD_WORK(notify_work, pkg_thermal_notify_work); +- +-static int pkg_thermal_notify(u64 msr_val) +-{ +- kthread_schedule_work(¬ify_work); +- return 0; +-} +- +-static void pkg_thermal_notify_flush(void) +-{ +- kthread_flush_work(¬ify_work); +-} +- +-#else /* !CONFIG_PREEMPT_RT_FULL */ +- +-static void pkg_thermal_notify_flush(void) { } +- +-static int pkg_thermal_notify(u64 msr_val) +-{ +- pkg_thermal_notify_work(NULL); + return 0; + } +-#endif /* CONFIG_PREEMPT_RT_FULL */ + + static int pkg_temp_thermal_device_add(unsigned int cpu) + { +@@ -573,7 +548,6 @@ static void __exit pkg_temp_thermal_exit(void) + platform_thermal_package_rate_control = NULL; + + cpuhp_remove_state(pkg_thermal_hp_state); +- pkg_thermal_notify_flush(); + debugfs_remove_recursive(debugfs); + kfree(packages); + } +diff --git a/fs/aio.c b/fs/aio.c +index a92119e05869..37e75bb0c406 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -121,7 +121,7 @@ struct kioctx { + long nr_pages; + + struct rcu_work free_rwork; /* see free_ioctx() */ +- struct kthread_work free_kwork; /* see free_ioctx() */ ++ struct work_struct free_work; /* see free_ioctx() */ + + /* + * signals when all in-flight requests are done +@@ -607,9 +607,9 @@ static void free_ioctx_reqs(struct percpu_ref *ref) + * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted - + * now it's safe to cancel any that need to be. + */ +-static void free_ioctx_users_work(struct kthread_work *work) ++static void free_ioctx_users_work(struct work_struct *work) + { +- struct kioctx *ctx = container_of(work, struct kioctx, free_kwork); ++ struct kioctx *ctx = container_of(work, struct kioctx, free_work); + struct aio_kiocb *req; + + spin_lock_irq(&ctx->ctx_lock); +@@ -631,8 +631,8 @@ static void free_ioctx_users(struct percpu_ref *ref) + { + struct kioctx *ctx = container_of(ref, struct kioctx, users); + +- kthread_init_work(&ctx->free_kwork, free_ioctx_users_work); +- kthread_schedule_work(&ctx->free_kwork); ++ INIT_WORK(&ctx->free_work, free_ioctx_users_work); ++ schedule_work(&ctx->free_work); + } + + static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm) +diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h +index 0473efda4c65..da587e60fe86 100644 +--- a/include/linux/blk-cgroup.h ++++ b/include/linux/blk-cgroup.h +@@ -14,7 +14,7 @@ + * Nauman Rafique + */ + +-#include ++#include + #include + #include + #include +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 981103415cd8..6a0bfa0a2c52 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -656,7 +656,7 @@ struct request_queue { + #endif + struct rcu_head rcu_head; + wait_queue_head_t mq_freeze_wq; +- struct kthread_work mq_pcpu_wake; ++ struct work_struct mq_pcpu_wake; + struct percpu_ref q_usage_counter; + struct list_head all_q_node; + +diff --git a/include/linux/kthread-cgroup.h b/include/linux/kthread-cgroup.h +deleted file mode 100644 +index 53d34bca9d72..000000000000 +--- a/include/linux/kthread-cgroup.h ++++ /dev/null +@@ -1,17 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _LINUX_KTHREAD_CGROUP_H +-#define _LINUX_KTHREAD_CGROUP_H +-#include +-#include +- +-#ifdef CONFIG_BLK_CGROUP +-void kthread_associate_blkcg(struct cgroup_subsys_state *css); +-struct cgroup_subsys_state *kthread_blkcg(void); +-#else +-static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } +-static inline struct cgroup_subsys_state *kthread_blkcg(void) +-{ +- return NULL; +-} +-#endif +-#endif +diff --git a/include/linux/kthread.h b/include/linux/kthread.h +index 7cf56eb54103..6b8c064f0cbc 100644 +--- a/include/linux/kthread.h ++++ b/include/linux/kthread.h +@@ -4,6 +4,7 @@ + /* Simple interface for creating and stopping kernel threads without mess. */ + #include + #include ++#include + + __printf(4, 5) + struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), +@@ -197,12 +198,14 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work); + + void kthread_destroy_worker(struct kthread_worker *worker); + +-extern struct kthread_worker kthread_global_worker; +-void kthread_init_global_worker(void); +- +-static inline bool kthread_schedule_work(struct kthread_work *work) ++#ifdef CONFIG_BLK_CGROUP ++void kthread_associate_blkcg(struct cgroup_subsys_state *css); ++struct cgroup_subsys_state *kthread_blkcg(void); ++#else ++static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } ++static inline struct cgroup_subsys_state *kthread_blkcg(void) + { +- return kthread_queue_work(&kthread_global_worker, work); ++ return NULL; + } +- ++#endif + #endif /* _LINUX_KTHREAD_H */ +diff --git a/include/linux/swait.h b/include/linux/swait.h +index f426a0661aa0..21ae66cd41d3 100644 +--- a/include/linux/swait.h ++++ b/include/linux/swait.h +@@ -299,4 +299,18 @@ do { \ + __ret; \ + }) + ++#define __swait_event_lock_irq(wq, condition, lock, cmd) \ ++ ___swait_event(wq, condition, TASK_UNINTERRUPTIBLE, 0, \ ++ raw_spin_unlock_irq(&lock); \ ++ cmd; \ ++ schedule(); \ ++ raw_spin_lock_irq(&lock)) ++ ++#define swait_event_lock_irq(wq_head, condition, lock) \ ++ do { \ ++ if (condition) \ ++ break; \ ++ __swait_event_lock_irq(wq_head, condition, lock, ); \ ++ } while (0) ++ + #endif /* _LINUX_SWAIT_H */ +diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h +index 60d673e15632..546aa73fba6a 100644 +--- a/include/linux/workqueue.h ++++ b/include/linux/workqueue.h +@@ -455,10 +455,6 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, + + extern void destroy_workqueue(struct workqueue_struct *wq); + +-struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask); +-void free_workqueue_attrs(struct workqueue_attrs *attrs); +-int apply_workqueue_attrs(struct workqueue_struct *wq, +- const struct workqueue_attrs *attrs); + int workqueue_set_unbound_cpumask(cpumask_var_t cpumask); + + extern bool queue_work_on(int cpu, struct workqueue_struct *wq, +diff --git a/init/main.c b/init/main.c +index e514dd93de76..6e02188386a7 100644 +--- a/init/main.c ++++ b/init/main.c +@@ -1129,7 +1129,6 @@ static noinline void __init kernel_init_freeable(void) + smp_prepare_cpus(setup_max_cpus); + + workqueue_init(); +- kthread_init_global_worker(); + + init_mm_internals(); + +diff --git a/kernel/kthread.c b/kernel/kthread.c +index 9db017761a1f..5641b55783a6 100644 +--- a/kernel/kthread.c ++++ b/kernel/kthread.c +@@ -20,7 +20,6 @@ + #include + #include + #include +-#include + #include + + static DEFINE_SPINLOCK(kthread_create_lock); +@@ -1181,19 +1180,6 @@ void kthread_destroy_worker(struct kthread_worker *worker) + } + EXPORT_SYMBOL(kthread_destroy_worker); + +-DEFINE_KTHREAD_WORKER(kthread_global_worker); +-EXPORT_SYMBOL(kthread_global_worker); +- +-__init void kthread_init_global_worker(void) +-{ +- kthread_global_worker.task = kthread_create(kthread_worker_fn, +- &kthread_global_worker, +- "kswork"); +- if (WARN_ON(IS_ERR(kthread_global_worker.task))) +- return; +- wake_up_process(kthread_global_worker.task); +-} +- + #ifdef CONFIG_BLK_CGROUP + /** + * kthread_associate_blkcg - associate blkcg to current kthread +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 678c2c4de4f5..a1c0123e7636 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -3607,6 +3607,7 @@ static inline void sched_submit_work(struct task_struct *tsk) + { + if (!tsk->state) + return; ++ + /* + * If a worker went to sleep, notify and ask workqueue whether + * it wants to wake up a task to maintain concurrency. +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index ed5d8d51ca91..94d97eae0a46 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -730,29 +730,6 @@ static void hrtimer_switch_to_hres(void) + retrigger_next_event(NULL); + } + +-#ifdef CONFIG_PREEMPT_RT_FULL +- +-static struct swork_event clock_set_delay_work; +- +-static void run_clock_set_delay(struct swork_event *event) +-{ +- clock_was_set(); +-} +- +-void clock_was_set_delayed(void) +-{ +- swork_queue(&clock_set_delay_work); +-} +- +-static __init int create_clock_set_delay_thread(void) +-{ +- WARN_ON(swork_get()); +- INIT_SWORK(&clock_set_delay_work, run_clock_set_delay); +- return 0; +-} +-early_initcall(create_clock_set_delay_thread); +-#else /* PREEMPT_RT_FULL */ +- + static void clock_was_set_work(struct work_struct *work) + { + clock_was_set(); +@@ -768,7 +745,6 @@ void clock_was_set_delayed(void) + { + schedule_work(&hrtimer_work); + } +-#endif + + #else + +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 9c10264d2679..e6a96fe8896b 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -49,8 +49,6 @@ + #include + #include + #include +-#include +-#include + + #include "workqueue_internal.h" + +@@ -125,11 +123,6 @@ enum { + * cpu or grabbing pool->lock is enough for read access. If + * POOL_DISASSOCIATED is set, it's identical to L. + * +- * On RT we need the extra protection via rt_lock_idle_list() for +- * the list manipulations against read access from +- * wq_worker_sleeping(). All other places are nicely serialized via +- * pool->lock. +- * + * A: wq_pool_attach_mutex protected. + * + * PL: wq_pool_mutex protected. +@@ -151,7 +144,7 @@ enum { + /* struct worker is defined in workqueue_internal.h */ + + struct worker_pool { +- spinlock_t lock; /* the pool lock */ ++ raw_spinlock_t lock; /* the pool lock */ + int cpu; /* I: the associated cpu */ + int node; /* I: the associated node ID */ + int id; /* I: pool ID */ +@@ -304,8 +297,8 @@ static struct workqueue_attrs *wq_update_unbound_numa_attrs_buf; + + static DEFINE_MUTEX(wq_pool_mutex); /* protects pools and workqueues list */ + static DEFINE_MUTEX(wq_pool_attach_mutex); /* protects worker attach/detach */ +-static DEFINE_SPINLOCK(wq_mayday_lock); /* protects wq->maydays list */ +-static DECLARE_WAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */ ++static DEFINE_RAW_SPINLOCK(wq_mayday_lock); /* protects wq->maydays list */ ++static DECLARE_SWAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */ + + static LIST_HEAD(workqueues); /* PR: list of all workqueues */ + static bool workqueue_freezing; /* PL: have wqs started freezing? */ +@@ -357,8 +350,6 @@ EXPORT_SYMBOL_GPL(system_power_efficient_wq); + struct workqueue_struct *system_freezable_power_efficient_wq __read_mostly; + EXPORT_SYMBOL_GPL(system_freezable_power_efficient_wq); + +-static DEFINE_LOCAL_IRQ_LOCK(pendingb_lock); +- + static int worker_thread(void *__worker); + static void workqueue_sysfs_unregister(struct workqueue_struct *wq); + +@@ -435,31 +426,6 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); + if (({ assert_rcu_or_wq_mutex(wq); false; })) { } \ + else + +-#ifdef CONFIG_PREEMPT_RT_BASE +-static inline void rt_lock_idle_list(struct worker_pool *pool) +-{ +- preempt_disable(); +-} +-static inline void rt_unlock_idle_list(struct worker_pool *pool) +-{ +- preempt_enable(); +-} +-static inline void sched_lock_idle_list(struct worker_pool *pool) { } +-static inline void sched_unlock_idle_list(struct worker_pool *pool) { } +-#else +-static inline void rt_lock_idle_list(struct worker_pool *pool) { } +-static inline void rt_unlock_idle_list(struct worker_pool *pool) { } +-static inline void sched_lock_idle_list(struct worker_pool *pool) +-{ +- spin_lock_irq(&pool->lock); +-} +-static inline void sched_unlock_idle_list(struct worker_pool *pool) +-{ +- spin_unlock_irq(&pool->lock); +-} +-#endif +- +- + #ifdef CONFIG_DEBUG_OBJECTS_WORK + + static struct debug_obj_descr work_debug_descr; +@@ -862,20 +828,14 @@ static struct worker *first_idle_worker(struct worker_pool *pool) + * Wake up the first idle worker of @pool. + * + * CONTEXT: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void wake_up_worker(struct worker_pool *pool) + { +- struct worker *worker; +- +- rt_lock_idle_list(pool); +- +- worker = first_idle_worker(pool); ++ struct worker *worker = first_idle_worker(pool); + + if (likely(worker)) + wake_up_process(worker->task); +- +- rt_unlock_idle_list(pool); + } + + /** +@@ -904,7 +864,7 @@ void wq_worker_running(struct task_struct *task) + */ + void wq_worker_sleeping(struct task_struct *task) + { +- struct worker *worker = kthread_data(task); ++ struct worker *next, *worker = kthread_data(task); + struct worker_pool *pool; + + /* +@@ -921,18 +881,26 @@ void wq_worker_sleeping(struct task_struct *task) + return; + + worker->sleeping = 1; ++ raw_spin_lock_irq(&pool->lock); + + /* + * The counterpart of the following dec_and_test, implied mb, + * worklist not empty test sequence is in insert_work(). + * Please read comment there. ++ * ++ * NOT_RUNNING is clear. This means that we're bound to and ++ * running on the local cpu w/ rq lock held and preemption ++ * disabled, which in turn means that none else could be ++ * manipulating idle_list, so dereferencing idle_list without pool ++ * lock is safe. + */ + if (atomic_dec_and_test(&pool->nr_running) && + !list_empty(&pool->worklist)) { +- sched_lock_idle_list(pool); +- wake_up_worker(pool); +- sched_unlock_idle_list(pool); ++ next = first_idle_worker(pool); ++ if (next) ++ wake_up_process(next->task); + } ++ raw_spin_unlock_irq(&pool->lock); + } + + /** +@@ -943,7 +911,7 @@ void wq_worker_sleeping(struct task_struct *task) + * Set @flags in @worker->flags and adjust nr_running accordingly. + * + * CONTEXT: +- * spin_lock_irq(pool->lock) ++ * raw_spin_lock_irq(pool->lock) + */ + static inline void worker_set_flags(struct worker *worker, unsigned int flags) + { +@@ -968,7 +936,7 @@ static inline void worker_set_flags(struct worker *worker, unsigned int flags) + * Clear @flags in @worker->flags and adjust nr_running accordingly. + * + * CONTEXT: +- * spin_lock_irq(pool->lock) ++ * raw_spin_lock_irq(pool->lock) + */ + static inline void worker_clr_flags(struct worker *worker, unsigned int flags) + { +@@ -1016,7 +984,7 @@ static inline void worker_clr_flags(struct worker *worker, unsigned int flags) + * actually occurs, it should be easy to locate the culprit work function. + * + * CONTEXT: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + * + * Return: + * Pointer to worker which is executing @work if found, %NULL +@@ -1051,7 +1019,7 @@ static struct worker *find_worker_executing_work(struct worker_pool *pool, + * nested inside outer list_for_each_entry_safe(). + * + * CONTEXT: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void move_linked_works(struct work_struct *work, struct list_head *head, + struct work_struct **nextp) +@@ -1129,11 +1097,9 @@ static void put_pwq_unlocked(struct pool_workqueue *pwq) + * As both pwqs and pools are RCU protected, the + * following lock operations are safe. + */ +- rcu_read_lock(); +- local_spin_lock_irq(pendingb_lock, &pwq->pool->lock); ++ raw_spin_lock_irq(&pwq->pool->lock); + put_pwq(pwq); +- local_spin_unlock_irq(pendingb_lock, &pwq->pool->lock); +- rcu_read_unlock(); ++ raw_spin_unlock_irq(&pwq->pool->lock); + } + } + +@@ -1166,7 +1132,7 @@ static void pwq_activate_first_delayed(struct pool_workqueue *pwq) + * decrement nr_in_flight of its pwq and handle workqueue flushing. + * + * CONTEXT: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, int color) + { +@@ -1237,7 +1203,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + struct worker_pool *pool; + struct pool_workqueue *pwq; + +- local_lock_irqsave(pendingb_lock, *flags); ++ local_irq_save(*flags); + + /* try to steal the timer if it exists */ + if (is_dwork) { +@@ -1265,7 +1231,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + if (!pool) + goto fail; + +- spin_lock(&pool->lock); ++ raw_spin_lock(&pool->lock); + /* + * work->data is guaranteed to point to pwq only while the work + * item is queued on pwq->wq, and both updating work->data to point +@@ -1294,17 +1260,17 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + /* work->data points to pwq iff queued, point to pool */ + set_work_pool_and_keep_pending(work, pool->id); + +- spin_unlock(&pool->lock); ++ raw_spin_unlock(&pool->lock); + rcu_read_unlock(); + return 1; + } +- spin_unlock(&pool->lock); ++ raw_spin_unlock(&pool->lock); + fail: + rcu_read_unlock(); +- local_unlock_irqrestore(pendingb_lock, *flags); ++ local_irq_restore(*flags); + if (work_is_canceling(work)) + return -ENOENT; +- cpu_chill(); ++ cpu_relax(); + return -EAGAIN; + } + +@@ -1319,7 +1285,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, + * work_struct flags. + * + * CONTEXT: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void insert_work(struct pool_workqueue *pwq, struct work_struct *work, + struct list_head *head, unsigned int extra_flags) +@@ -1406,13 +1372,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + * queued or lose PENDING. Grabbing PENDING and queueing should + * happen with IRQ disabled. + */ +-#ifndef CONFIG_PREEMPT_RT_FULL +- /* +- * nort: On RT the "interrupts-disabled" rule has been replaced with +- * pendingb_lock. +- */ + lockdep_assert_irqs_disabled(); +-#endif + + debug_work_activate(work); + +@@ -1442,7 +1402,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + if (last_pool && last_pool != pwq->pool) { + struct worker *worker; + +- spin_lock(&last_pool->lock); ++ raw_spin_lock(&last_pool->lock); + + worker = find_worker_executing_work(last_pool, work); + +@@ -1450,11 +1410,11 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + pwq = worker->current_pwq; + } else { + /* meh... not running there, queue here */ +- spin_unlock(&last_pool->lock); +- spin_lock(&pwq->pool->lock); ++ raw_spin_unlock(&last_pool->lock); ++ raw_spin_lock(&pwq->pool->lock); + } + } else { +- spin_lock(&pwq->pool->lock); ++ raw_spin_lock(&pwq->pool->lock); + } + + /* +@@ -1467,7 +1427,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + */ + if (unlikely(!pwq->refcnt)) { + if (wq->flags & WQ_UNBOUND) { +- spin_unlock(&pwq->pool->lock); ++ raw_spin_unlock(&pwq->pool->lock); + cpu_relax(); + goto retry; + } +@@ -1499,7 +1459,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, + insert_work(pwq, work, worklist, work_flags); + + out: +- spin_unlock(&pwq->pool->lock); ++ raw_spin_unlock(&pwq->pool->lock); + rcu_read_unlock(); + } + +@@ -1520,14 +1480,14 @@ bool queue_work_on(int cpu, struct workqueue_struct *wq, + bool ret = false; + unsigned long flags; + +- local_lock_irqsave(pendingb_lock,flags); ++ local_irq_save(flags); + + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { + __queue_work(cpu, wq, work); + ret = true; + } + +- local_unlock_irqrestore(pendingb_lock, flags); ++ local_irq_restore(flags); + return ret; + } + EXPORT_SYMBOL(queue_work_on); +@@ -1535,12 +1495,11 @@ EXPORT_SYMBOL(queue_work_on); + void delayed_work_timer_fn(struct timer_list *t) + { + struct delayed_work *dwork = from_timer(dwork, t, timer); ++ unsigned long flags; + +- /* XXX */ +- /* local_lock(pendingb_lock); */ +- /* should have been called from irqsafe timer with irq already off */ ++ local_irq_save(flags); + __queue_work(dwork->cpu, dwork->wq, &dwork->work); +- /* local_unlock(pendingb_lock); */ ++ local_irq_restore(flags); + } + EXPORT_SYMBOL(delayed_work_timer_fn); + +@@ -1595,14 +1554,14 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, + unsigned long flags; + + /* read the comment in __queue_work() */ +- local_lock_irqsave(pendingb_lock, flags); ++ local_irq_save(flags); + + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { + __queue_delayed_work(cpu, wq, dwork, delay); + ret = true; + } + +- local_unlock_irqrestore(pendingb_lock, flags); ++ local_irq_restore(flags); + return ret; + } + EXPORT_SYMBOL(queue_delayed_work_on); +@@ -1637,7 +1596,7 @@ bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq, + + if (likely(ret >= 0)) { + __queue_delayed_work(cpu, wq, dwork, delay); +- local_unlock_irqrestore(pendingb_lock, flags); ++ local_irq_restore(flags); + } + + /* -ENOENT from try_to_grab_pending() becomes %true */ +@@ -1648,12 +1607,11 @@ EXPORT_SYMBOL_GPL(mod_delayed_work_on); + static void rcu_work_rcufn(struct rcu_head *rcu) + { + struct rcu_work *rwork = container_of(rcu, struct rcu_work, rcu); +- unsigned long flags; + + /* read the comment in __queue_work() */ +- local_lock_irqsave(pendingb_lock, flags); ++ local_irq_disable(); + __queue_work(WORK_CPU_UNBOUND, rwork->wq, &rwork->work); +- local_unlock_irqrestore(pendingb_lock, flags); ++ local_irq_enable(); + } + + /** +@@ -1688,7 +1646,7 @@ EXPORT_SYMBOL(queue_rcu_work); + * necessary. + * + * LOCKING: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void worker_enter_idle(struct worker *worker) + { +@@ -1705,9 +1663,7 @@ static void worker_enter_idle(struct worker *worker) + worker->last_active = jiffies; + + /* idle_list is LIFO */ +- rt_lock_idle_list(pool); + list_add(&worker->entry, &pool->idle_list); +- rt_unlock_idle_list(pool); + + if (too_many_workers(pool) && !timer_pending(&pool->idle_timer)) + mod_timer(&pool->idle_timer, jiffies + IDLE_WORKER_TIMEOUT); +@@ -1730,7 +1686,7 @@ static void worker_enter_idle(struct worker *worker) + * @worker is leaving idle state. Update stats. + * + * LOCKING: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void worker_leave_idle(struct worker *worker) + { +@@ -1740,9 +1696,7 @@ static void worker_leave_idle(struct worker *worker) + return; + worker_clr_flags(worker, WORKER_IDLE); + pool->nr_idle--; +- rt_lock_idle_list(pool); + list_del_init(&worker->entry); +- rt_unlock_idle_list(pool); + } + + static struct worker *alloc_worker(int node) +@@ -1870,11 +1824,11 @@ static struct worker *create_worker(struct worker_pool *pool) + worker_attach_to_pool(worker, pool); + + /* start the newly created worker */ +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + worker->pool->nr_workers++; + worker_enter_idle(worker); + wake_up_process(worker->task); +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + + return worker; + +@@ -1893,7 +1847,7 @@ static struct worker *create_worker(struct worker_pool *pool) + * be idle. + * + * CONTEXT: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void destroy_worker(struct worker *worker) + { +@@ -1910,9 +1864,7 @@ static void destroy_worker(struct worker *worker) + pool->nr_workers--; + pool->nr_idle--; + +- rt_lock_idle_list(pool); + list_del_init(&worker->entry); +- rt_unlock_idle_list(pool); + worker->flags |= WORKER_DIE; + wake_up_process(worker->task); + } +@@ -1921,7 +1873,7 @@ static void idle_worker_timeout(struct timer_list *t) + { + struct worker_pool *pool = from_timer(pool, t, idle_timer); + +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + + while (too_many_workers(pool)) { + struct worker *worker; +@@ -1939,7 +1891,7 @@ static void idle_worker_timeout(struct timer_list *t) + destroy_worker(worker); + } + +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + } + + static void send_mayday(struct work_struct *work) +@@ -1970,8 +1922,8 @@ static void pool_mayday_timeout(struct timer_list *t) + struct worker_pool *pool = from_timer(pool, t, mayday_timer); + struct work_struct *work; + +- spin_lock_irq(&pool->lock); +- spin_lock(&wq_mayday_lock); /* for wq->maydays */ ++ raw_spin_lock_irq(&pool->lock); ++ raw_spin_lock(&wq_mayday_lock); /* for wq->maydays */ + + if (need_to_create_worker(pool)) { + /* +@@ -1984,8 +1936,8 @@ static void pool_mayday_timeout(struct timer_list *t) + send_mayday(work); + } + +- spin_unlock(&wq_mayday_lock); +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock(&wq_mayday_lock); ++ raw_spin_unlock_irq(&pool->lock); + + mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INTERVAL); + } +@@ -2004,7 +1956,7 @@ static void pool_mayday_timeout(struct timer_list *t) + * may_start_working() %true. + * + * LOCKING: +- * spin_lock_irq(pool->lock) which may be released and regrabbed ++ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed + * multiple times. Does GFP_KERNEL allocations. Called only from + * manager. + */ +@@ -2013,7 +1965,7 @@ __releases(&pool->lock) + __acquires(&pool->lock) + { + restart: +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + + /* if we don't make progress in MAYDAY_INITIAL_TIMEOUT, call for help */ + mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INITIAL_TIMEOUT); +@@ -2029,7 +1981,7 @@ __acquires(&pool->lock) + } + + del_timer_sync(&pool->mayday_timer); +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + /* + * This is necessary even after a new worker was just successfully + * created as @pool->lock was dropped and the new worker might have +@@ -2052,7 +2004,7 @@ __acquires(&pool->lock) + * and may_start_working() is true. + * + * CONTEXT: +- * spin_lock_irq(pool->lock) which may be released and regrabbed ++ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed + * multiple times. Does GFP_KERNEL allocations. + * + * Return: +@@ -2075,7 +2027,7 @@ static bool manage_workers(struct worker *worker) + + pool->manager = NULL; + pool->flags &= ~POOL_MANAGER_ACTIVE; +- wake_up(&wq_manager_wait); ++ swake_up_one(&wq_manager_wait); + return true; + } + +@@ -2091,7 +2043,7 @@ static bool manage_workers(struct worker *worker) + * call this function to process a work. + * + * CONTEXT: +- * spin_lock_irq(pool->lock) which is released and regrabbed. ++ * raw_spin_lock_irq(pool->lock) which is released and regrabbed. + */ + static void process_one_work(struct worker *worker, struct work_struct *work) + __releases(&pool->lock) +@@ -2173,7 +2125,7 @@ __acquires(&pool->lock) + */ + set_work_pool_and_clear_pending(work, pool->id); + +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + + lock_map_acquire(&pwq->wq->lockdep_map); + lock_map_acquire(&lockdep_map); +@@ -2228,7 +2180,7 @@ __acquires(&pool->lock) + */ + cond_resched(); + +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + + /* clear cpu intensive status */ + if (unlikely(cpu_intensive)) +@@ -2251,7 +2203,7 @@ __acquires(&pool->lock) + * fetches a work from the top and executes it. + * + * CONTEXT: +- * spin_lock_irq(pool->lock) which may be released and regrabbed ++ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed + * multiple times. + */ + static void process_scheduled_works(struct worker *worker) +@@ -2293,11 +2245,11 @@ static int worker_thread(void *__worker) + /* tell the scheduler that this is a workqueue worker */ + set_pf_worker(true); + woke_up: +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + + /* am I supposed to die? */ + if (unlikely(worker->flags & WORKER_DIE)) { +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + WARN_ON_ONCE(!list_empty(&worker->entry)); + set_pf_worker(false); + +@@ -2363,7 +2315,7 @@ static int worker_thread(void *__worker) + */ + worker_enter_idle(worker); + __set_current_state(TASK_IDLE); +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + schedule(); + goto woke_up; + } +@@ -2417,7 +2369,7 @@ static int rescuer_thread(void *__rescuer) + should_stop = kthread_should_stop(); + + /* see whether any pwq is asking for help */ +- spin_lock_irq(&wq_mayday_lock); ++ raw_spin_lock_irq(&wq_mayday_lock); + + while (!list_empty(&wq->maydays)) { + struct pool_workqueue *pwq = list_first_entry(&wq->maydays, +@@ -2429,11 +2381,11 @@ static int rescuer_thread(void *__rescuer) + __set_current_state(TASK_RUNNING); + list_del_init(&pwq->mayday_node); + +- spin_unlock_irq(&wq_mayday_lock); ++ raw_spin_unlock_irq(&wq_mayday_lock); + + worker_attach_to_pool(rescuer, pool); + +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + + /* + * Slurp in all works issued via this workqueue and +@@ -2462,7 +2414,7 @@ static int rescuer_thread(void *__rescuer) + * incur MAYDAY_INTERVAL delay inbetween. + */ + if (need_to_create_worker(pool)) { +- spin_lock(&wq_mayday_lock); ++ raw_spin_lock(&wq_mayday_lock); + /* + * Queue iff we aren't racing destruction + * and somebody else hasn't queued it already. +@@ -2471,7 +2423,7 @@ static int rescuer_thread(void *__rescuer) + get_pwq(pwq); + list_add_tail(&pwq->mayday_node, &wq->maydays); + } +- spin_unlock(&wq_mayday_lock); ++ raw_spin_unlock(&wq_mayday_lock); + } + } + +@@ -2489,14 +2441,14 @@ static int rescuer_thread(void *__rescuer) + if (need_more_worker(pool)) + wake_up_worker(pool); + +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + + worker_detach_from_pool(rescuer); + +- spin_lock_irq(&wq_mayday_lock); ++ raw_spin_lock_irq(&wq_mayday_lock); + } + +- spin_unlock_irq(&wq_mayday_lock); ++ raw_spin_unlock_irq(&wq_mayday_lock); + + if (should_stop) { + __set_current_state(TASK_RUNNING); +@@ -2576,7 +2528,7 @@ static void wq_barrier_func(struct work_struct *work) + * underneath us, so we can't reliably determine pwq from @target. + * + * CONTEXT: +- * spin_lock_irq(pool->lock). ++ * raw_spin_lock_irq(pool->lock). + */ + static void insert_wq_barrier(struct pool_workqueue *pwq, + struct wq_barrier *barr, +@@ -2663,7 +2615,7 @@ static bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq, + for_each_pwq(pwq, wq) { + struct worker_pool *pool = pwq->pool; + +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + + if (flush_color >= 0) { + WARN_ON_ONCE(pwq->flush_color != -1); +@@ -2680,7 +2632,7 @@ static bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq, + pwq->work_color = work_color; + } + +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + } + + if (flush_color >= 0 && atomic_dec_and_test(&wq->nr_pwqs_to_flush)) +@@ -2880,9 +2832,9 @@ void drain_workqueue(struct workqueue_struct *wq) + for_each_pwq(pwq, wq) { + bool drained; + +- spin_lock_irq(&pwq->pool->lock); ++ raw_spin_lock_irq(&pwq->pool->lock); + drained = !pwq->nr_active && list_empty(&pwq->delayed_works); +- spin_unlock_irq(&pwq->pool->lock); ++ raw_spin_unlock_irq(&pwq->pool->lock); + + if (drained) + continue; +@@ -2918,7 +2870,7 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, + return false; + } + +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + /* see the comment in try_to_grab_pending() with the same code */ + pwq = get_work_pwq(work); + if (pwq) { +@@ -2934,7 +2886,7 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, + check_flush_dependency(pwq->wq, work); + + insert_wq_barrier(pwq, barr, work, worker); +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + + /* + * Force a lock recursion deadlock when using flush_work() inside a +@@ -2953,7 +2905,7 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, + rcu_read_unlock(); + return true; + already_gone: +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + rcu_read_unlock(); + return false; + } +@@ -3054,7 +3006,7 @@ static bool __cancel_work_timer(struct work_struct *work, bool is_dwork) + + /* tell other tasks trying to grab @work to back off */ + mark_work_canceling(work); +- local_unlock_irqrestore(pendingb_lock, flags); ++ local_irq_restore(flags); + + /* + * This allows canceling during early boot. We know that @work +@@ -3115,10 +3067,10 @@ EXPORT_SYMBOL_GPL(cancel_work_sync); + */ + bool flush_delayed_work(struct delayed_work *dwork) + { +- local_lock_irq(pendingb_lock); ++ local_irq_disable(); + if (del_timer_sync(&dwork->timer)) + __queue_work(dwork->cpu, dwork->wq, &dwork->work); +- local_unlock_irq(pendingb_lock); ++ local_irq_enable(); + return flush_work(&dwork->work); + } + EXPORT_SYMBOL(flush_delayed_work); +@@ -3156,7 +3108,7 @@ static bool __cancel_work(struct work_struct *work, bool is_dwork) + return false; + + set_work_pool_and_clear_pending(work, get_work_pool_id(work)); +- local_unlock_irqrestore(pendingb_lock, flags); ++ local_irq_restore(flags); + return ret; + } + +@@ -3266,7 +3218,7 @@ EXPORT_SYMBOL_GPL(execute_in_process_context); + * + * Undo alloc_workqueue_attrs(). + */ +-void free_workqueue_attrs(struct workqueue_attrs *attrs) ++static void free_workqueue_attrs(struct workqueue_attrs *attrs) + { + if (attrs) { + free_cpumask_var(attrs->cpumask); +@@ -3276,21 +3228,20 @@ void free_workqueue_attrs(struct workqueue_attrs *attrs) + + /** + * alloc_workqueue_attrs - allocate a workqueue_attrs +- * @gfp_mask: allocation mask to use + * + * Allocate a new workqueue_attrs, initialize with default settings and + * return it. + * + * Return: The allocated new workqueue_attr on success. %NULL on failure. + */ +-struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask) ++static struct workqueue_attrs *alloc_workqueue_attrs(void) + { + struct workqueue_attrs *attrs; + +- attrs = kzalloc(sizeof(*attrs), gfp_mask); ++ attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); + if (!attrs) + goto fail; +- if (!alloc_cpumask_var(&attrs->cpumask, gfp_mask)) ++ if (!alloc_cpumask_var(&attrs->cpumask, GFP_KERNEL)) + goto fail; + + cpumask_copy(attrs->cpumask, cpu_possible_mask); +@@ -3347,7 +3298,7 @@ static bool wqattrs_equal(const struct workqueue_attrs *a, + */ + static int init_worker_pool(struct worker_pool *pool) + { +- spin_lock_init(&pool->lock); ++ raw_spin_lock_init(&pool->lock); + pool->id = -1; + pool->cpu = -1; + pool->node = NUMA_NO_NODE; +@@ -3368,7 +3319,7 @@ static int init_worker_pool(struct worker_pool *pool) + pool->refcnt = 1; + + /* shouldn't fail above this point */ +- pool->attrs = alloc_workqueue_attrs(GFP_KERNEL); ++ pool->attrs = alloc_workqueue_attrs(); + if (!pool->attrs) + return -ENOMEM; + return 0; +@@ -3433,15 +3384,15 @@ static void put_unbound_pool(struct worker_pool *pool) + * @pool's workers from blocking on attach_mutex. We're the last + * manager and @pool gets freed with the flag set. + */ +- spin_lock_irq(&pool->lock); +- wait_event_lock_irq(wq_manager_wait, ++ raw_spin_lock_irq(&pool->lock); ++ swait_event_lock_irq(wq_manager_wait, + !(pool->flags & POOL_MANAGER_ACTIVE), pool->lock); + pool->flags |= POOL_MANAGER_ACTIVE; + + while ((worker = first_idle_worker(pool))) + destroy_worker(worker); + WARN_ON(pool->nr_workers || pool->nr_idle); +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + + mutex_lock(&wq_pool_attach_mutex); + if (!list_empty(&pool->workers)) +@@ -3595,7 +3546,7 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) + return; + + /* this function can be called during early boot w/ irq disabled */ +- spin_lock_irqsave(&pwq->pool->lock, flags); ++ raw_spin_lock_irqsave(&pwq->pool->lock, flags); + + /* + * During [un]freezing, the caller is responsible for ensuring that +@@ -3618,7 +3569,7 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) + pwq->max_active = 0; + } + +- spin_unlock_irqrestore(&pwq->pool->lock, flags); ++ raw_spin_unlock_irqrestore(&pwq->pool->lock, flags); + } + + /* initialize newly alloced @pwq which is associated with @wq and @pool */ +@@ -3791,8 +3742,8 @@ apply_wqattrs_prepare(struct workqueue_struct *wq, + + ctx = kzalloc(struct_size(ctx, pwq_tbl, nr_node_ids), GFP_KERNEL); + +- new_attrs = alloc_workqueue_attrs(GFP_KERNEL); +- tmp_attrs = alloc_workqueue_attrs(GFP_KERNEL); ++ new_attrs = alloc_workqueue_attrs(); ++ tmp_attrs = alloc_workqueue_attrs(); + if (!ctx || !new_attrs || !tmp_attrs) + goto out_free; + +@@ -3928,7 +3879,7 @@ static int apply_workqueue_attrs_locked(struct workqueue_struct *wq, + * + * Return: 0 on success and -errno on failure. + */ +-int apply_workqueue_attrs(struct workqueue_struct *wq, ++static int apply_workqueue_attrs(struct workqueue_struct *wq, + const struct workqueue_attrs *attrs) + { + int ret; +@@ -3939,7 +3890,6 @@ int apply_workqueue_attrs(struct workqueue_struct *wq, + + return ret; + } +-EXPORT_SYMBOL_GPL(apply_workqueue_attrs); + + /** + * wq_update_unbound_numa - update NUMA affinity of a wq for CPU hot[un]plug +@@ -4017,9 +3967,9 @@ static void wq_update_unbound_numa(struct workqueue_struct *wq, int cpu, + + use_dfl_pwq: + mutex_lock(&wq->mutex); +- spin_lock_irq(&wq->dfl_pwq->pool->lock); ++ raw_spin_lock_irq(&wq->dfl_pwq->pool->lock); + get_pwq(wq->dfl_pwq); +- spin_unlock_irq(&wq->dfl_pwq->pool->lock); ++ raw_spin_unlock_irq(&wq->dfl_pwq->pool->lock); + old_pwq = numa_pwq_tbl_install(wq, node, wq->dfl_pwq); + out_unlock: + mutex_unlock(&wq->mutex); +@@ -4138,7 +4088,7 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt, + return NULL; + + if (flags & WQ_UNBOUND) { +- wq->unbound_attrs = alloc_workqueue_attrs(GFP_KERNEL); ++ wq->unbound_attrs = alloc_workqueue_attrs(); + if (!wq->unbound_attrs) + goto err_free_wq; + } +@@ -4225,9 +4175,9 @@ void destroy_workqueue(struct workqueue_struct *wq) + struct worker *rescuer = wq->rescuer; + + /* this prevents new queueing */ +- spin_lock_irq(&wq_mayday_lock); ++ raw_spin_lock_irq(&wq_mayday_lock); + wq->rescuer = NULL; +- spin_unlock_irq(&wq_mayday_lock); ++ raw_spin_unlock_irq(&wq_mayday_lock); + + /* rescuer will empty maydays list before exiting */ + kthread_stop(rescuer->task); +@@ -4422,10 +4372,10 @@ unsigned int work_busy(struct work_struct *work) + rcu_read_lock(); + pool = get_work_pool(work); + if (pool) { +- spin_lock_irqsave(&pool->lock, flags); ++ raw_spin_lock_irqsave(&pool->lock, flags); + if (find_worker_executing_work(pool, work)) + ret |= WORK_BUSY_RUNNING; +- spin_unlock_irqrestore(&pool->lock, flags); ++ raw_spin_unlock_irqrestore(&pool->lock, flags); + } + rcu_read_unlock(); + +@@ -4632,10 +4582,10 @@ void show_workqueue_state(void) + pr_info("workqueue %s: flags=0x%x\n", wq->name, wq->flags); + + for_each_pwq(pwq, wq) { +- spin_lock_irqsave(&pwq->pool->lock, flags); ++ raw_spin_lock_irqsave(&pwq->pool->lock, flags); + if (pwq->nr_active || !list_empty(&pwq->delayed_works)) + show_pwq(pwq); +- spin_unlock_irqrestore(&pwq->pool->lock, flags); ++ raw_spin_unlock_irqrestore(&pwq->pool->lock, flags); + /* + * We could be printing a lot from atomic context, e.g. + * sysrq-t -> show_workqueue_state(). Avoid triggering +@@ -4649,7 +4599,7 @@ void show_workqueue_state(void) + struct worker *worker; + bool first = true; + +- spin_lock_irqsave(&pool->lock, flags); ++ raw_spin_lock_irqsave(&pool->lock, flags); + if (pool->nr_workers == pool->nr_idle) + goto next_pool; + +@@ -4668,7 +4618,7 @@ void show_workqueue_state(void) + } + pr_cont("\n"); + next_pool: +- spin_unlock_irqrestore(&pool->lock, flags); ++ raw_spin_unlock_irqrestore(&pool->lock, flags); + /* + * We could be printing a lot from atomic context, e.g. + * sysrq-t -> show_workqueue_state(). Avoid triggering +@@ -4698,7 +4648,7 @@ void wq_worker_comm(char *buf, size_t size, struct task_struct *task) + struct worker_pool *pool = worker->pool; + + if (pool) { +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + /* + * ->desc tracks information (wq name or + * set_worker_desc()) for the latest execution. If +@@ -4712,7 +4662,7 @@ void wq_worker_comm(char *buf, size_t size, struct task_struct *task) + scnprintf(buf + off, size - off, "-%s", + worker->desc); + } +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + } + } + +@@ -4743,7 +4693,7 @@ static void unbind_workers(int cpu) + + for_each_cpu_worker_pool(pool, cpu) { + mutex_lock(&wq_pool_attach_mutex); +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + + /* + * We've blocked all attach/detach operations. Make all workers +@@ -4757,7 +4707,7 @@ static void unbind_workers(int cpu) + + pool->flags |= POOL_DISASSOCIATED; + +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + mutex_unlock(&wq_pool_attach_mutex); + + /* +@@ -4783,9 +4733,9 @@ static void unbind_workers(int cpu) + * worker blocking could lead to lengthy stalls. Kick off + * unbound chain execution of currently pending work items. + */ +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + wake_up_worker(pool); +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + } + } + +@@ -4812,7 +4762,7 @@ static void rebind_workers(struct worker_pool *pool) + WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, + pool->attrs->cpumask) < 0); + +- spin_lock_irq(&pool->lock); ++ raw_spin_lock_irq(&pool->lock); + + pool->flags &= ~POOL_DISASSOCIATED; + +@@ -4851,7 +4801,7 @@ static void rebind_workers(struct worker_pool *pool) + WRITE_ONCE(worker->flags, worker_flags); + } + +- spin_unlock_irq(&pool->lock); ++ raw_spin_unlock_irq(&pool->lock); + } + + /** +@@ -5303,7 +5253,7 @@ static struct workqueue_attrs *wq_sysfs_prep_attrs(struct workqueue_struct *wq) + + lockdep_assert_held(&wq_pool_mutex); + +- attrs = alloc_workqueue_attrs(GFP_KERNEL); ++ attrs = alloc_workqueue_attrs(); + if (!attrs) + return NULL; + +@@ -5725,7 +5675,7 @@ static void __init wq_numa_init(void) + return; + } + +- wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(GFP_KERNEL); ++ wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(); + BUG_ON(!wq_update_unbound_numa_attrs_buf); + + /* +@@ -5800,7 +5750,7 @@ int __init workqueue_init_early(void) + for (i = 0; i < NR_STD_WORKER_POOLS; i++) { + struct workqueue_attrs *attrs; + +- BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); ++ BUG_ON(!(attrs = alloc_workqueue_attrs())); + attrs->nice = std_nice[i]; + unbound_std_wq_attrs[i] = attrs; + +@@ -5809,7 +5759,7 @@ int __init workqueue_init_early(void) + * guaranteed by max_active which is enforced by pwqs. + * Turn off NUMA so that dfl_pwq is used for all nodes. + */ +- BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); ++ BUG_ON(!(attrs = alloc_workqueue_attrs())); + attrs->nice = std_nice[i]; + attrs->no_numa = true; + ordered_wq_attrs[i] = attrs; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0287-i2c-exynos5-Remove-IRQF_ONESHOT.patch linux-4.19.118/debian/patches-rt/0287-i2c-exynos5-Remove-IRQF_ONESHOT.patch --- linux-4.19.98/debian/patches-rt/0287-i2c-exynos5-Remove-IRQF_ONESHOT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0287-i2c-exynos5-Remove-IRQF_ONESHOT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,48 @@ +From a6f963a5d04359e6b27fc6a6ec9da5754729d0e0 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 13 Aug 2019 12:30:12 +0200 +Subject: [PATCH 287/325] i2c: exynos5: Remove IRQF_ONESHOT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 4b217df0ab3f7910c96e42091cc7d9f221d05f01 ] + +The drivers sets IRQF_ONESHOT and passes only a primary handler. The IRQ +is masked while the primary is handler is invoked independently of +IRQF_ONESHOT. +With IRQF_ONESHOT the core code will not force-thread the interrupt and +this is probably not intended. I *assume* that the original author copied +the IRQ registration from another driver which passed a primary and +secondary handler and removed the secondary handler but keeping the +ONESHOT flag. + +Remove IRQF_ONESHOT. + +Reported-by: Benjamin Rouxel +Tested-by: Benjamin Rouxel +Cc: Kukjin Kim +Cc: Krzysztof Kozlowski +Cc: linux-samsung-soc@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/i2c/busses/i2c-exynos5.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c +index c1ce2299a76e..5c57ecf4b79e 100644 +--- a/drivers/i2c/busses/i2c-exynos5.c ++++ b/drivers/i2c/busses/i2c-exynos5.c +@@ -800,9 +800,7 @@ static int exynos5_i2c_probe(struct platform_device *pdev) + } + + ret = devm_request_irq(&pdev->dev, i2c->irq, exynos5_i2c_irq, +- IRQF_NO_SUSPEND | IRQF_ONESHOT, +- dev_name(&pdev->dev), i2c); +- ++ IRQF_NO_SUSPEND, dev_name(&pdev->dev), i2c); + if (ret != 0) { + dev_err(&pdev->dev, "cannot request HS-I2C IRQ %d\n", i2c->irq); + goto err_clk; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0287-revert-block.patch linux-4.19.118/debian/patches-rt/0287-revert-block.patch --- linux-4.19.98/debian/patches-rt/0287-revert-block.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0287-revert-block.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -From 5d4341f0df610e341ef6248b72a4d24ea53b7694 Mon Sep 17 00:00:00 2001 -From: "Steven Rostedt (VMware)" -Date: Fri, 20 Sep 2019 17:50:54 -0400 -Subject: [PATCH 287/290] revert-block -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -Revert swork version of: block: blk-mq: move blk_queue_usage_counter_release() into process context - -In order to switch to upstream, we need to revert the swork code. - -Signed-off-by: Steven Rostedt (VMware) ---- - block/blk-core.c | 14 +------------- - include/linux/blkdev.h | 2 -- - 2 files changed, 1 insertion(+), 15 deletions(-) - -diff --git a/block/blk-core.c b/block/blk-core.c -index 13bf37156bb0..4860cd26cd5a 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -973,21 +973,12 @@ void blk_queue_exit(struct request_queue *q) - percpu_ref_put(&q->q_usage_counter); - } - --static void blk_queue_usage_counter_release_swork(struct swork_event *sev) --{ -- struct request_queue *q = -- container_of(sev, struct request_queue, mq_pcpu_wake); -- -- wake_up_all(&q->mq_freeze_wq); --} -- - static void blk_queue_usage_counter_release(struct percpu_ref *ref) - { - struct request_queue *q = - container_of(ref, struct request_queue, q_usage_counter); - -- if (wq_has_sleeper(&q->mq_freeze_wq)) -- swork_queue(&q->mq_pcpu_wake); -+ wake_up_all(&q->mq_freeze_wq); - } - - static void blk_rq_timed_out_timer(struct timer_list *t) -@@ -1084,7 +1075,6 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, - queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); - - init_waitqueue_head(&q->mq_freeze_wq); -- INIT_SWORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_swork); - - /* - * Init percpu_ref in atomic mode so that it's faster to shutdown. -@@ -3974,8 +3964,6 @@ int __init blk_dev_init(void) - if (!kblockd_workqueue) - panic("Failed to create kblockd\n"); - -- BUG_ON(swork_get()); -- - request_cachep = kmem_cache_create("blkdev_requests", - sizeof(struct request), 0, SLAB_PANIC, NULL); - -diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h -index 7b7c0bc6a514..f1960add94df 100644 ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -27,7 +27,6 @@ - #include - #include - #include --#include - - struct module; - struct scsi_ioctl_command; -@@ -656,7 +655,6 @@ struct request_queue { - #endif - struct rcu_head rcu_head; - wait_queue_head_t mq_freeze_wq; -- struct swork_event mq_pcpu_wake; - struct percpu_ref q_usage_counter; - struct list_head all_q_node; - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0288-block-blk-mq-move-blk_queue_usage_counter_release-in.patch linux-4.19.118/debian/patches-rt/0288-block-blk-mq-move-blk_queue_usage_counter_release-in.patch --- linux-4.19.98/debian/patches-rt/0288-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0288-block-blk-mq-move-blk_queue_usage_counter_release-in.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -From 7de506cb172bfbca14767ae02f0309d70d3c7dcb Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Tue, 13 Mar 2018 13:49:16 +0100 -Subject: [PATCH 288/290] block: blk-mq: move blk_queue_usage_counter_release() - into process context -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit 61c928ecf4fe200bda9b49a0813b5ba0f43995b5 ] - -| BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:914 -| in_atomic(): 1, irqs_disabled(): 0, pid: 255, name: kworker/u257:6 -| 5 locks held by kworker/u257:6/255: -| #0: ("events_unbound"){.+.+.+}, at: [] process_one_work+0x171/0x5e0 -| #1: ((&entry->work)){+.+.+.}, at: [] process_one_work+0x171/0x5e0 -| #2: (&shost->scan_mutex){+.+.+.}, at: [] __scsi_add_device+0xa3/0x130 [scsi_mod] -| #3: (&set->tag_list_lock){+.+...}, at: [] blk_mq_init_queue+0x96a/0xa50 -| #4: (rcu_read_lock_sched){......}, at: [] percpu_ref_kill_and_confirm+0x1d/0x120 -| Preemption disabled at:[] blk_mq_freeze_queue_start+0x56/0x70 -| -| CPU: 2 PID: 255 Comm: kworker/u257:6 Not tainted 3.18.7-rt0+ #1 -| Workqueue: events_unbound async_run_entry_fn -| 0000000000000003 ffff8800bc29f998 ffffffff815b3a12 0000000000000000 -| 0000000000000000 ffff8800bc29f9b8 ffffffff8109aa16 ffff8800bc29fa28 -| ffff8800bc5d1bc8 ffff8800bc29f9e8 ffffffff815b8dd4 ffff880000000000 -| Call Trace: -| [] dump_stack+0x4f/0x7c -| [] __might_sleep+0x116/0x190 -| [] rt_spin_lock+0x24/0x60 -| [] __wake_up+0x29/0x60 -| [] blk_mq_usage_counter_release+0x1e/0x20 -| [] percpu_ref_kill_and_confirm+0x106/0x120 -| [] blk_mq_freeze_queue_start+0x56/0x70 -| [] blk_mq_update_tag_set_depth+0x40/0xd0 -| [] blk_mq_init_queue+0x98c/0xa50 -| [] scsi_mq_alloc_queue+0x20/0x60 [scsi_mod] -| [] scsi_alloc_sdev+0x2f5/0x370 [scsi_mod] -| [] scsi_probe_and_add_lun+0x9e4/0xdd0 [scsi_mod] -| [] __scsi_add_device+0x126/0x130 [scsi_mod] -| [] ata_scsi_scan_host+0xaf/0x200 [libata] -| [] async_port_probe+0x46/0x60 [libata] -| [] async_run_entry_fn+0x3b/0xf0 -| [] process_one_work+0x201/0x5e0 - -percpu_ref_kill_and_confirm() invokes blk_mq_usage_counter_release() in -a rcu-sched region. swait based wake queue can't be used due to -wake_up_all() usage and disabled interrupts in !RT configs (as reported -by Corey Minyard). -The wq_has_sleeper() check has been suggested by Peter Zijlstra. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - block/blk-core.c | 12 +++++++++++- - include/linux/blkdev.h | 2 ++ - 2 files changed, 13 insertions(+), 1 deletion(-) - -diff --git a/block/blk-core.c b/block/blk-core.c -index 4860cd26cd5a..7d709465876e 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -973,12 +973,21 @@ void blk_queue_exit(struct request_queue *q) - percpu_ref_put(&q->q_usage_counter); - } - -+static void blk_queue_usage_counter_release_wrk(struct kthread_work *work) -+{ -+ struct request_queue *q = -+ container_of(work, struct request_queue, mq_pcpu_wake); -+ -+ wake_up_all(&q->mq_freeze_wq); -+} -+ - static void blk_queue_usage_counter_release(struct percpu_ref *ref) - { - struct request_queue *q = - container_of(ref, struct request_queue, q_usage_counter); - -- wake_up_all(&q->mq_freeze_wq); -+ if (wq_has_sleeper(&q->mq_freeze_wq)) -+ kthread_schedule_work(&q->mq_pcpu_wake); - } - - static void blk_rq_timed_out_timer(struct timer_list *t) -@@ -1075,6 +1084,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, - queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); - - init_waitqueue_head(&q->mq_freeze_wq); -+ kthread_init_work(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk); - - /* - * Init percpu_ref in atomic mode so that it's faster to shutdown. -diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h -index f1960add94df..15a489abfb62 100644 ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -655,6 +656,7 @@ struct request_queue { - #endif - struct rcu_head rcu_head; - wait_queue_head_t mq_freeze_wq; -+ struct kthread_work mq_pcpu_wake; - struct percpu_ref q_usage_counter; - struct list_head all_q_node; - --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0288-i2c-hix5hd2-Remove-IRQF_ONESHOT.patch linux-4.19.118/debian/patches-rt/0288-i2c-hix5hd2-Remove-IRQF_ONESHOT.patch --- linux-4.19.98/debian/patches-rt/0288-i2c-hix5hd2-Remove-IRQF_ONESHOT.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0288-i2c-hix5hd2-Remove-IRQF_ONESHOT.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,42 @@ +From 3b4a2b1bd8409f08d5a027e51b14fd5e6eb31708 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 13 Aug 2019 12:30:37 +0200 +Subject: [PATCH 288/325] i2c: hix5hd2: Remove IRQF_ONESHOT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit e88b481f3f86f11e3243e0808a830e5ca5782a9d ] + +The drivers sets IRQF_ONESHOT and passes only a primary handler. The IRQ +is masked while the primary is handler is invoked independently of +IRQF_ONESHOT. +With IRQF_ONESHOT the core code will not force-thread the interrupt and +this is probably not intended. I *assume* that the original author copied +the IRQ registration from another driver which passed a primary and +secondary handler and removed the secondary handler but keeping the +ONESHOT flag. + +Remove IRQF_ONESHOT. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/i2c/busses/i2c-hix5hd2.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-hix5hd2.c b/drivers/i2c/busses/i2c-hix5hd2.c +index b5ad7696adf9..0f08ef1f7f41 100644 +--- a/drivers/i2c/busses/i2c-hix5hd2.c ++++ b/drivers/i2c/busses/i2c-hix5hd2.c +@@ -449,8 +449,7 @@ static int hix5hd2_i2c_probe(struct platform_device *pdev) + hix5hd2_i2c_init(priv); + + ret = devm_request_irq(&pdev->dev, irq, hix5hd2_i2c_irq, +- IRQF_NO_SUSPEND | IRQF_ONESHOT, +- dev_name(&pdev->dev), priv); ++ IRQF_NO_SUSPEND, dev_name(&pdev->dev), priv); + if (ret != 0) { + dev_err(&pdev->dev, "cannot request HS-I2C IRQ %d\n", irq); + goto err_clk; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0289-sched-deadline-Ensure-inactive_timer-runs-in-hardirq.patch linux-4.19.118/debian/patches-rt/0289-sched-deadline-Ensure-inactive_timer-runs-in-hardirq.patch --- linux-4.19.98/debian/patches-rt/0289-sched-deadline-Ensure-inactive_timer-runs-in-hardirq.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0289-sched-deadline-Ensure-inactive_timer-runs-in-hardirq.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,50 @@ +From 7775d07be42794e09d02410ecec003db98b79c44 Mon Sep 17 00:00:00 2001 +From: Juri Lelli +Date: Wed, 31 Jul 2019 12:37:15 +0200 +Subject: [PATCH 289/325] sched/deadline: Ensure inactive_timer runs in hardirq + context +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit ba94e7aed7405c58251b1380e6e7d73aa8284b41 ] + +SCHED_DEADLINE inactive timer needs to run in hardirq context (as +dl_task_timer already does) on PREEMPT_RT + +Change the mode to HRTIMER_MODE_REL_HARD. + +[ tglx: Fixed up the start site, so mode debugging works ] + +Signed-off-by: Juri Lelli +Signed-off-by: Thomas Gleixner +Link: https://lkml.kernel.org/r/20190731103715.4047-1-juri.lelli@redhat.com +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/deadline.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c +index 974a8f9b615a..929167a1d991 100644 +--- a/kernel/sched/deadline.c ++++ b/kernel/sched/deadline.c +@@ -287,7 +287,7 @@ static void task_non_contending(struct task_struct *p) + + dl_se->dl_non_contending = 1; + get_task_struct(p); +- hrtimer_start(timer, ns_to_ktime(zerolag_time), HRTIMER_MODE_REL); ++ hrtimer_start(timer, ns_to_ktime(zerolag_time), HRTIMER_MODE_REL_HARD); + } + + static void task_contending(struct sched_dl_entity *dl_se, int flags) +@@ -1325,7 +1325,7 @@ void init_dl_inactive_task_timer(struct sched_dl_entity *dl_se) + { + struct hrtimer *timer = &dl_se->inactive_timer; + +- hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); + timer->function = inactive_task_timer; + } + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0289-workqueue-rework.patch linux-4.19.118/debian/patches-rt/0289-workqueue-rework.patch --- linux-4.19.98/debian/patches-rt/0289-workqueue-rework.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0289-workqueue-rework.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,1569 +0,0 @@ -From b5e4a5ce5478ed6616eec2fed6c13da28cdbb61c Mon Sep 17 00:00:00 2001 -From: Sebastian Andrzej Siewior -Date: Wed, 29 May 2019 18:52:27 +0200 -Subject: [PATCH 289/290] workqueue: rework -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - -[ Upstream commit d15a862f24df983458533aebd6fa207ecdd1095a ] - -This is an all-in change of the workqueue rework. -The worker_pool.lock is made to raw_spinlock_t. With this change we can -schedule workitems from preempt-disable sections and sections with disabled -interrupts. This change allows to remove all kthread_.* workarounds we used to -have. - -Signed-off-by: Sebastian Andrzej Siewior -Signed-off-by: Steven Rostedt (VMware) ---- - block/blk-core.c | 6 +- - drivers/block/loop.c | 2 +- - drivers/spi/spi-rockchip.c | 1 - - drivers/thermal/x86_pkg_temp_thermal.c | 28 +-- - fs/aio.c | 10 +- - include/linux/blk-cgroup.h | 2 +- - include/linux/blkdev.h | 2 +- - include/linux/interrupt.h | 5 - - include/linux/kthread-cgroup.h | 17 -- - include/linux/kthread.h | 15 +- - include/linux/swait.h | 14 ++ - include/linux/workqueue.h | 4 - - init/main.c | 1 - - kernel/irq/manage.c | 36 +-- - kernel/kthread.c | 14 -- - kernel/sched/core.c | 1 + - kernel/time/hrtimer.c | 24 -- - kernel/workqueue.c | 304 +++++++++++-------------- - 18 files changed, 166 insertions(+), 320 deletions(-) - delete mode 100644 include/linux/kthread-cgroup.h - -diff --git a/block/blk-core.c b/block/blk-core.c -index 7d709465876e..752c9e754509 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -973,7 +973,7 @@ void blk_queue_exit(struct request_queue *q) - percpu_ref_put(&q->q_usage_counter); - } - --static void blk_queue_usage_counter_release_wrk(struct kthread_work *work) -+static void blk_queue_usage_counter_release_wrk(struct work_struct *work) - { - struct request_queue *q = - container_of(work, struct request_queue, mq_pcpu_wake); -@@ -987,7 +987,7 @@ static void blk_queue_usage_counter_release(struct percpu_ref *ref) - container_of(ref, struct request_queue, q_usage_counter); - - if (wq_has_sleeper(&q->mq_freeze_wq)) -- kthread_schedule_work(&q->mq_pcpu_wake); -+ schedule_work(&q->mq_pcpu_wake); - } - - static void blk_rq_timed_out_timer(struct timer_list *t) -@@ -1084,7 +1084,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id, - queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q); - - init_waitqueue_head(&q->mq_freeze_wq); -- kthread_init_work(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk); -+ INIT_WORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk); - - /* - * Init percpu_ref in atomic mode so that it's faster to shutdown. -diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index 351ea22ffb56..9cd231a27328 100644 ---- a/drivers/block/loop.c -+++ b/drivers/block/loop.c -@@ -70,7 +70,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include -diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c -index 63b10236eb05..185bbdce62b1 100644 ---- a/drivers/spi/spi-rockchip.c -+++ b/drivers/spi/spi-rockchip.c -@@ -22,7 +22,6 @@ - #include - #include - #include --#include - - #define DRIVER_NAME "rockchip-spi" - -diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c -index 82f21fd4afb0..1ef937d799e4 100644 ---- a/drivers/thermal/x86_pkg_temp_thermal.c -+++ b/drivers/thermal/x86_pkg_temp_thermal.c -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - #include - #include - -@@ -330,7 +329,7 @@ static void pkg_thermal_schedule_work(int cpu, struct delayed_work *work) - schedule_delayed_work_on(cpu, work, ms); - } - --static void pkg_thermal_notify_work(struct kthread_work *work) -+static int pkg_thermal_notify(u64 msr_val) - { - int cpu = smp_processor_id(); - struct pkg_device *pkgdev; -@@ -349,32 +348,8 @@ static void pkg_thermal_notify_work(struct kthread_work *work) - } - - spin_unlock_irqrestore(&pkg_temp_lock, flags); --} -- --#ifdef CONFIG_PREEMPT_RT_FULL --static DEFINE_KTHREAD_WORK(notify_work, pkg_thermal_notify_work); -- --static int pkg_thermal_notify(u64 msr_val) --{ -- kthread_schedule_work(¬ify_work); -- return 0; --} -- --static void pkg_thermal_notify_flush(void) --{ -- kthread_flush_work(¬ify_work); --} -- --#else /* !CONFIG_PREEMPT_RT_FULL */ -- --static void pkg_thermal_notify_flush(void) { } -- --static int pkg_thermal_notify(u64 msr_val) --{ -- pkg_thermal_notify_work(NULL); - return 0; - } --#endif /* CONFIG_PREEMPT_RT_FULL */ - - static int pkg_temp_thermal_device_add(unsigned int cpu) - { -@@ -573,7 +548,6 @@ static void __exit pkg_temp_thermal_exit(void) - platform_thermal_package_rate_control = NULL; - - cpuhp_remove_state(pkg_thermal_hp_state); -- pkg_thermal_notify_flush(); - debugfs_remove_recursive(debugfs); - kfree(packages); - } -diff --git a/fs/aio.c b/fs/aio.c -index 0c613d805bf1..c74dd321f5b7 100644 ---- a/fs/aio.c -+++ b/fs/aio.c -@@ -121,7 +121,7 @@ struct kioctx { - long nr_pages; - - struct rcu_work free_rwork; /* see free_ioctx() */ -- struct kthread_work free_kwork; /* see free_ioctx() */ -+ struct work_struct free_work; /* see free_ioctx() */ - - /* - * signals when all in-flight requests are done -@@ -607,9 +607,9 @@ static void free_ioctx_reqs(struct percpu_ref *ref) - * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted - - * now it's safe to cancel any that need to be. - */ --static void free_ioctx_users_work(struct kthread_work *work) -+static void free_ioctx_users_work(struct work_struct *work) - { -- struct kioctx *ctx = container_of(work, struct kioctx, free_kwork); -+ struct kioctx *ctx = container_of(work, struct kioctx, free_work); - struct aio_kiocb *req; - - spin_lock_irq(&ctx->ctx_lock); -@@ -631,8 +631,8 @@ static void free_ioctx_users(struct percpu_ref *ref) - { - struct kioctx *ctx = container_of(ref, struct kioctx, users); - -- kthread_init_work(&ctx->free_kwork, free_ioctx_users_work); -- kthread_schedule_work(&ctx->free_kwork); -+ INIT_WORK(&ctx->free_work, free_ioctx_users_work); -+ schedule_work(&ctx->free_work); - } - - static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm) -diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h -index 0473efda4c65..da587e60fe86 100644 ---- a/include/linux/blk-cgroup.h -+++ b/include/linux/blk-cgroup.h -@@ -14,7 +14,7 @@ - * Nauman Rafique - */ - --#include -+#include - #include - #include - #include -diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h -index 15a489abfb62..45653e23e4cd 100644 ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -656,7 +656,7 @@ struct request_queue { - #endif - struct rcu_head rcu_head; - wait_queue_head_t mq_freeze_wq; -- struct kthread_work mq_pcpu_wake; -+ struct work_struct mq_pcpu_wake; - struct percpu_ref q_usage_counter; - struct list_head all_q_node; - -diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h -index a9321f6429f2..97d9ba26915e 100644 ---- a/include/linux/interrupt.h -+++ b/include/linux/interrupt.h -@@ -13,7 +13,6 @@ - #include - #include - #include --#include - - #include - #include -@@ -239,11 +238,7 @@ extern void resume_device_irqs(void); - struct irq_affinity_notify { - unsigned int irq; - struct kref kref; --#ifdef CONFIG_PREEMPT_RT_BASE -- struct kthread_work work; --#else - struct work_struct work; --#endif - void (*notify)(struct irq_affinity_notify *, const cpumask_t *mask); - void (*release)(struct kref *ref); - }; -diff --git a/include/linux/kthread-cgroup.h b/include/linux/kthread-cgroup.h -deleted file mode 100644 -index 53d34bca9d72..000000000000 ---- a/include/linux/kthread-cgroup.h -+++ /dev/null -@@ -1,17 +0,0 @@ --/* SPDX-License-Identifier: GPL-2.0 */ --#ifndef _LINUX_KTHREAD_CGROUP_H --#define _LINUX_KTHREAD_CGROUP_H --#include --#include -- --#ifdef CONFIG_BLK_CGROUP --void kthread_associate_blkcg(struct cgroup_subsys_state *css); --struct cgroup_subsys_state *kthread_blkcg(void); --#else --static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } --static inline struct cgroup_subsys_state *kthread_blkcg(void) --{ -- return NULL; --} --#endif --#endif -diff --git a/include/linux/kthread.h b/include/linux/kthread.h -index 7cf56eb54103..6b8c064f0cbc 100644 ---- a/include/linux/kthread.h -+++ b/include/linux/kthread.h -@@ -4,6 +4,7 @@ - /* Simple interface for creating and stopping kernel threads without mess. */ - #include - #include -+#include - - __printf(4, 5) - struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), -@@ -197,12 +198,14 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work); - - void kthread_destroy_worker(struct kthread_worker *worker); - --extern struct kthread_worker kthread_global_worker; --void kthread_init_global_worker(void); -- --static inline bool kthread_schedule_work(struct kthread_work *work) -+#ifdef CONFIG_BLK_CGROUP -+void kthread_associate_blkcg(struct cgroup_subsys_state *css); -+struct cgroup_subsys_state *kthread_blkcg(void); -+#else -+static inline void kthread_associate_blkcg(struct cgroup_subsys_state *css) { } -+static inline struct cgroup_subsys_state *kthread_blkcg(void) - { -- return kthread_queue_work(&kthread_global_worker, work); -+ return NULL; - } -- -+#endif - #endif /* _LINUX_KTHREAD_H */ -diff --git a/include/linux/swait.h b/include/linux/swait.h -index f426a0661aa0..21ae66cd41d3 100644 ---- a/include/linux/swait.h -+++ b/include/linux/swait.h -@@ -299,4 +299,18 @@ do { \ - __ret; \ - }) - -+#define __swait_event_lock_irq(wq, condition, lock, cmd) \ -+ ___swait_event(wq, condition, TASK_UNINTERRUPTIBLE, 0, \ -+ raw_spin_unlock_irq(&lock); \ -+ cmd; \ -+ schedule(); \ -+ raw_spin_lock_irq(&lock)) -+ -+#define swait_event_lock_irq(wq_head, condition, lock) \ -+ do { \ -+ if (condition) \ -+ break; \ -+ __swait_event_lock_irq(wq_head, condition, lock, ); \ -+ } while (0) -+ - #endif /* _LINUX_SWAIT_H */ -diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h -index 60d673e15632..546aa73fba6a 100644 ---- a/include/linux/workqueue.h -+++ b/include/linux/workqueue.h -@@ -455,10 +455,6 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, - - extern void destroy_workqueue(struct workqueue_struct *wq); - --struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask); --void free_workqueue_attrs(struct workqueue_attrs *attrs); --int apply_workqueue_attrs(struct workqueue_struct *wq, -- const struct workqueue_attrs *attrs); - int workqueue_set_unbound_cpumask(cpumask_var_t cpumask); - - extern bool queue_work_on(int cpu, struct workqueue_struct *wq, -diff --git a/init/main.c b/init/main.c -index e514dd93de76..6e02188386a7 100644 ---- a/init/main.c -+++ b/init/main.c -@@ -1129,7 +1129,6 @@ static noinline void __init kernel_init_freeable(void) - smp_prepare_cpus(setup_max_cpus); - - workqueue_init(); -- kthread_init_global_worker(); - - init_mm_internals(); - -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 290cd520dba1..82b3728685ca 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -285,12 +285,7 @@ int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, - - if (desc->affinity_notify) { - kref_get(&desc->affinity_notify->kref); -- --#ifdef CONFIG_PREEMPT_RT_BASE -- kthread_schedule_work(&desc->affinity_notify->work); --#else - schedule_work(&desc->affinity_notify->work); --#endif - } - irqd_set(data, IRQD_AFFINITY_SET); - -@@ -328,8 +323,10 @@ int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m) - } - EXPORT_SYMBOL_GPL(irq_set_affinity_hint); - --static void _irq_affinity_notify(struct irq_affinity_notify *notify) -+static void irq_affinity_notify(struct work_struct *work) - { -+ struct irq_affinity_notify *notify = -+ container_of(work, struct irq_affinity_notify, work); - struct irq_desc *desc = irq_to_desc(notify->irq); - cpumask_var_t cpumask; - unsigned long flags; -@@ -351,25 +348,6 @@ static void _irq_affinity_notify(struct irq_affinity_notify *notify) - kref_put(¬ify->kref, notify->release); - } - --#ifdef CONFIG_PREEMPT_RT_BASE -- --static void irq_affinity_notify(struct kthread_work *work) --{ -- struct irq_affinity_notify *notify = -- container_of(work, struct irq_affinity_notify, work); -- _irq_affinity_notify(notify); --} -- --#else -- --static void irq_affinity_notify(struct work_struct *work) --{ -- struct irq_affinity_notify *notify = -- container_of(work, struct irq_affinity_notify, work); -- _irq_affinity_notify(notify); --} --#endif -- - /** - * irq_set_affinity_notifier - control notification of IRQ affinity changes - * @irq: Interrupt for which to enable/disable notification -@@ -398,11 +376,7 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) - if (notify) { - notify->irq = irq; - kref_init(¬ify->kref); --#ifdef CONFIG_PREEMPT_RT_BASE -- kthread_init_work(¬ify->work, irq_affinity_notify); --#else - INIT_WORK(¬ify->work, irq_affinity_notify); --#endif - } - - raw_spin_lock_irqsave(&desc->lock, flags); -@@ -411,11 +385,7 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) - raw_spin_unlock_irqrestore(&desc->lock, flags); - - if (old_notify) { --#ifdef CONFIG_PREEMPT_RT_BASE -- kthread_cancel_work_sync(¬ify->work); --#else - cancel_work_sync(&old_notify->work); --#endif - kref_put(&old_notify->kref, old_notify->release); - } - -diff --git a/kernel/kthread.c b/kernel/kthread.c -index 9db017761a1f..5641b55783a6 100644 ---- a/kernel/kthread.c -+++ b/kernel/kthread.c -@@ -20,7 +20,6 @@ - #include - #include - #include --#include - #include - - static DEFINE_SPINLOCK(kthread_create_lock); -@@ -1181,19 +1180,6 @@ void kthread_destroy_worker(struct kthread_worker *worker) - } - EXPORT_SYMBOL(kthread_destroy_worker); - --DEFINE_KTHREAD_WORKER(kthread_global_worker); --EXPORT_SYMBOL(kthread_global_worker); -- --__init void kthread_init_global_worker(void) --{ -- kthread_global_worker.task = kthread_create(kthread_worker_fn, -- &kthread_global_worker, -- "kswork"); -- if (WARN_ON(IS_ERR(kthread_global_worker.task))) -- return; -- wake_up_process(kthread_global_worker.task); --} -- - #ifdef CONFIG_BLK_CGROUP - /** - * kthread_associate_blkcg - associate blkcg to current kthread -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 678c2c4de4f5..a1c0123e7636 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -3607,6 +3607,7 @@ static inline void sched_submit_work(struct task_struct *tsk) - { - if (!tsk->state) - return; -+ - /* - * If a worker went to sleep, notify and ask workqueue whether - * it wants to wake up a task to maintain concurrency. -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index ed5d8d51ca91..94d97eae0a46 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -730,29 +730,6 @@ static void hrtimer_switch_to_hres(void) - retrigger_next_event(NULL); - } - --#ifdef CONFIG_PREEMPT_RT_FULL -- --static struct swork_event clock_set_delay_work; -- --static void run_clock_set_delay(struct swork_event *event) --{ -- clock_was_set(); --} -- --void clock_was_set_delayed(void) --{ -- swork_queue(&clock_set_delay_work); --} -- --static __init int create_clock_set_delay_thread(void) --{ -- WARN_ON(swork_get()); -- INIT_SWORK(&clock_set_delay_work, run_clock_set_delay); -- return 0; --} --early_initcall(create_clock_set_delay_thread); --#else /* PREEMPT_RT_FULL */ -- - static void clock_was_set_work(struct work_struct *work) - { - clock_was_set(); -@@ -768,7 +745,6 @@ void clock_was_set_delayed(void) - { - schedule_work(&hrtimer_work); - } --#endif - - #else - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 714d0cfe4d56..75f59299dd06 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -49,8 +49,6 @@ - #include - #include - #include --#include --#include - - #include "workqueue_internal.h" - -@@ -125,11 +123,6 @@ enum { - * cpu or grabbing pool->lock is enough for read access. If - * POOL_DISASSOCIATED is set, it's identical to L. - * -- * On RT we need the extra protection via rt_lock_idle_list() for -- * the list manipulations against read access from -- * wq_worker_sleeping(). All other places are nicely serialized via -- * pool->lock. -- * - * A: wq_pool_attach_mutex protected. - * - * PL: wq_pool_mutex protected. -@@ -151,7 +144,7 @@ enum { - /* struct worker is defined in workqueue_internal.h */ - - struct worker_pool { -- spinlock_t lock; /* the pool lock */ -+ raw_spinlock_t lock; /* the pool lock */ - int cpu; /* I: the associated cpu */ - int node; /* I: the associated node ID */ - int id; /* I: pool ID */ -@@ -304,8 +297,8 @@ static struct workqueue_attrs *wq_update_unbound_numa_attrs_buf; - - static DEFINE_MUTEX(wq_pool_mutex); /* protects pools and workqueues list */ - static DEFINE_MUTEX(wq_pool_attach_mutex); /* protects worker attach/detach */ --static DEFINE_SPINLOCK(wq_mayday_lock); /* protects wq->maydays list */ --static DECLARE_WAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */ -+static DEFINE_RAW_SPINLOCK(wq_mayday_lock); /* protects wq->maydays list */ -+static DECLARE_SWAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */ - - static LIST_HEAD(workqueues); /* PR: list of all workqueues */ - static bool workqueue_freezing; /* PL: have wqs started freezing? */ -@@ -357,8 +350,6 @@ EXPORT_SYMBOL_GPL(system_power_efficient_wq); - struct workqueue_struct *system_freezable_power_efficient_wq __read_mostly; - EXPORT_SYMBOL_GPL(system_freezable_power_efficient_wq); - --static DEFINE_LOCAL_IRQ_LOCK(pendingb_lock); -- - static int worker_thread(void *__worker); - static void workqueue_sysfs_unregister(struct workqueue_struct *wq); - -@@ -435,31 +426,6 @@ static void workqueue_sysfs_unregister(struct workqueue_struct *wq); - if (({ assert_rcu_or_wq_mutex(wq); false; })) { } \ - else - --#ifdef CONFIG_PREEMPT_RT_BASE --static inline void rt_lock_idle_list(struct worker_pool *pool) --{ -- preempt_disable(); --} --static inline void rt_unlock_idle_list(struct worker_pool *pool) --{ -- preempt_enable(); --} --static inline void sched_lock_idle_list(struct worker_pool *pool) { } --static inline void sched_unlock_idle_list(struct worker_pool *pool) { } --#else --static inline void rt_lock_idle_list(struct worker_pool *pool) { } --static inline void rt_unlock_idle_list(struct worker_pool *pool) { } --static inline void sched_lock_idle_list(struct worker_pool *pool) --{ -- spin_lock_irq(&pool->lock); --} --static inline void sched_unlock_idle_list(struct worker_pool *pool) --{ -- spin_unlock_irq(&pool->lock); --} --#endif -- -- - #ifdef CONFIG_DEBUG_OBJECTS_WORK - - static struct debug_obj_descr work_debug_descr; -@@ -862,20 +828,14 @@ static struct worker *first_idle_worker(struct worker_pool *pool) - * Wake up the first idle worker of @pool. - * - * CONTEXT: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void wake_up_worker(struct worker_pool *pool) - { -- struct worker *worker; -- -- rt_lock_idle_list(pool); -- -- worker = first_idle_worker(pool); -+ struct worker *worker = first_idle_worker(pool); - - if (likely(worker)) - wake_up_process(worker->task); -- -- rt_unlock_idle_list(pool); - } - - /** -@@ -904,7 +864,7 @@ void wq_worker_running(struct task_struct *task) - */ - void wq_worker_sleeping(struct task_struct *task) - { -- struct worker *worker = kthread_data(task); -+ struct worker *next, *worker = kthread_data(task); - struct worker_pool *pool; - - /* -@@ -921,18 +881,26 @@ void wq_worker_sleeping(struct task_struct *task) - return; - - worker->sleeping = 1; -+ raw_spin_lock_irq(&pool->lock); - - /* - * The counterpart of the following dec_and_test, implied mb, - * worklist not empty test sequence is in insert_work(). - * Please read comment there. -+ * -+ * NOT_RUNNING is clear. This means that we're bound to and -+ * running on the local cpu w/ rq lock held and preemption -+ * disabled, which in turn means that none else could be -+ * manipulating idle_list, so dereferencing idle_list without pool -+ * lock is safe. - */ - if (atomic_dec_and_test(&pool->nr_running) && - !list_empty(&pool->worklist)) { -- sched_lock_idle_list(pool); -- wake_up_worker(pool); -- sched_unlock_idle_list(pool); -+ next = first_idle_worker(pool); -+ if (next) -+ wake_up_process(next->task); - } -+ raw_spin_unlock_irq(&pool->lock); - } - - /** -@@ -943,7 +911,7 @@ void wq_worker_sleeping(struct task_struct *task) - * Set @flags in @worker->flags and adjust nr_running accordingly. - * - * CONTEXT: -- * spin_lock_irq(pool->lock) -+ * raw_spin_lock_irq(pool->lock) - */ - static inline void worker_set_flags(struct worker *worker, unsigned int flags) - { -@@ -968,7 +936,7 @@ static inline void worker_set_flags(struct worker *worker, unsigned int flags) - * Clear @flags in @worker->flags and adjust nr_running accordingly. - * - * CONTEXT: -- * spin_lock_irq(pool->lock) -+ * raw_spin_lock_irq(pool->lock) - */ - static inline void worker_clr_flags(struct worker *worker, unsigned int flags) - { -@@ -1016,7 +984,7 @@ static inline void worker_clr_flags(struct worker *worker, unsigned int flags) - * actually occurs, it should be easy to locate the culprit work function. - * - * CONTEXT: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - * - * Return: - * Pointer to worker which is executing @work if found, %NULL -@@ -1051,7 +1019,7 @@ static struct worker *find_worker_executing_work(struct worker_pool *pool, - * nested inside outer list_for_each_entry_safe(). - * - * CONTEXT: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void move_linked_works(struct work_struct *work, struct list_head *head, - struct work_struct **nextp) -@@ -1129,11 +1097,9 @@ static void put_pwq_unlocked(struct pool_workqueue *pwq) - * As both pwqs and pools are RCU protected, the - * following lock operations are safe. - */ -- rcu_read_lock(); -- local_spin_lock_irq(pendingb_lock, &pwq->pool->lock); -+ raw_spin_lock_irq(&pwq->pool->lock); - put_pwq(pwq); -- local_spin_unlock_irq(pendingb_lock, &pwq->pool->lock); -- rcu_read_unlock(); -+ raw_spin_unlock_irq(&pwq->pool->lock); - } - } - -@@ -1166,7 +1132,7 @@ static void pwq_activate_first_delayed(struct pool_workqueue *pwq) - * decrement nr_in_flight of its pwq and handle workqueue flushing. - * - * CONTEXT: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, int color) - { -@@ -1237,7 +1203,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - struct worker_pool *pool; - struct pool_workqueue *pwq; - -- local_lock_irqsave(pendingb_lock, *flags); -+ local_irq_save(*flags); - - /* try to steal the timer if it exists */ - if (is_dwork) { -@@ -1265,7 +1231,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - if (!pool) - goto fail; - -- spin_lock(&pool->lock); -+ raw_spin_lock(&pool->lock); - /* - * work->data is guaranteed to point to pwq only while the work - * item is queued on pwq->wq, and both updating work->data to point -@@ -1294,17 +1260,17 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - /* work->data points to pwq iff queued, point to pool */ - set_work_pool_and_keep_pending(work, pool->id); - -- spin_unlock(&pool->lock); -+ raw_spin_unlock(&pool->lock); - rcu_read_unlock(); - return 1; - } -- spin_unlock(&pool->lock); -+ raw_spin_unlock(&pool->lock); - fail: - rcu_read_unlock(); -- local_unlock_irqrestore(pendingb_lock, *flags); -+ local_irq_restore(*flags); - if (work_is_canceling(work)) - return -ENOENT; -- cpu_chill(); -+ cpu_relax(); - return -EAGAIN; - } - -@@ -1319,7 +1285,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, - * work_struct flags. - * - * CONTEXT: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void insert_work(struct pool_workqueue *pwq, struct work_struct *work, - struct list_head *head, unsigned int extra_flags) -@@ -1406,13 +1372,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - * queued or lose PENDING. Grabbing PENDING and queueing should - * happen with IRQ disabled. - */ --#ifndef CONFIG_PREEMPT_RT_FULL -- /* -- * nort: On RT the "interrupts-disabled" rule has been replaced with -- * pendingb_lock. -- */ - lockdep_assert_irqs_disabled(); --#endif - - debug_work_activate(work); - -@@ -1440,7 +1400,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - if (last_pool && last_pool != pwq->pool) { - struct worker *worker; - -- spin_lock(&last_pool->lock); -+ raw_spin_lock(&last_pool->lock); - - worker = find_worker_executing_work(last_pool, work); - -@@ -1448,11 +1408,11 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - pwq = worker->current_pwq; - } else { - /* meh... not running there, queue here */ -- spin_unlock(&last_pool->lock); -- spin_lock(&pwq->pool->lock); -+ raw_spin_unlock(&last_pool->lock); -+ raw_spin_lock(&pwq->pool->lock); - } - } else { -- spin_lock(&pwq->pool->lock); -+ raw_spin_lock(&pwq->pool->lock); - } - - /* -@@ -1465,7 +1425,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - */ - if (unlikely(!pwq->refcnt)) { - if (wq->flags & WQ_UNBOUND) { -- spin_unlock(&pwq->pool->lock); -+ raw_spin_unlock(&pwq->pool->lock); - cpu_relax(); - goto retry; - } -@@ -1497,7 +1457,7 @@ static void __queue_work(int cpu, struct workqueue_struct *wq, - insert_work(pwq, work, worklist, work_flags); - - out: -- spin_unlock(&pwq->pool->lock); -+ raw_spin_unlock(&pwq->pool->lock); - rcu_read_unlock(); - } - -@@ -1518,14 +1478,14 @@ bool queue_work_on(int cpu, struct workqueue_struct *wq, - bool ret = false; - unsigned long flags; - -- local_lock_irqsave(pendingb_lock,flags); -+ local_irq_save(flags); - - if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { - __queue_work(cpu, wq, work); - ret = true; - } - -- local_unlock_irqrestore(pendingb_lock, flags); -+ local_irq_restore(flags); - return ret; - } - EXPORT_SYMBOL(queue_work_on); -@@ -1533,12 +1493,11 @@ EXPORT_SYMBOL(queue_work_on); - void delayed_work_timer_fn(struct timer_list *t) - { - struct delayed_work *dwork = from_timer(dwork, t, timer); -+ unsigned long flags; - -- /* XXX */ -- /* local_lock(pendingb_lock); */ -- /* should have been called from irqsafe timer with irq already off */ -+ local_irq_save(flags); - __queue_work(dwork->cpu, dwork->wq, &dwork->work); -- /* local_unlock(pendingb_lock); */ -+ local_irq_restore(flags); - } - EXPORT_SYMBOL(delayed_work_timer_fn); - -@@ -1593,14 +1552,14 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, - unsigned long flags; - - /* read the comment in __queue_work() */ -- local_lock_irqsave(pendingb_lock, flags); -+ local_irq_save(flags); - - if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { - __queue_delayed_work(cpu, wq, dwork, delay); - ret = true; - } - -- local_unlock_irqrestore(pendingb_lock, flags); -+ local_irq_restore(flags); - return ret; - } - EXPORT_SYMBOL(queue_delayed_work_on); -@@ -1635,7 +1594,7 @@ bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq, - - if (likely(ret >= 0)) { - __queue_delayed_work(cpu, wq, dwork, delay); -- local_unlock_irqrestore(pendingb_lock, flags); -+ local_irq_restore(flags); - } - - /* -ENOENT from try_to_grab_pending() becomes %true */ -@@ -1646,12 +1605,11 @@ EXPORT_SYMBOL_GPL(mod_delayed_work_on); - static void rcu_work_rcufn(struct rcu_head *rcu) - { - struct rcu_work *rwork = container_of(rcu, struct rcu_work, rcu); -- unsigned long flags; - - /* read the comment in __queue_work() */ -- local_lock_irqsave(pendingb_lock, flags); -+ local_irq_disable(); - __queue_work(WORK_CPU_UNBOUND, rwork->wq, &rwork->work); -- local_unlock_irqrestore(pendingb_lock, flags); -+ local_irq_enable(); - } - - /** -@@ -1686,7 +1644,7 @@ EXPORT_SYMBOL(queue_rcu_work); - * necessary. - * - * LOCKING: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void worker_enter_idle(struct worker *worker) - { -@@ -1703,9 +1661,7 @@ static void worker_enter_idle(struct worker *worker) - worker->last_active = jiffies; - - /* idle_list is LIFO */ -- rt_lock_idle_list(pool); - list_add(&worker->entry, &pool->idle_list); -- rt_unlock_idle_list(pool); - - if (too_many_workers(pool) && !timer_pending(&pool->idle_timer)) - mod_timer(&pool->idle_timer, jiffies + IDLE_WORKER_TIMEOUT); -@@ -1728,7 +1684,7 @@ static void worker_enter_idle(struct worker *worker) - * @worker is leaving idle state. Update stats. - * - * LOCKING: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void worker_leave_idle(struct worker *worker) - { -@@ -1738,9 +1694,7 @@ static void worker_leave_idle(struct worker *worker) - return; - worker_clr_flags(worker, WORKER_IDLE); - pool->nr_idle--; -- rt_lock_idle_list(pool); - list_del_init(&worker->entry); -- rt_unlock_idle_list(pool); - } - - static struct worker *alloc_worker(int node) -@@ -1868,11 +1822,11 @@ static struct worker *create_worker(struct worker_pool *pool) - worker_attach_to_pool(worker, pool); - - /* start the newly created worker */ -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - worker->pool->nr_workers++; - worker_enter_idle(worker); - wake_up_process(worker->task); -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - - return worker; - -@@ -1891,7 +1845,7 @@ static struct worker *create_worker(struct worker_pool *pool) - * be idle. - * - * CONTEXT: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void destroy_worker(struct worker *worker) - { -@@ -1908,9 +1862,7 @@ static void destroy_worker(struct worker *worker) - pool->nr_workers--; - pool->nr_idle--; - -- rt_lock_idle_list(pool); - list_del_init(&worker->entry); -- rt_unlock_idle_list(pool); - worker->flags |= WORKER_DIE; - wake_up_process(worker->task); - } -@@ -1919,7 +1871,7 @@ static void idle_worker_timeout(struct timer_list *t) - { - struct worker_pool *pool = from_timer(pool, t, idle_timer); - -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - - while (too_many_workers(pool)) { - struct worker *worker; -@@ -1937,7 +1889,7 @@ static void idle_worker_timeout(struct timer_list *t) - destroy_worker(worker); - } - -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - } - - static void send_mayday(struct work_struct *work) -@@ -1968,8 +1920,8 @@ static void pool_mayday_timeout(struct timer_list *t) - struct worker_pool *pool = from_timer(pool, t, mayday_timer); - struct work_struct *work; - -- spin_lock_irq(&pool->lock); -- spin_lock(&wq_mayday_lock); /* for wq->maydays */ -+ raw_spin_lock_irq(&pool->lock); -+ raw_spin_lock(&wq_mayday_lock); /* for wq->maydays */ - - if (need_to_create_worker(pool)) { - /* -@@ -1982,8 +1934,8 @@ static void pool_mayday_timeout(struct timer_list *t) - send_mayday(work); - } - -- spin_unlock(&wq_mayday_lock); -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock(&wq_mayday_lock); -+ raw_spin_unlock_irq(&pool->lock); - - mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INTERVAL); - } -@@ -2002,7 +1954,7 @@ static void pool_mayday_timeout(struct timer_list *t) - * may_start_working() %true. - * - * LOCKING: -- * spin_lock_irq(pool->lock) which may be released and regrabbed -+ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed - * multiple times. Does GFP_KERNEL allocations. Called only from - * manager. - */ -@@ -2011,7 +1963,7 @@ __releases(&pool->lock) - __acquires(&pool->lock) - { - restart: -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - - /* if we don't make progress in MAYDAY_INITIAL_TIMEOUT, call for help */ - mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INITIAL_TIMEOUT); -@@ -2027,7 +1979,7 @@ __acquires(&pool->lock) - } - - del_timer_sync(&pool->mayday_timer); -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - /* - * This is necessary even after a new worker was just successfully - * created as @pool->lock was dropped and the new worker might have -@@ -2050,7 +2002,7 @@ __acquires(&pool->lock) - * and may_start_working() is true. - * - * CONTEXT: -- * spin_lock_irq(pool->lock) which may be released and regrabbed -+ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed - * multiple times. Does GFP_KERNEL allocations. - * - * Return: -@@ -2073,7 +2025,7 @@ static bool manage_workers(struct worker *worker) - - pool->manager = NULL; - pool->flags &= ~POOL_MANAGER_ACTIVE; -- wake_up(&wq_manager_wait); -+ swake_up_one(&wq_manager_wait); - return true; - } - -@@ -2089,7 +2041,7 @@ static bool manage_workers(struct worker *worker) - * call this function to process a work. - * - * CONTEXT: -- * spin_lock_irq(pool->lock) which is released and regrabbed. -+ * raw_spin_lock_irq(pool->lock) which is released and regrabbed. - */ - static void process_one_work(struct worker *worker, struct work_struct *work) - __releases(&pool->lock) -@@ -2171,7 +2123,7 @@ __acquires(&pool->lock) - */ - set_work_pool_and_clear_pending(work, pool->id); - -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - - lock_map_acquire(&pwq->wq->lockdep_map); - lock_map_acquire(&lockdep_map); -@@ -2226,7 +2178,7 @@ __acquires(&pool->lock) - */ - cond_resched(); - -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - - /* clear cpu intensive status */ - if (unlikely(cpu_intensive)) -@@ -2249,7 +2201,7 @@ __acquires(&pool->lock) - * fetches a work from the top and executes it. - * - * CONTEXT: -- * spin_lock_irq(pool->lock) which may be released and regrabbed -+ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed - * multiple times. - */ - static void process_scheduled_works(struct worker *worker) -@@ -2291,11 +2243,11 @@ static int worker_thread(void *__worker) - /* tell the scheduler that this is a workqueue worker */ - set_pf_worker(true); - woke_up: -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - - /* am I supposed to die? */ - if (unlikely(worker->flags & WORKER_DIE)) { -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - WARN_ON_ONCE(!list_empty(&worker->entry)); - set_pf_worker(false); - -@@ -2361,7 +2313,7 @@ static int worker_thread(void *__worker) - */ - worker_enter_idle(worker); - __set_current_state(TASK_IDLE); -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - schedule(); - goto woke_up; - } -@@ -2415,7 +2367,7 @@ static int rescuer_thread(void *__rescuer) - should_stop = kthread_should_stop(); - - /* see whether any pwq is asking for help */ -- spin_lock_irq(&wq_mayday_lock); -+ raw_spin_lock_irq(&wq_mayday_lock); - - while (!list_empty(&wq->maydays)) { - struct pool_workqueue *pwq = list_first_entry(&wq->maydays, -@@ -2427,11 +2379,11 @@ static int rescuer_thread(void *__rescuer) - __set_current_state(TASK_RUNNING); - list_del_init(&pwq->mayday_node); - -- spin_unlock_irq(&wq_mayday_lock); -+ raw_spin_unlock_irq(&wq_mayday_lock); - - worker_attach_to_pool(rescuer, pool); - -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - - /* - * Slurp in all works issued via this workqueue and -@@ -2460,7 +2412,7 @@ static int rescuer_thread(void *__rescuer) - * incur MAYDAY_INTERVAL delay inbetween. - */ - if (need_to_create_worker(pool)) { -- spin_lock(&wq_mayday_lock); -+ raw_spin_lock(&wq_mayday_lock); - /* - * Queue iff we aren't racing destruction - * and somebody else hasn't queued it already. -@@ -2469,7 +2421,7 @@ static int rescuer_thread(void *__rescuer) - get_pwq(pwq); - list_add_tail(&pwq->mayday_node, &wq->maydays); - } -- spin_unlock(&wq_mayday_lock); -+ raw_spin_unlock(&wq_mayday_lock); - } - } - -@@ -2487,14 +2439,14 @@ static int rescuer_thread(void *__rescuer) - if (need_more_worker(pool)) - wake_up_worker(pool); - -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - - worker_detach_from_pool(rescuer); - -- spin_lock_irq(&wq_mayday_lock); -+ raw_spin_lock_irq(&wq_mayday_lock); - } - -- spin_unlock_irq(&wq_mayday_lock); -+ raw_spin_unlock_irq(&wq_mayday_lock); - - if (should_stop) { - __set_current_state(TASK_RUNNING); -@@ -2574,7 +2526,7 @@ static void wq_barrier_func(struct work_struct *work) - * underneath us, so we can't reliably determine pwq from @target. - * - * CONTEXT: -- * spin_lock_irq(pool->lock). -+ * raw_spin_lock_irq(pool->lock). - */ - static void insert_wq_barrier(struct pool_workqueue *pwq, - struct wq_barrier *barr, -@@ -2661,7 +2613,7 @@ static bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq, - for_each_pwq(pwq, wq) { - struct worker_pool *pool = pwq->pool; - -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - - if (flush_color >= 0) { - WARN_ON_ONCE(pwq->flush_color != -1); -@@ -2678,7 +2630,7 @@ static bool flush_workqueue_prep_pwqs(struct workqueue_struct *wq, - pwq->work_color = work_color; - } - -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - } - - if (flush_color >= 0 && atomic_dec_and_test(&wq->nr_pwqs_to_flush)) -@@ -2878,9 +2830,9 @@ void drain_workqueue(struct workqueue_struct *wq) - for_each_pwq(pwq, wq) { - bool drained; - -- spin_lock_irq(&pwq->pool->lock); -+ raw_spin_lock_irq(&pwq->pool->lock); - drained = !pwq->nr_active && list_empty(&pwq->delayed_works); -- spin_unlock_irq(&pwq->pool->lock); -+ raw_spin_unlock_irq(&pwq->pool->lock); - - if (drained) - continue; -@@ -2916,7 +2868,7 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, - return false; - } - -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - /* see the comment in try_to_grab_pending() with the same code */ - pwq = get_work_pwq(work); - if (pwq) { -@@ -2932,7 +2884,7 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, - check_flush_dependency(pwq->wq, work); - - insert_wq_barrier(pwq, barr, work, worker); -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - - /* - * Force a lock recursion deadlock when using flush_work() inside a -@@ -2951,7 +2903,7 @@ static bool start_flush_work(struct work_struct *work, struct wq_barrier *barr, - rcu_read_unlock(); - return true; - already_gone: -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - rcu_read_unlock(); - return false; - } -@@ -3052,7 +3004,7 @@ static bool __cancel_work_timer(struct work_struct *work, bool is_dwork) - - /* tell other tasks trying to grab @work to back off */ - mark_work_canceling(work); -- local_unlock_irqrestore(pendingb_lock, flags); -+ local_irq_restore(flags); - - /* - * This allows canceling during early boot. We know that @work -@@ -3113,10 +3065,10 @@ EXPORT_SYMBOL_GPL(cancel_work_sync); - */ - bool flush_delayed_work(struct delayed_work *dwork) - { -- local_lock_irq(pendingb_lock); -+ local_irq_disable(); - if (del_timer_sync(&dwork->timer)) - __queue_work(dwork->cpu, dwork->wq, &dwork->work); -- local_unlock_irq(pendingb_lock); -+ local_irq_enable(); - return flush_work(&dwork->work); - } - EXPORT_SYMBOL(flush_delayed_work); -@@ -3154,7 +3106,7 @@ static bool __cancel_work(struct work_struct *work, bool is_dwork) - return false; - - set_work_pool_and_clear_pending(work, get_work_pool_id(work)); -- local_unlock_irqrestore(pendingb_lock, flags); -+ local_irq_restore(flags); - return ret; - } - -@@ -3264,7 +3216,7 @@ EXPORT_SYMBOL_GPL(execute_in_process_context); - * - * Undo alloc_workqueue_attrs(). - */ --void free_workqueue_attrs(struct workqueue_attrs *attrs) -+static void free_workqueue_attrs(struct workqueue_attrs *attrs) - { - if (attrs) { - free_cpumask_var(attrs->cpumask); -@@ -3274,21 +3226,20 @@ void free_workqueue_attrs(struct workqueue_attrs *attrs) - - /** - * alloc_workqueue_attrs - allocate a workqueue_attrs -- * @gfp_mask: allocation mask to use - * - * Allocate a new workqueue_attrs, initialize with default settings and - * return it. - * - * Return: The allocated new workqueue_attr on success. %NULL on failure. - */ --struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask) -+static struct workqueue_attrs *alloc_workqueue_attrs(void) - { - struct workqueue_attrs *attrs; - -- attrs = kzalloc(sizeof(*attrs), gfp_mask); -+ attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); - if (!attrs) - goto fail; -- if (!alloc_cpumask_var(&attrs->cpumask, gfp_mask)) -+ if (!alloc_cpumask_var(&attrs->cpumask, GFP_KERNEL)) - goto fail; - - cpumask_copy(attrs->cpumask, cpu_possible_mask); -@@ -3345,7 +3296,7 @@ static bool wqattrs_equal(const struct workqueue_attrs *a, - */ - static int init_worker_pool(struct worker_pool *pool) - { -- spin_lock_init(&pool->lock); -+ raw_spin_lock_init(&pool->lock); - pool->id = -1; - pool->cpu = -1; - pool->node = NUMA_NO_NODE; -@@ -3366,7 +3317,7 @@ static int init_worker_pool(struct worker_pool *pool) - pool->refcnt = 1; - - /* shouldn't fail above this point */ -- pool->attrs = alloc_workqueue_attrs(GFP_KERNEL); -+ pool->attrs = alloc_workqueue_attrs(); - if (!pool->attrs) - return -ENOMEM; - return 0; -@@ -3431,15 +3382,15 @@ static void put_unbound_pool(struct worker_pool *pool) - * @pool's workers from blocking on attach_mutex. We're the last - * manager and @pool gets freed with the flag set. - */ -- spin_lock_irq(&pool->lock); -- wait_event_lock_irq(wq_manager_wait, -+ raw_spin_lock_irq(&pool->lock); -+ swait_event_lock_irq(wq_manager_wait, - !(pool->flags & POOL_MANAGER_ACTIVE), pool->lock); - pool->flags |= POOL_MANAGER_ACTIVE; - - while ((worker = first_idle_worker(pool))) - destroy_worker(worker); - WARN_ON(pool->nr_workers || pool->nr_idle); -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - - mutex_lock(&wq_pool_attach_mutex); - if (!list_empty(&pool->workers)) -@@ -3593,7 +3544,7 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) - return; - - /* this function can be called during early boot w/ irq disabled */ -- spin_lock_irqsave(&pwq->pool->lock, flags); -+ raw_spin_lock_irqsave(&pwq->pool->lock, flags); - - /* - * During [un]freezing, the caller is responsible for ensuring that -@@ -3616,7 +3567,7 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) - pwq->max_active = 0; - } - -- spin_unlock_irqrestore(&pwq->pool->lock, flags); -+ raw_spin_unlock_irqrestore(&pwq->pool->lock, flags); - } - - /* initialize newly alloced @pwq which is associated with @wq and @pool */ -@@ -3789,8 +3740,8 @@ apply_wqattrs_prepare(struct workqueue_struct *wq, - - ctx = kzalloc(struct_size(ctx, pwq_tbl, nr_node_ids), GFP_KERNEL); - -- new_attrs = alloc_workqueue_attrs(GFP_KERNEL); -- tmp_attrs = alloc_workqueue_attrs(GFP_KERNEL); -+ new_attrs = alloc_workqueue_attrs(); -+ tmp_attrs = alloc_workqueue_attrs(); - if (!ctx || !new_attrs || !tmp_attrs) - goto out_free; - -@@ -3926,7 +3877,7 @@ static int apply_workqueue_attrs_locked(struct workqueue_struct *wq, - * - * Return: 0 on success and -errno on failure. - */ --int apply_workqueue_attrs(struct workqueue_struct *wq, -+static int apply_workqueue_attrs(struct workqueue_struct *wq, - const struct workqueue_attrs *attrs) - { - int ret; -@@ -3937,7 +3888,6 @@ int apply_workqueue_attrs(struct workqueue_struct *wq, - - return ret; - } --EXPORT_SYMBOL_GPL(apply_workqueue_attrs); - - /** - * wq_update_unbound_numa - update NUMA affinity of a wq for CPU hot[un]plug -@@ -4015,9 +3965,9 @@ static void wq_update_unbound_numa(struct workqueue_struct *wq, int cpu, - - use_dfl_pwq: - mutex_lock(&wq->mutex); -- spin_lock_irq(&wq->dfl_pwq->pool->lock); -+ raw_spin_lock_irq(&wq->dfl_pwq->pool->lock); - get_pwq(wq->dfl_pwq); -- spin_unlock_irq(&wq->dfl_pwq->pool->lock); -+ raw_spin_unlock_irq(&wq->dfl_pwq->pool->lock); - old_pwq = numa_pwq_tbl_install(wq, node, wq->dfl_pwq); - out_unlock: - mutex_unlock(&wq->mutex); -@@ -4136,7 +4086,7 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt, - return NULL; - - if (flags & WQ_UNBOUND) { -- wq->unbound_attrs = alloc_workqueue_attrs(GFP_KERNEL); -+ wq->unbound_attrs = alloc_workqueue_attrs(); - if (!wq->unbound_attrs) - goto err_free_wq; - } -@@ -4223,9 +4173,9 @@ void destroy_workqueue(struct workqueue_struct *wq) - struct worker *rescuer = wq->rescuer; - - /* this prevents new queueing */ -- spin_lock_irq(&wq_mayday_lock); -+ raw_spin_lock_irq(&wq_mayday_lock); - wq->rescuer = NULL; -- spin_unlock_irq(&wq_mayday_lock); -+ raw_spin_unlock_irq(&wq_mayday_lock); - - /* rescuer will empty maydays list before exiting */ - kthread_stop(rescuer->task); -@@ -4420,10 +4370,10 @@ unsigned int work_busy(struct work_struct *work) - rcu_read_lock(); - pool = get_work_pool(work); - if (pool) { -- spin_lock_irqsave(&pool->lock, flags); -+ raw_spin_lock_irqsave(&pool->lock, flags); - if (find_worker_executing_work(pool, work)) - ret |= WORK_BUSY_RUNNING; -- spin_unlock_irqrestore(&pool->lock, flags); -+ raw_spin_unlock_irqrestore(&pool->lock, flags); - } - rcu_read_unlock(); - -@@ -4630,10 +4580,10 @@ void show_workqueue_state(void) - pr_info("workqueue %s: flags=0x%x\n", wq->name, wq->flags); - - for_each_pwq(pwq, wq) { -- spin_lock_irqsave(&pwq->pool->lock, flags); -+ raw_spin_lock_irqsave(&pwq->pool->lock, flags); - if (pwq->nr_active || !list_empty(&pwq->delayed_works)) - show_pwq(pwq); -- spin_unlock_irqrestore(&pwq->pool->lock, flags); -+ raw_spin_unlock_irqrestore(&pwq->pool->lock, flags); - /* - * We could be printing a lot from atomic context, e.g. - * sysrq-t -> show_workqueue_state(). Avoid triggering -@@ -4647,7 +4597,7 @@ void show_workqueue_state(void) - struct worker *worker; - bool first = true; - -- spin_lock_irqsave(&pool->lock, flags); -+ raw_spin_lock_irqsave(&pool->lock, flags); - if (pool->nr_workers == pool->nr_idle) - goto next_pool; - -@@ -4666,7 +4616,7 @@ void show_workqueue_state(void) - } - pr_cont("\n"); - next_pool: -- spin_unlock_irqrestore(&pool->lock, flags); -+ raw_spin_unlock_irqrestore(&pool->lock, flags); - /* - * We could be printing a lot from atomic context, e.g. - * sysrq-t -> show_workqueue_state(). Avoid triggering -@@ -4696,7 +4646,7 @@ void wq_worker_comm(char *buf, size_t size, struct task_struct *task) - struct worker_pool *pool = worker->pool; - - if (pool) { -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - /* - * ->desc tracks information (wq name or - * set_worker_desc()) for the latest execution. If -@@ -4710,7 +4660,7 @@ void wq_worker_comm(char *buf, size_t size, struct task_struct *task) - scnprintf(buf + off, size - off, "-%s", - worker->desc); - } -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - } - } - -@@ -4741,7 +4691,7 @@ static void unbind_workers(int cpu) - - for_each_cpu_worker_pool(pool, cpu) { - mutex_lock(&wq_pool_attach_mutex); -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - - /* - * We've blocked all attach/detach operations. Make all workers -@@ -4755,7 +4705,7 @@ static void unbind_workers(int cpu) - - pool->flags |= POOL_DISASSOCIATED; - -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - mutex_unlock(&wq_pool_attach_mutex); - - /* -@@ -4781,9 +4731,9 @@ static void unbind_workers(int cpu) - * worker blocking could lead to lengthy stalls. Kick off - * unbound chain execution of currently pending work items. - */ -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - wake_up_worker(pool); -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - } - } - -@@ -4810,7 +4760,7 @@ static void rebind_workers(struct worker_pool *pool) - WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, - pool->attrs->cpumask) < 0); - -- spin_lock_irq(&pool->lock); -+ raw_spin_lock_irq(&pool->lock); - - pool->flags &= ~POOL_DISASSOCIATED; - -@@ -4849,7 +4799,7 @@ static void rebind_workers(struct worker_pool *pool) - WRITE_ONCE(worker->flags, worker_flags); - } - -- spin_unlock_irq(&pool->lock); -+ raw_spin_unlock_irq(&pool->lock); - } - - /** -@@ -5301,7 +5251,7 @@ static struct workqueue_attrs *wq_sysfs_prep_attrs(struct workqueue_struct *wq) - - lockdep_assert_held(&wq_pool_mutex); - -- attrs = alloc_workqueue_attrs(GFP_KERNEL); -+ attrs = alloc_workqueue_attrs(); - if (!attrs) - return NULL; - -@@ -5723,7 +5673,7 @@ static void __init wq_numa_init(void) - return; - } - -- wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(GFP_KERNEL); -+ wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(); - BUG_ON(!wq_update_unbound_numa_attrs_buf); - - /* -@@ -5798,7 +5748,7 @@ int __init workqueue_init_early(void) - for (i = 0; i < NR_STD_WORKER_POOLS; i++) { - struct workqueue_attrs *attrs; - -- BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); -+ BUG_ON(!(attrs = alloc_workqueue_attrs())); - attrs->nice = std_nice[i]; - unbound_std_wq_attrs[i] = attrs; - -@@ -5807,7 +5757,7 @@ int __init workqueue_init_early(void) - * guaranteed by max_active which is enforced by pwqs. - * Turn off NUMA so that dfl_pwq is used for all nodes. - */ -- BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL))); -+ BUG_ON(!(attrs = alloc_workqueue_attrs())); - attrs->nice = std_nice[i]; - attrs->no_numa = true; - ordered_wq_attrs[i] = attrs; --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0290-Linux-4.19.94-rt38-REBASE.patch linux-4.19.118/debian/patches-rt/0290-Linux-4.19.94-rt38-REBASE.patch --- linux-4.19.98/debian/patches-rt/0290-Linux-4.19.94-rt38-REBASE.patch 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0290-Linux-4.19.94-rt38-REBASE.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -From dee368fe90e9506b8a4c9948fb611fb77dda153f Mon Sep 17 00:00:00 2001 -From: Steven Rostedt -Date: Mon, 14 Oct 2019 13:24:30 -0400 -Subject: [PATCH 290/290] Linux 4.19.94-rt38 REBASE -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.94-rt38.tar.xz - ---- - localversion-rt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/localversion-rt b/localversion-rt -index 1199ebade17b..49bae8d6aa67 100644 ---- a/localversion-rt -+++ b/localversion-rt -@@ -1 +1 @@ ---rt16 -+-rt38 --- -2.24.1 - diff -Nru linux-4.19.98/debian/patches-rt/0290-thermal-x86_pkg_temp-make-pkg_temp_lock-a-raw-spinlo.patch linux-4.19.118/debian/patches-rt/0290-thermal-x86_pkg_temp-make-pkg_temp_lock-a-raw-spinlo.patch --- linux-4.19.98/debian/patches-rt/0290-thermal-x86_pkg_temp-make-pkg_temp_lock-a-raw-spinlo.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0290-thermal-x86_pkg_temp-make-pkg_temp_lock-a-raw-spinlo.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,120 @@ +From 9af59981c8191547bb127a9be2984f0009085b2e Mon Sep 17 00:00:00 2001 +From: Clark Williams +Date: Mon, 15 Jul 2019 15:25:00 -0500 +Subject: [PATCH 290/325] thermal/x86_pkg_temp: make pkg_temp_lock a raw + spinlock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 8b03bb3ea7861b70b506199a69b1c8f81fe2d4d0 ] + +The spinlock pkg_temp_lock has the potential of being taken in atomic +context on v5.2-rt PREEMPT_RT. It's static and limited scope so +go ahead and make it a raw spinlock. + +Signed-off-by: Clark Williams +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/thermal/x86_pkg_temp_thermal.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/drivers/thermal/x86_pkg_temp_thermal.c b/drivers/thermal/x86_pkg_temp_thermal.c +index 1ef937d799e4..540becb78a0f 100644 +--- a/drivers/thermal/x86_pkg_temp_thermal.c ++++ b/drivers/thermal/x86_pkg_temp_thermal.c +@@ -75,7 +75,7 @@ static int max_packages __read_mostly; + /* Array of package pointers */ + static struct pkg_device **packages; + /* Serializes interrupt notification, work and hotplug */ +-static DEFINE_SPINLOCK(pkg_temp_lock); ++static DEFINE_RAW_SPINLOCK(pkg_temp_lock); + /* Protects zone operation in the work function against hotplug removal */ + static DEFINE_MUTEX(thermal_zone_mutex); + +@@ -291,12 +291,12 @@ static void pkg_temp_thermal_threshold_work_fn(struct work_struct *work) + u64 msr_val, wr_val; + + mutex_lock(&thermal_zone_mutex); +- spin_lock_irq(&pkg_temp_lock); ++ raw_spin_lock_irq(&pkg_temp_lock); + ++pkg_work_cnt; + + pkgdev = pkg_temp_thermal_get_dev(cpu); + if (!pkgdev) { +- spin_unlock_irq(&pkg_temp_lock); ++ raw_spin_unlock_irq(&pkg_temp_lock); + mutex_unlock(&thermal_zone_mutex); + return; + } +@@ -310,7 +310,7 @@ static void pkg_temp_thermal_threshold_work_fn(struct work_struct *work) + } + + enable_pkg_thres_interrupt(); +- spin_unlock_irq(&pkg_temp_lock); ++ raw_spin_unlock_irq(&pkg_temp_lock); + + /* + * If tzone is not NULL, then thermal_zone_mutex will prevent the +@@ -335,7 +335,7 @@ static int pkg_thermal_notify(u64 msr_val) + struct pkg_device *pkgdev; + unsigned long flags; + +- spin_lock_irqsave(&pkg_temp_lock, flags); ++ raw_spin_lock_irqsave(&pkg_temp_lock, flags); + ++pkg_interrupt_cnt; + + disable_pkg_thres_interrupt(); +@@ -347,7 +347,7 @@ static int pkg_thermal_notify(u64 msr_val) + pkg_thermal_schedule_work(pkgdev->cpu, &pkgdev->work); + } + +- spin_unlock_irqrestore(&pkg_temp_lock, flags); ++ raw_spin_unlock_irqrestore(&pkg_temp_lock, flags); + return 0; + } + +@@ -393,9 +393,9 @@ static int pkg_temp_thermal_device_add(unsigned int cpu) + pkgdev->msr_pkg_therm_high); + + cpumask_set_cpu(cpu, &pkgdev->cpumask); +- spin_lock_irq(&pkg_temp_lock); ++ raw_spin_lock_irq(&pkg_temp_lock); + packages[pkgid] = pkgdev; +- spin_unlock_irq(&pkg_temp_lock); ++ raw_spin_unlock_irq(&pkg_temp_lock); + return 0; + } + +@@ -432,7 +432,7 @@ static int pkg_thermal_cpu_offline(unsigned int cpu) + } + + /* Protect against work and interrupts */ +- spin_lock_irq(&pkg_temp_lock); ++ raw_spin_lock_irq(&pkg_temp_lock); + + /* + * Check whether this cpu was the current target and store the new +@@ -464,9 +464,9 @@ static int pkg_thermal_cpu_offline(unsigned int cpu) + * To cancel the work we need to drop the lock, otherwise + * we might deadlock if the work needs to be flushed. + */ +- spin_unlock_irq(&pkg_temp_lock); ++ raw_spin_unlock_irq(&pkg_temp_lock); + cancel_delayed_work_sync(&pkgdev->work); +- spin_lock_irq(&pkg_temp_lock); ++ raw_spin_lock_irq(&pkg_temp_lock); + /* + * If this is not the last cpu in the package and the work + * did not run after we dropped the lock above, then we +@@ -477,7 +477,7 @@ static int pkg_thermal_cpu_offline(unsigned int cpu) + pkg_thermal_schedule_work(target, &pkgdev->work); + } + +- spin_unlock_irq(&pkg_temp_lock); ++ raw_spin_unlock_irq(&pkg_temp_lock); + + /* Final cleanup if this is the last cpu */ + if (lastcpu) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0291-dma-buf-Use-seqlock_t-instread-disabling-preemption.patch linux-4.19.118/debian/patches-rt/0291-dma-buf-Use-seqlock_t-instread-disabling-preemption.patch --- linux-4.19.98/debian/patches-rt/0291-dma-buf-Use-seqlock_t-instread-disabling-preemption.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0291-dma-buf-Use-seqlock_t-instread-disabling-preemption.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,296 @@ +From fc310572745c255840931c77c058698ed0ee811c Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 14 Aug 2019 16:38:43 +0200 +Subject: [PATCH 291/325] dma-buf: Use seqlock_t instread disabling preemption +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 240610aa31094f51f299f06eb8dae8d4cd8d4500 ] + +"dma reservation" disables preemption while acquiring the write access +for "seqcount" and then may acquire a spinlock_t. + +Replace the seqcount with a seqlock_t which provides seqcount like +semantic and lock for writer. + +Link: https://lkml.kernel.org/r/f410b429-db86-f81c-7c67-f563fa808b62@free.fr +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/dma-buf/dma-buf.c | 8 ++-- + drivers/dma-buf/reservation.c | 43 +++++++------------ + .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 6 +-- + drivers/gpu/drm/i915/i915_gem.c | 10 ++--- + include/linux/reservation.h | 4 +- + 5 files changed, 29 insertions(+), 42 deletions(-) + +diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c +index 69842145c223..4c3ef46e7149 100644 +--- a/drivers/dma-buf/dma-buf.c ++++ b/drivers/dma-buf/dma-buf.c +@@ -179,7 +179,7 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll) + return 0; + + retry: +- seq = read_seqcount_begin(&resv->seq); ++ seq = read_seqbegin(&resv->seq); + rcu_read_lock(); + + fobj = rcu_dereference(resv->fence); +@@ -188,7 +188,7 @@ static __poll_t dma_buf_poll(struct file *file, poll_table *poll) + else + shared_count = 0; + fence_excl = rcu_dereference(resv->fence_excl); +- if (read_seqcount_retry(&resv->seq, seq)) { ++ if (read_seqretry(&resv->seq, seq)) { + rcu_read_unlock(); + goto retry; + } +@@ -1046,12 +1046,12 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) + + robj = buf_obj->resv; + while (true) { +- seq = read_seqcount_begin(&robj->seq); ++ seq = read_seqbegin(&robj->seq); + rcu_read_lock(); + fobj = rcu_dereference(robj->fence); + shared_count = fobj ? fobj->shared_count : 0; + fence = rcu_dereference(robj->fence_excl); +- if (!read_seqcount_retry(&robj->seq, seq)) ++ if (!read_seqretry(&robj->seq, seq)) + break; + rcu_read_unlock(); + } +diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c +index 49ab09468ba1..f11d58492216 100644 +--- a/drivers/dma-buf/reservation.c ++++ b/drivers/dma-buf/reservation.c +@@ -109,8 +109,7 @@ reservation_object_add_shared_inplace(struct reservation_object *obj, + + dma_fence_get(fence); + +- preempt_disable(); +- write_seqcount_begin(&obj->seq); ++ write_seqlock(&obj->seq); + + for (i = 0; i < fobj->shared_count; ++i) { + struct dma_fence *old_fence; +@@ -121,8 +120,7 @@ reservation_object_add_shared_inplace(struct reservation_object *obj, + if (old_fence->context == fence->context) { + /* memory barrier is added by write_seqcount_begin */ + RCU_INIT_POINTER(fobj->shared[i], fence); +- write_seqcount_end(&obj->seq); +- preempt_enable(); ++ write_sequnlock(&obj->seq); + + dma_fence_put(old_fence); + return; +@@ -146,8 +144,7 @@ reservation_object_add_shared_inplace(struct reservation_object *obj, + fobj->shared_count++; + } + +- write_seqcount_end(&obj->seq); +- preempt_enable(); ++ write_sequnlock(&obj->seq); + + dma_fence_put(signaled); + } +@@ -191,15 +188,13 @@ reservation_object_add_shared_replace(struct reservation_object *obj, + fobj->shared_count++; + + done: +- preempt_disable(); +- write_seqcount_begin(&obj->seq); ++ write_seqlock(&obj->seq); + /* + * RCU_INIT_POINTER can be used here, + * seqcount provides the necessary barriers + */ + RCU_INIT_POINTER(obj->fence, fobj); +- write_seqcount_end(&obj->seq); +- preempt_enable(); ++ write_sequnlock(&obj->seq); + + if (!old) + return; +@@ -259,14 +254,11 @@ void reservation_object_add_excl_fence(struct reservation_object *obj, + if (fence) + dma_fence_get(fence); + +- preempt_disable(); +- write_seqcount_begin(&obj->seq); +- /* write_seqcount_begin provides the necessary memory barrier */ ++ write_seqlock(&obj->seq); + RCU_INIT_POINTER(obj->fence_excl, fence); + if (old) + old->shared_count = 0; +- write_seqcount_end(&obj->seq); +- preempt_enable(); ++ write_sequnlock(&obj->seq); + + /* inplace update, no shared fences */ + while (i--) +@@ -349,13 +341,10 @@ int reservation_object_copy_fences(struct reservation_object *dst, + src_list = reservation_object_get_list(dst); + old = reservation_object_get_excl(dst); + +- preempt_disable(); +- write_seqcount_begin(&dst->seq); +- /* write_seqcount_begin provides the necessary memory barrier */ ++ write_seqlock(&dst->seq); + RCU_INIT_POINTER(dst->fence_excl, new); + RCU_INIT_POINTER(dst->fence, dst_list); +- write_seqcount_end(&dst->seq); +- preempt_enable(); ++ write_sequnlock(&dst->seq); + + if (src_list) + kfree_rcu(src_list, rcu); +@@ -396,7 +385,7 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj, + shared_count = i = 0; + + rcu_read_lock(); +- seq = read_seqcount_begin(&obj->seq); ++ seq = read_seqbegin(&obj->seq); + + fence_excl = rcu_dereference(obj->fence_excl); + if (fence_excl && !dma_fence_get_rcu(fence_excl)) +@@ -445,7 +434,7 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj, + } + } + +- if (i != shared_count || read_seqcount_retry(&obj->seq, seq)) { ++ if (i != shared_count || read_seqretry(&obj->seq, seq)) { + while (i--) + dma_fence_put(shared[i]); + dma_fence_put(fence_excl); +@@ -494,7 +483,7 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj, + + retry: + shared_count = 0; +- seq = read_seqcount_begin(&obj->seq); ++ seq = read_seqbegin(&obj->seq); + rcu_read_lock(); + i = -1; + +@@ -541,7 +530,7 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj, + + rcu_read_unlock(); + if (fence) { +- if (read_seqcount_retry(&obj->seq, seq)) { ++ if (read_seqretry(&obj->seq, seq)) { + dma_fence_put(fence); + goto retry; + } +@@ -597,7 +586,7 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj, + retry: + ret = true; + shared_count = 0; +- seq = read_seqcount_begin(&obj->seq); ++ seq = read_seqbegin(&obj->seq); + + if (test_all) { + unsigned i; +@@ -618,7 +607,7 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj, + break; + } + +- if (read_seqcount_retry(&obj->seq, seq)) ++ if (read_seqretry(&obj->seq, seq)) + goto retry; + } + +@@ -631,7 +620,7 @@ bool reservation_object_test_signaled_rcu(struct reservation_object *obj, + if (ret < 0) + goto retry; + +- if (read_seqcount_retry(&obj->seq, seq)) ++ if (read_seqretry(&obj->seq, seq)) + goto retry; + } + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +index f92597c292fe..10c675850aac 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +@@ -261,11 +261,9 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, + } + + /* Install the new fence list, seqcount provides the barriers */ +- preempt_disable(); +- write_seqcount_begin(&resv->seq); ++ write_seqlock(&resv->seq); + RCU_INIT_POINTER(resv->fence, new); +- write_seqcount_end(&resv->seq); +- preempt_enable(); ++ write_sequnlock(&resv->seq); + + /* Drop the references to the removed fences or move them to ef_list */ + for (i = j, k = 0; i < old->shared_count; ++i) { +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index c7d05ac7af3c..d484e79316bf 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -516,7 +516,7 @@ i915_gem_object_wait_reservation(struct reservation_object *resv, + long timeout, + struct intel_rps_client *rps_client) + { +- unsigned int seq = __read_seqcount_begin(&resv->seq); ++ unsigned int seq = read_seqbegin(&resv->seq); + struct dma_fence *excl; + bool prune_fences = false; + +@@ -569,9 +569,9 @@ i915_gem_object_wait_reservation(struct reservation_object *resv, + * signaled and that the reservation object has not been changed (i.e. + * no new fences have been added). + */ +- if (prune_fences && !__read_seqcount_retry(&resv->seq, seq)) { ++ if (prune_fences && !read_seqretry(&resv->seq, seq)) { + if (reservation_object_trylock(resv)) { +- if (!__read_seqcount_retry(&resv->seq, seq)) ++ if (!read_seqretry(&resv->seq, seq)) + reservation_object_add_excl_fence(resv, NULL); + reservation_object_unlock(resv); + } +@@ -4615,7 +4615,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data, + * + */ + retry: +- seq = raw_read_seqcount(&obj->resv->seq); ++ seq = read_seqbegin(&obj->resv->seq); + + /* Translate the exclusive fence to the READ *and* WRITE engine */ + args->busy = busy_check_writer(rcu_dereference(obj->resv->fence_excl)); +@@ -4633,7 +4633,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data, + } + } + +- if (args->busy && read_seqcount_retry(&obj->resv->seq, seq)) ++ if (args->busy && read_seqretry(&obj->resv->seq, seq)) + goto retry; + + err = 0; +diff --git a/include/linux/reservation.h b/include/linux/reservation.h +index 02166e815afb..0b31df1af698 100644 +--- a/include/linux/reservation.h ++++ b/include/linux/reservation.h +@@ -72,7 +72,7 @@ struct reservation_object_list { + */ + struct reservation_object { + struct ww_mutex lock; +- seqcount_t seq; ++ seqlock_t seq; + + struct dma_fence __rcu *fence_excl; + struct reservation_object_list __rcu *fence; +@@ -92,7 +92,7 @@ reservation_object_init(struct reservation_object *obj) + { + ww_mutex_init(&obj->lock, &reservation_ww_class); + +- __seqcount_init(&obj->seq, reservation_seqcount_string, &reservation_seqcount_class); ++ seqlock_init(&obj->seq); + RCU_INIT_POINTER(obj->fence, NULL); + RCU_INIT_POINTER(obj->fence_excl, NULL); + obj->staged = NULL; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0292-KVM-arm-arm64-Let-the-timer-expire-in-hardirq-contex.patch linux-4.19.118/debian/patches-rt/0292-KVM-arm-arm64-Let-the-timer-expire-in-hardirq-contex.patch --- linux-4.19.98/debian/patches-rt/0292-KVM-arm-arm64-Let-the-timer-expire-in-hardirq-contex.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0292-KVM-arm-arm64-Let-the-timer-expire-in-hardirq-contex.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,54 @@ +From 92af1484300b2fb481fb3cde9f813abebc1b9fd2 Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Tue, 13 Aug 2019 14:29:41 +0200 +Subject: [PATCH 292/325] KVM: arm/arm64: Let the timer expire in hardirq + context on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 719cc080c914045a6e35787bf4dc3ba91cfd3efb ] + +The timers are canceled from an preempt-notifier which is invoked with +disabled preemption which is not allowed on PREEMPT_RT. +The timer callback is short so in could be invoked in hard-IRQ context +on -RT. + +Let the timer expire on hard-IRQ context even on -RT. + +Signed-off-by: Thomas Gleixner +Acked-by: Marc Zyngier +Tested-by: Julien Grall +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + virt/kvm/arm/arch_timer.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c +index 17cecc96f735..217d39f40393 100644 +--- a/virt/kvm/arm/arch_timer.c ++++ b/virt/kvm/arm/arch_timer.c +@@ -67,7 +67,7 @@ static inline bool userspace_irqchip(struct kvm *kvm) + static void soft_timer_start(struct hrtimer *hrt, u64 ns) + { + hrtimer_start(hrt, ktime_add_ns(ktime_get(), ns), +- HRTIMER_MODE_ABS); ++ HRTIMER_MODE_ABS_HARD); + } + + static void soft_timer_cancel(struct hrtimer *hrt, struct work_struct *work) +@@ -638,10 +638,10 @@ void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu) + vcpu_ptimer(vcpu)->cntvoff = 0; + + INIT_WORK(&timer->expired, kvm_timer_inject_irq_work); +- hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); ++ hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); + timer->bg_timer.function = kvm_bg_timer_expire; + +- hrtimer_init(&timer->phys_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); ++ hrtimer_init(&timer->phys_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); + timer->phys_timer.function = kvm_phys_timer_expire; + + vtimer->irq.irq = default_vtimer_irq.irq; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0293-x86-preempt-Check-preemption-level-before-looking-at.patch linux-4.19.118/debian/patches-rt/0293-x86-preempt-Check-preemption-level-before-looking-at.patch --- linux-4.19.98/debian/patches-rt/0293-x86-preempt-Check-preemption-level-before-looking-at.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0293-x86-preempt-Check-preemption-level-before-looking-at.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,34 @@ +From b7ae4952818be75c5a6069dd33747475b78ecf6c Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 14 Aug 2019 17:08:58 +0200 +Subject: [PATCH 293/325] x86: preempt: Check preemption level before looking + at lazy-preempt +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 19fc8557f2323c52b26561651ed4d51fc688a740 ] + +Before evaluating the lazy-preempt state it must be ensure that the +preempt-count is zero. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + arch/x86/include/asm/preempt.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h +index f66708779274..afa0e42ccdd1 100644 +--- a/arch/x86/include/asm/preempt.h ++++ b/arch/x86/include/asm/preempt.h +@@ -96,6 +96,8 @@ static __always_inline bool __preempt_count_dec_and_test(void) + if (____preempt_count_dec_and_test()) + return true; + #ifdef CONFIG_PREEMPT_LAZY ++ if (preempt_count()) ++ return false; + if (current_thread_info()->preempt_lazy_count) + return false; + return test_thread_flag(TIF_NEED_RESCHED_LAZY); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0294-hrtimer-Use-READ_ONCE-to-access-timer-base-in-hrimer.patch linux-4.19.118/debian/patches-rt/0294-hrtimer-Use-READ_ONCE-to-access-timer-base-in-hrimer.patch --- linux-4.19.98/debian/patches-rt/0294-hrtimer-Use-READ_ONCE-to-access-timer-base-in-hrimer.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0294-hrtimer-Use-READ_ONCE-to-access-timer-base-in-hrimer.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,42 @@ +From e7c83855d0557c416f5940cc7c57095b166f993f Mon Sep 17 00:00:00 2001 +From: Julien Grall +Date: Wed, 21 Aug 2019 10:24:07 +0100 +Subject: [PATCH 294/325] hrtimer: Use READ_ONCE to access timer->base in + hrimer_grab_expiry_lock() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 2c8fdbe7ef0ad06c1a326886c5954e117b5657d6 ] + +The update to timer->base is protected by the base->cpu_base->lock(). +However, hrtimer_grab_expirty_lock() does not access it with the lock. + +So it would theorically be possible to have timer->base changed under +our feet. We need to prevent the compiler to refetch timer->base so the +check and the access is performed on the same base. + +Other access of timer->base are either done with a lock or protected +with READ_ONCE(). So use READ_ONCE() in hrtimer_grab_expirty_lock(). + +Signed-off-by: Julien Grall +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/time/hrtimer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 94d97eae0a46..d6026c170c2d 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -941,7 +941,7 @@ EXPORT_SYMBOL_GPL(hrtimer_forward); + + void hrtimer_grab_expiry_lock(const struct hrtimer *timer) + { +- struct hrtimer_clock_base *base = timer->base; ++ struct hrtimer_clock_base *base = READ_ONCE(timer->base); + + if (base && base->cpu_base) { + spin_lock(&base->cpu_base->softirq_expiry_lock); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0295-hrtimer-Don-t-grab-the-expiry-lock-for-non-soft-hrti.patch linux-4.19.118/debian/patches-rt/0295-hrtimer-Don-t-grab-the-expiry-lock-for-non-soft-hrti.patch --- linux-4.19.98/debian/patches-rt/0295-hrtimer-Don-t-grab-the-expiry-lock-for-non-soft-hrti.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0295-hrtimer-Don-t-grab-the-expiry-lock-for-non-soft-hrti.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,41 @@ +From 37beb738da51dc49fd9ffe9bfa816a6f6429fe45 Mon Sep 17 00:00:00 2001 +From: Julien Grall +Date: Wed, 21 Aug 2019 10:24:08 +0100 +Subject: [PATCH 295/325] hrtimer: Don't grab the expiry lock for non-soft + hrtimer +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit fd420354bea2f57c11f3de191dffdeea76531e76 ] + +Acquiring the lock in hrtimer_grab_expiry_lock() is designed for +sleeping-locks and should not be used with disabled interrupts. +hrtimer_cancel() may invoke hrtimer_grab_expiry_lock() also for locks +which expire in hard-IRQ context. + +Let hrtimer_cancel() invoke hrtimer_grab_expiry_lock() only for locks +which expire in softirq context. + +Signed-off-by: Julien Grall +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: rewrite changelog] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/hrtimer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index d6026c170c2d..49d20fe8570f 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -943,7 +943,7 @@ void hrtimer_grab_expiry_lock(const struct hrtimer *timer) + { + struct hrtimer_clock_base *base = READ_ONCE(timer->base); + +- if (base && base->cpu_base) { ++ if (timer->is_soft && base && base->cpu_base) { + spin_lock(&base->cpu_base->softirq_expiry_lock); + spin_unlock(&base->cpu_base->softirq_expiry_lock); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0296-hrtimer-Prevent-using-hrtimer_grab_expiry_lock-on-mi.patch linux-4.19.118/debian/patches-rt/0296-hrtimer-Prevent-using-hrtimer_grab_expiry_lock-on-mi.patch --- linux-4.19.98/debian/patches-rt/0296-hrtimer-Prevent-using-hrtimer_grab_expiry_lock-on-mi.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0296-hrtimer-Prevent-using-hrtimer_grab_expiry_lock-on-mi.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,43 @@ +From 4d9809e6dfca5b4213ff9fae00819c0af0d4f15d Mon Sep 17 00:00:00 2001 +From: Julien Grall +Date: Wed, 21 Aug 2019 10:24:09 +0100 +Subject: [PATCH 296/325] hrtimer: Prevent using hrtimer_grab_expiry_lock() on + migration_base +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit cef1b87f98823af923a386f3f69149acb212d4a1 ] + +As tglx puts it: +|If base == migration_base then there is no point to lock soft_expiry_lock +|simply because the timer is not executing the callback in soft irq context +|and the whole lock/unlock dance can be avoided. + +Furthermore, all the path leading to hrtimer_grab_expiry_lock() assumes +timer->base and timer->base->cpu_base are always non-NULL. So it is safe +to remove the NULL checks here. + +Signed-off-by: Julien Grall +Link: https://lkml.kernel.org/r/alpine.DEB.2.21.1908211557420.2223@nanos.tec.linutronix.de +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: rewrite changelog] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/hrtimer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 49d20fe8570f..1a5167c68310 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -943,7 +943,7 @@ void hrtimer_grab_expiry_lock(const struct hrtimer *timer) + { + struct hrtimer_clock_base *base = READ_ONCE(timer->base); + +- if (timer->is_soft && base && base->cpu_base) { ++ if (timer->is_soft && base != &migration_base) { + spin_lock(&base->cpu_base->softirq_expiry_lock); + spin_unlock(&base->cpu_base->softirq_expiry_lock); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0297-hrtimer-Add-a-missing-bracket-and-hide-migration_bas.patch linux-4.19.118/debian/patches-rt/0297-hrtimer-Add-a-missing-bracket-and-hide-migration_bas.patch --- linux-4.19.98/debian/patches-rt/0297-hrtimer-Add-a-missing-bracket-and-hide-migration_bas.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0297-hrtimer-Add-a-missing-bracket-and-hide-migration_bas.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,75 @@ +From 40b9a01ca24b87e815110263dc6a8d4d23618a57 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 4 Sep 2019 16:55:27 +0200 +Subject: [PATCH 297/325] hrtimer: Add a missing bracket and hide + `migration_base' on !SMP +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 47b6de0b7f22c28b40275aeede3993d807668c3b ] + +[ Upstream commit 5d2295f3a93b04986d069ebeaf5b07725f9096c1 ] + +The recent change to avoid taking the expiry lock when a timer is currently +migrated missed to add a bracket at the end of the if statement leading to +compile errors. Since that commit the variable `migration_base' is always +used but it is only available on SMP configuration thus leading to another +compile error. The changelog says "The timer base and base->cpu_base +cannot be NULL in the code path", so it is safe to limit this check to SMP +configurations only. + +Add the missing bracket to the if statement and hide `migration_base' +behind CONFIG_SMP bars. + +[ tglx: Mark the functions inline ... ] + +Fixes: 68b2c8c1e4210 ("hrtimer: Don't take expiry_lock when timer is currently migrated") +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Thomas Gleixner +Link: https://lkml.kernel.org/r/20190904145527.eah7z56ntwobqm6j@linutronix.de +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: port back to RT] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/time/hrtimer.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 1a5167c68310..e54a95de8b79 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -150,6 +150,11 @@ static struct hrtimer_cpu_base migration_cpu_base = { + + #define migration_base migration_cpu_base.clock_base[0] + ++static inline bool is_migration_base(struct hrtimer_clock_base *base) ++{ ++ return base == &migration_base; ++} ++ + /* + * We are using hashed locking: holding per_cpu(hrtimer_bases)[n].lock + * means that all timers which are tied to this base via timer->base are +@@ -274,6 +279,11 @@ switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_clock_base *base, + + #else /* CONFIG_SMP */ + ++static inline bool is_migration_base(struct hrtimer_clock_base *base) ++{ ++ return false; ++} ++ + static inline struct hrtimer_clock_base * + lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags) + { +@@ -943,7 +953,7 @@ void hrtimer_grab_expiry_lock(const struct hrtimer *timer) + { + struct hrtimer_clock_base *base = READ_ONCE(timer->base); + +- if (timer->is_soft && base != &migration_base) { ++ if (timer->is_soft && is_migration_base(base)) { + spin_lock(&base->cpu_base->softirq_expiry_lock); + spin_unlock(&base->cpu_base->softirq_expiry_lock); + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0298-posix-timers-Unlock-expiry-lock-in-the-early-return.patch linux-4.19.118/debian/patches-rt/0298-posix-timers-Unlock-expiry-lock-in-the-early-return.patch --- linux-4.19.98/debian/patches-rt/0298-posix-timers-Unlock-expiry-lock-in-the-early-return.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0298-posix-timers-Unlock-expiry-lock-in-the-early-return.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,41 @@ +From f411ec1b4e6bd2f4b4448fa25f79a55478fa3b45 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 16 Sep 2019 12:33:59 +0200 +Subject: [PATCH 298/325] posix-timers: Unlock expiry lock in the early return +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 356a2781375ec58521a9bc3f500488745990c242 ] + +Patch ("posix-timers: Add expiry lock") acquired a lock in +run_posix_cpu_timers() but didn't drop the lock in the early return. + +Unlock the lock in the early return path. + +Reported-by: kbuild test robot +Reported-by: Dan Carpenter +Reviewed-by: Thomas Gleixner +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/time/posix-cpu-timers.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c +index 765e700962ab..c9964dc3276b 100644 +--- a/kernel/time/posix-cpu-timers.c ++++ b/kernel/time/posix-cpu-timers.c +@@ -1175,8 +1175,10 @@ static void __run_posix_cpu_timers(struct task_struct *tsk) + expiry_lock = this_cpu_ptr(&cpu_timer_expiry_lock); + spin_lock(expiry_lock); + +- if (!lock_task_sighand(tsk, &flags)) ++ if (!lock_task_sighand(tsk, &flags)) { ++ spin_unlock(expiry_lock); + return; ++ } + /* + * Here we take off tsk->signal->cpu_timers[N] and + * tsk->cpu_timers[N] all the timers that are firing, and +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0299-sched-migrate_dis-enable-Use-sleeping_lock-to-annota.patch linux-4.19.118/debian/patches-rt/0299-sched-migrate_dis-enable-Use-sleeping_lock-to-annota.patch --- linux-4.19.98/debian/patches-rt/0299-sched-migrate_dis-enable-Use-sleeping_lock-to-annota.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0299-sched-migrate_dis-enable-Use-sleeping_lock-to-annota.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,58 @@ +From d7ead78411ba51a030468c6baaedb44999852db5 Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Tue, 24 Sep 2019 14:36:41 +0200 +Subject: [PATCH 299/325] =?UTF-8?q?sched:=20migrate=5Fdis/enable:=20Use=20?= + =?UTF-8?q?sleeping=5Flock=E2=80=A6()=20to=20annotate=20sleeping=20points?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 4230dd3824c3e1785504e6f757ce79a4b55651fa ] + +Without this, rcu_note_context_switch() will complain if an RCU read lock +is held when migrate_enable() calls stop_one_cpu(). Likewise when +migrate_disable() calls pin_current_cpu() which calls __read_rt_lock() -- +which bypasses the part of the mutex code that calls sleeping_lock_inc(). + +Signed-off-by: Scott Wood +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: use sleeping_lock_…() ] +Signed-off-by: Sebastian Andrzej Siewior +--- + kernel/cpu.c | 2 ++ + kernel/sched/core.c | 3 +++ + 2 files changed, 5 insertions(+) + +diff --git a/kernel/cpu.c b/kernel/cpu.c +index 1541189f417b..0d50ae262898 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -307,7 +307,9 @@ void pin_current_cpu(void) + preempt_lazy_enable(); + preempt_enable(); + ++ sleeping_lock_inc(); + __read_rt_lock(cpuhp_pin); ++ sleeping_lock_dec(); + + preempt_disable(); + preempt_lazy_disable(); +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index a1c0123e7636..3413b9ebef1f 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7372,7 +7372,10 @@ void migrate_enable(void) + unpin_current_cpu(); + preempt_lazy_enable(); + preempt_enable(); ++ ++ sleeping_lock_inc(); + stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); ++ sleeping_lock_dec(); + tlb_migrate_finish(p->mm); + + return; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0300-sched-__set_cpus_allowed_ptr-Check-cpus_mask-not-cpu.patch linux-4.19.118/debian/patches-rt/0300-sched-__set_cpus_allowed_ptr-Check-cpus_mask-not-cpu.patch --- linux-4.19.98/debian/patches-rt/0300-sched-__set_cpus_allowed_ptr-Check-cpus_mask-not-cpu.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0300-sched-__set_cpus_allowed_ptr-Check-cpus_mask-not-cpu.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,39 @@ +From 1c66a5b365296bd3b4ebb2be7eef2d8ba7688414 Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Sat, 27 Jul 2019 00:56:32 -0500 +Subject: [PATCH 300/325] sched: __set_cpus_allowed_ptr: Check cpus_mask, not + cpus_ptr +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit e5606fb7b042db634ed62b4dd733d62e050e468f ] + +This function is concerned with the long-term cpu mask, not the +transitory mask the task might have while migrate disabled. Before +this patch, if a task was migrate disabled at the time +__set_cpus_allowed_ptr() was called, and the new mask happened to be +equal to the cpu that the task was running on, then the mask update +would be lost. + +Signed-off-by: Scott Wood +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 3413b9ebef1f..d6bd8129a390 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1157,7 +1157,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + goto out; + } + +- if (cpumask_equal(p->cpus_ptr, new_mask)) ++ if (cpumask_equal(&p->cpus_mask, new_mask)) + goto out; + + dest_cpu = cpumask_any_and(cpu_valid_mask, new_mask); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0301-sched-Remove-dead-__migrate_disabled-check.patch linux-4.19.118/debian/patches-rt/0301-sched-Remove-dead-__migrate_disabled-check.patch --- linux-4.19.98/debian/patches-rt/0301-sched-Remove-dead-__migrate_disabled-check.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0301-sched-Remove-dead-__migrate_disabled-check.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,39 @@ +From f46e960055b6cbc8a2b26fef4edad0c1b7d3770a Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Sat, 27 Jul 2019 00:56:33 -0500 +Subject: [PATCH 301/325] sched: Remove dead __migrate_disabled() check +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 14d9272d534ea91262e15db99443fc5995c7c016 ] + +This code was unreachable given the __migrate_disabled() branch +to "out" immediately beforehand. + +Signed-off-by: Scott Wood +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index d6bd8129a390..a29f33e776d0 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1182,13 +1182,6 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + if (cpumask_test_cpu(task_cpu(p), new_mask) || __migrate_disabled(p)) + goto out; + +-#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +- if (__migrate_disabled(p)) { +- p->migrate_disable_update = 1; +- goto out; +- } +-#endif +- + if (task_running(rq, p) || p->state == TASK_WAKING) { + struct migration_arg arg = { p, dest_cpu }; + /* Need help from migration thread: drop lock and wait. */ +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0302-sched-migrate-disable-Protect-cpus_ptr-with-lock.patch linux-4.19.118/debian/patches-rt/0302-sched-migrate-disable-Protect-cpus_ptr-with-lock.patch --- linux-4.19.98/debian/patches-rt/0302-sched-migrate-disable-Protect-cpus_ptr-with-lock.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0302-sched-migrate-disable-Protect-cpus_ptr-with-lock.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,47 @@ +From e55dacd743cbf8cee043aab134f975732e2c7c3b Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Sat, 27 Jul 2019 00:56:34 -0500 +Subject: [PATCH 302/325] sched: migrate disable: Protect cpus_ptr with lock +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 27ee52a891ed2c7e2e2c8332ccae0de7c2674b09 ] + +Various places assume that cpus_ptr is protected by rq/pi locks, +so don't change it before grabbing those locks. + +Signed-off-by: Scott Wood +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index a29f33e776d0..d9a3f88508ee 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7250,9 +7250,8 @@ migrate_disable_update_cpus_allowed(struct task_struct *p) + struct rq *rq; + struct rq_flags rf; + +- p->cpus_ptr = cpumask_of(smp_processor_id()); +- + rq = task_rq_lock(p, &rf); ++ p->cpus_ptr = cpumask_of(smp_processor_id()); + update_nr_migratory(p, -1); + p->nr_cpus_allowed = 1; + task_rq_unlock(rq, p, &rf); +@@ -7264,9 +7263,8 @@ migrate_enable_update_cpus_allowed(struct task_struct *p) + struct rq *rq; + struct rq_flags rf; + +- p->cpus_ptr = &p->cpus_mask; +- + rq = task_rq_lock(p, &rf); ++ p->cpus_ptr = &p->cpus_mask; + p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask); + update_nr_migratory(p, 1); + task_rq_unlock(rq, p, &rf); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0303-lib-smp_processor_id-Don-t-use-cpumask_equal.patch linux-4.19.118/debian/patches-rt/0303-lib-smp_processor_id-Don-t-use-cpumask_equal.patch --- linux-4.19.98/debian/patches-rt/0303-lib-smp_processor_id-Don-t-use-cpumask_equal.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0303-lib-smp_processor_id-Don-t-use-cpumask_equal.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,45 @@ +From 2a8268e1b24351654fff43cf71aef1206aebeaf0 Mon Sep 17 00:00:00 2001 +From: Waiman Long +Date: Thu, 3 Oct 2019 16:36:08 -0400 +Subject: [PATCH 303/325] lib/smp_processor_id: Don't use cpumask_equal() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 659252061477862f45b79e1de169e6030f5c8918 ] + +The check_preemption_disabled() function uses cpumask_equal() to see +if the task is bounded to the current CPU only. cpumask_equal() calls +memcmp() to do the comparison. As x86 doesn't have __HAVE_ARCH_MEMCMP, +the slow memcmp() function in lib/string.c is used. + +On a RT kernel that call check_preemption_disabled() very frequently, +below is the perf-record output of a certain microbenchmark: + + 42.75% 2.45% testpmd [kernel.kallsyms] [k] check_preemption_disabled + 40.01% 39.97% testpmd [kernel.kallsyms] [k] memcmp + +We should avoid calling memcmp() in performance critical path. So the +cpumask_equal() call is now replaced with an equivalent simpler check. + +Signed-off-by: Waiman Long +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + lib/smp_processor_id.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c +index fb35c45b9421..b8a8a8db2d75 100644 +--- a/lib/smp_processor_id.c ++++ b/lib/smp_processor_id.c +@@ -22,7 +22,7 @@ notrace static unsigned int check_preemption_disabled(const char *what1, + * Kernel threads bound to a single CPU can safely use + * smp_processor_id(): + */ +- if (cpumask_equal(current->cpus_ptr, cpumask_of(this_cpu))) ++ if (current->nr_cpus_allowed == 1) + goto out; + + /* +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0304-futex-Make-the-futex_hash_bucket-spinlock_t-again-an.patch linux-4.19.118/debian/patches-rt/0304-futex-Make-the-futex_hash_bucket-spinlock_t-again-an.patch --- linux-4.19.98/debian/patches-rt/0304-futex-Make-the-futex_hash_bucket-spinlock_t-again-an.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0304-futex-Make-the-futex_hash_bucket-spinlock_t-again-an.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,738 @@ +From adad7dbe4e54e932da34439e96166729050fbdc1 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Mon, 7 Oct 2019 16:45:18 +0200 +Subject: [PATCH 304/325] futex: Make the futex_hash_bucket spinlock_t again + and bring back its old state +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 954ad80c23edfe71f4e8ce70b961eac884320c3a ] + +This is an all-in-one patch that reverts the patches: + futex: Make the futex_hash_bucket lock raw + futex: Delay deallocation of pi_state + +and adds back the old patches we had: + futex: workaround migrate_disable/enable in different context + rtmutex: Handle the various new futex race conditions + futex: Fix bug on when a requeued RT task times out + futex: Ensure lock/unlock symetry versus pi_lock and hash bucket lock + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/futex.c | 230 ++++++++++++++++++-------------- + kernel/locking/rtmutex.c | 65 ++++++++- + kernel/locking/rtmutex_common.h | 3 + + 3 files changed, 194 insertions(+), 104 deletions(-) + +diff --git a/kernel/futex.c b/kernel/futex.c +index 3c604e3eb20a..81c8908eae3d 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -243,7 +243,7 @@ struct futex_q { + struct plist_node list; + + struct task_struct *task; +- raw_spinlock_t *lock_ptr; ++ spinlock_t *lock_ptr; + union futex_key key; + struct futex_pi_state *pi_state; + struct rt_mutex_waiter *rt_waiter; +@@ -264,7 +264,7 @@ static const struct futex_q futex_q_init = { + */ + struct futex_hash_bucket { + atomic_t waiters; +- raw_spinlock_t lock; ++ spinlock_t lock; + struct plist_head chain; + } ____cacheline_aligned_in_smp; + +@@ -842,13 +842,13 @@ static void get_pi_state(struct futex_pi_state *pi_state) + * Drops a reference to the pi_state object and frees or caches it + * when the last reference is gone. + */ +-static struct futex_pi_state *__put_pi_state(struct futex_pi_state *pi_state) ++static void put_pi_state(struct futex_pi_state *pi_state) + { + if (!pi_state) +- return NULL; ++ return; + + if (!atomic_dec_and_test(&pi_state->refcount)) +- return NULL; ++ return; + + /* + * If pi_state->owner is NULL, the owner is most probably dying +@@ -868,7 +868,9 @@ static struct futex_pi_state *__put_pi_state(struct futex_pi_state *pi_state) + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); + } + +- if (!current->pi_state_cache) { ++ if (current->pi_state_cache) { ++ kfree(pi_state); ++ } else { + /* + * pi_state->list is already empty. + * clear pi_state->owner. +@@ -877,30 +879,6 @@ static struct futex_pi_state *__put_pi_state(struct futex_pi_state *pi_state) + pi_state->owner = NULL; + atomic_set(&pi_state->refcount, 1); + current->pi_state_cache = pi_state; +- pi_state = NULL; +- } +- return pi_state; +-} +- +-static void put_pi_state(struct futex_pi_state *pi_state) +-{ +- kfree(__put_pi_state(pi_state)); +-} +- +-static void put_pi_state_atomic(struct futex_pi_state *pi_state, +- struct list_head *to_free) +-{ +- if (__put_pi_state(pi_state)) +- list_add(&pi_state->list, to_free); +-} +- +-static void free_pi_state_list(struct list_head *to_free) +-{ +- struct futex_pi_state *p, *next; +- +- list_for_each_entry_safe(p, next, to_free, list) { +- list_del(&p->list); +- kfree(p); + } + } + +@@ -917,7 +895,6 @@ void exit_pi_state_list(struct task_struct *curr) + struct futex_pi_state *pi_state; + struct futex_hash_bucket *hb; + union futex_key key = FUTEX_KEY_INIT; +- LIST_HEAD(to_free); + + if (!futex_cmpxchg_enabled) + return; +@@ -951,7 +928,7 @@ void exit_pi_state_list(struct task_struct *curr) + } + raw_spin_unlock_irq(&curr->pi_lock); + +- raw_spin_lock(&hb->lock); ++ spin_lock(&hb->lock); + raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); + raw_spin_lock(&curr->pi_lock); + /* +@@ -961,8 +938,10 @@ void exit_pi_state_list(struct task_struct *curr) + if (head->next != next) { + /* retain curr->pi_lock for the loop invariant */ + raw_spin_unlock(&pi_state->pi_mutex.wait_lock); +- raw_spin_unlock(&hb->lock); +- put_pi_state_atomic(pi_state, &to_free); ++ raw_spin_unlock_irq(&curr->pi_lock); ++ spin_unlock(&hb->lock); ++ raw_spin_lock_irq(&curr->pi_lock); ++ put_pi_state(pi_state); + continue; + } + +@@ -973,7 +952,7 @@ void exit_pi_state_list(struct task_struct *curr) + + raw_spin_unlock(&curr->pi_lock); + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); +- raw_spin_unlock(&hb->lock); ++ spin_unlock(&hb->lock); + + rt_mutex_futex_unlock(&pi_state->pi_mutex); + put_pi_state(pi_state); +@@ -981,8 +960,6 @@ void exit_pi_state_list(struct task_struct *curr) + raw_spin_lock_irq(&curr->pi_lock); + } + raw_spin_unlock_irq(&curr->pi_lock); +- +- free_pi_state_list(&to_free); + } + + #endif +@@ -1469,7 +1446,7 @@ static void __unqueue_futex(struct futex_q *q) + { + struct futex_hash_bucket *hb; + +- if (WARN_ON_SMP(!q->lock_ptr || !raw_spin_is_locked(q->lock_ptr)) ++ if (WARN_ON_SMP(!q->lock_ptr || !spin_is_locked(q->lock_ptr)) + || WARN_ON(plist_node_empty(&q->list))) + return; + +@@ -1597,21 +1574,21 @@ static inline void + double_lock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) + { + if (hb1 <= hb2) { +- raw_spin_lock(&hb1->lock); ++ spin_lock(&hb1->lock); + if (hb1 < hb2) +- raw_spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING); ++ spin_lock_nested(&hb2->lock, SINGLE_DEPTH_NESTING); + } else { /* hb1 > hb2 */ +- raw_spin_lock(&hb2->lock); +- raw_spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING); ++ spin_lock(&hb2->lock); ++ spin_lock_nested(&hb1->lock, SINGLE_DEPTH_NESTING); + } + } + + static inline void + double_unlock_hb(struct futex_hash_bucket *hb1, struct futex_hash_bucket *hb2) + { +- raw_spin_unlock(&hb1->lock); ++ spin_unlock(&hb1->lock); + if (hb1 != hb2) +- raw_spin_unlock(&hb2->lock); ++ spin_unlock(&hb2->lock); + } + + /* +@@ -1639,7 +1616,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) + if (!hb_waiters_pending(hb)) + goto out_put_key; + +- raw_spin_lock(&hb->lock); ++ spin_lock(&hb->lock); + + plist_for_each_entry_safe(this, next, &hb->chain, list) { + if (match_futex (&this->key, &key)) { +@@ -1658,7 +1635,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) + } + } + +- raw_spin_unlock(&hb->lock); ++ spin_unlock(&hb->lock); + wake_up_q(&wake_q); + out_put_key: + put_futex_key(&key); +@@ -1965,7 +1942,6 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + struct futex_hash_bucket *hb1, *hb2; + struct futex_q *this, *next; + DEFINE_WAKE_Q(wake_q); +- LIST_HEAD(to_free); + + if (nr_wake < 0 || nr_requeue < 0) + return -EINVAL; +@@ -2193,6 +2169,16 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + requeue_pi_wake_futex(this, &key2, hb2); + drop_count++; + continue; ++ } else if (ret == -EAGAIN) { ++ /* ++ * Waiter was woken by timeout or ++ * signal and has set pi_blocked_on to ++ * PI_WAKEUP_INPROGRESS before we ++ * tried to enqueue it on the rtmutex. ++ */ ++ this->pi_state = NULL; ++ put_pi_state(pi_state); ++ continue; + } else if (ret) { + /* + * rt_mutex_start_proxy_lock() detected a +@@ -2203,7 +2189,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + * object. + */ + this->pi_state = NULL; +- put_pi_state_atomic(pi_state, &to_free); ++ put_pi_state(pi_state); + /* + * We stop queueing more waiters and let user + * space deal with the mess. +@@ -2220,7 +2206,7 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + * in futex_proxy_trylock_atomic() or in lookup_pi_state(). We + * need to drop it here again. + */ +- put_pi_state_atomic(pi_state, &to_free); ++ put_pi_state(pi_state); + + out_unlock: + double_unlock_hb(hb1, hb2); +@@ -2241,7 +2227,6 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + out_put_key1: + put_futex_key(&key1); + out: +- free_pi_state_list(&to_free); + return ret ? ret : task_count; + } + +@@ -2265,7 +2250,7 @@ static inline struct futex_hash_bucket *queue_lock(struct futex_q *q) + + q->lock_ptr = &hb->lock; + +- raw_spin_lock(&hb->lock); /* implies smp_mb(); (A) */ ++ spin_lock(&hb->lock); /* implies smp_mb(); (A) */ + return hb; + } + +@@ -2273,7 +2258,7 @@ static inline void + queue_unlock(struct futex_hash_bucket *hb) + __releases(&hb->lock) + { +- raw_spin_unlock(&hb->lock); ++ spin_unlock(&hb->lock); + hb_waiters_dec(hb); + } + +@@ -2312,7 +2297,7 @@ static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb) + __releases(&hb->lock) + { + __queue_me(q, hb); +- raw_spin_unlock(&hb->lock); ++ spin_unlock(&hb->lock); + } + + /** +@@ -2328,41 +2313,41 @@ static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb) + */ + static int unqueue_me(struct futex_q *q) + { +- raw_spinlock_t *lock_ptr; ++ spinlock_t *lock_ptr; + int ret = 0; + + /* In the common case we don't take the spinlock, which is nice. */ + retry: + /* +- * q->lock_ptr can change between this read and the following +- * raw_spin_lock. Use READ_ONCE to forbid the compiler from reloading +- * q->lock_ptr and optimizing lock_ptr out of the logic below. ++ * q->lock_ptr can change between this read and the following spin_lock. ++ * Use READ_ONCE to forbid the compiler from reloading q->lock_ptr and ++ * optimizing lock_ptr out of the logic below. + */ + lock_ptr = READ_ONCE(q->lock_ptr); + if (lock_ptr != NULL) { +- raw_spin_lock(lock_ptr); ++ spin_lock(lock_ptr); + /* + * q->lock_ptr can change between reading it and +- * raw_spin_lock(), causing us to take the wrong lock. This ++ * spin_lock(), causing us to take the wrong lock. This + * corrects the race condition. + * + * Reasoning goes like this: if we have the wrong lock, + * q->lock_ptr must have changed (maybe several times) +- * between reading it and the raw_spin_lock(). It can +- * change again after the raw_spin_lock() but only if it was +- * already changed before the raw_spin_lock(). It cannot, ++ * between reading it and the spin_lock(). It can ++ * change again after the spin_lock() but only if it was ++ * already changed before the spin_lock(). It cannot, + * however, change back to the original value. Therefore + * we can detect whether we acquired the correct lock. + */ + if (unlikely(lock_ptr != q->lock_ptr)) { +- raw_spin_unlock(lock_ptr); ++ spin_unlock(lock_ptr); + goto retry; + } + __unqueue_futex(q); + + BUG_ON(q->pi_state); + +- raw_spin_unlock(lock_ptr); ++ spin_unlock(lock_ptr); + ret = 1; + } + +@@ -2378,16 +2363,13 @@ static int unqueue_me(struct futex_q *q) + static void unqueue_me_pi(struct futex_q *q) + __releases(q->lock_ptr) + { +- struct futex_pi_state *ps; +- + __unqueue_futex(q); + + BUG_ON(!q->pi_state); +- ps = __put_pi_state(q->pi_state); ++ put_pi_state(q->pi_state); + q->pi_state = NULL; + +- raw_spin_unlock(q->lock_ptr); +- kfree(ps); ++ spin_unlock(q->lock_ptr); + } + + static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, +@@ -2520,7 +2502,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, + */ + handle_err: + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); +- raw_spin_unlock(q->lock_ptr); ++ spin_unlock(q->lock_ptr); + + switch (err) { + case -EFAULT: +@@ -2538,7 +2520,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, + break; + } + +- raw_spin_lock(q->lock_ptr); ++ spin_lock(q->lock_ptr); + raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); + + /* +@@ -2634,7 +2616,7 @@ static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q, + /* + * The task state is guaranteed to be set before another task can + * wake it. set_current_state() is implemented using smp_store_mb() and +- * queue_me() calls raw_spin_unlock() upon completion, both serializing ++ * queue_me() calls spin_unlock() upon completion, both serializing + * access to the hash list and forcing another memory barrier. + */ + set_current_state(TASK_INTERRUPTIBLE); +@@ -2925,7 +2907,15 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + * before __rt_mutex_start_proxy_lock() is done. + */ + raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock); +- raw_spin_unlock(q.lock_ptr); ++ /* ++ * the migrate_disable() here disables migration in the in_atomic() fast ++ * path which is enabled again in the following spin_unlock(). We have ++ * one migrate_disable() pending in the slow-path which is reversed ++ * after the raw_spin_unlock_irq() where we leave the atomic context. ++ */ ++ migrate_disable(); ++ ++ spin_unlock(q.lock_ptr); + /* + * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter + * such that futex_unlock_pi() is guaranteed to observe the waiter when +@@ -2933,6 +2923,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + */ + ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current); + raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock); ++ migrate_enable(); + + if (ret) { + if (ret == 1) +@@ -2946,7 +2937,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + ret = rt_mutex_wait_proxy_lock(&q.pi_state->pi_mutex, to, &rt_waiter); + + cleanup: +- raw_spin_lock(q.lock_ptr); ++ spin_lock(q.lock_ptr); + /* + * If we failed to acquire the lock (deadlock/signal/timeout), we must + * first acquire the hb->lock before removing the lock from the +@@ -3047,7 +3038,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + return ret; + + hb = hash_futex(&key); +- raw_spin_lock(&hb->lock); ++ spin_lock(&hb->lock); + + /* + * Check waiters first. We do not trust user space values at +@@ -3081,10 +3072,19 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + * rt_waiter. Also see the WARN in wake_futex_pi(). + */ + raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock); +- raw_spin_unlock(&hb->lock); ++ /* ++ * Magic trickery for now to make the RT migrate disable ++ * logic happy. The following spin_unlock() happens with ++ * interrupts disabled so the internal migrate_enable() ++ * won't undo the migrate_disable() which was issued when ++ * locking hb->lock. ++ */ ++ migrate_disable(); ++ spin_unlock(&hb->lock); + + /* drops pi_state->pi_mutex.wait_lock */ + ret = wake_futex_pi(uaddr, uval, pi_state); ++ migrate_enable(); + + put_pi_state(pi_state); + +@@ -3120,7 +3120,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + * owner. + */ + if ((ret = cmpxchg_futex_value_locked(&curval, uaddr, uval, 0))) { +- raw_spin_unlock(&hb->lock); ++ spin_unlock(&hb->lock); + switch (ret) { + case -EFAULT: + goto pi_faulted; +@@ -3140,7 +3140,7 @@ static int futex_unlock_pi(u32 __user *uaddr, unsigned int flags) + ret = (curval == uval) ? 0 : -EAGAIN; + + out_unlock: +- raw_spin_unlock(&hb->lock); ++ spin_unlock(&hb->lock); + out_putkey: + put_futex_key(&key); + return ret; +@@ -3256,7 +3256,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + struct hrtimer_sleeper timeout, *to = NULL; + struct futex_pi_state *pi_state = NULL; + struct rt_mutex_waiter rt_waiter; +- struct futex_hash_bucket *hb; ++ struct futex_hash_bucket *hb, *hb2; + union futex_key key2 = FUTEX_KEY_INIT; + struct futex_q q = futex_q_init; + int res, ret; +@@ -3314,20 +3314,55 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + /* Queue the futex_q, drop the hb lock, wait for wakeup. */ + futex_wait_queue_me(hb, &q, to); + +- raw_spin_lock(&hb->lock); +- ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); +- raw_spin_unlock(&hb->lock); +- if (ret) +- goto out_put_keys; ++ /* ++ * On RT we must avoid races with requeue and trying to block ++ * on two mutexes (hb->lock and uaddr2's rtmutex) by ++ * serializing access to pi_blocked_on with pi_lock. ++ */ ++ raw_spin_lock_irq(¤t->pi_lock); ++ if (current->pi_blocked_on) { ++ /* ++ * We have been requeued or are in the process of ++ * being requeued. ++ */ ++ raw_spin_unlock_irq(¤t->pi_lock); ++ } else { ++ /* ++ * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS ++ * prevents a concurrent requeue from moving us to the ++ * uaddr2 rtmutex. After that we can safely acquire ++ * (and possibly block on) hb->lock. ++ */ ++ current->pi_blocked_on = PI_WAKEUP_INPROGRESS; ++ raw_spin_unlock_irq(¤t->pi_lock); ++ ++ spin_lock(&hb->lock); ++ ++ /* ++ * Clean up pi_blocked_on. We might leak it otherwise ++ * when we succeeded with the hb->lock in the fast ++ * path. ++ */ ++ raw_spin_lock_irq(¤t->pi_lock); ++ current->pi_blocked_on = NULL; ++ raw_spin_unlock_irq(¤t->pi_lock); ++ ++ ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); ++ spin_unlock(&hb->lock); ++ if (ret) ++ goto out_put_keys; ++ } + + /* +- * In order for us to be here, we know our q.key == key2, and since +- * we took the hb->lock above, we also know that futex_requeue() has +- * completed and we no longer have to concern ourselves with a wakeup +- * race with the atomic proxy lock acquisition by the requeue code. The +- * futex_requeue dropped our key1 reference and incremented our key2 +- * reference count. ++ * In order to be here, we have either been requeued, are in ++ * the process of being requeued, or requeue successfully ++ * acquired uaddr2 on our behalf. If pi_blocked_on was ++ * non-null above, we may be racing with a requeue. Do not ++ * rely on q->lock_ptr to be hb2->lock until after blocking on ++ * hb->lock or hb2->lock. The futex_requeue dropped our key1 ++ * reference and incremented our key2 reference count. + */ ++ hb2 = hash_futex(&key2); + + /* Check if the requeue code acquired the second futex for us. */ + if (!q.rt_waiter) { +@@ -3336,9 +3371,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * did a lock-steal - fix up the PI-state in that case. + */ + if (q.pi_state && (q.pi_state->owner != current)) { +- struct futex_pi_state *ps_free; +- +- raw_spin_lock(q.lock_ptr); ++ spin_lock(&hb2->lock); ++ BUG_ON(&hb2->lock != q.lock_ptr); + ret = fixup_pi_state_owner(uaddr2, &q, current); + if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) { + pi_state = q.pi_state; +@@ -3348,9 +3382,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * Drop the reference to the pi state which + * the requeue_pi() code acquired for us. + */ +- ps_free = __put_pi_state(q.pi_state); +- raw_spin_unlock(q.lock_ptr); +- kfree(ps_free); ++ put_pi_state(q.pi_state); ++ spin_unlock(&hb2->lock); + } + } else { + struct rt_mutex *pi_mutex; +@@ -3364,7 +3397,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + pi_mutex = &q.pi_state->pi_mutex; + ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); + +- raw_spin_lock(q.lock_ptr); ++ spin_lock(&hb2->lock); ++ BUG_ON(&hb2->lock != q.lock_ptr); + if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) + ret = 0; + +@@ -4031,7 +4065,7 @@ static int __init futex_init(void) + for (i = 0; i < futex_hashsize; i++) { + atomic_set(&futex_queues[i].waiters, 0); + plist_head_init(&futex_queues[i].chain); +- raw_spin_lock_init(&futex_queues[i].lock); ++ spin_lock_init(&futex_queues[i].lock); + } + + return 0; +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 44a33057a83a..2a9bf2443acc 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -142,6 +142,12 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) + WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); + } + ++static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) ++{ ++ return waiter && waiter != PI_WAKEUP_INPROGRESS && ++ waiter != PI_REQUEUE_INPROGRESS; ++} ++ + /* + * We can speed up the acquire/release, if there's no debugging state to be + * set up. +@@ -415,7 +421,8 @@ int max_lock_depth = 1024; + + static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) + { +- return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; ++ return rt_mutex_real_waiter(p->pi_blocked_on) ? ++ p->pi_blocked_on->lock : NULL; + } + + /* +@@ -551,7 +558,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * reached or the state of the chain has changed while we + * dropped the locks. + */ +- if (!waiter) ++ if (!rt_mutex_real_waiter(waiter)) + goto out_unlock_pi; + + /* +@@ -1321,6 +1328,22 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + return -EDEADLK; + + raw_spin_lock(&task->pi_lock); ++ /* ++ * In the case of futex requeue PI, this will be a proxy ++ * lock. The task will wake unaware that it is enqueueed on ++ * this lock. Avoid blocking on two locks and corrupting ++ * pi_blocked_on via the PI_WAKEUP_INPROGRESS ++ * flag. futex_wait_requeue_pi() sets this when it wakes up ++ * before requeue (due to a signal or timeout). Do not enqueue ++ * the task if PI_WAKEUP_INPROGRESS is set. ++ */ ++ if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { ++ raw_spin_unlock(&task->pi_lock); ++ return -EAGAIN; ++ } ++ ++ BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); ++ + waiter->task = task; + waiter->lock = lock; + waiter->prio = task->prio; +@@ -1344,7 +1367,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + rt_mutex_enqueue_pi(owner, waiter); + + rt_mutex_adjust_prio(owner); +- if (owner->pi_blocked_on) ++ if (rt_mutex_real_waiter(owner->pi_blocked_on)) + chain_walk = 1; + } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { + chain_walk = 1; +@@ -1444,7 +1467,7 @@ static void remove_waiter(struct rt_mutex *lock, + { + bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); + struct task_struct *owner = rt_mutex_owner(lock); +- struct rt_mutex *next_lock; ++ struct rt_mutex *next_lock = NULL; + + lockdep_assert_held(&lock->wait_lock); + +@@ -1470,7 +1493,8 @@ static void remove_waiter(struct rt_mutex *lock, + rt_mutex_adjust_prio(owner); + + /* Store the lock on which owner is blocked or NULL */ +- next_lock = task_blocked_on_lock(owner); ++ if (rt_mutex_real_waiter(owner->pi_blocked_on)) ++ next_lock = task_blocked_on_lock(owner); + + raw_spin_unlock(&owner->pi_lock); + +@@ -1506,7 +1530,8 @@ void rt_mutex_adjust_pi(struct task_struct *task) + raw_spin_lock_irqsave(&task->pi_lock, flags); + + waiter = task->pi_blocked_on; +- if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { ++ if (!rt_mutex_real_waiter(waiter) || ++ rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { + raw_spin_unlock_irqrestore(&task->pi_lock, flags); + return; + } +@@ -2325,6 +2350,34 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + if (try_to_take_rt_mutex(lock, task, NULL)) + return 1; + ++#ifdef CONFIG_PREEMPT_RT_FULL ++ /* ++ * In PREEMPT_RT there's an added race. ++ * If the task, that we are about to requeue, times out, ++ * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue ++ * to skip this task. But right after the task sets ++ * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then ++ * block on the spin_lock(&hb->lock), which in RT is an rtmutex. ++ * This will replace the PI_WAKEUP_INPROGRESS with the actual ++ * lock that it blocks on. We *must not* place this task ++ * on this proxy lock in that case. ++ * ++ * To prevent this race, we first take the task's pi_lock ++ * and check if it has updated its pi_blocked_on. If it has, ++ * we assume that it woke up and we return -EAGAIN. ++ * Otherwise, we set the task's pi_blocked_on to ++ * PI_REQUEUE_INPROGRESS, so that if the task is waking up ++ * it will know that we are in the process of requeuing it. ++ */ ++ raw_spin_lock(&task->pi_lock); ++ if (task->pi_blocked_on) { ++ raw_spin_unlock(&task->pi_lock); ++ return -EAGAIN; ++ } ++ task->pi_blocked_on = PI_REQUEUE_INPROGRESS; ++ raw_spin_unlock(&task->pi_lock); ++#endif ++ + /* We enforce deadlock detection for futexes */ + ret = task_blocks_on_rt_mutex(lock, waiter, task, + RT_MUTEX_FULL_CHAINWALK); +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index 758dc43872e5..546aaf058b9e 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -132,6 +132,9 @@ enum rtmutex_chainwalk { + /* + * PI-futex support (proxy locking functions, etc.): + */ ++#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) ++#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) ++ + extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); + extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, + struct task_struct *proxy_owner); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0305-locking-rtmutex-Clean-pi_blocked_on-in-the-error-cas.patch linux-4.19.118/debian/patches-rt/0305-locking-rtmutex-Clean-pi_blocked_on-in-the-error-cas.patch --- linux-4.19.98/debian/patches-rt/0305-locking-rtmutex-Clean-pi_blocked_on-in-the-error-cas.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0305-locking-rtmutex-Clean-pi_blocked_on-in-the-error-cas.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,102 @@ +From 7a56801d0e3c06595886dde9df739f3c9a8b1b03 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Mon, 30 Sep 2019 18:15:44 +0200 +Subject: [PATCH 305/325] locking/rtmutex: Clean ->pi_blocked_on in the error + case +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 0be4ea6e3ce693101be0fbd55a0cc7ce238ab2eb ] + +The function rt_mutex_wait_proxy_lock() cleans ->pi_blocked_on in case +of failure (timeout, signal). The same cleanup is required in +__rt_mutex_start_proxy_lock(). +In both the cases the tasks was interrupted by a signal or timeout while +acquiring the lock and after the interruption it longer blocks on the +lock. + +Fixes: 1a1fb985f2e2b ("futex: Handle early deadlock return correctly") +Signed-off-by: Peter Zijlstra (Intel) +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/locking/rtmutex.c | 43 +++++++++++++++++++++++----------------- + 1 file changed, 25 insertions(+), 18 deletions(-) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 2a9bf2443acc..63b3d6f306fa 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -2320,6 +2320,26 @@ void rt_mutex_proxy_unlock(struct rt_mutex *lock, + rt_mutex_set_owner(lock, NULL); + } + ++static void fixup_rt_mutex_blocked(struct rt_mutex *lock) ++{ ++ struct task_struct *tsk = current; ++ /* ++ * RT has a problem here when the wait got interrupted by a timeout ++ * or a signal. task->pi_blocked_on is still set. The task must ++ * acquire the hash bucket lock when returning from this function. ++ * ++ * If the hash bucket lock is contended then the ++ * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in ++ * task_blocks_on_rt_mutex() will trigger. This can be avoided by ++ * clearing task->pi_blocked_on which removes the task from the ++ * boosting chain of the rtmutex. That's correct because the task ++ * is not longer blocked on it. ++ */ ++ raw_spin_lock(&tsk->pi_lock); ++ tsk->pi_blocked_on = NULL; ++ raw_spin_unlock(&tsk->pi_lock); ++} ++ + /** + * __rt_mutex_start_proxy_lock() - Start lock acquisition for another task + * @lock: the rt_mutex to take +@@ -2392,6 +2412,9 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + ret = 0; + } + ++ if (ret) ++ fixup_rt_mutex_blocked(lock); ++ + debug_rt_mutex_print_deadlock(waiter); + + return ret; +@@ -2472,7 +2495,6 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, + struct hrtimer_sleeper *to, + struct rt_mutex_waiter *waiter) + { +- struct task_struct *tsk = current; + int ret; + + raw_spin_lock_irq(&lock->wait_lock); +@@ -2484,23 +2506,8 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, + * have to fix that up. + */ + fixup_rt_mutex_waiters(lock); +- /* +- * RT has a problem here when the wait got interrupted by a timeout +- * or a signal. task->pi_blocked_on is still set. The task must +- * acquire the hash bucket lock when returning from this function. +- * +- * If the hash bucket lock is contended then the +- * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in +- * task_blocks_on_rt_mutex() will trigger. This can be avoided by +- * clearing task->pi_blocked_on which removes the task from the +- * boosting chain of the rtmutex. That's correct because the task +- * is not longer blocked on it. +- */ +- if (ret) { +- raw_spin_lock(&tsk->pi_lock); +- tsk->pi_blocked_on = NULL; +- raw_spin_unlock(&tsk->pi_lock); +- } ++ if (ret) ++ fixup_rt_mutex_blocked(lock); + + raw_spin_unlock_irq(&lock->wait_lock); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0306-lib-ubsan-Don-t-seralize-UBSAN-report.patch linux-4.19.118/debian/patches-rt/0306-lib-ubsan-Don-t-seralize-UBSAN-report.patch --- linux-4.19.98/debian/patches-rt/0306-lib-ubsan-Don-t-seralize-UBSAN-report.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0306-lib-ubsan-Don-t-seralize-UBSAN-report.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,308 @@ +From 698de15ca2f181483753c9f60b88cb548479f803 Mon Sep 17 00:00:00 2001 +From: Julien Grall +Date: Fri, 20 Sep 2019 11:08:35 +0100 +Subject: [PATCH 306/325] lib/ubsan: Don't seralize UBSAN report +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 4702c28ac777b27acb499cbd5e8e787ce1a7d82d ] + +At the moment, UBSAN report will be serialized using a spin_lock(). On +RT-systems, spinlocks are turned to rt_spin_lock and may sleep. This will +result to the following splat if the undefined behavior is in a context +that can sleep: + +| BUG: sleeping function called from invalid context at /src/linux/kernel/locking/rtmutex.c:968 +| in_atomic(): 1, irqs_disabled(): 128, pid: 3447, name: make +| 1 lock held by make/3447: +| #0: 000000009a966332 (&mm->mmap_sem){++++}, at: do_page_fault+0x140/0x4f8 +| Preemption disabled at: +| [] rt_mutex_futex_unlock+0x4c/0xb0 +| CPU: 3 PID: 3447 Comm: make Tainted: G W 5.2.14-rt7-01890-ge6e057589653 #911 +| Call trace: +| dump_backtrace+0x0/0x148 +| show_stack+0x14/0x20 +| dump_stack+0xbc/0x104 +| ___might_sleep+0x154/0x210 +| rt_spin_lock+0x68/0xa0 +| ubsan_prologue+0x30/0x68 +| handle_overflow+0x64/0xe0 +| __ubsan_handle_add_overflow+0x10/0x18 +| __lock_acquire+0x1c28/0x2a28 +| lock_acquire+0xf0/0x370 +| _raw_spin_lock_irqsave+0x58/0x78 +| rt_mutex_futex_unlock+0x4c/0xb0 +| rt_spin_unlock+0x28/0x70 +| get_page_from_freelist+0x428/0x2b60 +| __alloc_pages_nodemask+0x174/0x1708 +| alloc_pages_vma+0x1ac/0x238 +| __handle_mm_fault+0x4ac/0x10b0 +| handle_mm_fault+0x1d8/0x3b0 +| do_page_fault+0x1c8/0x4f8 +| do_translation_fault+0xb8/0xe0 +| do_mem_abort+0x3c/0x98 +| el0_da+0x20/0x24 + +The spin_lock() will protect against multiple CPUs to output a report +together, I guess to prevent them to be interleaved. However, they can +still interleave with other messages (and even splat from __migth_sleep). + +So the lock usefulness seems pretty limited. Rather than trying to +accomodate RT-system by switching to a raw_spin_lock(), the lock is now +completely dropped. + +Link: https://lkml.kernel.org/r/20190920100835.14999-1-julien.grall@arm.com +Reported-by: Andre Przywara +Signed-off-by: Julien Grall +Acked-by: Andrey Ryabinin +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + lib/ubsan.c | 64 +++++++++++++++++++---------------------------------- + 1 file changed, 23 insertions(+), 41 deletions(-) + +diff --git a/lib/ubsan.c b/lib/ubsan.c +index 1e9e2ab25539..5830cc9a2164 100644 +--- a/lib/ubsan.c ++++ b/lib/ubsan.c +@@ -143,25 +143,21 @@ static void val_to_string(char *str, size_t size, struct type_descriptor *type, + } + } + +-static DEFINE_SPINLOCK(report_lock); +- +-static void ubsan_prologue(struct source_location *location, +- unsigned long *flags) ++static void ubsan_prologue(struct source_location *location) + { + current->in_ubsan++; +- spin_lock_irqsave(&report_lock, *flags); + + pr_err("========================================" + "========================================\n"); + print_source_location("UBSAN: Undefined behaviour in", location); + } + +-static void ubsan_epilogue(unsigned long *flags) ++static void ubsan_epilogue(void) + { + dump_stack(); + pr_err("========================================" + "========================================\n"); +- spin_unlock_irqrestore(&report_lock, *flags); ++ + current->in_ubsan--; + } + +@@ -170,14 +166,13 @@ static void handle_overflow(struct overflow_data *data, void *lhs, + { + + struct type_descriptor *type = data->type; +- unsigned long flags; + char lhs_val_str[VALUE_LENGTH]; + char rhs_val_str[VALUE_LENGTH]; + + if (suppress_report(&data->location)) + return; + +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + + val_to_string(lhs_val_str, sizeof(lhs_val_str), type, lhs); + val_to_string(rhs_val_str, sizeof(rhs_val_str), type, rhs); +@@ -189,7 +184,7 @@ static void handle_overflow(struct overflow_data *data, void *lhs, + rhs_val_str, + type->type_name); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + + void __ubsan_handle_add_overflow(struct overflow_data *data, +@@ -217,20 +212,19 @@ EXPORT_SYMBOL(__ubsan_handle_mul_overflow); + void __ubsan_handle_negate_overflow(struct overflow_data *data, + void *old_val) + { +- unsigned long flags; + char old_val_str[VALUE_LENGTH]; + + if (suppress_report(&data->location)) + return; + +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + + val_to_string(old_val_str, sizeof(old_val_str), data->type, old_val); + + pr_err("negation of %s cannot be represented in type %s:\n", + old_val_str, data->type->type_name); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + EXPORT_SYMBOL(__ubsan_handle_negate_overflow); + +@@ -238,13 +232,12 @@ EXPORT_SYMBOL(__ubsan_handle_negate_overflow); + void __ubsan_handle_divrem_overflow(struct overflow_data *data, + void *lhs, void *rhs) + { +- unsigned long flags; + char rhs_val_str[VALUE_LENGTH]; + + if (suppress_report(&data->location)) + return; + +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + + val_to_string(rhs_val_str, sizeof(rhs_val_str), data->type, rhs); + +@@ -254,58 +247,52 @@ void __ubsan_handle_divrem_overflow(struct overflow_data *data, + else + pr_err("division by zero\n"); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + EXPORT_SYMBOL(__ubsan_handle_divrem_overflow); + + static void handle_null_ptr_deref(struct type_mismatch_data_common *data) + { +- unsigned long flags; +- + if (suppress_report(data->location)) + return; + +- ubsan_prologue(data->location, &flags); ++ ubsan_prologue(data->location); + + pr_err("%s null pointer of type %s\n", + type_check_kinds[data->type_check_kind], + data->type->type_name); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + + static void handle_misaligned_access(struct type_mismatch_data_common *data, + unsigned long ptr) + { +- unsigned long flags; +- + if (suppress_report(data->location)) + return; + +- ubsan_prologue(data->location, &flags); ++ ubsan_prologue(data->location); + + pr_err("%s misaligned address %p for type %s\n", + type_check_kinds[data->type_check_kind], + (void *)ptr, data->type->type_name); + pr_err("which requires %ld byte alignment\n", data->alignment); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + + static void handle_object_size_mismatch(struct type_mismatch_data_common *data, + unsigned long ptr) + { +- unsigned long flags; +- + if (suppress_report(data->location)) + return; + +- ubsan_prologue(data->location, &flags); ++ ubsan_prologue(data->location); + pr_err("%s address %p with insufficient space\n", + type_check_kinds[data->type_check_kind], + (void *) ptr); + pr_err("for an object of type %s\n", data->type->type_name); +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + + static void ubsan_type_mismatch_common(struct type_mismatch_data_common *data, +@@ -369,25 +356,23 @@ EXPORT_SYMBOL(__ubsan_handle_vla_bound_not_positive); + + void __ubsan_handle_out_of_bounds(struct out_of_bounds_data *data, void *index) + { +- unsigned long flags; + char index_str[VALUE_LENGTH]; + + if (suppress_report(&data->location)) + return; + +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + + val_to_string(index_str, sizeof(index_str), data->index_type, index); + pr_err("index %s is out of range for type %s\n", index_str, + data->array_type->type_name); +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + EXPORT_SYMBOL(__ubsan_handle_out_of_bounds); + + void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data, + void *lhs, void *rhs) + { +- unsigned long flags; + struct type_descriptor *rhs_type = data->rhs_type; + struct type_descriptor *lhs_type = data->lhs_type; + char rhs_str[VALUE_LENGTH]; +@@ -396,7 +381,7 @@ void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data, + if (suppress_report(&data->location)) + return; + +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + + val_to_string(rhs_str, sizeof(rhs_str), rhs_type, rhs); + val_to_string(lhs_str, sizeof(lhs_str), lhs_type, lhs); +@@ -419,18 +404,16 @@ void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data, + lhs_str, rhs_str, + lhs_type->type_name); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + EXPORT_SYMBOL(__ubsan_handle_shift_out_of_bounds); + + + void __ubsan_handle_builtin_unreachable(struct unreachable_data *data) + { +- unsigned long flags; +- +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + pr_err("calling __builtin_unreachable()\n"); +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + panic("can't return from __builtin_unreachable()"); + } + EXPORT_SYMBOL(__ubsan_handle_builtin_unreachable); +@@ -438,19 +421,18 @@ EXPORT_SYMBOL(__ubsan_handle_builtin_unreachable); + void __ubsan_handle_load_invalid_value(struct invalid_value_data *data, + void *val) + { +- unsigned long flags; + char val_str[VALUE_LENGTH]; + + if (suppress_report(&data->location)) + return; + +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + + val_to_string(val_str, sizeof(val_str), data->type, val); + + pr_err("load of value %s is not a valid value for type %s\n", + val_str, data->type->type_name); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + EXPORT_SYMBOL(__ubsan_handle_load_invalid_value); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0307-kmemleak-Change-the-lock-of-kmemleak_object-to-raw_s.patch linux-4.19.118/debian/patches-rt/0307-kmemleak-Change-the-lock-of-kmemleak_object-to-raw_s.patch --- linux-4.19.98/debian/patches-rt/0307-kmemleak-Change-the-lock-of-kmemleak_object-to-raw_s.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0307-kmemleak-Change-the-lock-of-kmemleak_object-to-raw_s.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,293 @@ +From db9ad49e0819b8bc8cfbad6008ac0f52d5e168e1 Mon Sep 17 00:00:00 2001 +From: Liu Haitao +Date: Fri, 27 Sep 2019 16:22:30 +0800 +Subject: [PATCH 307/325] kmemleak: Change the lock of kmemleak_object to + raw_spinlock_t +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 217847f57119b5fdd377bfa3d344613ddb98d9fc ] + +The commit ("kmemleak: Turn kmemleak_lock to raw spinlock on RT") +changed the kmemleak_lock to raw spinlock. However the +kmemleak_object->lock is held after the kmemleak_lock is held in +scan_block(). + +Make the object->lock a raw_spinlock_t. + +Cc: stable-rt@vger.kernel.org +Link: https://lkml.kernel.org/r/20190927082230.34152-1-yongxin.liu@windriver.com +Signed-off-by: Liu Haitao +Signed-off-by: Yongxin Liu +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + mm/kmemleak.c | 72 +++++++++++++++++++++++++-------------------------- + 1 file changed, 36 insertions(+), 36 deletions(-) + +diff --git a/mm/kmemleak.c b/mm/kmemleak.c +index 92ce99b15f2b..e5f5eeed338d 100644 +--- a/mm/kmemleak.c ++++ b/mm/kmemleak.c +@@ -147,7 +147,7 @@ struct kmemleak_scan_area { + * (use_count) and freed using the RCU mechanism. + */ + struct kmemleak_object { +- spinlock_t lock; ++ raw_spinlock_t lock; + unsigned int flags; /* object status flags */ + struct list_head object_list; + struct list_head gray_list; +@@ -561,7 +561,7 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, + INIT_LIST_HEAD(&object->object_list); + INIT_LIST_HEAD(&object->gray_list); + INIT_HLIST_HEAD(&object->area_list); +- spin_lock_init(&object->lock); ++ raw_spin_lock_init(&object->lock); + atomic_set(&object->use_count, 1); + object->flags = OBJECT_ALLOCATED; + object->pointer = ptr; +@@ -642,9 +642,9 @@ static void __delete_object(struct kmemleak_object *object) + * Locking here also ensures that the corresponding memory block + * cannot be freed when it is being scanned. + */ +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + object->flags &= ~OBJECT_ALLOCATED; +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + put_object(object); + } + +@@ -716,9 +716,9 @@ static void paint_it(struct kmemleak_object *object, int color) + { + unsigned long flags; + +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + __paint_it(object, color); +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + } + + static void paint_ptr(unsigned long ptr, int color) +@@ -778,7 +778,7 @@ static void add_scan_area(unsigned long ptr, size_t size, gfp_t gfp) + goto out; + } + +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + if (size == SIZE_MAX) { + size = object->pointer + object->size - ptr; + } else if (ptr + size > object->pointer + object->size) { +@@ -794,7 +794,7 @@ static void add_scan_area(unsigned long ptr, size_t size, gfp_t gfp) + + hlist_add_head(&area->node, &object->area_list); + out_unlock: +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + out: + put_object(object); + } +@@ -817,9 +817,9 @@ static void object_set_excess_ref(unsigned long ptr, unsigned long excess_ref) + return; + } + +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + object->excess_ref = excess_ref; +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + put_object(object); + } + +@@ -839,9 +839,9 @@ static void object_no_scan(unsigned long ptr) + return; + } + +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + object->flags |= OBJECT_NO_SCAN; +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + put_object(object); + } + +@@ -902,11 +902,11 @@ static void early_alloc(struct early_log *log) + log->min_count, GFP_ATOMIC); + if (!object) + goto out; +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + for (i = 0; i < log->trace_len; i++) + object->trace[i] = log->trace[i]; + object->trace_len = log->trace_len; +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + out: + rcu_read_unlock(); + } +@@ -1096,9 +1096,9 @@ void __ref kmemleak_update_trace(const void *ptr) + return; + } + +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + object->trace_len = __save_stack_trace(object->trace); +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + + put_object(object); + } +@@ -1344,7 +1344,7 @@ static void scan_block(void *_start, void *_end, + * previously acquired in scan_object(). These locks are + * enclosed by scan_mutex. + */ +- spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); ++ raw_spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); + /* only pass surplus references (object already gray) */ + if (color_gray(object)) { + excess_ref = object->excess_ref; +@@ -1353,7 +1353,7 @@ static void scan_block(void *_start, void *_end, + excess_ref = 0; + update_refs(object); + } +- spin_unlock(&object->lock); ++ raw_spin_unlock(&object->lock); + + if (excess_ref) { + object = lookup_object(excess_ref, 0); +@@ -1362,9 +1362,9 @@ static void scan_block(void *_start, void *_end, + if (object == scanned) + /* circular reference, ignore */ + continue; +- spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); ++ raw_spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING); + update_refs(object); +- spin_unlock(&object->lock); ++ raw_spin_unlock(&object->lock); + } + } + raw_spin_unlock_irqrestore(&kmemleak_lock, flags); +@@ -1400,7 +1400,7 @@ static void scan_object(struct kmemleak_object *object) + * Once the object->lock is acquired, the corresponding memory block + * cannot be freed (the same lock is acquired in delete_object). + */ +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + if (object->flags & OBJECT_NO_SCAN) + goto out; + if (!(object->flags & OBJECT_ALLOCATED)) +@@ -1419,9 +1419,9 @@ static void scan_object(struct kmemleak_object *object) + if (start >= end) + break; + +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + cond_resched(); +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + } while (object->flags & OBJECT_ALLOCATED); + } else + hlist_for_each_entry(area, &object->area_list, node) +@@ -1429,7 +1429,7 @@ static void scan_object(struct kmemleak_object *object) + (void *)(area->start + area->size), + object); + out: +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + } + + /* +@@ -1482,7 +1482,7 @@ static void kmemleak_scan(void) + /* prepare the kmemleak_object's */ + rcu_read_lock(); + list_for_each_entry_rcu(object, &object_list, object_list) { +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + #ifdef DEBUG + /* + * With a few exceptions there should be a maximum of +@@ -1499,7 +1499,7 @@ static void kmemleak_scan(void) + if (color_gray(object) && get_object(object)) + list_add_tail(&object->gray_list, &gray_list); + +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + } + rcu_read_unlock(); + +@@ -1564,14 +1564,14 @@ static void kmemleak_scan(void) + */ + rcu_read_lock(); + list_for_each_entry_rcu(object, &object_list, object_list) { +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + if (color_white(object) && (object->flags & OBJECT_ALLOCATED) + && update_checksum(object) && get_object(object)) { + /* color it gray temporarily */ + object->count = object->min_count; + list_add_tail(&object->gray_list, &gray_list); + } +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + } + rcu_read_unlock(); + +@@ -1591,13 +1591,13 @@ static void kmemleak_scan(void) + */ + rcu_read_lock(); + list_for_each_entry_rcu(object, &object_list, object_list) { +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + if (unreferenced_object(object) && + !(object->flags & OBJECT_REPORTED)) { + object->flags |= OBJECT_REPORTED; + new_leaks++; + } +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + } + rcu_read_unlock(); + +@@ -1749,10 +1749,10 @@ static int kmemleak_seq_show(struct seq_file *seq, void *v) + struct kmemleak_object *object = v; + unsigned long flags; + +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + if ((object->flags & OBJECT_REPORTED) && unreferenced_object(object)) + print_unreferenced(seq, object); +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + return 0; + } + +@@ -1782,9 +1782,9 @@ static int dump_str_object_info(const char *str) + return -EINVAL; + } + +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + dump_object_info(object); +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + + put_object(object); + return 0; +@@ -1803,11 +1803,11 @@ static void kmemleak_clear(void) + + rcu_read_lock(); + list_for_each_entry_rcu(object, &object_list, object_list) { +- spin_lock_irqsave(&object->lock, flags); ++ raw_spin_lock_irqsave(&object->lock, flags); + if ((object->flags & OBJECT_REPORTED) && + unreferenced_object(object)) + __paint_it(object, KMEMLEAK_GREY); +- spin_unlock_irqrestore(&object->lock, flags); ++ raw_spin_unlock_irqrestore(&object->lock, flags); + } + rcu_read_unlock(); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0308-sched-migrate_enable-Use-select_fallback_rq.patch linux-4.19.118/debian/patches-rt/0308-sched-migrate_enable-Use-select_fallback_rq.patch --- linux-4.19.98/debian/patches-rt/0308-sched-migrate_enable-Use-select_fallback_rq.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0308-sched-migrate_enable-Use-select_fallback_rq.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,66 @@ +From 4c2c29a788e99fba068a36c7a2db2a51ff1f0eda Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Sat, 12 Oct 2019 01:52:12 -0500 +Subject: [PATCH 308/325] sched: migrate_enable: Use select_fallback_rq() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit adfa969d4cfcc995a9d866020124e50f1827d2d1 ] + +migrate_enable() currently open-codes a variant of select_fallback_rq(). +However, it does not have the "No more Mr. Nice Guy" fallback and thus +it will pass an invalid CPU to the migration thread if cpus_mask only +contains a CPU that is !active. + +Signed-off-by: Scott Wood +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 25 ++++++++++--------------- + 1 file changed, 10 insertions(+), 15 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index d9a3f88508ee..6fd3f7b4d7d8 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7335,6 +7335,7 @@ void migrate_enable(void) + if (p->migrate_disable_update) { + struct rq *rq; + struct rq_flags rf; ++ int cpu = task_cpu(p); + + rq = task_rq_lock(p, &rf); + update_rq_clock(rq); +@@ -7344,21 +7345,15 @@ void migrate_enable(void) + + p->migrate_disable_update = 0; + +- WARN_ON(smp_processor_id() != task_cpu(p)); +- if (!cpumask_test_cpu(task_cpu(p), &p->cpus_mask)) { +- const struct cpumask *cpu_valid_mask = cpu_active_mask; +- struct migration_arg arg; +- unsigned int dest_cpu; +- +- if (p->flags & PF_KTHREAD) { +- /* +- * Kernel threads are allowed on online && !active CPUs +- */ +- cpu_valid_mask = cpu_online_mask; +- } +- dest_cpu = cpumask_any_and(cpu_valid_mask, &p->cpus_mask); +- arg.task = p; +- arg.dest_cpu = dest_cpu; ++ WARN_ON(smp_processor_id() != cpu); ++ if (!cpumask_test_cpu(cpu, &p->cpus_mask)) { ++ struct migration_arg arg = { p }; ++ struct rq_flags rf; ++ ++ rq = task_rq_lock(p, &rf); ++ update_rq_clock(rq); ++ arg.dest_cpu = select_fallback_rq(cpu, p); ++ task_rq_unlock(rq, p, &rf); + + unpin_current_cpu(); + preempt_lazy_enable(); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0309-sched-Lazy-migrate_disable-processing.patch linux-4.19.118/debian/patches-rt/0309-sched-Lazy-migrate_disable-processing.patch --- linux-4.19.98/debian/patches-rt/0309-sched-Lazy-migrate_disable-processing.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0309-sched-Lazy-migrate_disable-processing.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,616 @@ +From 74e387d61b063ceb45e370bc75b3f0d76bd51061 Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Sat, 12 Oct 2019 01:52:13 -0500 +Subject: [PATCH 309/325] sched: Lazy migrate_disable processing +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 425c5b38779a860062aa62219dc920d374b13c17 ] + +Avoid overhead on the majority of migrate disable/enable sequences by +only manipulating scheduler data (and grabbing the relevant locks) when +the task actually schedules while migrate-disabled. A kernel build +showed around a 10% reduction in system time (with CONFIG_NR_CPUS=512). + +Instead of cpuhp_pin_lock, CPU hotplug is handled by keeping a per-CPU +count of the number of pinned tasks (including tasks which have not +scheduled in the migrate-disabled section); takedown_cpu() will +wait until that reaches zero (confirmed by take_cpu_down() in stop +machine context to deal with races) before migrating tasks off of the +cpu. + +To simplify synchronization, updating cpus_mask is no longer deferred +until migrate_enable(). This lets us not have to worry about +migrate_enable() missing the update if it's on the fast path (didn't +schedule during the migrate disabled section). It also makes the code +a bit simpler and reduces deviation from mainline. + +While the main motivation for this is the performance benefit, lazy +migrate disable also eliminates the restriction on calling +migrate_disable() while atomic but leaving the atomic region prior to +calling migrate_enable() -- though this won't help with local_bh_disable() +(and thus rcutorture) unless something similar is done with the recently +added local_lock. + +Signed-off-by: Scott Wood +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + include/linux/cpu.h | 4 - + include/linux/sched.h | 11 +-- + init/init_task.c | 4 + + kernel/cpu.c | 103 +++++++++-------------- + kernel/sched/core.c | 182 +++++++++++++++++------------------------ + kernel/sched/sched.h | 4 + + lib/smp_processor_id.c | 3 + + 7 files changed, 129 insertions(+), 182 deletions(-) + +diff --git a/include/linux/cpu.h b/include/linux/cpu.h +index e67645924404..87347ccbba0c 100644 +--- a/include/linux/cpu.h ++++ b/include/linux/cpu.h +@@ -118,8 +118,6 @@ extern void cpu_hotplug_disable(void); + extern void cpu_hotplug_enable(void); + void clear_tasks_mm_cpumask(int cpu); + int cpu_down(unsigned int cpu); +-extern void pin_current_cpu(void); +-extern void unpin_current_cpu(void); + + #else /* CONFIG_HOTPLUG_CPU */ + +@@ -131,8 +129,6 @@ static inline int cpus_read_trylock(void) { return true; } + static inline void lockdep_assert_cpus_held(void) { } + static inline void cpu_hotplug_disable(void) { } + static inline void cpu_hotplug_enable(void) { } +-static inline void pin_current_cpu(void) { } +-static inline void unpin_current_cpu(void) { } + + #endif /* !CONFIG_HOTPLUG_CPU */ + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 854a6cb456af..60ac271472aa 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -227,6 +227,8 @@ extern void io_schedule_finish(int token); + extern long io_schedule_timeout(long timeout); + extern void io_schedule(void); + ++int cpu_nr_pinned(int cpu); ++ + /** + * struct prev_cputime - snapshot of system and user cputime + * @utime: time spent in user mode +@@ -670,16 +672,13 @@ struct task_struct { + cpumask_t cpus_mask; + #if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + int migrate_disable; +- int migrate_disable_update; +- int pinned_on_cpu; ++ bool migrate_disable_scheduled; + # ifdef CONFIG_SCHED_DEBUG +- int migrate_disable_atomic; ++ int pinned_on_cpu; + # endif +- + #elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) + # ifdef CONFIG_SCHED_DEBUG + int migrate_disable; +- int migrate_disable_atomic; + # endif + #endif + #ifdef CONFIG_PREEMPT_RT_FULL +@@ -2058,4 +2057,6 @@ static inline void rseq_syscall(struct pt_regs *regs) + + #endif + ++extern struct task_struct *takedown_cpu_task; ++ + #endif +diff --git a/init/init_task.c b/init/init_task.c +index 9e3362748214..4e5af4616dbd 100644 +--- a/init/init_task.c ++++ b/init/init_task.c +@@ -80,6 +80,10 @@ struct task_struct init_task + .cpus_ptr = &init_task.cpus_mask, + .cpus_mask = CPU_MASK_ALL, + .nr_cpus_allowed= NR_CPUS, ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) && \ ++ defined(CONFIG_SCHED_DEBUG) ++ .pinned_on_cpu = -1, ++#endif + .mm = NULL, + .active_mm = &init_mm, + .restart_block = { +diff --git a/kernel/cpu.c b/kernel/cpu.c +index 0d50ae262898..2834eed32b55 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -75,11 +75,6 @@ static DEFINE_PER_CPU(struct cpuhp_cpu_state, cpuhp_state) = { + .fail = CPUHP_INVALID, + }; + +-#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PREEMPT_RT_FULL) +-static DEFINE_PER_CPU(struct rt_rw_lock, cpuhp_pin_lock) = \ +- __RWLOCK_RT_INITIALIZER(cpuhp_pin_lock); +-#endif +- + #if defined(CONFIG_LOCKDEP) && defined(CONFIG_SMP) + static struct lockdep_map cpuhp_state_up_map = + STATIC_LOCKDEP_MAP_INIT("cpuhp_state-up", &cpuhp_state_up_map); +@@ -286,57 +281,6 @@ static int cpu_hotplug_disabled; + + #ifdef CONFIG_HOTPLUG_CPU + +-/** +- * pin_current_cpu - Prevent the current cpu from being unplugged +- */ +-void pin_current_cpu(void) +-{ +-#ifdef CONFIG_PREEMPT_RT_FULL +- struct rt_rw_lock *cpuhp_pin; +- unsigned int cpu; +- int ret; +- +-again: +- cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); +- ret = __read_rt_trylock(cpuhp_pin); +- if (ret) { +- current->pinned_on_cpu = smp_processor_id(); +- return; +- } +- cpu = smp_processor_id(); +- preempt_lazy_enable(); +- preempt_enable(); +- +- sleeping_lock_inc(); +- __read_rt_lock(cpuhp_pin); +- sleeping_lock_dec(); +- +- preempt_disable(); +- preempt_lazy_disable(); +- if (cpu != smp_processor_id()) { +- __read_rt_unlock(cpuhp_pin); +- goto again; +- } +- current->pinned_on_cpu = cpu; +-#endif +-} +- +-/** +- * unpin_current_cpu - Allow unplug of current cpu +- */ +-void unpin_current_cpu(void) +-{ +-#ifdef CONFIG_PREEMPT_RT_FULL +- struct rt_rw_lock *cpuhp_pin = this_cpu_ptr(&cpuhp_pin_lock); +- +- if (WARN_ON(current->pinned_on_cpu != smp_processor_id())) +- cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, current->pinned_on_cpu); +- +- current->pinned_on_cpu = -1; +- __read_rt_unlock(cpuhp_pin); +-#endif +-} +- + DEFINE_STATIC_PERCPU_RWSEM(cpu_hotplug_lock); + + void cpus_read_lock(void) +@@ -865,6 +809,15 @@ static int take_cpu_down(void *_param) + int err, cpu = smp_processor_id(); + int ret; + ++#ifdef CONFIG_PREEMPT_RT_BASE ++ /* ++ * If any tasks disabled migration before we got here, ++ * go back and sleep again. ++ */ ++ if (cpu_nr_pinned(cpu)) ++ return -EAGAIN; ++#endif ++ + /* Ensure this CPU doesn't handle any more interrupts. */ + err = __cpu_disable(); + if (err < 0) +@@ -892,11 +845,10 @@ static int take_cpu_down(void *_param) + return 0; + } + ++struct task_struct *takedown_cpu_task; ++ + static int takedown_cpu(unsigned int cpu) + { +-#ifdef CONFIG_PREEMPT_RT_FULL +- struct rt_rw_lock *cpuhp_pin = per_cpu_ptr(&cpuhp_pin_lock, cpu); +-#endif + struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu); + int err; + +@@ -909,17 +861,38 @@ static int takedown_cpu(unsigned int cpu) + */ + irq_lock_sparse(); + +-#ifdef CONFIG_PREEMPT_RT_FULL +- __write_rt_lock(cpuhp_pin); ++#ifdef CONFIG_PREEMPT_RT_BASE ++ WARN_ON_ONCE(takedown_cpu_task); ++ takedown_cpu_task = current; ++ ++again: ++ /* ++ * If a task pins this CPU after we pass this check, take_cpu_down ++ * will return -EAGAIN. ++ */ ++ for (;;) { ++ int nr_pinned; ++ ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ nr_pinned = cpu_nr_pinned(cpu); ++ if (nr_pinned == 0) ++ break; ++ schedule(); ++ } ++ set_current_state(TASK_RUNNING); + #endif + + /* + * So now all preempt/rcu users must observe !cpu_active(). + */ + err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu)); ++#ifdef CONFIG_PREEMPT_RT_BASE ++ if (err == -EAGAIN) ++ goto again; ++#endif + if (err) { +-#ifdef CONFIG_PREEMPT_RT_FULL +- __write_rt_unlock(cpuhp_pin); ++#ifdef CONFIG_PREEMPT_RT_BASE ++ takedown_cpu_task = NULL; + #endif + /* CPU refused to die */ + irq_unlock_sparse(); +@@ -939,8 +912,8 @@ static int takedown_cpu(unsigned int cpu) + wait_for_ap_thread(st, false); + BUG_ON(st->state != CPUHP_AP_IDLE_DEAD); + +-#ifdef CONFIG_PREEMPT_RT_FULL +- __write_rt_unlock(cpuhp_pin); ++#ifdef CONFIG_PREEMPT_RT_BASE ++ takedown_cpu_task = NULL; + #endif + /* Interrupts are moved away from the dying cpu, reenable alloc/free */ + irq_unlock_sparse(); +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 6fd3f7b4d7d8..e97ac751aad2 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -1065,7 +1065,8 @@ static int migration_cpu_stop(void *data) + void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask) + { + cpumask_copy(&p->cpus_mask, new_mask); +- p->nr_cpus_allowed = cpumask_weight(new_mask); ++ if (p->cpus_ptr == &p->cpus_mask) ++ p->nr_cpus_allowed = cpumask_weight(new_mask); + } + + #if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +@@ -1076,8 +1077,7 @@ int __migrate_disabled(struct task_struct *p) + EXPORT_SYMBOL_GPL(__migrate_disabled); + #endif + +-static void __do_set_cpus_allowed_tail(struct task_struct *p, +- const struct cpumask *new_mask) ++void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) + { + struct rq *rq = task_rq(p); + bool queued, running; +@@ -1106,20 +1106,6 @@ static void __do_set_cpus_allowed_tail(struct task_struct *p, + set_curr_task(rq, p); + } + +-void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) +-{ +-#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +- if (__migrate_disabled(p)) { +- lockdep_assert_held(&p->pi_lock); +- +- cpumask_copy(&p->cpus_mask, new_mask); +- p->migrate_disable_update = 1; +- return; +- } +-#endif +- __do_set_cpus_allowed_tail(p, new_mask); +-} +- + /* + * Change a given task's CPU affinity. Migrate the thread to a + * proper CPU and schedule it away if the CPU it's executing on +@@ -1179,7 +1165,8 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + } + + /* Can the task run on the task's current CPU? If so, we're done */ +- if (cpumask_test_cpu(task_cpu(p), new_mask) || __migrate_disabled(p)) ++ if (cpumask_test_cpu(task_cpu(p), new_mask) || ++ p->cpus_ptr != &p->cpus_mask) + goto out; + + if (task_running(rq, p) || p->state == TASK_WAKING) { +@@ -3454,6 +3441,8 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) + BUG(); + } + ++static void migrate_disabled_sched(struct task_struct *p); ++ + /* + * __schedule() is the main scheduler function. + * +@@ -3524,6 +3513,9 @@ static void __sched notrace __schedule(bool preempt) + rq_lock(rq, &rf); + smp_mb__after_spinlock(); + ++ if (__migrate_disabled(prev)) ++ migrate_disabled_sched(prev); ++ + /* Promote REQ to ACT */ + rq->clock_update_flags <<= 1; + update_rq_clock(rq); +@@ -5779,6 +5771,8 @@ static void migrate_tasks(struct rq *dead_rq, struct rq_flags *rf) + BUG_ON(!next); + put_prev_task(rq, next); + ++ WARN_ON_ONCE(__migrate_disabled(next)); ++ + /* + * Rules for changing task_struct::cpus_mask are holding + * both pi_lock and rq->lock, such that holding either +@@ -7247,14 +7241,9 @@ update_nr_migratory(struct task_struct *p, long delta) + static inline void + migrate_disable_update_cpus_allowed(struct task_struct *p) + { +- struct rq *rq; +- struct rq_flags rf; +- +- rq = task_rq_lock(p, &rf); + p->cpus_ptr = cpumask_of(smp_processor_id()); + update_nr_migratory(p, -1); + p->nr_cpus_allowed = 1; +- task_rq_unlock(rq, p, &rf); + } + + static inline void +@@ -7272,54 +7261,35 @@ migrate_enable_update_cpus_allowed(struct task_struct *p) + + void migrate_disable(void) + { +- struct task_struct *p = current; ++ preempt_disable(); + +- if (in_atomic() || irqs_disabled()) { ++ if (++current->migrate_disable == 1) { ++ this_rq()->nr_pinned++; ++ preempt_lazy_disable(); + #ifdef CONFIG_SCHED_DEBUG +- p->migrate_disable_atomic++; ++ WARN_ON_ONCE(current->pinned_on_cpu >= 0); ++ current->pinned_on_cpu = smp_processor_id(); + #endif +- return; +- } +-#ifdef CONFIG_SCHED_DEBUG +- if (unlikely(p->migrate_disable_atomic)) { +- tracing_off(); +- WARN_ON_ONCE(1); + } +-#endif + +- if (p->migrate_disable) { +- p->migrate_disable++; +- return; +- } ++ preempt_enable(); ++} ++EXPORT_SYMBOL(migrate_disable); + +- preempt_disable(); +- preempt_lazy_disable(); +- pin_current_cpu(); ++static void migrate_disabled_sched(struct task_struct *p) ++{ ++ if (p->migrate_disable_scheduled) ++ return; + + migrate_disable_update_cpus_allowed(p); +- p->migrate_disable = 1; +- +- preempt_enable(); ++ p->migrate_disable_scheduled = 1; + } +-EXPORT_SYMBOL(migrate_disable); + + void migrate_enable(void) + { + struct task_struct *p = current; +- +- if (in_atomic() || irqs_disabled()) { +-#ifdef CONFIG_SCHED_DEBUG +- p->migrate_disable_atomic--; +-#endif +- return; +- } +- +-#ifdef CONFIG_SCHED_DEBUG +- if (unlikely(p->migrate_disable_atomic)) { +- tracing_off(); +- WARN_ON_ONCE(1); +- } +-#endif ++ struct rq *rq = this_rq(); ++ int cpu = task_cpu(p); + + WARN_ON_ONCE(p->migrate_disable <= 0); + if (p->migrate_disable > 1) { +@@ -7329,67 +7299,69 @@ void migrate_enable(void) + + preempt_disable(); + ++#ifdef CONFIG_SCHED_DEBUG ++ WARN_ON_ONCE(current->pinned_on_cpu != cpu); ++ current->pinned_on_cpu = -1; ++#endif ++ ++ WARN_ON_ONCE(rq->nr_pinned < 1); ++ + p->migrate_disable = 0; ++ rq->nr_pinned--; ++ if (rq->nr_pinned == 0 && unlikely(!cpu_active(cpu)) && ++ takedown_cpu_task) ++ wake_up_process(takedown_cpu_task); ++ ++ if (!p->migrate_disable_scheduled) ++ goto out; ++ ++ p->migrate_disable_scheduled = 0; ++ + migrate_enable_update_cpus_allowed(p); + +- if (p->migrate_disable_update) { +- struct rq *rq; ++ WARN_ON(smp_processor_id() != cpu); ++ if (!is_cpu_allowed(p, cpu)) { ++ struct migration_arg arg = { p }; + struct rq_flags rf; +- int cpu = task_cpu(p); + + rq = task_rq_lock(p, &rf); + update_rq_clock(rq); +- +- __do_set_cpus_allowed_tail(p, &p->cpus_mask); ++ arg.dest_cpu = select_fallback_rq(cpu, p); + task_rq_unlock(rq, p, &rf); + +- p->migrate_disable_update = 0; +- +- WARN_ON(smp_processor_id() != cpu); +- if (!cpumask_test_cpu(cpu, &p->cpus_mask)) { +- struct migration_arg arg = { p }; +- struct rq_flags rf; ++ preempt_lazy_enable(); ++ preempt_enable(); + +- rq = task_rq_lock(p, &rf); +- update_rq_clock(rq); +- arg.dest_cpu = select_fallback_rq(cpu, p); +- task_rq_unlock(rq, p, &rf); +- +- unpin_current_cpu(); +- preempt_lazy_enable(); +- preempt_enable(); +- +- sleeping_lock_inc(); +- stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); +- sleeping_lock_dec(); +- tlb_migrate_finish(p->mm); ++ sleeping_lock_inc(); ++ stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); ++ sleeping_lock_dec(); ++ tlb_migrate_finish(p->mm); + +- return; +- } ++ return; + } +- unpin_current_cpu(); ++ ++out: + preempt_lazy_enable(); + preempt_enable(); + } + EXPORT_SYMBOL(migrate_enable); + +-#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) +-void migrate_disable(void) ++int cpu_nr_pinned(int cpu) + { +-#ifdef CONFIG_SCHED_DEBUG +- struct task_struct *p = current; ++ struct rq *rq = cpu_rq(cpu); + +- if (in_atomic() || irqs_disabled()) { +- p->migrate_disable_atomic++; +- return; +- } ++ return rq->nr_pinned; ++} + +- if (unlikely(p->migrate_disable_atomic)) { +- tracing_off(); +- WARN_ON_ONCE(1); +- } ++#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) ++static void migrate_disabled_sched(struct task_struct *p) ++{ ++} + +- p->migrate_disable++; ++void migrate_disable(void) ++{ ++#ifdef CONFIG_SCHED_DEBUG ++ current->migrate_disable++; + #endif + barrier(); + } +@@ -7400,20 +7372,14 @@ void migrate_enable(void) + #ifdef CONFIG_SCHED_DEBUG + struct task_struct *p = current; + +- if (in_atomic() || irqs_disabled()) { +- p->migrate_disable_atomic--; +- return; +- } +- +- if (unlikely(p->migrate_disable_atomic)) { +- tracing_off(); +- WARN_ON_ONCE(1); +- } +- + WARN_ON_ONCE(p->migrate_disable <= 0); + p->migrate_disable--; + #endif + barrier(); + } + EXPORT_SYMBOL(migrate_enable); ++#else ++static void migrate_disabled_sched(struct task_struct *p) ++{ ++} + #endif +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index c90574112bca..78fa5911dd55 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -913,6 +913,10 @@ struct rq { + /* Must be inspected within a rcu lock section */ + struct cpuidle_state *idle_state; + #endif ++ ++#if defined(CONFIG_PREEMPT_RT_BASE) && defined(CONFIG_SMP) ++ int nr_pinned; ++#endif + }; + + static inline int cpu_of(struct rq *rq) +diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c +index b8a8a8db2d75..0c80992aa337 100644 +--- a/lib/smp_processor_id.c ++++ b/lib/smp_processor_id.c +@@ -22,6 +22,9 @@ notrace static unsigned int check_preemption_disabled(const char *what1, + * Kernel threads bound to a single CPU can safely use + * smp_processor_id(): + */ ++ if (current->migrate_disable) ++ goto out; ++ + if (current->nr_cpus_allowed == 1) + goto out; + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0310-sched-migrate_enable-Use-stop_one_cpu_nowait.patch linux-4.19.118/debian/patches-rt/0310-sched-migrate_enable-Use-stop_one_cpu_nowait.patch --- linux-4.19.98/debian/patches-rt/0310-sched-migrate_enable-Use-stop_one_cpu_nowait.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0310-sched-migrate_enable-Use-stop_one_cpu_nowait.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,121 @@ +From b18b09e0eb93eaff554f8b9ddf8be859ceea079f Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Sat, 12 Oct 2019 01:52:14 -0500 +Subject: [PATCH 310/325] sched: migrate_enable: Use stop_one_cpu_nowait() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 6b39a1fa8c53cae08dc03afdae193b7d3a78a173 ] + +migrate_enable() can be called with current->state != TASK_RUNNING. +Avoid clobbering the existing state by using stop_one_cpu_nowait(). +Since we're stopping the current cpu, we know that we won't get +past __schedule() until migration_cpu_stop() has run (at least up to +the point of migrating us to another cpu). + +Signed-off-by: Scott Wood +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + include/linux/stop_machine.h | 2 ++ + kernel/sched/core.c | 23 +++++++++++++---------- + kernel/stop_machine.c | 7 +++++-- + 3 files changed, 20 insertions(+), 12 deletions(-) + +diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h +index 6d3635c86dbe..82fc686ddd9e 100644 +--- a/include/linux/stop_machine.h ++++ b/include/linux/stop_machine.h +@@ -26,6 +26,8 @@ struct cpu_stop_work { + cpu_stop_fn_t fn; + void *arg; + struct cpu_stop_done *done; ++ /* Did not run due to disabled stopper; for nowait debug checks */ ++ bool disabled; + }; + + int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg); +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index e97ac751aad2..e465381b464d 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -990,6 +990,7 @@ static struct rq *move_queued_task(struct rq *rq, struct rq_flags *rf, + struct migration_arg { + struct task_struct *task; + int dest_cpu; ++ bool done; + }; + + /* +@@ -1025,6 +1026,11 @@ static int migration_cpu_stop(void *data) + struct task_struct *p = arg->task; + struct rq *rq = this_rq(); + struct rq_flags rf; ++ int dest_cpu = arg->dest_cpu; ++ ++ /* We don't look at arg after this point. */ ++ smp_mb(); ++ arg->done = true; + + /* + * The original target CPU might have gone down and we might +@@ -1047,9 +1053,9 @@ static int migration_cpu_stop(void *data) + */ + if (task_rq(p) == rq) { + if (task_on_rq_queued(p)) +- rq = __migrate_task(rq, &rf, p, arg->dest_cpu); ++ rq = __migrate_task(rq, &rf, p, dest_cpu); + else +- p->wake_cpu = arg->dest_cpu; ++ p->wake_cpu = dest_cpu; + } + rq_unlock(rq, &rf); + raw_spin_unlock(&p->pi_lock); +@@ -7322,6 +7328,7 @@ void migrate_enable(void) + WARN_ON(smp_processor_id() != cpu); + if (!is_cpu_allowed(p, cpu)) { + struct migration_arg arg = { p }; ++ struct cpu_stop_work work; + struct rq_flags rf; + + rq = task_rq_lock(p, &rf); +@@ -7329,15 +7336,11 @@ void migrate_enable(void) + arg.dest_cpu = select_fallback_rq(cpu, p); + task_rq_unlock(rq, p, &rf); + +- preempt_lazy_enable(); +- preempt_enable(); +- +- sleeping_lock_inc(); +- stop_one_cpu(task_cpu(p), migration_cpu_stop, &arg); +- sleeping_lock_dec(); ++ stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop, ++ &arg, &work); + tlb_migrate_finish(p->mm); +- +- return; ++ __schedule(true); ++ WARN_ON_ONCE(!arg.done && !work.disabled); + } + + out: +diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c +index 067cb83f37ea..2d15c0d50625 100644 +--- a/kernel/stop_machine.c ++++ b/kernel/stop_machine.c +@@ -86,8 +86,11 @@ static bool cpu_stop_queue_work(unsigned int cpu, struct cpu_stop_work *work) + enabled = stopper->enabled; + if (enabled) + __cpu_stop_queue_work(stopper, work, &wakeq); +- else if (work->done) +- cpu_stop_signal_done(work->done); ++ else { ++ work->disabled = true; ++ if (work->done) ++ cpu_stop_signal_done(work->done); ++ } + raw_spin_unlock_irqrestore(&stopper->lock, flags); + + wake_up_q(&wakeq); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0311-Revert-ARM-Initialize-split-page-table-locks-for-vec.patch linux-4.19.118/debian/patches-rt/0311-Revert-ARM-Initialize-split-page-table-locks-for-vec.patch --- linux-4.19.98/debian/patches-rt/0311-Revert-ARM-Initialize-split-page-table-locks-for-vec.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0311-Revert-ARM-Initialize-split-page-table-locks-for-vec.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,87 @@ +From 0a88cdae392aebfc8444d6c038aa0e5fbfa4f3f5 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 18 Oct 2019 13:04:15 +0200 +Subject: [PATCH 311/325] Revert "ARM: Initialize split page table locks for + vector page" +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 247074c44d8c3e619dfde6404a52295d8d671d38 ] + +I'm dropping this patch, with its original description: + +|ARM: Initialize split page table locks for vector page +| +|Without this patch, ARM can not use SPLIT_PTLOCK_CPUS if +|PREEMPT_RT_FULL=y because vectors_user_mapping() creates a +|VM_ALWAYSDUMP mapping of the vector page (address 0xffff0000), but no +|ptl->lock has been allocated for the page. An attempt to coredump +|that page will result in a kernel NULL pointer dereference when +|follow_page() attempts to lock the page. +| +|The call tree to the NULL pointer dereference is: +| +| do_notify_resume() +| get_signal_to_deliver() +| do_coredump() +| elf_core_dump() +| get_dump_page() +| __get_user_pages() +| follow_page() +| pte_offset_map_lock() <----- a #define +| ... +| rt_spin_lock() +| +|The underlying problem is exposed by mm-shrink-the-page-frame-to-rt-size.patch. + +The patch named mm-shrink-the-page-frame-to-rt-size.patch was dropped +from the RT queue once the SPLIT_PTLOCK_CPUS feature (in a slightly +different shape) went upstream (somewhere between v3.12 and v3.14). + +I can see that the patch still allocates a lock which wasn't there +before. However I can't trigger a kernel oops like described in the +patch by triggering a coredump. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + arch/arm/kernel/process.c | 24 ------------------------ + 1 file changed, 24 deletions(-) + +diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c +index 8d3c7ce34c24..82ab015bf42b 100644 +--- a/arch/arm/kernel/process.c ++++ b/arch/arm/kernel/process.c +@@ -324,30 +324,6 @@ unsigned long arch_randomize_brk(struct mm_struct *mm) + } + + #ifdef CONFIG_MMU +-/* +- * CONFIG_SPLIT_PTLOCK_CPUS results in a page->ptl lock. If the lock is not +- * initialized by pgtable_page_ctor() then a coredump of the vector page will +- * fail. +- */ +-static int __init vectors_user_mapping_init_page(void) +-{ +- struct page *page; +- unsigned long addr = 0xffff0000; +- pgd_t *pgd; +- pud_t *pud; +- pmd_t *pmd; +- +- pgd = pgd_offset_k(addr); +- pud = pud_offset(pgd, addr); +- pmd = pmd_offset(pud, addr); +- page = pmd_page(*(pmd)); +- +- pgtable_page_ctor(page); +- +- return 0; +-} +-late_initcall(vectors_user_mapping_init_page); +- + #ifdef CONFIG_KUSER_HELPERS + /* + * The vectors page is always readable from user space for the +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0312-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch linux-4.19.118/debian/patches-rt/0312-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch --- linux-4.19.98/debian/patches-rt/0312-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0312-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,129 @@ +From 146edf2faa6c91a7c60ed338adbe4112c0a655bb Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 19 Nov 2019 09:25:04 +0100 +Subject: [PATCH 312/325] locking: Make spinlock_t and rwlock_t a RCU section + on RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 84440022a0e1c8c936d61f8f97593674a295d409 ] + +On !RT a locked spinlock_t and rwlock_t disables preemption which +implies a RCU read section. There is code that relies on that behaviour. + +Add an explicit RCU read section on RT while a sleeping lock (a lock +which would disables preemption on !RT) acquired. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/locking/rtmutex.c | 6 ++++++ + kernel/locking/rwlock-rt.c | 6 ++++++ + 2 files changed, 12 insertions(+) + +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 63b3d6f306fa..c7d3ae01b4e5 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -1142,6 +1142,7 @@ void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) + void __lockfunc rt_spin_lock(spinlock_t *lock) + { + sleeping_lock_inc(); ++ rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); +@@ -1157,6 +1158,7 @@ void __lockfunc __rt_spin_lock(struct rt_mutex *lock) + void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) + { + sleeping_lock_inc(); ++ rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); + rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); +@@ -1170,6 +1172,7 @@ void __lockfunc rt_spin_unlock(spinlock_t *lock) + spin_release(&lock->dep_map, 1, _RET_IP_); + rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); + migrate_enable(); ++ rcu_read_unlock(); + sleeping_lock_dec(); + } + EXPORT_SYMBOL(rt_spin_unlock); +@@ -1201,6 +1204,7 @@ int __lockfunc rt_spin_trylock(spinlock_t *lock) + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); + } else { + migrate_enable(); + sleeping_lock_dec(); +@@ -1217,6 +1221,7 @@ int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { + sleeping_lock_inc(); ++ rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); + } else +@@ -1233,6 +1238,7 @@ int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags) + ret = __rt_mutex_trylock(&lock->lock); + if (ret) { + sleeping_lock_inc(); ++ rcu_read_lock(); + migrate_disable(); + spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); + } +diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c +index c3b91205161c..0ae8c62ea832 100644 +--- a/kernel/locking/rwlock-rt.c ++++ b/kernel/locking/rwlock-rt.c +@@ -310,6 +310,7 @@ int __lockfunc rt_read_trylock(rwlock_t *rwlock) + ret = do_read_rt_trylock(rwlock); + if (ret) { + rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); + } else { + migrate_enable(); + sleeping_lock_dec(); +@@ -327,6 +328,7 @@ int __lockfunc rt_write_trylock(rwlock_t *rwlock) + ret = do_write_rt_trylock(rwlock); + if (ret) { + rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); + } else { + migrate_enable(); + sleeping_lock_dec(); +@@ -338,6 +340,7 @@ EXPORT_SYMBOL(rt_write_trylock); + void __lockfunc rt_read_lock(rwlock_t *rwlock) + { + sleeping_lock_inc(); ++ rcu_read_lock(); + migrate_disable(); + rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); + do_read_rt_lock(rwlock); +@@ -347,6 +350,7 @@ EXPORT_SYMBOL(rt_read_lock); + void __lockfunc rt_write_lock(rwlock_t *rwlock) + { + sleeping_lock_inc(); ++ rcu_read_lock(); + migrate_disable(); + rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); + do_write_rt_lock(rwlock); +@@ -358,6 +362,7 @@ void __lockfunc rt_read_unlock(rwlock_t *rwlock) + rwlock_release(&rwlock->dep_map, 1, _RET_IP_); + do_read_rt_unlock(rwlock); + migrate_enable(); ++ rcu_read_unlock(); + sleeping_lock_dec(); + } + EXPORT_SYMBOL(rt_read_unlock); +@@ -367,6 +372,7 @@ void __lockfunc rt_write_unlock(rwlock_t *rwlock) + rwlock_release(&rwlock->dep_map, 1, _RET_IP_); + do_write_rt_unlock(rwlock); + migrate_enable(); ++ rcu_read_unlock(); + sleeping_lock_dec(); + } + EXPORT_SYMBOL(rt_write_unlock); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0313-sched-core-migrate_enable-must-access-takedown_cpu_t.patch linux-4.19.118/debian/patches-rt/0313-sched-core-migrate_enable-must-access-takedown_cpu_t.patch --- linux-4.19.98/debian/patches-rt/0313-sched-core-migrate_enable-must-access-takedown_cpu_t.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0313-sched-core-migrate_enable-must-access-takedown_cpu_t.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,55 @@ +From b36ee36f5d6230ea331f5999401df432180eb114 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 29 Nov 2019 17:24:55 +0100 +Subject: [PATCH 313/325] sched/core: migrate_enable() must access + takedown_cpu_task on !HOTPLUG_CPU +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit a61d1977f692e46bad99a100f264981ba08cb4bd ] + +The variable takedown_cpu_task is never declared/used on !HOTPLUG_CPU +except for migrate_enable(). This leads to a link error. + +Don't use takedown_cpu_task in !HOTPLUG_CPU. + +Reported-by: Dick Hollenbeck +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/cpu.c | 2 ++ + kernel/sched/core.c | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/kernel/cpu.c b/kernel/cpu.c +index 2834eed32b55..d28254597f59 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -845,7 +845,9 @@ static int take_cpu_down(void *_param) + return 0; + } + ++#ifdef CONFIG_PREEMPT_RT_BASE + struct task_struct *takedown_cpu_task; ++#endif + + static int takedown_cpu(unsigned int cpu) + { +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index e465381b464d..cbd76324babd 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7314,9 +7314,11 @@ void migrate_enable(void) + + p->migrate_disable = 0; + rq->nr_pinned--; ++#ifdef CONFIG_HOTPLUG_CPU + if (rq->nr_pinned == 0 && unlikely(!cpu_active(cpu)) && + takedown_cpu_task) + wake_up_process(takedown_cpu_task); ++#endif + + if (!p->migrate_disable_scheduled) + goto out; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0314-lib-smp_processor_id-Adjust-check_preemption_disable.patch linux-4.19.118/debian/patches-rt/0314-lib-smp_processor_id-Adjust-check_preemption_disable.patch --- linux-4.19.98/debian/patches-rt/0314-lib-smp_processor_id-Adjust-check_preemption_disable.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0314-lib-smp_processor_id-Adjust-check_preemption_disable.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,41 @@ +From feb825b2c5296319abdfa796acf01d481332b6a1 Mon Sep 17 00:00:00 2001 +From: Daniel Wagner +Date: Mon, 16 Dec 2019 16:15:57 +0100 +Subject: [PATCH 314/325] lib/smp_processor_id: Adjust + check_preemption_disabled() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit af3c1c5fdf177870fb5e6e16b24e374696ab28f5 ] + +The current->migrate_disable counter is not always defined leading to +build failures with DEBUG_PREEMPT && !PREEMPT_RT_BASE. + +Restrict the access to ->migrate_disable to same set where +->migrate_disable is modified. + +Signed-off-by: Daniel Wagner +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: adjust condition + description] +Signed-off-by: Sebastian Andrzej Siewior +--- + lib/smp_processor_id.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c +index 0c80992aa337..2e7398534b66 100644 +--- a/lib/smp_processor_id.c ++++ b/lib/smp_processor_id.c +@@ -22,8 +22,10 @@ notrace static unsigned int check_preemption_disabled(const char *what1, + * Kernel threads bound to a single CPU can safely use + * smp_processor_id(): + */ ++#if defined(CONFIG_PREEMPT_RT_BASE) && (defined(CONFIG_SMP) || defined(CONFIG_SCHED_DEBUG)) + if (current->migrate_disable) + goto out; ++#endif + + if (current->nr_cpus_allowed == 1) + goto out; +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0315-sched-migrate_enable-Busy-loop-until-the-migration-r.patch linux-4.19.118/debian/patches-rt/0315-sched-migrate_enable-Busy-loop-until-the-migration-r.patch --- linux-4.19.98/debian/patches-rt/0315-sched-migrate_enable-Busy-loop-until-the-migration-r.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0315-sched-migrate_enable-Busy-loop-until-the-migration-r.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,57 @@ +From 61c8b73bfa540c2d761e691f2b52b74e7af0cab3 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Thu, 12 Dec 2019 10:53:59 +0100 +Subject: [PATCH 315/325] sched: migrate_enable: Busy loop until the migration + request is completed +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 140d7f54a5fff02898d2ca9802b39548bf7455f1 ] + +If user task changes the CPU affinity mask of a running task it will +dispatch migration request if the current CPU is no longer allowed. This +might happen shortly before a task enters a migrate_disable() section. +Upon leaving the migrate_disable() section, the task will notice that +the current CPU is no longer allowed and will will dispatch its own +migration request to move it off the current CPU. +While invoking __schedule() the first migration request will be +processed and the task returns on the "new" CPU with "arg.done = 0". Its +own migration request will be processed shortly after and will result in +memory corruption if the stack memory, designed for request, was used +otherwise in the meantime. + +Spin until the migration request has been processed if it was accepted. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index cbd76324babd..4616c086dd26 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7329,7 +7329,7 @@ void migrate_enable(void) + + WARN_ON(smp_processor_id() != cpu); + if (!is_cpu_allowed(p, cpu)) { +- struct migration_arg arg = { p }; ++ struct migration_arg arg = { .task = p }; + struct cpu_stop_work work; + struct rq_flags rf; + +@@ -7342,7 +7342,10 @@ void migrate_enable(void) + &arg, &work); + tlb_migrate_finish(p->mm); + __schedule(true); +- WARN_ON_ONCE(!arg.done && !work.disabled); ++ if (!work.disabled) { ++ while (!arg.done) ++ cpu_relax(); ++ } + } + + out: +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0316-userfaultfd-Use-a-seqlock-instead-of-seqcount.patch linux-4.19.118/debian/patches-rt/0316-userfaultfd-Use-a-seqlock-instead-of-seqcount.patch --- linux-4.19.98/debian/patches-rt/0316-userfaultfd-Use-a-seqlock-instead-of-seqcount.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0316-userfaultfd-Use-a-seqlock-instead-of-seqcount.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,80 @@ +From 4f66ae2e8860bf4d6272dffff2e66f0f28e726b0 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Wed, 18 Dec 2019 12:25:09 +0100 +Subject: [PATCH 316/325] userfaultfd: Use a seqlock instead of seqcount +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit dc952a564d02997330654be9628bbe97ba2a05d3 ] + +On RT write_seqcount_begin() disables preemption which leads to warning +in add_wait_queue() while the spinlock_t is acquired. +The waitqueue can't be converted to swait_queue because +userfaultfd_wake_function() is used as a custom wake function. + +Use seqlock instead seqcount to avoid the preempt_disable() section +during add_wait_queue(). + +Cc: stable-rt@vger.kernel.org +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + fs/userfaultfd.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c +index d269d1139f7f..ff6be687f68e 100644 +--- a/fs/userfaultfd.c ++++ b/fs/userfaultfd.c +@@ -61,7 +61,7 @@ struct userfaultfd_ctx { + /* waitqueue head for events */ + wait_queue_head_t event_wqh; + /* a refile sequence protected by fault_pending_wqh lock */ +- struct seqcount refile_seq; ++ seqlock_t refile_seq; + /* pseudo fd refcounting */ + atomic_t refcount; + /* userfaultfd syscall flags */ +@@ -1064,7 +1064,7 @@ static ssize_t userfaultfd_ctx_read(struct userfaultfd_ctx *ctx, int no_wait, + * waitqueue could become empty if this is the + * only userfault. + */ +- write_seqcount_begin(&ctx->refile_seq); ++ write_seqlock(&ctx->refile_seq); + + /* + * The fault_pending_wqh.lock prevents the uwq +@@ -1090,7 +1090,7 @@ static ssize_t userfaultfd_ctx_read(struct userfaultfd_ctx *ctx, int no_wait, + list_del(&uwq->wq.entry); + add_wait_queue(&ctx->fault_wqh, &uwq->wq); + +- write_seqcount_end(&ctx->refile_seq); ++ write_sequnlock(&ctx->refile_seq); + + /* careful to always initialize msg if ret == 0 */ + *msg = uwq->msg; +@@ -1263,11 +1263,11 @@ static __always_inline void wake_userfault(struct userfaultfd_ctx *ctx, + * sure we've userfaults to wake. + */ + do { +- seq = read_seqcount_begin(&ctx->refile_seq); ++ seq = read_seqbegin(&ctx->refile_seq); + need_wakeup = waitqueue_active(&ctx->fault_pending_wqh) || + waitqueue_active(&ctx->fault_wqh); + cond_resched(); +- } while (read_seqcount_retry(&ctx->refile_seq, seq)); ++ } while (read_seqretry(&ctx->refile_seq, seq)); + if (need_wakeup) + __wake_userfault(ctx, range); + } +@@ -1938,7 +1938,7 @@ static void init_once_userfaultfd_ctx(void *mem) + init_waitqueue_head(&ctx->fault_wqh); + init_waitqueue_head(&ctx->event_wqh); + init_waitqueue_head(&ctx->fd_wqh); +- seqcount_init(&ctx->refile_seq); ++ seqlock_init(&ctx->refile_seq); + } + + SYSCALL_DEFINE1(userfaultfd, int, flags) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0317-sched-migrate_enable-Use-per-cpu-cpu_stop_work.patch linux-4.19.118/debian/patches-rt/0317-sched-migrate_enable-Use-per-cpu-cpu_stop_work.patch --- linux-4.19.98/debian/patches-rt/0317-sched-migrate_enable-Use-per-cpu-cpu_stop_work.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0317-sched-migrate_enable-Use-per-cpu-cpu_stop_work.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,83 @@ +From 5ae09731e6eef2497166c6c3520e1537dde2bc31 Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Fri, 24 Jan 2020 06:11:46 -0500 +Subject: [PATCH 317/325] sched: migrate_enable: Use per-cpu cpu_stop_work +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 2dcd94b443c5dcbc20281666321b7f025f9cc85c ] + +Commit e6c287b1512d ("sched: migrate_enable: Use stop_one_cpu_nowait()") +adds a busy wait to deal with an edge case where the migrated thread +can resume running on another CPU before the stopper has consumed +cpu_stop_work. However, this is done with preemption disabled and can +potentially lead to deadlock. + +While it is not guaranteed that the cpu_stop_work will be consumed before +the migrating thread resumes and exits the stack frame, it is guaranteed +that nothing other than the stopper can run on the old cpu between the +migrating thread scheduling out and the cpu_stop_work being consumed. +Thus, we can store cpu_stop_work in per-cpu data without it being +reused too early. + +Fixes: e6c287b1512d ("sched: migrate_enable: Use stop_one_cpu_nowait()") +Suggested-by: Sebastian Andrzej Siewior +Signed-off-by: Scott Wood +Reviewed-by: Steven Rostedt (VMware) +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 4616c086dd26..c4290fa5c0b6 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7291,6 +7291,9 @@ static void migrate_disabled_sched(struct task_struct *p) + p->migrate_disable_scheduled = 1; + } + ++static DEFINE_PER_CPU(struct cpu_stop_work, migrate_work); ++static DEFINE_PER_CPU(struct migration_arg, migrate_arg); ++ + void migrate_enable(void) + { + struct task_struct *p = current; +@@ -7329,23 +7332,26 @@ void migrate_enable(void) + + WARN_ON(smp_processor_id() != cpu); + if (!is_cpu_allowed(p, cpu)) { +- struct migration_arg arg = { .task = p }; +- struct cpu_stop_work work; ++ struct migration_arg __percpu *arg; ++ struct cpu_stop_work __percpu *work; + struct rq_flags rf; + ++ work = this_cpu_ptr(&migrate_work); ++ arg = this_cpu_ptr(&migrate_arg); ++ WARN_ON_ONCE(!arg->done && !work->disabled && work->arg); ++ ++ arg->task = p; ++ arg->done = false; ++ + rq = task_rq_lock(p, &rf); + update_rq_clock(rq); +- arg.dest_cpu = select_fallback_rq(cpu, p); ++ arg->dest_cpu = select_fallback_rq(cpu, p); + task_rq_unlock(rq, p, &rf); + + stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop, +- &arg, &work); ++ arg, work); + tlb_migrate_finish(p->mm); + __schedule(true); +- if (!work.disabled) { +- while (!arg.done) +- cpu_relax(); +- } + } + + out: +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0318-sched-migrate_enable-Remove-__schedule-call.patch linux-4.19.118/debian/patches-rt/0318-sched-migrate_enable-Remove-__schedule-call.patch --- linux-4.19.98/debian/patches-rt/0318-sched-migrate_enable-Remove-__schedule-call.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0318-sched-migrate_enable-Remove-__schedule-call.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,41 @@ +From 73dfb6f21b436b1f96516f951ca173e0828562c6 Mon Sep 17 00:00:00 2001 +From: Scott Wood +Date: Fri, 24 Jan 2020 06:11:47 -0500 +Subject: [PATCH 318/325] sched: migrate_enable: Remove __schedule() call +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit b8162e61e9a33bd1de6452eb838fbf50a93ddd9a ] + +We can rely on preempt_enable() to schedule. Besides simplifying the +code, this potentially allows sequences such as the following to be +permitted: + +migrate_disable(); +preempt_disable(); +migrate_enable(); +preempt_enable(); + +Suggested-by: Sebastian Andrzej Siewior +Signed-off-by: Scott Wood +Reviewed-by: Steven Rostedt (VMware) +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/sched/core.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index c4290fa5c0b6..02e51c74e0bf 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -7351,7 +7351,6 @@ void migrate_enable(void) + stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop, + arg, work); + tlb_migrate_finish(p->mm); +- __schedule(true); + } + + out: +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0319-mm-memcontrol-Move-misplaced-local_unlock_irqrestore.patch linux-4.19.118/debian/patches-rt/0319-mm-memcontrol-Move-misplaced-local_unlock_irqrestore.patch --- linux-4.19.98/debian/patches-rt/0319-mm-memcontrol-Move-misplaced-local_unlock_irqrestore.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0319-mm-memcontrol-Move-misplaced-local_unlock_irqrestore.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,42 @@ +From f7888a980c01a83b9589e0a56b38997f29ba207d Mon Sep 17 00:00:00 2001 +From: Matt Fleming +Date: Sun, 26 Jan 2020 21:19:45 +0000 +Subject: [PATCH 319/325] mm/memcontrol: Move misplaced + local_unlock_irqrestore() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit 071a1d6a6e14d0dec240a8c67b425140d7f92f6a ] + +The comment about local_lock_irqsave() mentions just the counters and +css_put_many()'s callback just invokes a worker so it is safe to move the +unlock function after memcg_check_events() so css_put_many() can be invoked +without the lock acquired. + +Cc: Daniel Wagner +Signed-off-by: Matt Fleming +Signed-off-by: Steven Rostedt (VMware) +[bigeasy: rewrote the patch description] +Signed-off-by: Sebastian Andrzej Siewior +--- + mm/memcontrol.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index 4156a4e766fb..d059e2a99441 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -6538,10 +6538,10 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) + mem_cgroup_charge_statistics(memcg, page, PageTransHuge(page), + -nr_entries); + memcg_check_events(memcg, page); ++ local_unlock_irqrestore(event_lock, flags); + + if (!mem_cgroup_is_root(memcg)) + css_put_many(&memcg->css, nr_entries); +- local_unlock_irqrestore(event_lock, flags); + } + + /** +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0320-locallock-Include-header-for-the-current-macro.patch linux-4.19.118/debian/patches-rt/0320-locallock-Include-header-for-the-current-macro.patch --- linux-4.19.98/debian/patches-rt/0320-locallock-Include-header-for-the-current-macro.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0320-locallock-Include-header-for-the-current-macro.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,32 @@ +From 455f22d624a5ef6344c8ff69a8d65ff71bc65672 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Tue, 4 Feb 2020 13:29:50 +0100 +Subject: [PATCH 320/325] locallock: Include header for the `current' macro +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit e693075a5fd852043fa8d2b0467e078d9e5cb782 ] + +Include the header for `current' macro so that +CONFIG_KERNEL_HEADER_TEST=y passes. + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + include/linux/locallock.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/include/linux/locallock.h b/include/linux/locallock.h +index 921eab83cd34..81c89d87723b 100644 +--- a/include/linux/locallock.h ++++ b/include/linux/locallock.h +@@ -3,6 +3,7 @@ + + #include + #include ++#include + + #ifdef CONFIG_PREEMPT_RT_BASE + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0321-drm-vmwgfx-Drop-preempt_disable-in-vmw_fifo_ping_hos.patch linux-4.19.118/debian/patches-rt/0321-drm-vmwgfx-Drop-preempt_disable-in-vmw_fifo_ping_hos.patch --- linux-4.19.98/debian/patches-rt/0321-drm-vmwgfx-Drop-preempt_disable-in-vmw_fifo_ping_hos.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0321-drm-vmwgfx-Drop-preempt_disable-in-vmw_fifo_ping_hos.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,45 @@ +From a6f7c997fb02c34d3cffdffcba7d1c98ae91d171 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 21 Feb 2020 18:57:11 +0100 +Subject: [PATCH 321/325] drm/vmwgfx: Drop preempt_disable() in + vmw_fifo_ping_host() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit b901491e7b9b7a676818d84e482b69be72fc142f ] + +vmw_fifo_ping_host() disables preemption around a test and a register +write via vmw_write(). The write function acquires a spinlock_t typed +lock which is not allowed in a preempt_disable()ed section on +PREEMPT_RT. This has been reported in the bugzilla. + +It has been explained by Thomas Hellstrom that this preempt_disable()ed +section is not required for correctness. + +Remove the preempt_disable() section. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=206591 +Link: https://lkml.kernel.org/r/0b5e1c65d89951de993deab06d1d197b40fd67aa.camel@vmware.com +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +index d0fd147ef75f..fb5a3461bb8c 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +@@ -167,10 +167,8 @@ void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason) + { + u32 *fifo_mem = dev_priv->mmio_virt; + +- preempt_disable(); + if (cmpxchg(fifo_mem + SVGA_FIFO_BUSY, 0, 1) == 0) + vmw_write(dev_priv, SVGA_REG_SYNC, reason); +- preempt_enable(); + } + + void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo) +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0322-tracing-make-preempt_lazy-and-migrate_disable-counte.patch linux-4.19.118/debian/patches-rt/0322-tracing-make-preempt_lazy-and-migrate_disable-counte.patch --- linux-4.19.98/debian/patches-rt/0322-tracing-make-preempt_lazy-and-migrate_disable-counte.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0322-tracing-make-preempt_lazy-and-migrate_disable-counte.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,56 @@ +From 6ef292c7e5f32959f6677108998c006ffd625694 Mon Sep 17 00:00:00 2001 +From: Sebastian Andrzej Siewior +Date: Fri, 21 Feb 2020 18:15:15 +0100 +Subject: [PATCH 322/325] tracing: make preempt_lazy and migrate_disable + counter smaller +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +[ Upstream commit dd430bf5ecb40f9a89679c85868826475d71de54 ] + +The migrate_disable counter should not exceed 255 so it is enough to +store it in an 8bit field. +With this change we can move the `preempt_lazy_count' member into the +gap so the whole struct shrinks by 4 bytes to 12 bytes in total. +Remove the `padding' field, it is not needed. +Update the tracing fields in trace_define_common_fields() (it was +missing the preempt_lazy_count field). + +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Steven Rostedt (VMware) +--- + include/linux/trace_events.h | 3 +-- + kernel/trace/trace_events.c | 4 ++-- + 2 files changed, 3 insertions(+), 4 deletions(-) + +diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h +index 72864a11cec0..e26a85c1b7ba 100644 +--- a/include/linux/trace_events.h ++++ b/include/linux/trace_events.h +@@ -62,8 +62,7 @@ struct trace_entry { + unsigned char flags; + unsigned char preempt_count; + int pid; +- unsigned short migrate_disable; +- unsigned short padding; ++ unsigned char migrate_disable; + unsigned char preempt_lazy_count; + }; + +diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c +index 1febb0ca4c81..07b8f5bfd263 100644 +--- a/kernel/trace/trace_events.c ++++ b/kernel/trace/trace_events.c +@@ -188,8 +188,8 @@ static int trace_define_common_fields(void) + __common_field(unsigned char, flags); + __common_field(unsigned char, preempt_count); + __common_field(int, pid); +- __common_field(unsigned short, migrate_disable); +- __common_field(unsigned short, padding); ++ __common_field(unsigned char, migrate_disable); ++ __common_field(unsigned char, preempt_lazy_count); + + return ret; + } +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0323-lib-ubsan-Remove-flags-parameter-from-calls-to-ubsan.patch linux-4.19.118/debian/patches-rt/0323-lib-ubsan-Remove-flags-parameter-from-calls-to-ubsan.patch --- linux-4.19.98/debian/patches-rt/0323-lib-ubsan-Remove-flags-parameter-from-calls-to-ubsan.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0323-lib-ubsan-Remove-flags-parameter-from-calls-to-ubsan.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,57 @@ +From 126be7dbd1b1466d09a2314fd0d24af2e72f319d Mon Sep 17 00:00:00 2001 +From: Tiejun Chen +Date: Mon, 30 Mar 2020 18:45:23 -0400 +Subject: [PATCH 323/325] lib/ubsan: Remove flags parameter from calls to + ubsan_prologue() and ubsan_epilogue() +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +Fails to build with CONFIG_UBSAN=y + +lib/ubsan.c: In function '__ubsan_handle_vla_bound_not_positive': +lib/ubsan.c:348:2: error: too many arguments to function 'ubsan_prologue' + ubsan_prologue(&data->location, &flags); + ^~~~~~~~~~~~~~ +lib/ubsan.c:146:13: note: declared here + static void ubsan_prologue(struct source_location *location) + ^~~~~~~~~~~~~~ +lib/ubsan.c:353:2: error: too many arguments to function 'ubsan_epilogue' + ubsan_epilogue(&flags); + ^~~~~~~~~~~~~~ +lib/ubsan.c:155:13: note: declared here + static void ubsan_epilogue(void) + ^~~~~~~~~~~~~~ + +Signed-off-by: Tiejun Chen +Signed-off-by: Steven Rostedt (VMware) +--- + lib/ubsan.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/lib/ubsan.c b/lib/ubsan.c +index 5830cc9a2164..199c75e03469 100644 +--- a/lib/ubsan.c ++++ b/lib/ubsan.c +@@ -339,18 +339,17 @@ EXPORT_SYMBOL(__ubsan_handle_type_mismatch_v1); + void __ubsan_handle_vla_bound_not_positive(struct vla_bound_data *data, + void *bound) + { +- unsigned long flags; + char bound_str[VALUE_LENGTH]; + + if (suppress_report(&data->location)) + return; + +- ubsan_prologue(&data->location, &flags); ++ ubsan_prologue(&data->location); + + val_to_string(bound_str, sizeof(bound_str), data->type, bound); + pr_err("variable length array bound value %s <= 0\n", bound_str); + +- ubsan_epilogue(&flags); ++ ubsan_epilogue(); + } + EXPORT_SYMBOL(__ubsan_handle_vla_bound_not_positive); + +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0324-irq_work-Fix-checking-of-IRQ_WORK_LAZY-flag-set-on-n.patch linux-4.19.118/debian/patches-rt/0324-irq_work-Fix-checking-of-IRQ_WORK_LAZY-flag-set-on-n.patch --- linux-4.19.98/debian/patches-rt/0324-irq_work-Fix-checking-of-IRQ_WORK_LAZY-flag-set-on-n.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0324-irq_work-Fix-checking-of-IRQ_WORK_LAZY-flag-set-on-n.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,72 @@ +From 91565eecad8c73f52ef0c7fef8bfb042f142e2e2 Mon Sep 17 00:00:00 2001 +From: "Steven Rostedt (VMware)" +Date: Sun, 22 Mar 2020 00:00:28 +0100 +Subject: [PATCH 324/325] irq_work: Fix checking of IRQ_WORK_LAZY flag set on + non PREEMPT_RT +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +When CONFIG_PREEMPT_RT_FULL is not set, some of the checks for using +lazy_list are not properly made as the IRQ_WORK_LAZY is not checked. There's +two locations that need this update, so a use_lazy_list() helper function is +added and used in both locations. + +Link: https://lore.kernel.org/r/20200321230028.GA22058@duo.ucw.cz +Reported-by: Pavel Machek +Signed-off-by: Steven Rostedt (VMware) +--- + kernel/irq_work.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/kernel/irq_work.c b/kernel/irq_work.c +index 2940622da5b3..b6d9d35941ac 100644 +--- a/kernel/irq_work.c ++++ b/kernel/irq_work.c +@@ -70,6 +70,12 @@ static void __irq_work_queue_local(struct irq_work *work, struct llist_head *lis + arch_irq_work_raise(); + } + ++static inline bool use_lazy_list(struct irq_work *work) ++{ ++ return (IS_ENABLED(CONFIG_PREEMPT_RT_FULL) && !(work->flags & IRQ_WORK_HARD_IRQ)) ++ || (work->flags & IRQ_WORK_LAZY); ++} ++ + /* Enqueue the irq work @work on the current CPU */ + bool irq_work_queue(struct irq_work *work) + { +@@ -81,11 +87,10 @@ bool irq_work_queue(struct irq_work *work) + + /* Queue the entry and raise the IPI if needed. */ + preempt_disable(); +- if (IS_ENABLED(CONFIG_PREEMPT_RT_FULL) && !(work->flags & IRQ_WORK_HARD_IRQ)) ++ if (use_lazy_list(work)) + list = this_cpu_ptr(&lazy_list); + else + list = this_cpu_ptr(&raised_list); +- + __irq_work_queue_local(work, list); + preempt_enable(); + +@@ -106,7 +111,6 @@ bool irq_work_queue_on(struct irq_work *work, int cpu) + + #else /* CONFIG_SMP: */ + struct llist_head *list; +- bool lazy_work, realtime = IS_ENABLED(CONFIG_PREEMPT_RT_FULL); + + /* All work should have been flushed before going offline */ + WARN_ON_ONCE(cpu_is_offline(cpu)); +@@ -116,10 +120,7 @@ bool irq_work_queue_on(struct irq_work *work, int cpu) + return false; + + preempt_disable(); +- +- lazy_work = work->flags & IRQ_WORK_LAZY; +- +- if (lazy_work || (realtime && !(work->flags & IRQ_WORK_HARD_IRQ))) ++ if (use_lazy_list(work)) + list = &per_cpu(lazy_list, cpu); + else + list = &per_cpu(raised_list, cpu); +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/0325-Linux-4.19.115-rt48-REBASE.patch linux-4.19.118/debian/patches-rt/0325-Linux-4.19.115-rt48-REBASE.patch --- linux-4.19.98/debian/patches-rt/0325-Linux-4.19.115-rt48-REBASE.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/0325-Linux-4.19.115-rt48-REBASE.patch 2020-04-22 13:32:13.000000000 +0000 @@ -0,0 +1,20 @@ +From 03030c7da51669f16a21bd1c99bbf8b8ed2cefea Mon Sep 17 00:00:00 2001 +From: "Steven Rostedt (VMware)" +Date: Tue, 31 Mar 2020 12:32:04 -0400 +Subject: [PATCH 325/325] Linux 4.19.115-rt48 REBASE +Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.115-rt48.tar.xz + +--- + localversion-rt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/localversion-rt b/localversion-rt +index 1199ebade17b..24707986c321 100644 +--- a/localversion-rt ++++ b/localversion-rt +@@ -1 +1 @@ +--rt16 ++-rt48 +-- +2.25.1 + diff -Nru linux-4.19.98/debian/patches-rt/series linux-4.19.118/debian/patches-rt/series --- linux-4.19.98/debian/patches-rt/series 2020-01-26 13:26:49.000000000 +0000 +++ linux-4.19.118/debian/patches-rt/series 2020-04-22 13:32:13.000000000 +0000 @@ -94,197 +94,232 @@ 0094-work-simple-drop-a-shit-statement-in-SWORK_EVENT_PEN.patch 0095-completion-Use-simple-wait-queues.patch 0096-fs-aio-simple-simple-work.patch -0097-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch -0098-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch -0099-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch -0100-hrtimers-Prepare-full-preemption.patch -0101-hrtimer-by-timers-by-default-into-the-softirq-contex.patch -0102-sched-fair-Make-the-hrtimers-non-hard-again.patch -0103-hrtimer-Move-schedule_work-call-to-helper-thread.patch -0104-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch -0105-posix-timers-Thread-posix-cpu-timers-on-rt.patch -0106-sched-Move-task_struct-cleanup-to-RCU.patch -0107-sched-Limit-the-number-of-task-migrations-per-batch.patch -0108-sched-Move-mmdrop-to-RCU-on-RT.patch -0109-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch -0110-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch -0111-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch -0112-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch -0113-sched-Disable-TTWU_QUEUE-on-RT.patch -0114-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch -0115-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch -0116-hotplug-Lightweight-get-online-cpus.patch -0117-trace-Add-migrate-disabled-counter-to-tracing-output.patch -0118-lockdep-Make-it-RT-aware.patch -0119-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch -0120-softirq-Check-preemption-after-reenabling-interrupts.patch -0121-softirq-Disable-softirq-stacks-for-RT.patch -0122-softirq-Split-softirq-locks.patch -0123-net-core-use-local_bh_disable-in-netif_rx_ni.patch -0124-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch -0125-softirq-split-timer-softirqs-out-of-ksoftirqd.patch -0126-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch -0127-softirq-Avoid-local_softirq_pending-messages-if-task.patch -0128-rtmutex-trylock-is-okay-on-RT.patch -0129-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch -0130-rtmutex-Handle-the-various-new-futex-race-conditions.patch -0131-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch -0132-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch -0133-pid.h-include-atomic.h.patch -0134-arm-include-definition-for-cpumask_t.patch -0135-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch -0136-rtmutex-Add-rtmutex_lock_killable.patch -0137-rtmutex-Make-lock_killable-work.patch -0138-spinlock-Split-the-lock-types-header.patch -0139-rtmutex-Avoid-include-hell.patch -0140-rbtree-don-t-include-the-rcu-header.patch -0141-rtmutex-Provide-rt_mutex_slowlock_locked.patch -0142-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch -0143-rtmutex-add-sleeping-lock-implementation.patch -0144-rtmutex-add-mutex-implementation-based-on-rtmutex.patch -0145-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch -0146-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch -0147-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch -0148-rtmutex-wire-up-RT-s-locking.patch -0149-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch -0150-kconfig-Add-PREEMPT_RT_FULL.patch -0151-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch -0152-locking-rt-mutex-Flush-block-plug-on-__down_read.patch -0153-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch -0154-ptrace-fix-ptrace-vs-tasklist_lock-race.patch -0155-rtmutex-annotate-sleeping-lock-context.patch -0156-sched-migrate_disable-fallback-to-preempt_disable-in.patch -0157-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch -0158-rcu-Frob-softirq-test.patch -0159-rcu-Merge-RCU-bh-into-RCU-preempt.patch -0160-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch -0161-rcu-Eliminate-softirq-processing-from-rcutree.patch -0162-srcu-use-cpu_online-instead-custom-check.patch -0163-srcu-replace-local_irqsave-with-a-locallock.patch -0164-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch -0165-tty-serial-omap-Make-the-locking-RT-aware.patch -0166-tty-serial-pl011-Make-the-locking-work-on-RT.patch -0167-tty-serial-pl011-explicitly-initialize-the-flags-var.patch -0168-rt-Improve-the-serial-console-PASS_LIMIT.patch -0169-tty-serial-8250-don-t-take-the-trylock-during-oops.patch -0170-locking-percpu-rwsem-Remove-preempt_disable-variants.patch -0171-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch -0172-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch -0173-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch -0174-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch -0175-thermal-Defer-thermal-wakups-to-threads.patch -0176-x86-fpu-Disable-preemption-around-local_bh_disable.patch -0177-fs-epoll-Do-not-disable-preemption-on-RT.patch -0178-mm-vmalloc-Another-preempt-disable-region-which-suck.patch -0179-block-mq-use-cpu_light.patch -0180-block-mq-do-not-invoke-preempt_disable.patch -0181-block-mq-don-t-complete-requests-via-IPI.patch -0182-md-raid5-Make-raid5_percpu-handling-RT-aware.patch -0183-rt-Introduce-cpu_chill.patch -0184-hrtimer-Don-t-lose-state-in-cpu_chill.patch -0185-hrtimer-cpu_chill-save-task-state-in-saved_state.patch -0186-block-blk-mq-move-blk_queue_usage_counter_release-in.patch -0187-block-Use-cpu_chill-for-retry-loops.patch -0188-fs-dcache-Use-cpu_chill-in-trylock-loops.patch -0189-net-Use-cpu_chill-instead-of-cpu_relax.patch -0190-fs-dcache-use-swait_queue-instead-of-waitqueue.patch -0191-workqueue-Use-normal-rcu.patch -0192-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch -0193-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch -0194-sched-Distangle-worker-accounting-from-rqlock.patch -0195-debugobjects-Make-RT-aware.patch -0196-seqlock-Prevent-rt-starvation.patch -0197-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch -0198-net-Use-skbufhead-with-raw-lock.patch -0199-net-move-xmit_recursion-to-per-task-variable-on-RT.patch -0200-net-provide-a-way-to-delegate-processing-a-softirq-t.patch -0201-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch -0202-net-Qdisc-use-a-seqlock-instead-seqcount.patch -0203-net-add-back-the-missing-serialization-in-ip_send_un.patch -0204-net-add-a-lock-around-icmp_sk.patch -0205-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch -0206-irqwork-push-most-work-into-softirq-context.patch -0207-printk-Make-rt-aware.patch -0208-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch -0209-printk-Drop-the-logbuf_lock-more-often.patch -0210-ARM-enable-irq-in-translation-section-permission-fau.patch -0211-genirq-update-irq_set_irqchip_state-documentation.patch -0212-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch -0213-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch -0214-kgdb-serial-Short-term-workaround.patch -0215-sysfs-Add-sys-kernel-realtime-entry.patch -0216-mm-rt-kmap_atomic-scheduling.patch -0217-x86-highmem-Add-a-already-used-pte-check.patch -0218-arm-highmem-Flush-tlb-on-unmap.patch -0219-arm-Enable-highmem-for-rt.patch -0220-scsi-fcoe-Make-RT-aware.patch -0221-x86-crypto-Reduce-preempt-disabled-regions.patch -0222-crypto-Reduce-preempt-disabled-regions-more-algos.patch -0223-crypto-limit-more-FPU-enabled-sections.patch -0224-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch -0225-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch -0226-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch -0227-x86-stackprotector-Avoid-random-pool-on-rt.patch -0228-random-Make-it-work-on-rt.patch -0229-cpu-hotplug-Implement-CPU-pinning.patch -0230-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch -0231-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch -0232-net-Remove-preemption-disabling-in-netif_rx.patch -0233-net-Another-local_irq_disable-kmalloc-headache.patch -0234-net-core-protect-users-of-napi_alloc_cache-against-r.patch -0235-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch -0236-net-Add-a-mutex-around-devnet_rename_seq.patch -0237-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch -0238-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch -0239-sched-Add-support-for-lazy-preemption.patch -0240-ftrace-Fix-trace-header-alignment.patch -0241-x86-Support-for-lazy-preemption.patch -0242-x86-lazy-preempt-properly-check-against-preempt-mask.patch -0243-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch -0244-arm-Add-support-for-lazy-preemption.patch -0245-powerpc-Add-support-for-lazy-preemption.patch -0246-arch-arm64-Add-lazy-preempt-support.patch -0247-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch -0248-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch -0249-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch -0250-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch -0251-tpm_tis-fix-stall-after-iowrite-s.patch -0252-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch -0253-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch -0254-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch -0255-drm-i915-disable-tracing-on-RT.patch -0256-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch -0257-cgroups-use-simple-wait-in-css_release.patch -0258-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch -0259-apparmor-use-a-locallock-instead-preempt_disable.patch -0260-workqueue-Prevent-deadlock-stall-on-RT.patch -0261-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch -0262-Add-localversion-for-RT-release.patch -0263-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch -0264-powerpc-reshuffle-TIF-bits.patch -0265-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch -0266-drm-i915-Don-t-disable-interrupts-independently-of-t.patch -0267-sched-completion-Fix-a-lockup-in-wait_for_completion.patch -0268-kthread-add-a-global-worker-thread.patch -0269-genirq-Do-not-invoke-the-affinity-callback-via-a-wor.patch -0270-genirq-Handle-missing-work_struct-in-irq_set_affinit.patch -0271-arm-imx6-cpuidle-Use-raw_spinlock_t.patch -0272-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch -0273-pci-switchtec-fix-stream_open.cocci-warnings.patch -0274-sched-core-Drop-a-preempt_disable_rt-statement.patch -0275-timers-Redo-the-notification-of-canceling-timers-on-.patch -0276-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch -0277-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch -0278-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch -0279-Revert-futex-workaround-migrate_disable-enable-in-di.patch -0280-futex-Make-the-futex_hash_bucket-lock-raw.patch -0281-futex-Delay-deallocation-of-pi_state.patch -0282-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch -0283-revert-aio.patch -0284-fs-aio-simple-simple-work.patch -0285-revert-thermal.patch -0286-thermal-Defer-thermal-wakups-to-threads.patch -0287-revert-block.patch -0288-block-blk-mq-move-blk_queue_usage_counter_release-in.patch -0289-workqueue-rework.patch -0290-Linux-4.19.94-rt38-REBASE.patch +0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch +0098-hrtimer-consolidate-hrtimer_init-hrtimer_init_sleepe.patch +0099-hrtimers-Prepare-full-preemption.patch +0100-hrtimer-by-timers-by-default-into-the-softirq-contex.patch +0101-sched-fair-Make-the-hrtimers-non-hard-again.patch +0102-hrtimer-Move-schedule_work-call-to-helper-thread.patch +0103-hrtimer-move-state-change-before-hrtimer_cancel-in-d.patch +0104-posix-timers-Thread-posix-cpu-timers-on-rt.patch +0105-sched-Move-task_struct-cleanup-to-RCU.patch +0106-sched-Limit-the-number-of-task-migrations-per-batch.patch +0107-sched-Move-mmdrop-to-RCU-on-RT.patch +0108-kernel-sched-move-stack-kprobe-clean-up-to-__put_tas.patch +0109-sched-Add-saved_state-for-tasks-blocked-on-sleeping-.patch +0110-sched-Do-not-account-rcu_preempt_depth-on-RT-in-migh.patch +0111-sched-Use-the-proper-LOCK_OFFSET-for-cond_resched.patch +0112-sched-Disable-TTWU_QUEUE-on-RT.patch +0113-sched-workqueue-Only-wake-up-idle-workers-if-not-blo.patch +0114-rt-Increase-decrease-the-nr-of-migratory-tasks-when-.patch +0115-hotplug-Lightweight-get-online-cpus.patch +0116-trace-Add-migrate-disabled-counter-to-tracing-output.patch +0117-lockdep-Make-it-RT-aware.patch +0118-tasklet-Prevent-tasklets-from-going-into-infinite-sp.patch +0119-softirq-Check-preemption-after-reenabling-interrupts.patch +0120-softirq-Disable-softirq-stacks-for-RT.patch +0121-softirq-Split-softirq-locks.patch +0122-net-core-use-local_bh_disable-in-netif_rx_ni.patch +0123-genirq-Allow-disabling-of-softirq-processing-in-irq-.patch +0124-softirq-split-timer-softirqs-out-of-ksoftirqd.patch +0125-softirq-Avoid-local_softirq_pending-messages-if-ksof.patch +0126-softirq-Avoid-local_softirq_pending-messages-if-task.patch +0127-rtmutex-trylock-is-okay-on-RT.patch +0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch +0129-rtmutex-Handle-the-various-new-futex-race-conditions.patch +0130-futex-Fix-bug-on-when-a-requeued-RT-task-times-out.patch +0131-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch +0132-pid.h-include-atomic.h.patch +0133-arm-include-definition-for-cpumask_t.patch +0134-locking-locktorture-Do-NOT-include-rwlock.h-directly.patch +0135-rtmutex-Add-rtmutex_lock_killable.patch +0136-rtmutex-Make-lock_killable-work.patch +0137-spinlock-Split-the-lock-types-header.patch +0138-rtmutex-Avoid-include-hell.patch +0139-rbtree-don-t-include-the-rcu-header.patch +0140-rtmutex-Provide-rt_mutex_slowlock_locked.patch +0141-rtmutex-export-lockdep-less-version-of-rt_mutex-s-lo.patch +0142-rtmutex-add-sleeping-lock-implementation.patch +0143-rtmutex-add-mutex-implementation-based-on-rtmutex.patch +0144-rtmutex-add-rwsem-implementation-based-on-rtmutex.patch +0145-rtmutex-add-rwlock-implementation-based-on-rtmutex.patch +0146-rtmutex-rwlock-preserve-state-like-a-sleeping-lock.patch +0147-rtmutex-wire-up-RT-s-locking.patch +0148-rtmutex-add-ww_mutex-addon-for-mutex-rt.patch +0149-kconfig-Add-PREEMPT_RT_FULL.patch +0150-locking-rt-mutex-fix-deadlock-in-device-mapper-block.patch +0151-locking-rt-mutex-Flush-block-plug-on-__down_read.patch +0152-locking-rtmutex-re-init-the-wait_lock-in-rt_mutex_in.patch +0153-ptrace-fix-ptrace-vs-tasklist_lock-race.patch +0154-rtmutex-annotate-sleeping-lock-context.patch +0155-sched-migrate_disable-fallback-to-preempt_disable-in.patch +0156-locking-don-t-check-for-__LINUX_SPINLOCK_TYPES_H-on-.patch +0157-rcu-Frob-softirq-test.patch +0158-rcu-Merge-RCU-bh-into-RCU-preempt.patch +0159-rcu-Make-ksoftirqd-do-RCU-quiescent-states.patch +0160-rcu-Eliminate-softirq-processing-from-rcutree.patch +0161-srcu-use-cpu_online-instead-custom-check.patch +0162-srcu-replace-local_irqsave-with-a-locallock.patch +0163-rcu-enable-rcu_normal_after_boot-by-default-for-RT.patch +0164-tty-serial-omap-Make-the-locking-RT-aware.patch +0165-tty-serial-pl011-Make-the-locking-work-on-RT.patch +0166-tty-serial-pl011-explicitly-initialize-the-flags-var.patch +0167-rt-Improve-the-serial-console-PASS_LIMIT.patch +0168-tty-serial-8250-don-t-take-the-trylock-during-oops.patch +0169-locking-percpu-rwsem-Remove-preempt_disable-variants.patch +0170-mm-Protect-activate_mm-by-preempt_-disable-enable-_r.patch +0171-fs-dcache-bring-back-explicit-INIT_HLIST_BL_HEAD-ini.patch +0172-fs-dcache-disable-preemption-on-i_dir_seq-s-write-si.patch +0173-squashfs-make-use-of-local-lock-in-multi_cpu-decompr.patch +0174-thermal-Defer-thermal-wakups-to-threads.patch +0175-x86-fpu-Disable-preemption-around-local_bh_disable.patch +0176-fs-epoll-Do-not-disable-preemption-on-RT.patch +0177-mm-vmalloc-Another-preempt-disable-region-which-suck.patch +0178-block-mq-use-cpu_light.patch +0179-block-mq-do-not-invoke-preempt_disable.patch +0180-block-mq-don-t-complete-requests-via-IPI.patch +0181-md-raid5-Make-raid5_percpu-handling-RT-aware.patch +0182-rt-Introduce-cpu_chill.patch +0183-hrtimer-Don-t-lose-state-in-cpu_chill.patch +0184-hrtimer-cpu_chill-save-task-state-in-saved_state.patch +0185-block-blk-mq-move-blk_queue_usage_counter_release-in.patch +0186-block-Use-cpu_chill-for-retry-loops.patch +0187-fs-dcache-Use-cpu_chill-in-trylock-loops.patch +0188-net-Use-cpu_chill-instead-of-cpu_relax.patch +0189-fs-dcache-use-swait_queue-instead-of-waitqueue.patch +0190-workqueue-Use-normal-rcu.patch +0191-workqueue-Use-local-irq-lock-instead-of-irq-disable-.patch +0192-workqueue-Prevent-workqueue-versus-ata-piix-livelock.patch +0193-sched-Distangle-worker-accounting-from-rqlock.patch +0194-debugobjects-Make-RT-aware.patch +0195-seqlock-Prevent-rt-starvation.patch +0196-sunrpc-Make-svc_xprt_do_enqueue-use-get_cpu_light.patch +0197-net-Use-skbufhead-with-raw-lock.patch +0198-net-move-xmit_recursion-to-per-task-variable-on-RT.patch +0199-net-provide-a-way-to-delegate-processing-a-softirq-t.patch +0200-net-dev-always-take-qdisc-s-busylock-in-__dev_xmit_s.patch +0201-net-Qdisc-use-a-seqlock-instead-seqcount.patch +0202-net-add-back-the-missing-serialization-in-ip_send_un.patch +0203-net-add-a-lock-around-icmp_sk.patch +0204-net-Have-__napi_schedule_irqoff-disable-interrupts-o.patch +0205-irqwork-push-most-work-into-softirq-context.patch +0206-printk-Make-rt-aware.patch +0207-kernel-printk-Don-t-try-to-print-from-IRQ-NMI-region.patch +0208-printk-Drop-the-logbuf_lock-more-often.patch +0209-ARM-enable-irq-in-translation-section-permission-fau.patch +0210-genirq-update-irq_set_irqchip_state-documentation.patch +0211-KVM-arm-arm64-downgrade-preempt_disable-d-region-to-.patch +0212-arm64-fpsimd-use-preemp_disable-in-addition-to-local.patch +0213-kgdb-serial-Short-term-workaround.patch +0214-sysfs-Add-sys-kernel-realtime-entry.patch +0215-mm-rt-kmap_atomic-scheduling.patch +0216-x86-highmem-Add-a-already-used-pte-check.patch +0217-arm-highmem-Flush-tlb-on-unmap.patch +0218-arm-Enable-highmem-for-rt.patch +0219-scsi-fcoe-Make-RT-aware.patch +0220-x86-crypto-Reduce-preempt-disabled-regions.patch +0221-crypto-Reduce-preempt-disabled-regions-more-algos.patch +0222-crypto-limit-more-FPU-enabled-sections.patch +0223-crypto-scompress-serialize-RT-percpu-scratch-buffer-.patch +0224-crypto-cryptd-add-a-lock-instead-preempt_disable-loc.patch +0225-panic-skip-get_random_bytes-for-RT_FULL-in-init_oops.patch +0226-x86-stackprotector-Avoid-random-pool-on-rt.patch +0227-random-Make-it-work-on-rt.patch +0228-cpu-hotplug-Implement-CPU-pinning.patch +0229-sched-Allow-pinned-user-tasks-to-be-awakened-to-the-.patch +0230-hotplug-duct-tape-RT-rwlock-usage-for-non-RT.patch +0231-net-Remove-preemption-disabling-in-netif_rx.patch +0232-net-Another-local_irq_disable-kmalloc-headache.patch +0233-net-core-protect-users-of-napi_alloc_cache-against-r.patch +0234-net-netfilter-Serialize-xt_write_recseq-sections-on-.patch +0235-net-Add-a-mutex-around-devnet_rename_seq.patch +0236-lockdep-selftest-Only-do-hardirq-context-test-for-ra.patch +0237-lockdep-selftest-fix-warnings-due-to-missing-PREEMPT.patch +0238-sched-Add-support-for-lazy-preemption.patch +0239-ftrace-Fix-trace-header-alignment.patch +0240-x86-Support-for-lazy-preemption.patch +0241-x86-lazy-preempt-properly-check-against-preempt-mask.patch +0242-x86-lazy-preempt-use-proper-return-label-on-32bit-x8.patch +0243-arm-Add-support-for-lazy-preemption.patch +0244-powerpc-Add-support-for-lazy-preemption.patch +0245-arch-arm64-Add-lazy-preempt-support.patch +0246-connector-cn_proc-Protect-send_msg-with-a-local-lock.patch +0247-drivers-block-zram-Replace-bit-spinlocks-with-rtmute.patch +0248-drivers-zram-Don-t-disable-preemption-in-zcomp_strea.patch +0249-drivers-zram-fix-zcomp_stream_get-smp_processor_id-u.patch +0250-tpm_tis-fix-stall-after-iowrite-s.patch +0251-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch +0252-drm-radeon-i915-Use-preempt_disable-enable_rt-where-.patch +0253-drm-i915-Use-local_lock-unlock_irq-in-intel_pipe_upd.patch +0254-drm-i915-disable-tracing-on-RT.patch +0255-drm-i915-skip-DRM_I915_LOW_LEVEL_TRACEPOINTS-with-NO.patch +0256-cgroups-use-simple-wait-in-css_release.patch +0257-cpuset-Convert-callback_lock-to-raw_spinlock_t.patch +0258-apparmor-use-a-locallock-instead-preempt_disable.patch +0259-workqueue-Prevent-deadlock-stall-on-RT.patch +0260-signals-Allow-rt-tasks-to-cache-one-sigqueue-struct.patch +0261-Add-localversion-for-RT-release.patch +0262-powerpc-pseries-iommu-Use-a-locallock-instead-local_.patch +0263-powerpc-reshuffle-TIF-bits.patch +0264-tty-sysrq-Convert-show_lock-to-raw_spinlock_t.patch +0265-drm-i915-Don-t-disable-interrupts-independently-of-t.patch +0266-sched-completion-Fix-a-lockup-in-wait_for_completion.patch +0267-kthread-add-a-global-worker-thread.patch +0268-arm-imx6-cpuidle-Use-raw_spinlock_t.patch +0269-rcu-Don-t-allow-to-change-rcu_normal_after_boot-on-R.patch +0270-pci-switchtec-fix-stream_open.cocci-warnings.patch +0271-sched-core-Drop-a-preempt_disable_rt-statement.patch +0272-timers-Redo-the-notification-of-canceling-timers-on-.patch +0273-Revert-futex-Ensure-lock-unlock-symetry-versus-pi_lo.patch +0274-Revert-futex-Fix-bug-on-when-a-requeued-RT-task-time.patch +0275-Revert-rtmutex-Handle-the-various-new-futex-race-con.patch +0276-Revert-futex-workaround-migrate_disable-enable-in-di.patch +0277-futex-Make-the-futex_hash_bucket-lock-raw.patch +0278-futex-Delay-deallocation-of-pi_state.patch +0279-mm-zswap-Do-not-disable-preemption-in-zswap_frontswa.patch +0280-revert-aio.patch +0281-fs-aio-simple-simple-work.patch +0282-revert-thermal.patch +0283-thermal-Defer-thermal-wakups-to-threads.patch +0284-revert-block.patch +0285-block-blk-mq-move-blk_queue_usage_counter_release-in.patch +0286-workqueue-rework.patch +0287-i2c-exynos5-Remove-IRQF_ONESHOT.patch +0288-i2c-hix5hd2-Remove-IRQF_ONESHOT.patch +0289-sched-deadline-Ensure-inactive_timer-runs-in-hardirq.patch +0290-thermal-x86_pkg_temp-make-pkg_temp_lock-a-raw-spinlo.patch +0291-dma-buf-Use-seqlock_t-instread-disabling-preemption.patch +0292-KVM-arm-arm64-Let-the-timer-expire-in-hardirq-contex.patch +0293-x86-preempt-Check-preemption-level-before-looking-at.patch +0294-hrtimer-Use-READ_ONCE-to-access-timer-base-in-hrimer.patch +0295-hrtimer-Don-t-grab-the-expiry-lock-for-non-soft-hrti.patch +0296-hrtimer-Prevent-using-hrtimer_grab_expiry_lock-on-mi.patch +0297-hrtimer-Add-a-missing-bracket-and-hide-migration_bas.patch +0298-posix-timers-Unlock-expiry-lock-in-the-early-return.patch +0299-sched-migrate_dis-enable-Use-sleeping_lock-to-annota.patch +0300-sched-__set_cpus_allowed_ptr-Check-cpus_mask-not-cpu.patch +0301-sched-Remove-dead-__migrate_disabled-check.patch +0302-sched-migrate-disable-Protect-cpus_ptr-with-lock.patch +0303-lib-smp_processor_id-Don-t-use-cpumask_equal.patch +0304-futex-Make-the-futex_hash_bucket-spinlock_t-again-an.patch +0305-locking-rtmutex-Clean-pi_blocked_on-in-the-error-cas.patch +0306-lib-ubsan-Don-t-seralize-UBSAN-report.patch +0307-kmemleak-Change-the-lock-of-kmemleak_object-to-raw_s.patch +0308-sched-migrate_enable-Use-select_fallback_rq.patch +0309-sched-Lazy-migrate_disable-processing.patch +0310-sched-migrate_enable-Use-stop_one_cpu_nowait.patch +0311-Revert-ARM-Initialize-split-page-table-locks-for-vec.patch +0312-locking-Make-spinlock_t-and-rwlock_t-a-RCU-section-o.patch +0313-sched-core-migrate_enable-must-access-takedown_cpu_t.patch +0314-lib-smp_processor_id-Adjust-check_preemption_disable.patch +0315-sched-migrate_enable-Busy-loop-until-the-migration-r.patch +0316-userfaultfd-Use-a-seqlock-instead-of-seqcount.patch +0317-sched-migrate_enable-Use-per-cpu-cpu_stop_work.patch +0318-sched-migrate_enable-Remove-__schedule-call.patch +0319-mm-memcontrol-Move-misplaced-local_unlock_irqrestore.patch +0320-locallock-Include-header-for-the-current-macro.patch +0321-drm-vmwgfx-Drop-preempt_disable-in-vmw_fifo_ping_hos.patch +0322-tracing-make-preempt_lazy-and-migrate_disable-counte.patch +0323-lib-ubsan-Remove-flags-parameter-from-calls-to-ubsan.patch +0324-irq_work-Fix-checking-of-IRQ_WORK_LAZY-flag-set-on-n.patch +0325-Linux-4.19.115-rt48-REBASE.patch diff -Nru linux-4.19.98/debian/rules.gen linux-4.19.118/debian/rules.gen --- linux-4.19.98/debian/rules.gen 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/rules.gen 2020-04-26 13:04:11.000000000 +0000 @@ -2,725 +2,725 @@ binary-arch: binary-arch_alpha binary-arch_amd64 binary-arch_arm64 binary-arch_arm64ilp32 binary-arch_armel binary-arch_armhf binary-arch_hppa binary-arch_i386 binary-arch_ia64 binary-arch_m68k binary-arch_mips binary-arch_mips64 binary-arch_mips64el binary-arch_mips64r6 binary-arch_mips64r6el binary-arch_mipsel binary-arch_mipsn32 binary-arch_mipsn32el binary-arch_mipsn32r6 binary-arch_mipsn32r6el binary-arch_mipsr6 binary-arch_mipsr6el binary-arch_powerpc binary-arch_powerpcspe binary-arch_ppc64 binary-arch_ppc64el binary-arch_riscv64 binary-arch_s390 binary-arch_s390x binary-arch_sh3 binary-arch_sh4 binary-arch_sparc binary-arch_sparc64 binary-arch_x32 binary-arch_alpha:: binary-arch_alpha_none binary-arch_alpha_real binary-arch_alpha:: - $(MAKE) -f debian/rules.real install-udeb_alpha ABINAME='4.19.0-8' ARCH='alpha' KERNEL_ARCH='alpha' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-alpha-generic-di nic-modules-4.19.0-8-alpha-generic-di nic-wireless-modules-4.19.0-8-alpha-generic-di nic-shared-modules-4.19.0-8-alpha-generic-di serial-modules-4.19.0-8-alpha-generic-di usb-serial-modules-4.19.0-8-alpha-generic-di ppp-modules-4.19.0-8-alpha-generic-di pata-modules-4.19.0-8-alpha-generic-di cdrom-core-modules-4.19.0-8-alpha-generic-di scsi-core-modules-4.19.0-8-alpha-generic-di scsi-modules-4.19.0-8-alpha-generic-di scsi-nic-modules-4.19.0-8-alpha-generic-di loop-modules-4.19.0-8-alpha-generic-di btrfs-modules-4.19.0-8-alpha-generic-di ext4-modules-4.19.0-8-alpha-generic-di isofs-modules-4.19.0-8-alpha-generic-di jfs-modules-4.19.0-8-alpha-generic-di xfs-modules-4.19.0-8-alpha-generic-di fat-modules-4.19.0-8-alpha-generic-di md-modules-4.19.0-8-alpha-generic-di multipath-modules-4.19.0-8-alpha-generic-di usb-modules-4.19.0-8-alpha-generic-di usb-storage-modules-4.19.0-8-alpha-generic-di fb-modules-4.19.0-8-alpha-generic-di input-modules-4.19.0-8-alpha-generic-di event-modules-4.19.0-8-alpha-generic-di mouse-modules-4.19.0-8-alpha-generic-di nic-pcmcia-modules-4.19.0-8-alpha-generic-di pcmcia-modules-4.19.0-8-alpha-generic-di nic-usb-modules-4.19.0-8-alpha-generic-di sata-modules-4.19.0-8-alpha-generic-di i2c-modules-4.19.0-8-alpha-generic-di crc-modules-4.19.0-8-alpha-generic-di crypto-modules-4.19.0-8-alpha-generic-di crypto-dm-modules-4.19.0-8-alpha-generic-di ata-modules-4.19.0-8-alpha-generic-di nbd-modules-4.19.0-8-alpha-generic-di squashfs-modules-4.19.0-8-alpha-generic-di zlib-modules-4.19.0-8-alpha-generic-di compress-modules-4.19.0-8-alpha-generic-di fuse-modules-4.19.0-8-alpha-generic-di srm-modules-4.19.0-8-alpha-generic-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_alpha ABINAME='4.19.0-9' ARCH='alpha' KERNEL_ARCH='alpha' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-alpha-generic-di nic-modules-4.19.0-9-alpha-generic-di nic-wireless-modules-4.19.0-9-alpha-generic-di nic-shared-modules-4.19.0-9-alpha-generic-di serial-modules-4.19.0-9-alpha-generic-di usb-serial-modules-4.19.0-9-alpha-generic-di ppp-modules-4.19.0-9-alpha-generic-di pata-modules-4.19.0-9-alpha-generic-di cdrom-core-modules-4.19.0-9-alpha-generic-di scsi-core-modules-4.19.0-9-alpha-generic-di scsi-modules-4.19.0-9-alpha-generic-di scsi-nic-modules-4.19.0-9-alpha-generic-di loop-modules-4.19.0-9-alpha-generic-di btrfs-modules-4.19.0-9-alpha-generic-di ext4-modules-4.19.0-9-alpha-generic-di isofs-modules-4.19.0-9-alpha-generic-di jfs-modules-4.19.0-9-alpha-generic-di xfs-modules-4.19.0-9-alpha-generic-di fat-modules-4.19.0-9-alpha-generic-di md-modules-4.19.0-9-alpha-generic-di multipath-modules-4.19.0-9-alpha-generic-di usb-modules-4.19.0-9-alpha-generic-di usb-storage-modules-4.19.0-9-alpha-generic-di fb-modules-4.19.0-9-alpha-generic-di input-modules-4.19.0-9-alpha-generic-di event-modules-4.19.0-9-alpha-generic-di mouse-modules-4.19.0-9-alpha-generic-di nic-pcmcia-modules-4.19.0-9-alpha-generic-di pcmcia-modules-4.19.0-9-alpha-generic-di nic-usb-modules-4.19.0-9-alpha-generic-di sata-modules-4.19.0-9-alpha-generic-di i2c-modules-4.19.0-9-alpha-generic-di crc-modules-4.19.0-9-alpha-generic-di crypto-modules-4.19.0-9-alpha-generic-di crypto-dm-modules-4.19.0-9-alpha-generic-di ata-modules-4.19.0-9-alpha-generic-di nbd-modules-4.19.0-9-alpha-generic-di squashfs-modules-4.19.0-9-alpha-generic-di zlib-modules-4.19.0-9-alpha-generic-di compress-modules-4.19.0-9-alpha-generic-di fuse-modules-4.19.0-9-alpha-generic-di srm-modules-4.19.0-9-alpha-generic-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_alpha_none: binary-arch_alpha_none_alpha-generic binary-arch_alpha_none_alpha-smp binary-arch_alpha_none_real binary-arch_alpha_none_alpha-generic: binary-arch_alpha_none_alpha-generic_real binary-arch_alpha_none_alpha-generic_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_alpha_none_alpha-smp: binary-arch_alpha_none_alpha-smp_real binary-arch_alpha_none_alpha-smp_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_alpha_none_real: binary-arch_alpha_real:: setup_alpha binary-arch_alpha_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='alpha' KERNEL_ARCH='alpha' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='alpha' KERNEL_ARCH='alpha' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_amd64:: binary-arch_amd64_extra binary-arch_amd64_none binary-arch_amd64_real binary-arch_amd64_rt binary-arch_amd64:: - $(MAKE) -f debian/rules.real install-udeb_amd64 ABINAME='4.19.0-8' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-amd64-di nic-modules-4.19.0-8-amd64-di nic-wireless-modules-4.19.0-8-amd64-di nic-shared-modules-4.19.0-8-amd64-di serial-modules-4.19.0-8-amd64-di usb-serial-modules-4.19.0-8-amd64-di ppp-modules-4.19.0-8-amd64-di pata-modules-4.19.0-8-amd64-di cdrom-core-modules-4.19.0-8-amd64-di firewire-core-modules-4.19.0-8-amd64-di scsi-core-modules-4.19.0-8-amd64-di scsi-modules-4.19.0-8-amd64-di scsi-nic-modules-4.19.0-8-amd64-di loop-modules-4.19.0-8-amd64-di btrfs-modules-4.19.0-8-amd64-di ext4-modules-4.19.0-8-amd64-di isofs-modules-4.19.0-8-amd64-di jfs-modules-4.19.0-8-amd64-di xfs-modules-4.19.0-8-amd64-di fat-modules-4.19.0-8-amd64-di md-modules-4.19.0-8-amd64-di multipath-modules-4.19.0-8-amd64-di usb-modules-4.19.0-8-amd64-di usb-storage-modules-4.19.0-8-amd64-di pcmcia-storage-modules-4.19.0-8-amd64-di fb-modules-4.19.0-8-amd64-di input-modules-4.19.0-8-amd64-di event-modules-4.19.0-8-amd64-di mouse-modules-4.19.0-8-amd64-di nic-pcmcia-modules-4.19.0-8-amd64-di pcmcia-modules-4.19.0-8-amd64-di nic-usb-modules-4.19.0-8-amd64-di sata-modules-4.19.0-8-amd64-di acpi-modules-4.19.0-8-amd64-di i2c-modules-4.19.0-8-amd64-di crc-modules-4.19.0-8-amd64-di crypto-modules-4.19.0-8-amd64-di crypto-dm-modules-4.19.0-8-amd64-di efi-modules-4.19.0-8-amd64-di ata-modules-4.19.0-8-amd64-di mmc-core-modules-4.19.0-8-amd64-di mmc-modules-4.19.0-8-amd64-di nbd-modules-4.19.0-8-amd64-di squashfs-modules-4.19.0-8-amd64-di speakup-modules-4.19.0-8-amd64-di uinput-modules-4.19.0-8-amd64-di sound-modules-4.19.0-8-amd64-di compress-modules-4.19.0-8-amd64-di udf-modules-4.19.0-8-amd64-di fuse-modules-4.19.0-8-amd64-di mtd-core-modules-4.19.0-8-amd64-di' UDEB_UNSIGNED_TEST_BUILD=True + $(MAKE) -f debian/rules.real install-udeb_amd64 ABINAME='4.19.0-9' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-amd64-di nic-modules-4.19.0-9-amd64-di nic-wireless-modules-4.19.0-9-amd64-di nic-shared-modules-4.19.0-9-amd64-di serial-modules-4.19.0-9-amd64-di usb-serial-modules-4.19.0-9-amd64-di ppp-modules-4.19.0-9-amd64-di pata-modules-4.19.0-9-amd64-di cdrom-core-modules-4.19.0-9-amd64-di firewire-core-modules-4.19.0-9-amd64-di scsi-core-modules-4.19.0-9-amd64-di scsi-modules-4.19.0-9-amd64-di scsi-nic-modules-4.19.0-9-amd64-di loop-modules-4.19.0-9-amd64-di btrfs-modules-4.19.0-9-amd64-di ext4-modules-4.19.0-9-amd64-di isofs-modules-4.19.0-9-amd64-di jfs-modules-4.19.0-9-amd64-di xfs-modules-4.19.0-9-amd64-di fat-modules-4.19.0-9-amd64-di md-modules-4.19.0-9-amd64-di multipath-modules-4.19.0-9-amd64-di usb-modules-4.19.0-9-amd64-di usb-storage-modules-4.19.0-9-amd64-di pcmcia-storage-modules-4.19.0-9-amd64-di fb-modules-4.19.0-9-amd64-di input-modules-4.19.0-9-amd64-di event-modules-4.19.0-9-amd64-di mouse-modules-4.19.0-9-amd64-di nic-pcmcia-modules-4.19.0-9-amd64-di pcmcia-modules-4.19.0-9-amd64-di nic-usb-modules-4.19.0-9-amd64-di sata-modules-4.19.0-9-amd64-di acpi-modules-4.19.0-9-amd64-di i2c-modules-4.19.0-9-amd64-di crc-modules-4.19.0-9-amd64-di crypto-modules-4.19.0-9-amd64-di crypto-dm-modules-4.19.0-9-amd64-di efi-modules-4.19.0-9-amd64-di ata-modules-4.19.0-9-amd64-di mmc-core-modules-4.19.0-9-amd64-di mmc-modules-4.19.0-9-amd64-di nbd-modules-4.19.0-9-amd64-di squashfs-modules-4.19.0-9-amd64-di speakup-modules-4.19.0-9-amd64-di uinput-modules-4.19.0-9-amd64-di sound-modules-4.19.0-9-amd64-di compress-modules-4.19.0-9-amd64-di udf-modules-4.19.0-9-amd64-di fuse-modules-4.19.0-9-amd64-di mtd-core-modules-4.19.0-9-amd64-di' UDEB_UNSIGNED_TEST_BUILD=True binary-arch_amd64:: - $(MAKE) -f debian/rules.real install-signed-template_amd64 ABINAME='4.19.0-8' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real install-signed-template_amd64 ABINAME='4.19.0-9' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_amd64_extra:: $(MAKE) -f debian/rules.real install-dummy ARCH='amd64' DH_OPTIONS='-plinux-compiler-gcc-8-x86' binary-arch_amd64_none: binary-arch_amd64_none_amd64 binary-arch_amd64_none_cloud-amd64 binary-arch_amd64_none_real binary-arch_amd64_none_amd64: binary-arch_amd64_none_amd64_real binary-arch_amd64_none_amd64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_amd64_none_cloud-amd64: binary-arch_amd64_none_cloud-amd64_real binary-arch_amd64_none_cloud-amd64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_amd64_none_real: binary-arch_amd64_real:: setup_amd64 binary-arch_amd64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_amd64_rt: binary-arch_amd64_rt_amd64 binary-arch_amd64_rt_real binary-arch_amd64_rt_amd64: binary-arch_amd64_rt_amd64_real binary-arch_amd64_rt_amd64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_amd64_rt_real: binary-arch_arm64:: binary-arch_arm64_none binary-arch_arm64_real binary-arch_arm64_rt binary-arch_arm64:: - $(MAKE) -f debian/rules.real install-udeb_arm64 ABINAME='4.19.0-8' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-arm64-di nic-modules-4.19.0-8-arm64-di nic-wireless-modules-4.19.0-8-arm64-di nic-shared-modules-4.19.0-8-arm64-di usb-serial-modules-4.19.0-8-arm64-di ppp-modules-4.19.0-8-arm64-di cdrom-core-modules-4.19.0-8-arm64-di scsi-core-modules-4.19.0-8-arm64-di scsi-modules-4.19.0-8-arm64-di scsi-nic-modules-4.19.0-8-arm64-di loop-modules-4.19.0-8-arm64-di btrfs-modules-4.19.0-8-arm64-di ext4-modules-4.19.0-8-arm64-di isofs-modules-4.19.0-8-arm64-di jfs-modules-4.19.0-8-arm64-di xfs-modules-4.19.0-8-arm64-di fat-modules-4.19.0-8-arm64-di md-modules-4.19.0-8-arm64-di multipath-modules-4.19.0-8-arm64-di usb-modules-4.19.0-8-arm64-di usb-storage-modules-4.19.0-8-arm64-di fb-modules-4.19.0-8-arm64-di input-modules-4.19.0-8-arm64-di event-modules-4.19.0-8-arm64-di nic-usb-modules-4.19.0-8-arm64-di sata-modules-4.19.0-8-arm64-di i2c-modules-4.19.0-8-arm64-di crc-modules-4.19.0-8-arm64-di crypto-modules-4.19.0-8-arm64-di crypto-dm-modules-4.19.0-8-arm64-di efi-modules-4.19.0-8-arm64-di ata-modules-4.19.0-8-arm64-di mmc-modules-4.19.0-8-arm64-di nbd-modules-4.19.0-8-arm64-di squashfs-modules-4.19.0-8-arm64-di uinput-modules-4.19.0-8-arm64-di compress-modules-4.19.0-8-arm64-di leds-modules-4.19.0-8-arm64-di udf-modules-4.19.0-8-arm64-di fuse-modules-4.19.0-8-arm64-di mtd-core-modules-4.19.0-8-arm64-di' UDEB_UNSIGNED_TEST_BUILD=True + $(MAKE) -f debian/rules.real install-udeb_arm64 ABINAME='4.19.0-9' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-arm64-di nic-modules-4.19.0-9-arm64-di nic-wireless-modules-4.19.0-9-arm64-di nic-shared-modules-4.19.0-9-arm64-di usb-serial-modules-4.19.0-9-arm64-di ppp-modules-4.19.0-9-arm64-di cdrom-core-modules-4.19.0-9-arm64-di scsi-core-modules-4.19.0-9-arm64-di scsi-modules-4.19.0-9-arm64-di scsi-nic-modules-4.19.0-9-arm64-di loop-modules-4.19.0-9-arm64-di btrfs-modules-4.19.0-9-arm64-di ext4-modules-4.19.0-9-arm64-di isofs-modules-4.19.0-9-arm64-di jfs-modules-4.19.0-9-arm64-di xfs-modules-4.19.0-9-arm64-di fat-modules-4.19.0-9-arm64-di md-modules-4.19.0-9-arm64-di multipath-modules-4.19.0-9-arm64-di usb-modules-4.19.0-9-arm64-di usb-storage-modules-4.19.0-9-arm64-di fb-modules-4.19.0-9-arm64-di input-modules-4.19.0-9-arm64-di event-modules-4.19.0-9-arm64-di nic-usb-modules-4.19.0-9-arm64-di sata-modules-4.19.0-9-arm64-di i2c-modules-4.19.0-9-arm64-di crc-modules-4.19.0-9-arm64-di crypto-modules-4.19.0-9-arm64-di crypto-dm-modules-4.19.0-9-arm64-di efi-modules-4.19.0-9-arm64-di ata-modules-4.19.0-9-arm64-di mmc-modules-4.19.0-9-arm64-di nbd-modules-4.19.0-9-arm64-di squashfs-modules-4.19.0-9-arm64-di uinput-modules-4.19.0-9-arm64-di compress-modules-4.19.0-9-arm64-di leds-modules-4.19.0-9-arm64-di udf-modules-4.19.0-9-arm64-di fuse-modules-4.19.0-9-arm64-di mtd-core-modules-4.19.0-9-arm64-di' UDEB_UNSIGNED_TEST_BUILD=True binary-arch_arm64:: - $(MAKE) -f debian/rules.real install-signed-template_arm64 ABINAME='4.19.0-8' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real install-signed-template_arm64 ABINAME='4.19.0-9' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_arm64_none: binary-arch_arm64_none_arm64 binary-arch_arm64_none_real binary-arch_arm64_none_arm64: binary-arch_arm64_none_arm64_real binary-arch_arm64_none_arm64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_arm64_none_real: binary-arch_arm64_real:: setup_arm64 binary-arch_arm64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_arm64_rt: binary-arch_arm64_rt_arm64 binary-arch_arm64_rt_real binary-arch_arm64_rt_arm64: binary-arch_arm64_rt_arm64_real binary-arch_arm64_rt_arm64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_arm64_rt_real: binary-arch_arm64ilp32: binary-arch_arm64ilp32_real binary-arch_arm64ilp32_real:: setup_arm64ilp32 binary-arch_arm64ilp32_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='arm64ilp32' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='arm64ilp32' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_armel:: binary-arch_armel_extra binary-arch_armel_none binary-arch_armel_real binary-arch_armel:: - $(MAKE) -f debian/rules.real install-udeb_armel ABINAME='4.19.0-8' ARCH='armel' KERNEL_ARCH='arm' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-marvell-di nic-modules-4.19.0-8-marvell-di nic-shared-modules-4.19.0-8-marvell-di usb-serial-modules-4.19.0-8-marvell-di ppp-modules-4.19.0-8-marvell-di cdrom-core-modules-4.19.0-8-marvell-di scsi-core-modules-4.19.0-8-marvell-di loop-modules-4.19.0-8-marvell-di ipv6-modules-4.19.0-8-marvell-di btrfs-modules-4.19.0-8-marvell-di ext4-modules-4.19.0-8-marvell-di isofs-modules-4.19.0-8-marvell-di jffs2-modules-4.19.0-8-marvell-di jfs-modules-4.19.0-8-marvell-di fat-modules-4.19.0-8-marvell-di minix-modules-4.19.0-8-marvell-di md-modules-4.19.0-8-marvell-di multipath-modules-4.19.0-8-marvell-di usb-modules-4.19.0-8-marvell-di usb-storage-modules-4.19.0-8-marvell-di fb-modules-4.19.0-8-marvell-di input-modules-4.19.0-8-marvell-di event-modules-4.19.0-8-marvell-di mouse-modules-4.19.0-8-marvell-di nic-usb-modules-4.19.0-8-marvell-di sata-modules-4.19.0-8-marvell-di crc-modules-4.19.0-8-marvell-di crypto-modules-4.19.0-8-marvell-di crypto-dm-modules-4.19.0-8-marvell-di mmc-core-modules-4.19.0-8-marvell-di mmc-modules-4.19.0-8-marvell-di nbd-modules-4.19.0-8-marvell-di squashfs-modules-4.19.0-8-marvell-di uinput-modules-4.19.0-8-marvell-di zlib-modules-4.19.0-8-marvell-di compress-modules-4.19.0-8-marvell-di leds-modules-4.19.0-8-marvell-di udf-modules-4.19.0-8-marvell-di fuse-modules-4.19.0-8-marvell-di mtd-modules-4.19.0-8-marvell-di mtd-core-modules-4.19.0-8-marvell-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_armel ABINAME='4.19.0-9' ARCH='armel' KERNEL_ARCH='arm' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-marvell-di nic-modules-4.19.0-9-marvell-di nic-shared-modules-4.19.0-9-marvell-di usb-serial-modules-4.19.0-9-marvell-di ppp-modules-4.19.0-9-marvell-di cdrom-core-modules-4.19.0-9-marvell-di scsi-core-modules-4.19.0-9-marvell-di loop-modules-4.19.0-9-marvell-di ipv6-modules-4.19.0-9-marvell-di btrfs-modules-4.19.0-9-marvell-di ext4-modules-4.19.0-9-marvell-di isofs-modules-4.19.0-9-marvell-di jffs2-modules-4.19.0-9-marvell-di jfs-modules-4.19.0-9-marvell-di fat-modules-4.19.0-9-marvell-di minix-modules-4.19.0-9-marvell-di md-modules-4.19.0-9-marvell-di multipath-modules-4.19.0-9-marvell-di usb-modules-4.19.0-9-marvell-di usb-storage-modules-4.19.0-9-marvell-di fb-modules-4.19.0-9-marvell-di input-modules-4.19.0-9-marvell-di event-modules-4.19.0-9-marvell-di mouse-modules-4.19.0-9-marvell-di nic-usb-modules-4.19.0-9-marvell-di sata-modules-4.19.0-9-marvell-di crc-modules-4.19.0-9-marvell-di crypto-modules-4.19.0-9-marvell-di crypto-dm-modules-4.19.0-9-marvell-di mmc-core-modules-4.19.0-9-marvell-di mmc-modules-4.19.0-9-marvell-di nbd-modules-4.19.0-9-marvell-di squashfs-modules-4.19.0-9-marvell-di uinput-modules-4.19.0-9-marvell-di zlib-modules-4.19.0-9-marvell-di compress-modules-4.19.0-9-marvell-di leds-modules-4.19.0-9-marvell-di udf-modules-4.19.0-9-marvell-di fuse-modules-4.19.0-9-marvell-di mtd-modules-4.19.0-9-marvell-di mtd-core-modules-4.19.0-9-marvell-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_armel_extra:: $(MAKE) -f debian/rules.real install-dummy ARCH='armel' DH_OPTIONS='-plinux-compiler-gcc-8-arm' binary-arch_armel_none: binary-arch_armel_none_marvell binary-arch_armel_none_real binary-arch_armel_none_rpi binary-arch_armel_none_marvell: binary-arch_armel_none_marvell_real binary-arch_armel_none_marvell_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_armel_none_real: binary-arch_armel_none_rpi: binary-arch_armel_none_rpi_real binary-arch_armel_none_rpi_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_armel_real:: setup_armel binary-arch_armel_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='armel' KERNEL_ARCH='arm' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='armel' KERNEL_ARCH='arm' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_armhf:: binary-arch_armhf_extra binary-arch_armhf_none binary-arch_armhf_real binary-arch_armhf_rt binary-arch_armhf:: - $(MAKE) -f debian/rules.real install-udeb_armhf ABINAME='4.19.0-8' ARCH='armhf' KERNEL_ARCH='arm' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-armmp-di nic-modules-4.19.0-8-armmp-di nic-wireless-modules-4.19.0-8-armmp-di nic-shared-modules-4.19.0-8-armmp-di usb-serial-modules-4.19.0-8-armmp-di ppp-modules-4.19.0-8-armmp-di pata-modules-4.19.0-8-armmp-di cdrom-core-modules-4.19.0-8-armmp-di scsi-core-modules-4.19.0-8-armmp-di scsi-modules-4.19.0-8-armmp-di scsi-nic-modules-4.19.0-8-armmp-di loop-modules-4.19.0-8-armmp-di btrfs-modules-4.19.0-8-armmp-di ext4-modules-4.19.0-8-armmp-di isofs-modules-4.19.0-8-armmp-di jfs-modules-4.19.0-8-armmp-di fat-modules-4.19.0-8-armmp-di md-modules-4.19.0-8-armmp-di multipath-modules-4.19.0-8-armmp-di usb-modules-4.19.0-8-armmp-di usb-storage-modules-4.19.0-8-armmp-di fb-modules-4.19.0-8-armmp-di input-modules-4.19.0-8-armmp-di event-modules-4.19.0-8-armmp-di nic-usb-modules-4.19.0-8-armmp-di sata-modules-4.19.0-8-armmp-di i2c-modules-4.19.0-8-armmp-di crc-modules-4.19.0-8-armmp-di crypto-modules-4.19.0-8-armmp-di crypto-dm-modules-4.19.0-8-armmp-di efi-modules-4.19.0-8-armmp-di ata-modules-4.19.0-8-armmp-di mmc-modules-4.19.0-8-armmp-di nbd-modules-4.19.0-8-armmp-di squashfs-modules-4.19.0-8-armmp-di uinput-modules-4.19.0-8-armmp-di zlib-modules-4.19.0-8-armmp-di compress-modules-4.19.0-8-armmp-di leds-modules-4.19.0-8-armmp-di udf-modules-4.19.0-8-armmp-di fuse-modules-4.19.0-8-armmp-di mtd-modules-4.19.0-8-armmp-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_armhf ABINAME='4.19.0-9' ARCH='armhf' KERNEL_ARCH='arm' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-armmp-di nic-modules-4.19.0-9-armmp-di nic-wireless-modules-4.19.0-9-armmp-di nic-shared-modules-4.19.0-9-armmp-di usb-serial-modules-4.19.0-9-armmp-di ppp-modules-4.19.0-9-armmp-di pata-modules-4.19.0-9-armmp-di cdrom-core-modules-4.19.0-9-armmp-di scsi-core-modules-4.19.0-9-armmp-di scsi-modules-4.19.0-9-armmp-di scsi-nic-modules-4.19.0-9-armmp-di loop-modules-4.19.0-9-armmp-di btrfs-modules-4.19.0-9-armmp-di ext4-modules-4.19.0-9-armmp-di isofs-modules-4.19.0-9-armmp-di jfs-modules-4.19.0-9-armmp-di fat-modules-4.19.0-9-armmp-di md-modules-4.19.0-9-armmp-di multipath-modules-4.19.0-9-armmp-di usb-modules-4.19.0-9-armmp-di usb-storage-modules-4.19.0-9-armmp-di fb-modules-4.19.0-9-armmp-di input-modules-4.19.0-9-armmp-di event-modules-4.19.0-9-armmp-di nic-usb-modules-4.19.0-9-armmp-di sata-modules-4.19.0-9-armmp-di i2c-modules-4.19.0-9-armmp-di crc-modules-4.19.0-9-armmp-di crypto-modules-4.19.0-9-armmp-di crypto-dm-modules-4.19.0-9-armmp-di efi-modules-4.19.0-9-armmp-di ata-modules-4.19.0-9-armmp-di mmc-modules-4.19.0-9-armmp-di nbd-modules-4.19.0-9-armmp-di squashfs-modules-4.19.0-9-armmp-di uinput-modules-4.19.0-9-armmp-di zlib-modules-4.19.0-9-armmp-di compress-modules-4.19.0-9-armmp-di leds-modules-4.19.0-9-armmp-di udf-modules-4.19.0-9-armmp-di fuse-modules-4.19.0-9-armmp-di mtd-modules-4.19.0-9-armmp-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_armhf_extra:: $(MAKE) -f debian/rules.real install-dummy ARCH='armhf' DH_OPTIONS='-plinux-compiler-gcc-8-arm' binary-arch_armhf_none: binary-arch_armhf_none_armmp binary-arch_armhf_none_armmp-lpae binary-arch_armhf_none_real binary-arch_armhf_none_armmp: binary-arch_armhf_none_armmp_real binary-arch_armhf_none_armmp-lpae: binary-arch_armhf_none_armmp-lpae_real binary-arch_armhf_none_armmp-lpae_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_armhf_none_armmp_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_armhf_none_real: binary-arch_armhf_real:: setup_armhf binary-arch_armhf_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='armhf' KERNEL_ARCH='arm' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='armhf' KERNEL_ARCH='arm' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_armhf_rt: binary-arch_armhf_rt_armmp binary-arch_armhf_rt_real binary-arch_armhf_rt_armmp: binary-arch_armhf_rt_armmp_real binary-arch_armhf_rt_armmp_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_armhf_rt_real: binary-arch_hppa:: binary-arch_hppa_none binary-arch_hppa_real binary-arch_hppa:: - $(MAKE) -f debian/rules.real install-udeb_hppa ABINAME='4.19.0-8' ARCH='hppa' KERNEL_ARCH='parisc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-parisc-di nic-modules-4.19.0-8-parisc-di nic-shared-modules-4.19.0-8-parisc-di serial-modules-4.19.0-8-parisc-di usb-serial-modules-4.19.0-8-parisc-di ppp-modules-4.19.0-8-parisc-di pata-modules-4.19.0-8-parisc-di cdrom-core-modules-4.19.0-8-parisc-di scsi-core-modules-4.19.0-8-parisc-di scsi-modules-4.19.0-8-parisc-di loop-modules-4.19.0-8-parisc-di btrfs-modules-4.19.0-8-parisc-di ext4-modules-4.19.0-8-parisc-di isofs-modules-4.19.0-8-parisc-di jfs-modules-4.19.0-8-parisc-di xfs-modules-4.19.0-8-parisc-di fat-modules-4.19.0-8-parisc-di md-modules-4.19.0-8-parisc-di multipath-modules-4.19.0-8-parisc-di usb-modules-4.19.0-8-parisc-di usb-storage-modules-4.19.0-8-parisc-di input-modules-4.19.0-8-parisc-di event-modules-4.19.0-8-parisc-di mouse-modules-4.19.0-8-parisc-di nic-usb-modules-4.19.0-8-parisc-di sata-modules-4.19.0-8-parisc-di crc-modules-4.19.0-8-parisc-di crypto-modules-4.19.0-8-parisc-di crypto-dm-modules-4.19.0-8-parisc-di ata-modules-4.19.0-8-parisc-di nbd-modules-4.19.0-8-parisc-di squashfs-modules-4.19.0-8-parisc-di zlib-modules-4.19.0-8-parisc-di compress-modules-4.19.0-8-parisc-di fuse-modules-4.19.0-8-parisc-di kernel-image-4.19.0-8-parisc64-smp-di nic-modules-4.19.0-8-parisc64-smp-di nic-shared-modules-4.19.0-8-parisc64-smp-di serial-modules-4.19.0-8-parisc64-smp-di usb-serial-modules-4.19.0-8-parisc64-smp-di ppp-modules-4.19.0-8-parisc64-smp-di pata-modules-4.19.0-8-parisc64-smp-di cdrom-core-modules-4.19.0-8-parisc64-smp-di scsi-core-modules-4.19.0-8-parisc64-smp-di scsi-modules-4.19.0-8-parisc64-smp-di loop-modules-4.19.0-8-parisc64-smp-di btrfs-modules-4.19.0-8-parisc64-smp-di ext4-modules-4.19.0-8-parisc64-smp-di isofs-modules-4.19.0-8-parisc64-smp-di jfs-modules-4.19.0-8-parisc64-smp-di xfs-modules-4.19.0-8-parisc64-smp-di fat-modules-4.19.0-8-parisc64-smp-di md-modules-4.19.0-8-parisc64-smp-di multipath-modules-4.19.0-8-parisc64-smp-di usb-modules-4.19.0-8-parisc64-smp-di usb-storage-modules-4.19.0-8-parisc64-smp-di fb-modules-4.19.0-8-parisc64-smp-di input-modules-4.19.0-8-parisc64-smp-di event-modules-4.19.0-8-parisc64-smp-di mouse-modules-4.19.0-8-parisc64-smp-di nic-usb-modules-4.19.0-8-parisc64-smp-di sata-modules-4.19.0-8-parisc64-smp-di crc-modules-4.19.0-8-parisc64-smp-di crypto-modules-4.19.0-8-parisc64-smp-di crypto-dm-modules-4.19.0-8-parisc64-smp-di ata-modules-4.19.0-8-parisc64-smp-di nbd-modules-4.19.0-8-parisc64-smp-di squashfs-modules-4.19.0-8-parisc64-smp-di zlib-modules-4.19.0-8-parisc64-smp-di compress-modules-4.19.0-8-parisc64-smp-di fuse-modules-4.19.0-8-parisc64-smp-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_hppa ABINAME='4.19.0-9' ARCH='hppa' KERNEL_ARCH='parisc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-parisc-di nic-modules-4.19.0-9-parisc-di nic-shared-modules-4.19.0-9-parisc-di serial-modules-4.19.0-9-parisc-di usb-serial-modules-4.19.0-9-parisc-di ppp-modules-4.19.0-9-parisc-di pata-modules-4.19.0-9-parisc-di cdrom-core-modules-4.19.0-9-parisc-di scsi-core-modules-4.19.0-9-parisc-di scsi-modules-4.19.0-9-parisc-di loop-modules-4.19.0-9-parisc-di btrfs-modules-4.19.0-9-parisc-di ext4-modules-4.19.0-9-parisc-di isofs-modules-4.19.0-9-parisc-di jfs-modules-4.19.0-9-parisc-di xfs-modules-4.19.0-9-parisc-di fat-modules-4.19.0-9-parisc-di md-modules-4.19.0-9-parisc-di multipath-modules-4.19.0-9-parisc-di usb-modules-4.19.0-9-parisc-di usb-storage-modules-4.19.0-9-parisc-di input-modules-4.19.0-9-parisc-di event-modules-4.19.0-9-parisc-di mouse-modules-4.19.0-9-parisc-di nic-usb-modules-4.19.0-9-parisc-di sata-modules-4.19.0-9-parisc-di crc-modules-4.19.0-9-parisc-di crypto-modules-4.19.0-9-parisc-di crypto-dm-modules-4.19.0-9-parisc-di ata-modules-4.19.0-9-parisc-di nbd-modules-4.19.0-9-parisc-di squashfs-modules-4.19.0-9-parisc-di zlib-modules-4.19.0-9-parisc-di compress-modules-4.19.0-9-parisc-di fuse-modules-4.19.0-9-parisc-di kernel-image-4.19.0-9-parisc64-smp-di nic-modules-4.19.0-9-parisc64-smp-di nic-shared-modules-4.19.0-9-parisc64-smp-di serial-modules-4.19.0-9-parisc64-smp-di usb-serial-modules-4.19.0-9-parisc64-smp-di ppp-modules-4.19.0-9-parisc64-smp-di pata-modules-4.19.0-9-parisc64-smp-di cdrom-core-modules-4.19.0-9-parisc64-smp-di scsi-core-modules-4.19.0-9-parisc64-smp-di scsi-modules-4.19.0-9-parisc64-smp-di loop-modules-4.19.0-9-parisc64-smp-di btrfs-modules-4.19.0-9-parisc64-smp-di ext4-modules-4.19.0-9-parisc64-smp-di isofs-modules-4.19.0-9-parisc64-smp-di jfs-modules-4.19.0-9-parisc64-smp-di xfs-modules-4.19.0-9-parisc64-smp-di fat-modules-4.19.0-9-parisc64-smp-di md-modules-4.19.0-9-parisc64-smp-di multipath-modules-4.19.0-9-parisc64-smp-di usb-modules-4.19.0-9-parisc64-smp-di usb-storage-modules-4.19.0-9-parisc64-smp-di fb-modules-4.19.0-9-parisc64-smp-di input-modules-4.19.0-9-parisc64-smp-di event-modules-4.19.0-9-parisc64-smp-di mouse-modules-4.19.0-9-parisc64-smp-di nic-usb-modules-4.19.0-9-parisc64-smp-di sata-modules-4.19.0-9-parisc64-smp-di crc-modules-4.19.0-9-parisc64-smp-di crypto-modules-4.19.0-9-parisc64-smp-di crypto-dm-modules-4.19.0-9-parisc64-smp-di ata-modules-4.19.0-9-parisc64-smp-di nbd-modules-4.19.0-9-parisc64-smp-di squashfs-modules-4.19.0-9-parisc64-smp-di zlib-modules-4.19.0-9-parisc64-smp-di compress-modules-4.19.0-9-parisc64-smp-di fuse-modules-4.19.0-9-parisc64-smp-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_hppa_none: binary-arch_hppa_none_parisc binary-arch_hppa_none_parisc-smp binary-arch_hppa_none_parisc64-smp binary-arch_hppa_none_real binary-arch_hppa_none_parisc: binary-arch_hppa_none_parisc_real binary-arch_hppa_none_parisc-smp: binary-arch_hppa_none_parisc-smp_real binary-arch_hppa_none_parisc-smp_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_hppa_none_parisc64-smp: binary-arch_hppa_none_parisc64-smp_real binary-arch_hppa_none_parisc64-smp_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_hppa_none_parisc_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_hppa_none_real: binary-arch_hppa_real:: setup_hppa binary-arch_hppa_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='hppa' KERNEL_ARCH='parisc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='hppa' KERNEL_ARCH='parisc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_i386:: binary-arch_i386_extra binary-arch_i386_none binary-arch_i386_real binary-arch_i386_rt binary-arch_i386:: - $(MAKE) -f debian/rules.real install-udeb_i386 ABINAME='4.19.0-8' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-686-di nic-modules-4.19.0-8-686-di nic-wireless-modules-4.19.0-8-686-di nic-shared-modules-4.19.0-8-686-di serial-modules-4.19.0-8-686-di usb-serial-modules-4.19.0-8-686-di ppp-modules-4.19.0-8-686-di pata-modules-4.19.0-8-686-di cdrom-core-modules-4.19.0-8-686-di firewire-core-modules-4.19.0-8-686-di scsi-core-modules-4.19.0-8-686-di scsi-modules-4.19.0-8-686-di scsi-nic-modules-4.19.0-8-686-di loop-modules-4.19.0-8-686-di btrfs-modules-4.19.0-8-686-di ext4-modules-4.19.0-8-686-di isofs-modules-4.19.0-8-686-di jfs-modules-4.19.0-8-686-di xfs-modules-4.19.0-8-686-di fat-modules-4.19.0-8-686-di md-modules-4.19.0-8-686-di multipath-modules-4.19.0-8-686-di usb-modules-4.19.0-8-686-di usb-storage-modules-4.19.0-8-686-di pcmcia-storage-modules-4.19.0-8-686-di fb-modules-4.19.0-8-686-di input-modules-4.19.0-8-686-di event-modules-4.19.0-8-686-di mouse-modules-4.19.0-8-686-di nic-pcmcia-modules-4.19.0-8-686-di pcmcia-modules-4.19.0-8-686-di nic-usb-modules-4.19.0-8-686-di sata-modules-4.19.0-8-686-di acpi-modules-4.19.0-8-686-di i2c-modules-4.19.0-8-686-di crc-modules-4.19.0-8-686-di crypto-modules-4.19.0-8-686-di crypto-dm-modules-4.19.0-8-686-di efi-modules-4.19.0-8-686-di ata-modules-4.19.0-8-686-di mmc-core-modules-4.19.0-8-686-di mmc-modules-4.19.0-8-686-di nbd-modules-4.19.0-8-686-di squashfs-modules-4.19.0-8-686-di speakup-modules-4.19.0-8-686-di uinput-modules-4.19.0-8-686-di sound-modules-4.19.0-8-686-di compress-modules-4.19.0-8-686-di udf-modules-4.19.0-8-686-di fuse-modules-4.19.0-8-686-di mtd-core-modules-4.19.0-8-686-di kernel-image-4.19.0-8-686-pae-di nic-modules-4.19.0-8-686-pae-di nic-wireless-modules-4.19.0-8-686-pae-di nic-shared-modules-4.19.0-8-686-pae-di serial-modules-4.19.0-8-686-pae-di usb-serial-modules-4.19.0-8-686-pae-di ppp-modules-4.19.0-8-686-pae-di pata-modules-4.19.0-8-686-pae-di cdrom-core-modules-4.19.0-8-686-pae-di firewire-core-modules-4.19.0-8-686-pae-di scsi-core-modules-4.19.0-8-686-pae-di scsi-modules-4.19.0-8-686-pae-di scsi-nic-modules-4.19.0-8-686-pae-di loop-modules-4.19.0-8-686-pae-di btrfs-modules-4.19.0-8-686-pae-di ext4-modules-4.19.0-8-686-pae-di isofs-modules-4.19.0-8-686-pae-di jfs-modules-4.19.0-8-686-pae-di xfs-modules-4.19.0-8-686-pae-di fat-modules-4.19.0-8-686-pae-di md-modules-4.19.0-8-686-pae-di multipath-modules-4.19.0-8-686-pae-di usb-modules-4.19.0-8-686-pae-di usb-storage-modules-4.19.0-8-686-pae-di pcmcia-storage-modules-4.19.0-8-686-pae-di fb-modules-4.19.0-8-686-pae-di input-modules-4.19.0-8-686-pae-di event-modules-4.19.0-8-686-pae-di mouse-modules-4.19.0-8-686-pae-di nic-pcmcia-modules-4.19.0-8-686-pae-di pcmcia-modules-4.19.0-8-686-pae-di nic-usb-modules-4.19.0-8-686-pae-di sata-modules-4.19.0-8-686-pae-di acpi-modules-4.19.0-8-686-pae-di i2c-modules-4.19.0-8-686-pae-di crc-modules-4.19.0-8-686-pae-di crypto-modules-4.19.0-8-686-pae-di crypto-dm-modules-4.19.0-8-686-pae-di efi-modules-4.19.0-8-686-pae-di ata-modules-4.19.0-8-686-pae-di mmc-core-modules-4.19.0-8-686-pae-di mmc-modules-4.19.0-8-686-pae-di nbd-modules-4.19.0-8-686-pae-di squashfs-modules-4.19.0-8-686-pae-di speakup-modules-4.19.0-8-686-pae-di uinput-modules-4.19.0-8-686-pae-di sound-modules-4.19.0-8-686-pae-di compress-modules-4.19.0-8-686-pae-di udf-modules-4.19.0-8-686-pae-di fuse-modules-4.19.0-8-686-pae-di mtd-core-modules-4.19.0-8-686-pae-di' UDEB_UNSIGNED_TEST_BUILD=True + $(MAKE) -f debian/rules.real install-udeb_i386 ABINAME='4.19.0-9' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-686-di nic-modules-4.19.0-9-686-di nic-wireless-modules-4.19.0-9-686-di nic-shared-modules-4.19.0-9-686-di serial-modules-4.19.0-9-686-di usb-serial-modules-4.19.0-9-686-di ppp-modules-4.19.0-9-686-di pata-modules-4.19.0-9-686-di cdrom-core-modules-4.19.0-9-686-di firewire-core-modules-4.19.0-9-686-di scsi-core-modules-4.19.0-9-686-di scsi-modules-4.19.0-9-686-di scsi-nic-modules-4.19.0-9-686-di loop-modules-4.19.0-9-686-di btrfs-modules-4.19.0-9-686-di ext4-modules-4.19.0-9-686-di isofs-modules-4.19.0-9-686-di jfs-modules-4.19.0-9-686-di xfs-modules-4.19.0-9-686-di fat-modules-4.19.0-9-686-di md-modules-4.19.0-9-686-di multipath-modules-4.19.0-9-686-di usb-modules-4.19.0-9-686-di usb-storage-modules-4.19.0-9-686-di pcmcia-storage-modules-4.19.0-9-686-di fb-modules-4.19.0-9-686-di input-modules-4.19.0-9-686-di event-modules-4.19.0-9-686-di mouse-modules-4.19.0-9-686-di nic-pcmcia-modules-4.19.0-9-686-di pcmcia-modules-4.19.0-9-686-di nic-usb-modules-4.19.0-9-686-di sata-modules-4.19.0-9-686-di acpi-modules-4.19.0-9-686-di i2c-modules-4.19.0-9-686-di crc-modules-4.19.0-9-686-di crypto-modules-4.19.0-9-686-di crypto-dm-modules-4.19.0-9-686-di efi-modules-4.19.0-9-686-di ata-modules-4.19.0-9-686-di mmc-core-modules-4.19.0-9-686-di mmc-modules-4.19.0-9-686-di nbd-modules-4.19.0-9-686-di squashfs-modules-4.19.0-9-686-di speakup-modules-4.19.0-9-686-di uinput-modules-4.19.0-9-686-di sound-modules-4.19.0-9-686-di compress-modules-4.19.0-9-686-di udf-modules-4.19.0-9-686-di fuse-modules-4.19.0-9-686-di mtd-core-modules-4.19.0-9-686-di kernel-image-4.19.0-9-686-pae-di nic-modules-4.19.0-9-686-pae-di nic-wireless-modules-4.19.0-9-686-pae-di nic-shared-modules-4.19.0-9-686-pae-di serial-modules-4.19.0-9-686-pae-di usb-serial-modules-4.19.0-9-686-pae-di ppp-modules-4.19.0-9-686-pae-di pata-modules-4.19.0-9-686-pae-di cdrom-core-modules-4.19.0-9-686-pae-di firewire-core-modules-4.19.0-9-686-pae-di scsi-core-modules-4.19.0-9-686-pae-di scsi-modules-4.19.0-9-686-pae-di scsi-nic-modules-4.19.0-9-686-pae-di loop-modules-4.19.0-9-686-pae-di btrfs-modules-4.19.0-9-686-pae-di ext4-modules-4.19.0-9-686-pae-di isofs-modules-4.19.0-9-686-pae-di jfs-modules-4.19.0-9-686-pae-di xfs-modules-4.19.0-9-686-pae-di fat-modules-4.19.0-9-686-pae-di md-modules-4.19.0-9-686-pae-di multipath-modules-4.19.0-9-686-pae-di usb-modules-4.19.0-9-686-pae-di usb-storage-modules-4.19.0-9-686-pae-di pcmcia-storage-modules-4.19.0-9-686-pae-di fb-modules-4.19.0-9-686-pae-di input-modules-4.19.0-9-686-pae-di event-modules-4.19.0-9-686-pae-di mouse-modules-4.19.0-9-686-pae-di nic-pcmcia-modules-4.19.0-9-686-pae-di pcmcia-modules-4.19.0-9-686-pae-di nic-usb-modules-4.19.0-9-686-pae-di sata-modules-4.19.0-9-686-pae-di acpi-modules-4.19.0-9-686-pae-di i2c-modules-4.19.0-9-686-pae-di crc-modules-4.19.0-9-686-pae-di crypto-modules-4.19.0-9-686-pae-di crypto-dm-modules-4.19.0-9-686-pae-di efi-modules-4.19.0-9-686-pae-di ata-modules-4.19.0-9-686-pae-di mmc-core-modules-4.19.0-9-686-pae-di mmc-modules-4.19.0-9-686-pae-di nbd-modules-4.19.0-9-686-pae-di squashfs-modules-4.19.0-9-686-pae-di speakup-modules-4.19.0-9-686-pae-di uinput-modules-4.19.0-9-686-pae-di sound-modules-4.19.0-9-686-pae-di compress-modules-4.19.0-9-686-pae-di udf-modules-4.19.0-9-686-pae-di fuse-modules-4.19.0-9-686-pae-di mtd-core-modules-4.19.0-9-686-pae-di' UDEB_UNSIGNED_TEST_BUILD=True binary-arch_i386:: - $(MAKE) -f debian/rules.real install-signed-template_i386 ABINAME='4.19.0-8' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real install-signed-template_i386 ABINAME='4.19.0-9' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_i386_extra:: $(MAKE) -f debian/rules.real install-dummy ARCH='i386' DH_OPTIONS='-plinux-compiler-gcc-8-x86' binary-arch_i386_none: binary-arch_i386_none_686 binary-arch_i386_none_686-pae binary-arch_i386_none_real binary-arch_i386_none_686: binary-arch_i386_none_686_real binary-arch_i386_none_686-pae: binary-arch_i386_none_686-pae_real binary-arch_i386_none_686-pae_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_i386_none_686_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_i386_none_real: binary-arch_i386_real:: setup_i386 binary-arch_i386_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_i386_rt: binary-arch_i386_rt_686-pae binary-arch_i386_rt_real binary-arch_i386_rt_686-pae: binary-arch_i386_rt_686-pae_real binary-arch_i386_rt_686-pae_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_i386_rt_real: binary-arch_ia64:: binary-arch_ia64_none binary-arch_ia64_real binary-arch_ia64:: - $(MAKE) -f debian/rules.real install-udeb_ia64 ABINAME='4.19.0-8' ARCH='ia64' KERNEL_ARCH='ia64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-itanium-di nic-modules-4.19.0-8-itanium-di nic-shared-modules-4.19.0-8-itanium-di serial-modules-4.19.0-8-itanium-di usb-serial-modules-4.19.0-8-itanium-di ppp-modules-4.19.0-8-itanium-di pata-modules-4.19.0-8-itanium-di cdrom-core-modules-4.19.0-8-itanium-di firewire-core-modules-4.19.0-8-itanium-di scsi-core-modules-4.19.0-8-itanium-di scsi-modules-4.19.0-8-itanium-di scsi-nic-modules-4.19.0-8-itanium-di loop-modules-4.19.0-8-itanium-di btrfs-modules-4.19.0-8-itanium-di ext4-modules-4.19.0-8-itanium-di isofs-modules-4.19.0-8-itanium-di jfs-modules-4.19.0-8-itanium-di xfs-modules-4.19.0-8-itanium-di fat-modules-4.19.0-8-itanium-di md-modules-4.19.0-8-itanium-di multipath-modules-4.19.0-8-itanium-di usb-modules-4.19.0-8-itanium-di usb-storage-modules-4.19.0-8-itanium-di fb-modules-4.19.0-8-itanium-di input-modules-4.19.0-8-itanium-di event-modules-4.19.0-8-itanium-di mouse-modules-4.19.0-8-itanium-di pcmcia-modules-4.19.0-8-itanium-di nic-usb-modules-4.19.0-8-itanium-di sata-modules-4.19.0-8-itanium-di i2c-modules-4.19.0-8-itanium-di crc-modules-4.19.0-8-itanium-di crypto-modules-4.19.0-8-itanium-di crypto-dm-modules-4.19.0-8-itanium-di ata-modules-4.19.0-8-itanium-di nbd-modules-4.19.0-8-itanium-di squashfs-modules-4.19.0-8-itanium-di uinput-modules-4.19.0-8-itanium-di compress-modules-4.19.0-8-itanium-di udf-modules-4.19.0-8-itanium-di fuse-modules-4.19.0-8-itanium-di mtd-core-modules-4.19.0-8-itanium-di ide-core-modules-4.19.0-8-itanium-di ide-modules-4.19.0-8-itanium-di sn-modules-4.19.0-8-itanium-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_ia64 ABINAME='4.19.0-9' ARCH='ia64' KERNEL_ARCH='ia64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-itanium-di nic-modules-4.19.0-9-itanium-di nic-shared-modules-4.19.0-9-itanium-di serial-modules-4.19.0-9-itanium-di usb-serial-modules-4.19.0-9-itanium-di ppp-modules-4.19.0-9-itanium-di pata-modules-4.19.0-9-itanium-di cdrom-core-modules-4.19.0-9-itanium-di firewire-core-modules-4.19.0-9-itanium-di scsi-core-modules-4.19.0-9-itanium-di scsi-modules-4.19.0-9-itanium-di scsi-nic-modules-4.19.0-9-itanium-di loop-modules-4.19.0-9-itanium-di btrfs-modules-4.19.0-9-itanium-di ext4-modules-4.19.0-9-itanium-di isofs-modules-4.19.0-9-itanium-di jfs-modules-4.19.0-9-itanium-di xfs-modules-4.19.0-9-itanium-di fat-modules-4.19.0-9-itanium-di md-modules-4.19.0-9-itanium-di multipath-modules-4.19.0-9-itanium-di usb-modules-4.19.0-9-itanium-di usb-storage-modules-4.19.0-9-itanium-di fb-modules-4.19.0-9-itanium-di input-modules-4.19.0-9-itanium-di event-modules-4.19.0-9-itanium-di mouse-modules-4.19.0-9-itanium-di pcmcia-modules-4.19.0-9-itanium-di nic-usb-modules-4.19.0-9-itanium-di sata-modules-4.19.0-9-itanium-di i2c-modules-4.19.0-9-itanium-di crc-modules-4.19.0-9-itanium-di crypto-modules-4.19.0-9-itanium-di crypto-dm-modules-4.19.0-9-itanium-di ata-modules-4.19.0-9-itanium-di nbd-modules-4.19.0-9-itanium-di squashfs-modules-4.19.0-9-itanium-di uinput-modules-4.19.0-9-itanium-di compress-modules-4.19.0-9-itanium-di udf-modules-4.19.0-9-itanium-di fuse-modules-4.19.0-9-itanium-di mtd-core-modules-4.19.0-9-itanium-di ide-core-modules-4.19.0-9-itanium-di ide-modules-4.19.0-9-itanium-di sn-modules-4.19.0-9-itanium-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_ia64_none: binary-arch_ia64_none_itanium binary-arch_ia64_none_mckinley binary-arch_ia64_none_real binary-arch_ia64_none_itanium: binary-arch_ia64_none_itanium_real binary-arch_ia64_none_itanium_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_ia64_none_mckinley: binary-arch_ia64_none_mckinley_real binary-arch_ia64_none_mckinley_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_ia64_none_real: binary-arch_ia64_real:: setup_ia64 binary-arch_ia64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='ia64' KERNEL_ARCH='ia64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='ia64' KERNEL_ARCH='ia64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_m68k:: binary-arch_m68k_none binary-arch_m68k_real binary-arch_m68k:: - $(MAKE) -f debian/rules.real install-udeb_m68k ABINAME='4.19.0-8' ARCH='m68k' KERNEL_ARCH='m68k' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-m68k-di nic-modules-4.19.0-8-m68k-di nic-shared-modules-4.19.0-8-m68k-di ppp-modules-4.19.0-8-m68k-di pata-modules-4.19.0-8-m68k-di cdrom-core-modules-4.19.0-8-m68k-di scsi-core-modules-4.19.0-8-m68k-di scsi-modules-4.19.0-8-m68k-di loop-modules-4.19.0-8-m68k-di btrfs-modules-4.19.0-8-m68k-di ext4-modules-4.19.0-8-m68k-di isofs-modules-4.19.0-8-m68k-di fat-modules-4.19.0-8-m68k-di hfs-modules-4.19.0-8-m68k-di affs-modules-4.19.0-8-m68k-di md-modules-4.19.0-8-m68k-di crc-modules-4.19.0-8-m68k-di crypto-modules-4.19.0-8-m68k-di ata-modules-4.19.0-8-m68k-di nbd-modules-4.19.0-8-m68k-di squashfs-modules-4.19.0-8-m68k-di zlib-modules-4.19.0-8-m68k-di compress-modules-4.19.0-8-m68k-di udf-modules-4.19.0-8-m68k-di fuse-modules-4.19.0-8-m68k-di ide-core-modules-4.19.0-8-m68k-di ide-modules-4.19.0-8-m68k-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_m68k ABINAME='4.19.0-9' ARCH='m68k' KERNEL_ARCH='m68k' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-m68k-di nic-modules-4.19.0-9-m68k-di nic-shared-modules-4.19.0-9-m68k-di ppp-modules-4.19.0-9-m68k-di pata-modules-4.19.0-9-m68k-di cdrom-core-modules-4.19.0-9-m68k-di scsi-core-modules-4.19.0-9-m68k-di scsi-modules-4.19.0-9-m68k-di loop-modules-4.19.0-9-m68k-di btrfs-modules-4.19.0-9-m68k-di ext4-modules-4.19.0-9-m68k-di isofs-modules-4.19.0-9-m68k-di fat-modules-4.19.0-9-m68k-di hfs-modules-4.19.0-9-m68k-di affs-modules-4.19.0-9-m68k-di md-modules-4.19.0-9-m68k-di crc-modules-4.19.0-9-m68k-di crypto-modules-4.19.0-9-m68k-di ata-modules-4.19.0-9-m68k-di nbd-modules-4.19.0-9-m68k-di squashfs-modules-4.19.0-9-m68k-di zlib-modules-4.19.0-9-m68k-di compress-modules-4.19.0-9-m68k-di udf-modules-4.19.0-9-m68k-di fuse-modules-4.19.0-9-m68k-di ide-core-modules-4.19.0-9-m68k-di ide-modules-4.19.0-9-m68k-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_m68k_none: binary-arch_m68k_none_m68k binary-arch_m68k_none_real binary-arch_m68k_none_m68k: binary-arch_m68k_none_m68k_real binary-arch_m68k_none_m68k_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_m68k_none_real: binary-arch_m68k_real:: setup_m68k binary-arch_m68k_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='m68k' KERNEL_ARCH='m68k' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='m68k' KERNEL_ARCH='m68k' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips:: binary-arch_mips_none binary-arch_mips_real binary-arch_mips:: - $(MAKE) -f debian/rules.real install-udeb_mips ABINAME='4.19.0-8' ARCH='mips' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-4kc-malta-di nic-modules-4.19.0-8-4kc-malta-di nic-wireless-modules-4.19.0-8-4kc-malta-di nic-shared-modules-4.19.0-8-4kc-malta-di usb-serial-modules-4.19.0-8-4kc-malta-di ppp-modules-4.19.0-8-4kc-malta-di pata-modules-4.19.0-8-4kc-malta-di cdrom-core-modules-4.19.0-8-4kc-malta-di scsi-core-modules-4.19.0-8-4kc-malta-di scsi-modules-4.19.0-8-4kc-malta-di scsi-nic-modules-4.19.0-8-4kc-malta-di loop-modules-4.19.0-8-4kc-malta-di btrfs-modules-4.19.0-8-4kc-malta-di ext4-modules-4.19.0-8-4kc-malta-di isofs-modules-4.19.0-8-4kc-malta-di jfs-modules-4.19.0-8-4kc-malta-di xfs-modules-4.19.0-8-4kc-malta-di fat-modules-4.19.0-8-4kc-malta-di hfs-modules-4.19.0-8-4kc-malta-di affs-modules-4.19.0-8-4kc-malta-di minix-modules-4.19.0-8-4kc-malta-di md-modules-4.19.0-8-4kc-malta-di multipath-modules-4.19.0-8-4kc-malta-di usb-modules-4.19.0-8-4kc-malta-di usb-storage-modules-4.19.0-8-4kc-malta-di fb-modules-4.19.0-8-4kc-malta-di input-modules-4.19.0-8-4kc-malta-di event-modules-4.19.0-8-4kc-malta-di mouse-modules-4.19.0-8-4kc-malta-di nic-usb-modules-4.19.0-8-4kc-malta-di sata-modules-4.19.0-8-4kc-malta-di i2c-modules-4.19.0-8-4kc-malta-di crc-modules-4.19.0-8-4kc-malta-di crypto-modules-4.19.0-8-4kc-malta-di crypto-dm-modules-4.19.0-8-4kc-malta-di ata-modules-4.19.0-8-4kc-malta-di mmc-core-modules-4.19.0-8-4kc-malta-di mmc-modules-4.19.0-8-4kc-malta-di nbd-modules-4.19.0-8-4kc-malta-di squashfs-modules-4.19.0-8-4kc-malta-di sound-modules-4.19.0-8-4kc-malta-di zlib-modules-4.19.0-8-4kc-malta-di compress-modules-4.19.0-8-4kc-malta-di udf-modules-4.19.0-8-4kc-malta-di fuse-modules-4.19.0-8-4kc-malta-di mtd-core-modules-4.19.0-8-4kc-malta-di kernel-image-4.19.0-8-octeon-di nic-modules-4.19.0-8-octeon-di nic-wireless-modules-4.19.0-8-octeon-di nic-shared-modules-4.19.0-8-octeon-di usb-serial-modules-4.19.0-8-octeon-di ppp-modules-4.19.0-8-octeon-di pata-modules-4.19.0-8-octeon-di cdrom-core-modules-4.19.0-8-octeon-di scsi-core-modules-4.19.0-8-octeon-di scsi-modules-4.19.0-8-octeon-di scsi-nic-modules-4.19.0-8-octeon-di loop-modules-4.19.0-8-octeon-di btrfs-modules-4.19.0-8-octeon-di ext4-modules-4.19.0-8-octeon-di isofs-modules-4.19.0-8-octeon-di jfs-modules-4.19.0-8-octeon-di xfs-modules-4.19.0-8-octeon-di fat-modules-4.19.0-8-octeon-di hfs-modules-4.19.0-8-octeon-di affs-modules-4.19.0-8-octeon-di minix-modules-4.19.0-8-octeon-di md-modules-4.19.0-8-octeon-di multipath-modules-4.19.0-8-octeon-di usb-modules-4.19.0-8-octeon-di usb-storage-modules-4.19.0-8-octeon-di input-modules-4.19.0-8-octeon-di event-modules-4.19.0-8-octeon-di nic-usb-modules-4.19.0-8-octeon-di sata-modules-4.19.0-8-octeon-di crc-modules-4.19.0-8-octeon-di crypto-modules-4.19.0-8-octeon-di crypto-dm-modules-4.19.0-8-octeon-di nbd-modules-4.19.0-8-octeon-di squashfs-modules-4.19.0-8-octeon-di rtc-modules-4.19.0-8-octeon-di sound-modules-4.19.0-8-octeon-di zlib-modules-4.19.0-8-octeon-di compress-modules-4.19.0-8-octeon-di udf-modules-4.19.0-8-octeon-di fuse-modules-4.19.0-8-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mips ABINAME='4.19.0-9' ARCH='mips' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-4kc-malta-di nic-modules-4.19.0-9-4kc-malta-di nic-wireless-modules-4.19.0-9-4kc-malta-di nic-shared-modules-4.19.0-9-4kc-malta-di usb-serial-modules-4.19.0-9-4kc-malta-di ppp-modules-4.19.0-9-4kc-malta-di pata-modules-4.19.0-9-4kc-malta-di cdrom-core-modules-4.19.0-9-4kc-malta-di scsi-core-modules-4.19.0-9-4kc-malta-di scsi-modules-4.19.0-9-4kc-malta-di scsi-nic-modules-4.19.0-9-4kc-malta-di loop-modules-4.19.0-9-4kc-malta-di btrfs-modules-4.19.0-9-4kc-malta-di ext4-modules-4.19.0-9-4kc-malta-di isofs-modules-4.19.0-9-4kc-malta-di jfs-modules-4.19.0-9-4kc-malta-di xfs-modules-4.19.0-9-4kc-malta-di fat-modules-4.19.0-9-4kc-malta-di hfs-modules-4.19.0-9-4kc-malta-di affs-modules-4.19.0-9-4kc-malta-di minix-modules-4.19.0-9-4kc-malta-di md-modules-4.19.0-9-4kc-malta-di multipath-modules-4.19.0-9-4kc-malta-di usb-modules-4.19.0-9-4kc-malta-di usb-storage-modules-4.19.0-9-4kc-malta-di fb-modules-4.19.0-9-4kc-malta-di input-modules-4.19.0-9-4kc-malta-di event-modules-4.19.0-9-4kc-malta-di mouse-modules-4.19.0-9-4kc-malta-di nic-usb-modules-4.19.0-9-4kc-malta-di sata-modules-4.19.0-9-4kc-malta-di i2c-modules-4.19.0-9-4kc-malta-di crc-modules-4.19.0-9-4kc-malta-di crypto-modules-4.19.0-9-4kc-malta-di crypto-dm-modules-4.19.0-9-4kc-malta-di ata-modules-4.19.0-9-4kc-malta-di mmc-core-modules-4.19.0-9-4kc-malta-di mmc-modules-4.19.0-9-4kc-malta-di nbd-modules-4.19.0-9-4kc-malta-di squashfs-modules-4.19.0-9-4kc-malta-di sound-modules-4.19.0-9-4kc-malta-di zlib-modules-4.19.0-9-4kc-malta-di compress-modules-4.19.0-9-4kc-malta-di udf-modules-4.19.0-9-4kc-malta-di fuse-modules-4.19.0-9-4kc-malta-di mtd-core-modules-4.19.0-9-4kc-malta-di kernel-image-4.19.0-9-octeon-di nic-modules-4.19.0-9-octeon-di nic-wireless-modules-4.19.0-9-octeon-di nic-shared-modules-4.19.0-9-octeon-di usb-serial-modules-4.19.0-9-octeon-di ppp-modules-4.19.0-9-octeon-di pata-modules-4.19.0-9-octeon-di cdrom-core-modules-4.19.0-9-octeon-di scsi-core-modules-4.19.0-9-octeon-di scsi-modules-4.19.0-9-octeon-di scsi-nic-modules-4.19.0-9-octeon-di loop-modules-4.19.0-9-octeon-di btrfs-modules-4.19.0-9-octeon-di ext4-modules-4.19.0-9-octeon-di isofs-modules-4.19.0-9-octeon-di jfs-modules-4.19.0-9-octeon-di xfs-modules-4.19.0-9-octeon-di fat-modules-4.19.0-9-octeon-di hfs-modules-4.19.0-9-octeon-di affs-modules-4.19.0-9-octeon-di minix-modules-4.19.0-9-octeon-di md-modules-4.19.0-9-octeon-di multipath-modules-4.19.0-9-octeon-di usb-modules-4.19.0-9-octeon-di usb-storage-modules-4.19.0-9-octeon-di input-modules-4.19.0-9-octeon-di event-modules-4.19.0-9-octeon-di nic-usb-modules-4.19.0-9-octeon-di sata-modules-4.19.0-9-octeon-di crc-modules-4.19.0-9-octeon-di crypto-modules-4.19.0-9-octeon-di crypto-dm-modules-4.19.0-9-octeon-di nbd-modules-4.19.0-9-octeon-di squashfs-modules-4.19.0-9-octeon-di rtc-modules-4.19.0-9-octeon-di sound-modules-4.19.0-9-octeon-di zlib-modules-4.19.0-9-octeon-di compress-modules-4.19.0-9-octeon-di udf-modules-4.19.0-9-octeon-di fuse-modules-4.19.0-9-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mips64:: binary-arch_mips64_none binary-arch_mips64_real binary-arch_mips64:: - $(MAKE) -f debian/rules.real install-udeb_mips64 ABINAME='4.19.0-8' ARCH='mips64' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-5kc-malta-di nic-modules-4.19.0-8-5kc-malta-di nic-wireless-modules-4.19.0-8-5kc-malta-di nic-shared-modules-4.19.0-8-5kc-malta-di usb-serial-modules-4.19.0-8-5kc-malta-di ppp-modules-4.19.0-8-5kc-malta-di pata-modules-4.19.0-8-5kc-malta-di cdrom-core-modules-4.19.0-8-5kc-malta-di scsi-core-modules-4.19.0-8-5kc-malta-di scsi-modules-4.19.0-8-5kc-malta-di scsi-nic-modules-4.19.0-8-5kc-malta-di loop-modules-4.19.0-8-5kc-malta-di btrfs-modules-4.19.0-8-5kc-malta-di ext4-modules-4.19.0-8-5kc-malta-di isofs-modules-4.19.0-8-5kc-malta-di jfs-modules-4.19.0-8-5kc-malta-di xfs-modules-4.19.0-8-5kc-malta-di fat-modules-4.19.0-8-5kc-malta-di hfs-modules-4.19.0-8-5kc-malta-di affs-modules-4.19.0-8-5kc-malta-di minix-modules-4.19.0-8-5kc-malta-di md-modules-4.19.0-8-5kc-malta-di multipath-modules-4.19.0-8-5kc-malta-di usb-modules-4.19.0-8-5kc-malta-di usb-storage-modules-4.19.0-8-5kc-malta-di fb-modules-4.19.0-8-5kc-malta-di input-modules-4.19.0-8-5kc-malta-di event-modules-4.19.0-8-5kc-malta-di mouse-modules-4.19.0-8-5kc-malta-di nic-usb-modules-4.19.0-8-5kc-malta-di sata-modules-4.19.0-8-5kc-malta-di i2c-modules-4.19.0-8-5kc-malta-di crc-modules-4.19.0-8-5kc-malta-di crypto-modules-4.19.0-8-5kc-malta-di crypto-dm-modules-4.19.0-8-5kc-malta-di ata-modules-4.19.0-8-5kc-malta-di mmc-core-modules-4.19.0-8-5kc-malta-di mmc-modules-4.19.0-8-5kc-malta-di nbd-modules-4.19.0-8-5kc-malta-di squashfs-modules-4.19.0-8-5kc-malta-di sound-modules-4.19.0-8-5kc-malta-di zlib-modules-4.19.0-8-5kc-malta-di compress-modules-4.19.0-8-5kc-malta-di udf-modules-4.19.0-8-5kc-malta-di fuse-modules-4.19.0-8-5kc-malta-di mtd-core-modules-4.19.0-8-5kc-malta-di kernel-image-4.19.0-8-octeon-di nic-modules-4.19.0-8-octeon-di nic-wireless-modules-4.19.0-8-octeon-di nic-shared-modules-4.19.0-8-octeon-di usb-serial-modules-4.19.0-8-octeon-di ppp-modules-4.19.0-8-octeon-di pata-modules-4.19.0-8-octeon-di cdrom-core-modules-4.19.0-8-octeon-di scsi-core-modules-4.19.0-8-octeon-di scsi-modules-4.19.0-8-octeon-di scsi-nic-modules-4.19.0-8-octeon-di loop-modules-4.19.0-8-octeon-di btrfs-modules-4.19.0-8-octeon-di ext4-modules-4.19.0-8-octeon-di isofs-modules-4.19.0-8-octeon-di jfs-modules-4.19.0-8-octeon-di xfs-modules-4.19.0-8-octeon-di fat-modules-4.19.0-8-octeon-di hfs-modules-4.19.0-8-octeon-di affs-modules-4.19.0-8-octeon-di minix-modules-4.19.0-8-octeon-di md-modules-4.19.0-8-octeon-di multipath-modules-4.19.0-8-octeon-di usb-modules-4.19.0-8-octeon-di usb-storage-modules-4.19.0-8-octeon-di input-modules-4.19.0-8-octeon-di event-modules-4.19.0-8-octeon-di nic-usb-modules-4.19.0-8-octeon-di sata-modules-4.19.0-8-octeon-di crc-modules-4.19.0-8-octeon-di crypto-modules-4.19.0-8-octeon-di crypto-dm-modules-4.19.0-8-octeon-di nbd-modules-4.19.0-8-octeon-di squashfs-modules-4.19.0-8-octeon-di rtc-modules-4.19.0-8-octeon-di sound-modules-4.19.0-8-octeon-di zlib-modules-4.19.0-8-octeon-di compress-modules-4.19.0-8-octeon-di udf-modules-4.19.0-8-octeon-di fuse-modules-4.19.0-8-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mips64 ABINAME='4.19.0-9' ARCH='mips64' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-5kc-malta-di nic-modules-4.19.0-9-5kc-malta-di nic-wireless-modules-4.19.0-9-5kc-malta-di nic-shared-modules-4.19.0-9-5kc-malta-di usb-serial-modules-4.19.0-9-5kc-malta-di ppp-modules-4.19.0-9-5kc-malta-di pata-modules-4.19.0-9-5kc-malta-di cdrom-core-modules-4.19.0-9-5kc-malta-di scsi-core-modules-4.19.0-9-5kc-malta-di scsi-modules-4.19.0-9-5kc-malta-di scsi-nic-modules-4.19.0-9-5kc-malta-di loop-modules-4.19.0-9-5kc-malta-di btrfs-modules-4.19.0-9-5kc-malta-di ext4-modules-4.19.0-9-5kc-malta-di isofs-modules-4.19.0-9-5kc-malta-di jfs-modules-4.19.0-9-5kc-malta-di xfs-modules-4.19.0-9-5kc-malta-di fat-modules-4.19.0-9-5kc-malta-di hfs-modules-4.19.0-9-5kc-malta-di affs-modules-4.19.0-9-5kc-malta-di minix-modules-4.19.0-9-5kc-malta-di md-modules-4.19.0-9-5kc-malta-di multipath-modules-4.19.0-9-5kc-malta-di usb-modules-4.19.0-9-5kc-malta-di usb-storage-modules-4.19.0-9-5kc-malta-di fb-modules-4.19.0-9-5kc-malta-di input-modules-4.19.0-9-5kc-malta-di event-modules-4.19.0-9-5kc-malta-di mouse-modules-4.19.0-9-5kc-malta-di nic-usb-modules-4.19.0-9-5kc-malta-di sata-modules-4.19.0-9-5kc-malta-di i2c-modules-4.19.0-9-5kc-malta-di crc-modules-4.19.0-9-5kc-malta-di crypto-modules-4.19.0-9-5kc-malta-di crypto-dm-modules-4.19.0-9-5kc-malta-di ata-modules-4.19.0-9-5kc-malta-di mmc-core-modules-4.19.0-9-5kc-malta-di mmc-modules-4.19.0-9-5kc-malta-di nbd-modules-4.19.0-9-5kc-malta-di squashfs-modules-4.19.0-9-5kc-malta-di sound-modules-4.19.0-9-5kc-malta-di zlib-modules-4.19.0-9-5kc-malta-di compress-modules-4.19.0-9-5kc-malta-di udf-modules-4.19.0-9-5kc-malta-di fuse-modules-4.19.0-9-5kc-malta-di mtd-core-modules-4.19.0-9-5kc-malta-di kernel-image-4.19.0-9-octeon-di nic-modules-4.19.0-9-octeon-di nic-wireless-modules-4.19.0-9-octeon-di nic-shared-modules-4.19.0-9-octeon-di usb-serial-modules-4.19.0-9-octeon-di ppp-modules-4.19.0-9-octeon-di pata-modules-4.19.0-9-octeon-di cdrom-core-modules-4.19.0-9-octeon-di scsi-core-modules-4.19.0-9-octeon-di scsi-modules-4.19.0-9-octeon-di scsi-nic-modules-4.19.0-9-octeon-di loop-modules-4.19.0-9-octeon-di btrfs-modules-4.19.0-9-octeon-di ext4-modules-4.19.0-9-octeon-di isofs-modules-4.19.0-9-octeon-di jfs-modules-4.19.0-9-octeon-di xfs-modules-4.19.0-9-octeon-di fat-modules-4.19.0-9-octeon-di hfs-modules-4.19.0-9-octeon-di affs-modules-4.19.0-9-octeon-di minix-modules-4.19.0-9-octeon-di md-modules-4.19.0-9-octeon-di multipath-modules-4.19.0-9-octeon-di usb-modules-4.19.0-9-octeon-di usb-storage-modules-4.19.0-9-octeon-di input-modules-4.19.0-9-octeon-di event-modules-4.19.0-9-octeon-di nic-usb-modules-4.19.0-9-octeon-di sata-modules-4.19.0-9-octeon-di crc-modules-4.19.0-9-octeon-di crypto-modules-4.19.0-9-octeon-di crypto-dm-modules-4.19.0-9-octeon-di nbd-modules-4.19.0-9-octeon-di squashfs-modules-4.19.0-9-octeon-di rtc-modules-4.19.0-9-octeon-di sound-modules-4.19.0-9-octeon-di zlib-modules-4.19.0-9-octeon-di compress-modules-4.19.0-9-octeon-di udf-modules-4.19.0-9-octeon-di fuse-modules-4.19.0-9-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mips64_none: binary-arch_mips64_none_5kc-malta binary-arch_mips64_none_octeon binary-arch_mips64_none_real binary-arch_mips64_none_5kc-malta: binary-arch_mips64_none_5kc-malta_real binary-arch_mips64_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64_none_octeon: binary-arch_mips64_none_octeon_real binary-arch_mips64_none_octeon_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64_none_real: binary-arch_mips64_real:: setup_mips64 binary-arch_mips64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mips64' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mips64' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64el:: binary-arch_mips64el_none binary-arch_mips64el_real binary-arch_mips64el:: - $(MAKE) -f debian/rules.real install-udeb_mips64el ABINAME='4.19.0-8' ARCH='mips64el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-5kc-malta-di nic-modules-4.19.0-8-5kc-malta-di nic-wireless-modules-4.19.0-8-5kc-malta-di nic-shared-modules-4.19.0-8-5kc-malta-di usb-serial-modules-4.19.0-8-5kc-malta-di ppp-modules-4.19.0-8-5kc-malta-di pata-modules-4.19.0-8-5kc-malta-di cdrom-core-modules-4.19.0-8-5kc-malta-di scsi-core-modules-4.19.0-8-5kc-malta-di scsi-modules-4.19.0-8-5kc-malta-di scsi-nic-modules-4.19.0-8-5kc-malta-di loop-modules-4.19.0-8-5kc-malta-di btrfs-modules-4.19.0-8-5kc-malta-di ext4-modules-4.19.0-8-5kc-malta-di isofs-modules-4.19.0-8-5kc-malta-di jfs-modules-4.19.0-8-5kc-malta-di xfs-modules-4.19.0-8-5kc-malta-di fat-modules-4.19.0-8-5kc-malta-di hfs-modules-4.19.0-8-5kc-malta-di affs-modules-4.19.0-8-5kc-malta-di minix-modules-4.19.0-8-5kc-malta-di md-modules-4.19.0-8-5kc-malta-di multipath-modules-4.19.0-8-5kc-malta-di usb-modules-4.19.0-8-5kc-malta-di usb-storage-modules-4.19.0-8-5kc-malta-di fb-modules-4.19.0-8-5kc-malta-di input-modules-4.19.0-8-5kc-malta-di event-modules-4.19.0-8-5kc-malta-di mouse-modules-4.19.0-8-5kc-malta-di nic-usb-modules-4.19.0-8-5kc-malta-di sata-modules-4.19.0-8-5kc-malta-di i2c-modules-4.19.0-8-5kc-malta-di crc-modules-4.19.0-8-5kc-malta-di crypto-modules-4.19.0-8-5kc-malta-di crypto-dm-modules-4.19.0-8-5kc-malta-di ata-modules-4.19.0-8-5kc-malta-di mmc-core-modules-4.19.0-8-5kc-malta-di mmc-modules-4.19.0-8-5kc-malta-di nbd-modules-4.19.0-8-5kc-malta-di squashfs-modules-4.19.0-8-5kc-malta-di sound-modules-4.19.0-8-5kc-malta-di zlib-modules-4.19.0-8-5kc-malta-di compress-modules-4.19.0-8-5kc-malta-di udf-modules-4.19.0-8-5kc-malta-di fuse-modules-4.19.0-8-5kc-malta-di mtd-core-modules-4.19.0-8-5kc-malta-di kernel-image-4.19.0-8-loongson-3-di nic-modules-4.19.0-8-loongson-3-di nic-wireless-modules-4.19.0-8-loongson-3-di nic-shared-modules-4.19.0-8-loongson-3-di usb-serial-modules-4.19.0-8-loongson-3-di ppp-modules-4.19.0-8-loongson-3-di pata-modules-4.19.0-8-loongson-3-di cdrom-core-modules-4.19.0-8-loongson-3-di firewire-core-modules-4.19.0-8-loongson-3-di scsi-core-modules-4.19.0-8-loongson-3-di scsi-modules-4.19.0-8-loongson-3-di scsi-nic-modules-4.19.0-8-loongson-3-di loop-modules-4.19.0-8-loongson-3-di btrfs-modules-4.19.0-8-loongson-3-di ext4-modules-4.19.0-8-loongson-3-di isofs-modules-4.19.0-8-loongson-3-di jfs-modules-4.19.0-8-loongson-3-di xfs-modules-4.19.0-8-loongson-3-di fat-modules-4.19.0-8-loongson-3-di hfs-modules-4.19.0-8-loongson-3-di affs-modules-4.19.0-8-loongson-3-di minix-modules-4.19.0-8-loongson-3-di nfs-modules-4.19.0-8-loongson-3-di md-modules-4.19.0-8-loongson-3-di multipath-modules-4.19.0-8-loongson-3-di usb-modules-4.19.0-8-loongson-3-di usb-storage-modules-4.19.0-8-loongson-3-di fb-modules-4.19.0-8-loongson-3-di input-modules-4.19.0-8-loongson-3-di event-modules-4.19.0-8-loongson-3-di nic-usb-modules-4.19.0-8-loongson-3-di sata-modules-4.19.0-8-loongson-3-di crc-modules-4.19.0-8-loongson-3-di crypto-modules-4.19.0-8-loongson-3-di crypto-dm-modules-4.19.0-8-loongson-3-di ata-modules-4.19.0-8-loongson-3-di nbd-modules-4.19.0-8-loongson-3-di squashfs-modules-4.19.0-8-loongson-3-di speakup-modules-4.19.0-8-loongson-3-di sound-modules-4.19.0-8-loongson-3-di zlib-modules-4.19.0-8-loongson-3-di compress-modules-4.19.0-8-loongson-3-di udf-modules-4.19.0-8-loongson-3-di fuse-modules-4.19.0-8-loongson-3-di mtd-core-modules-4.19.0-8-loongson-3-di kernel-image-4.19.0-8-octeon-di nic-modules-4.19.0-8-octeon-di nic-wireless-modules-4.19.0-8-octeon-di nic-shared-modules-4.19.0-8-octeon-di usb-serial-modules-4.19.0-8-octeon-di ppp-modules-4.19.0-8-octeon-di pata-modules-4.19.0-8-octeon-di cdrom-core-modules-4.19.0-8-octeon-di scsi-core-modules-4.19.0-8-octeon-di scsi-modules-4.19.0-8-octeon-di scsi-nic-modules-4.19.0-8-octeon-di loop-modules-4.19.0-8-octeon-di btrfs-modules-4.19.0-8-octeon-di ext4-modules-4.19.0-8-octeon-di isofs-modules-4.19.0-8-octeon-di jfs-modules-4.19.0-8-octeon-di xfs-modules-4.19.0-8-octeon-di fat-modules-4.19.0-8-octeon-di hfs-modules-4.19.0-8-octeon-di affs-modules-4.19.0-8-octeon-di minix-modules-4.19.0-8-octeon-di md-modules-4.19.0-8-octeon-di multipath-modules-4.19.0-8-octeon-di usb-modules-4.19.0-8-octeon-di usb-storage-modules-4.19.0-8-octeon-di input-modules-4.19.0-8-octeon-di event-modules-4.19.0-8-octeon-di nic-usb-modules-4.19.0-8-octeon-di sata-modules-4.19.0-8-octeon-di crc-modules-4.19.0-8-octeon-di crypto-modules-4.19.0-8-octeon-di crypto-dm-modules-4.19.0-8-octeon-di nbd-modules-4.19.0-8-octeon-di squashfs-modules-4.19.0-8-octeon-di rtc-modules-4.19.0-8-octeon-di sound-modules-4.19.0-8-octeon-di zlib-modules-4.19.0-8-octeon-di compress-modules-4.19.0-8-octeon-di udf-modules-4.19.0-8-octeon-di fuse-modules-4.19.0-8-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mips64el ABINAME='4.19.0-9' ARCH='mips64el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-5kc-malta-di nic-modules-4.19.0-9-5kc-malta-di nic-wireless-modules-4.19.0-9-5kc-malta-di nic-shared-modules-4.19.0-9-5kc-malta-di usb-serial-modules-4.19.0-9-5kc-malta-di ppp-modules-4.19.0-9-5kc-malta-di pata-modules-4.19.0-9-5kc-malta-di cdrom-core-modules-4.19.0-9-5kc-malta-di scsi-core-modules-4.19.0-9-5kc-malta-di scsi-modules-4.19.0-9-5kc-malta-di scsi-nic-modules-4.19.0-9-5kc-malta-di loop-modules-4.19.0-9-5kc-malta-di btrfs-modules-4.19.0-9-5kc-malta-di ext4-modules-4.19.0-9-5kc-malta-di isofs-modules-4.19.0-9-5kc-malta-di jfs-modules-4.19.0-9-5kc-malta-di xfs-modules-4.19.0-9-5kc-malta-di fat-modules-4.19.0-9-5kc-malta-di hfs-modules-4.19.0-9-5kc-malta-di affs-modules-4.19.0-9-5kc-malta-di minix-modules-4.19.0-9-5kc-malta-di md-modules-4.19.0-9-5kc-malta-di multipath-modules-4.19.0-9-5kc-malta-di usb-modules-4.19.0-9-5kc-malta-di usb-storage-modules-4.19.0-9-5kc-malta-di fb-modules-4.19.0-9-5kc-malta-di input-modules-4.19.0-9-5kc-malta-di event-modules-4.19.0-9-5kc-malta-di mouse-modules-4.19.0-9-5kc-malta-di nic-usb-modules-4.19.0-9-5kc-malta-di sata-modules-4.19.0-9-5kc-malta-di i2c-modules-4.19.0-9-5kc-malta-di crc-modules-4.19.0-9-5kc-malta-di crypto-modules-4.19.0-9-5kc-malta-di crypto-dm-modules-4.19.0-9-5kc-malta-di ata-modules-4.19.0-9-5kc-malta-di mmc-core-modules-4.19.0-9-5kc-malta-di mmc-modules-4.19.0-9-5kc-malta-di nbd-modules-4.19.0-9-5kc-malta-di squashfs-modules-4.19.0-9-5kc-malta-di sound-modules-4.19.0-9-5kc-malta-di zlib-modules-4.19.0-9-5kc-malta-di compress-modules-4.19.0-9-5kc-malta-di udf-modules-4.19.0-9-5kc-malta-di fuse-modules-4.19.0-9-5kc-malta-di mtd-core-modules-4.19.0-9-5kc-malta-di kernel-image-4.19.0-9-loongson-3-di nic-modules-4.19.0-9-loongson-3-di nic-wireless-modules-4.19.0-9-loongson-3-di nic-shared-modules-4.19.0-9-loongson-3-di usb-serial-modules-4.19.0-9-loongson-3-di ppp-modules-4.19.0-9-loongson-3-di pata-modules-4.19.0-9-loongson-3-di cdrom-core-modules-4.19.0-9-loongson-3-di firewire-core-modules-4.19.0-9-loongson-3-di scsi-core-modules-4.19.0-9-loongson-3-di scsi-modules-4.19.0-9-loongson-3-di scsi-nic-modules-4.19.0-9-loongson-3-di loop-modules-4.19.0-9-loongson-3-di btrfs-modules-4.19.0-9-loongson-3-di ext4-modules-4.19.0-9-loongson-3-di isofs-modules-4.19.0-9-loongson-3-di jfs-modules-4.19.0-9-loongson-3-di xfs-modules-4.19.0-9-loongson-3-di fat-modules-4.19.0-9-loongson-3-di hfs-modules-4.19.0-9-loongson-3-di affs-modules-4.19.0-9-loongson-3-di minix-modules-4.19.0-9-loongson-3-di nfs-modules-4.19.0-9-loongson-3-di md-modules-4.19.0-9-loongson-3-di multipath-modules-4.19.0-9-loongson-3-di usb-modules-4.19.0-9-loongson-3-di usb-storage-modules-4.19.0-9-loongson-3-di fb-modules-4.19.0-9-loongson-3-di input-modules-4.19.0-9-loongson-3-di event-modules-4.19.0-9-loongson-3-di nic-usb-modules-4.19.0-9-loongson-3-di sata-modules-4.19.0-9-loongson-3-di crc-modules-4.19.0-9-loongson-3-di crypto-modules-4.19.0-9-loongson-3-di crypto-dm-modules-4.19.0-9-loongson-3-di ata-modules-4.19.0-9-loongson-3-di nbd-modules-4.19.0-9-loongson-3-di squashfs-modules-4.19.0-9-loongson-3-di speakup-modules-4.19.0-9-loongson-3-di sound-modules-4.19.0-9-loongson-3-di zlib-modules-4.19.0-9-loongson-3-di compress-modules-4.19.0-9-loongson-3-di udf-modules-4.19.0-9-loongson-3-di fuse-modules-4.19.0-9-loongson-3-di mtd-core-modules-4.19.0-9-loongson-3-di kernel-image-4.19.0-9-octeon-di nic-modules-4.19.0-9-octeon-di nic-wireless-modules-4.19.0-9-octeon-di nic-shared-modules-4.19.0-9-octeon-di usb-serial-modules-4.19.0-9-octeon-di ppp-modules-4.19.0-9-octeon-di pata-modules-4.19.0-9-octeon-di cdrom-core-modules-4.19.0-9-octeon-di scsi-core-modules-4.19.0-9-octeon-di scsi-modules-4.19.0-9-octeon-di scsi-nic-modules-4.19.0-9-octeon-di loop-modules-4.19.0-9-octeon-di btrfs-modules-4.19.0-9-octeon-di ext4-modules-4.19.0-9-octeon-di isofs-modules-4.19.0-9-octeon-di jfs-modules-4.19.0-9-octeon-di xfs-modules-4.19.0-9-octeon-di fat-modules-4.19.0-9-octeon-di hfs-modules-4.19.0-9-octeon-di affs-modules-4.19.0-9-octeon-di minix-modules-4.19.0-9-octeon-di md-modules-4.19.0-9-octeon-di multipath-modules-4.19.0-9-octeon-di usb-modules-4.19.0-9-octeon-di usb-storage-modules-4.19.0-9-octeon-di input-modules-4.19.0-9-octeon-di event-modules-4.19.0-9-octeon-di nic-usb-modules-4.19.0-9-octeon-di sata-modules-4.19.0-9-octeon-di crc-modules-4.19.0-9-octeon-di crypto-modules-4.19.0-9-octeon-di crypto-dm-modules-4.19.0-9-octeon-di nbd-modules-4.19.0-9-octeon-di squashfs-modules-4.19.0-9-octeon-di rtc-modules-4.19.0-9-octeon-di sound-modules-4.19.0-9-octeon-di zlib-modules-4.19.0-9-octeon-di compress-modules-4.19.0-9-octeon-di udf-modules-4.19.0-9-octeon-di fuse-modules-4.19.0-9-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mips64el_none: binary-arch_mips64el_none_5kc-malta binary-arch_mips64el_none_loongson-3 binary-arch_mips64el_none_octeon binary-arch_mips64el_none_real binary-arch_mips64el_none_5kc-malta: binary-arch_mips64el_none_5kc-malta_real binary-arch_mips64el_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64el_none_loongson-3: binary-arch_mips64el_none_loongson-3_real binary-arch_mips64el_none_loongson-3_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64el_none_octeon: binary-arch_mips64el_none_octeon_real binary-arch_mips64el_none_octeon_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64el_none_real: binary-arch_mips64el_real:: setup_mips64el binary-arch_mips64el_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mips64el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mips64el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64r6:: binary-arch_mips64r6_none binary-arch_mips64r6_real binary-arch_mips64r6:: - $(MAKE) -f debian/rules.real install-udeb_mips64r6 ABINAME='4.19.0-8' ARCH='mips64r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-mips64r6-di nic-shared-modules-4.19.0-8-mips64r6-di loop-modules-4.19.0-8-mips64r6-di btrfs-modules-4.19.0-8-mips64r6-di ext4-modules-4.19.0-8-mips64r6-di isofs-modules-4.19.0-8-mips64r6-di jfs-modules-4.19.0-8-mips64r6-di xfs-modules-4.19.0-8-mips64r6-di md-modules-4.19.0-8-mips64r6-di multipath-modules-4.19.0-8-mips64r6-di crc-modules-4.19.0-8-mips64r6-di crypto-modules-4.19.0-8-mips64r6-di crypto-dm-modules-4.19.0-8-mips64r6-di nbd-modules-4.19.0-8-mips64r6-di squashfs-modules-4.19.0-8-mips64r6-di zlib-modules-4.19.0-8-mips64r6-di compress-modules-4.19.0-8-mips64r6-di udf-modules-4.19.0-8-mips64r6-di fuse-modules-4.19.0-8-mips64r6-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mips64r6 ABINAME='4.19.0-9' ARCH='mips64r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-mips64r6-di nic-shared-modules-4.19.0-9-mips64r6-di loop-modules-4.19.0-9-mips64r6-di btrfs-modules-4.19.0-9-mips64r6-di ext4-modules-4.19.0-9-mips64r6-di isofs-modules-4.19.0-9-mips64r6-di jfs-modules-4.19.0-9-mips64r6-di xfs-modules-4.19.0-9-mips64r6-di md-modules-4.19.0-9-mips64r6-di multipath-modules-4.19.0-9-mips64r6-di crc-modules-4.19.0-9-mips64r6-di crypto-modules-4.19.0-9-mips64r6-di crypto-dm-modules-4.19.0-9-mips64r6-di nbd-modules-4.19.0-9-mips64r6-di squashfs-modules-4.19.0-9-mips64r6-di zlib-modules-4.19.0-9-mips64r6-di compress-modules-4.19.0-9-mips64r6-di udf-modules-4.19.0-9-mips64r6-di fuse-modules-4.19.0-9-mips64r6-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mips64r6_none: binary-arch_mips64r6_none_mips64r6 binary-arch_mips64r6_none_real binary-arch_mips64r6_none_mips64r6: binary-arch_mips64r6_none_mips64r6_real binary-arch_mips64r6_none_mips64r6_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64r6_none_real: binary-arch_mips64r6_real:: setup_mips64r6 binary-arch_mips64r6_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mips64r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mips64r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64r6el:: binary-arch_mips64r6el_none binary-arch_mips64r6el_real binary-arch_mips64r6el:: - $(MAKE) -f debian/rules.real install-udeb_mips64r6el ABINAME='4.19.0-8' ARCH='mips64r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-mips64r6el-di nic-shared-modules-4.19.0-8-mips64r6el-di loop-modules-4.19.0-8-mips64r6el-di btrfs-modules-4.19.0-8-mips64r6el-di ext4-modules-4.19.0-8-mips64r6el-di isofs-modules-4.19.0-8-mips64r6el-di jfs-modules-4.19.0-8-mips64r6el-di xfs-modules-4.19.0-8-mips64r6el-di md-modules-4.19.0-8-mips64r6el-di multipath-modules-4.19.0-8-mips64r6el-di crc-modules-4.19.0-8-mips64r6el-di crypto-modules-4.19.0-8-mips64r6el-di crypto-dm-modules-4.19.0-8-mips64r6el-di nbd-modules-4.19.0-8-mips64r6el-di squashfs-modules-4.19.0-8-mips64r6el-di zlib-modules-4.19.0-8-mips64r6el-di compress-modules-4.19.0-8-mips64r6el-di udf-modules-4.19.0-8-mips64r6el-di fuse-modules-4.19.0-8-mips64r6el-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mips64r6el ABINAME='4.19.0-9' ARCH='mips64r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-mips64r6el-di nic-shared-modules-4.19.0-9-mips64r6el-di loop-modules-4.19.0-9-mips64r6el-di btrfs-modules-4.19.0-9-mips64r6el-di ext4-modules-4.19.0-9-mips64r6el-di isofs-modules-4.19.0-9-mips64r6el-di jfs-modules-4.19.0-9-mips64r6el-di xfs-modules-4.19.0-9-mips64r6el-di md-modules-4.19.0-9-mips64r6el-di multipath-modules-4.19.0-9-mips64r6el-di crc-modules-4.19.0-9-mips64r6el-di crypto-modules-4.19.0-9-mips64r6el-di crypto-dm-modules-4.19.0-9-mips64r6el-di nbd-modules-4.19.0-9-mips64r6el-di squashfs-modules-4.19.0-9-mips64r6el-di zlib-modules-4.19.0-9-mips64r6el-di compress-modules-4.19.0-9-mips64r6el-di udf-modules-4.19.0-9-mips64r6el-di fuse-modules-4.19.0-9-mips64r6el-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mips64r6el_none: binary-arch_mips64r6el_none_mips64r6el binary-arch_mips64r6el_none_real binary-arch_mips64r6el_none_mips64r6el: binary-arch_mips64r6el_none_mips64r6el_real binary-arch_mips64r6el_none_mips64r6el_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips64r6el_none_real: binary-arch_mips64r6el_real:: setup_mips64r6el binary-arch_mips64r6el_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mips64r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mips64r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips_none: binary-arch_mips_none_4kc-malta binary-arch_mips_none_5kc-malta binary-arch_mips_none_octeon binary-arch_mips_none_real binary-arch_mips_none_4kc-malta: binary-arch_mips_none_4kc-malta_real binary-arch_mips_none_4kc-malta_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips_none_5kc-malta: binary-arch_mips_none_5kc-malta_real binary-arch_mips_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips_none_octeon: binary-arch_mips_none_octeon_real binary-arch_mips_none_octeon_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mips_none_real: binary-arch_mips_real:: setup_mips binary-arch_mips_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mips' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mips' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsel:: binary-arch_mipsel_none binary-arch_mipsel_real binary-arch_mipsel:: - $(MAKE) -f debian/rules.real install-udeb_mipsel ABINAME='4.19.0-8' ARCH='mipsel' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-4kc-malta-di nic-modules-4.19.0-8-4kc-malta-di nic-wireless-modules-4.19.0-8-4kc-malta-di nic-shared-modules-4.19.0-8-4kc-malta-di usb-serial-modules-4.19.0-8-4kc-malta-di ppp-modules-4.19.0-8-4kc-malta-di pata-modules-4.19.0-8-4kc-malta-di cdrom-core-modules-4.19.0-8-4kc-malta-di scsi-core-modules-4.19.0-8-4kc-malta-di scsi-modules-4.19.0-8-4kc-malta-di scsi-nic-modules-4.19.0-8-4kc-malta-di loop-modules-4.19.0-8-4kc-malta-di btrfs-modules-4.19.0-8-4kc-malta-di ext4-modules-4.19.0-8-4kc-malta-di isofs-modules-4.19.0-8-4kc-malta-di jfs-modules-4.19.0-8-4kc-malta-di xfs-modules-4.19.0-8-4kc-malta-di fat-modules-4.19.0-8-4kc-malta-di hfs-modules-4.19.0-8-4kc-malta-di affs-modules-4.19.0-8-4kc-malta-di minix-modules-4.19.0-8-4kc-malta-di md-modules-4.19.0-8-4kc-malta-di multipath-modules-4.19.0-8-4kc-malta-di usb-modules-4.19.0-8-4kc-malta-di usb-storage-modules-4.19.0-8-4kc-malta-di fb-modules-4.19.0-8-4kc-malta-di input-modules-4.19.0-8-4kc-malta-di event-modules-4.19.0-8-4kc-malta-di mouse-modules-4.19.0-8-4kc-malta-di nic-usb-modules-4.19.0-8-4kc-malta-di sata-modules-4.19.0-8-4kc-malta-di i2c-modules-4.19.0-8-4kc-malta-di crc-modules-4.19.0-8-4kc-malta-di crypto-modules-4.19.0-8-4kc-malta-di crypto-dm-modules-4.19.0-8-4kc-malta-di ata-modules-4.19.0-8-4kc-malta-di mmc-core-modules-4.19.0-8-4kc-malta-di mmc-modules-4.19.0-8-4kc-malta-di nbd-modules-4.19.0-8-4kc-malta-di squashfs-modules-4.19.0-8-4kc-malta-di sound-modules-4.19.0-8-4kc-malta-di zlib-modules-4.19.0-8-4kc-malta-di compress-modules-4.19.0-8-4kc-malta-di udf-modules-4.19.0-8-4kc-malta-di fuse-modules-4.19.0-8-4kc-malta-di mtd-core-modules-4.19.0-8-4kc-malta-di kernel-image-4.19.0-8-loongson-3-di nic-modules-4.19.0-8-loongson-3-di nic-wireless-modules-4.19.0-8-loongson-3-di nic-shared-modules-4.19.0-8-loongson-3-di usb-serial-modules-4.19.0-8-loongson-3-di ppp-modules-4.19.0-8-loongson-3-di pata-modules-4.19.0-8-loongson-3-di cdrom-core-modules-4.19.0-8-loongson-3-di firewire-core-modules-4.19.0-8-loongson-3-di scsi-core-modules-4.19.0-8-loongson-3-di scsi-modules-4.19.0-8-loongson-3-di scsi-nic-modules-4.19.0-8-loongson-3-di loop-modules-4.19.0-8-loongson-3-di btrfs-modules-4.19.0-8-loongson-3-di ext4-modules-4.19.0-8-loongson-3-di isofs-modules-4.19.0-8-loongson-3-di jfs-modules-4.19.0-8-loongson-3-di xfs-modules-4.19.0-8-loongson-3-di fat-modules-4.19.0-8-loongson-3-di hfs-modules-4.19.0-8-loongson-3-di affs-modules-4.19.0-8-loongson-3-di minix-modules-4.19.0-8-loongson-3-di nfs-modules-4.19.0-8-loongson-3-di md-modules-4.19.0-8-loongson-3-di multipath-modules-4.19.0-8-loongson-3-di usb-modules-4.19.0-8-loongson-3-di usb-storage-modules-4.19.0-8-loongson-3-di fb-modules-4.19.0-8-loongson-3-di input-modules-4.19.0-8-loongson-3-di event-modules-4.19.0-8-loongson-3-di nic-usb-modules-4.19.0-8-loongson-3-di sata-modules-4.19.0-8-loongson-3-di crc-modules-4.19.0-8-loongson-3-di crypto-modules-4.19.0-8-loongson-3-di crypto-dm-modules-4.19.0-8-loongson-3-di ata-modules-4.19.0-8-loongson-3-di nbd-modules-4.19.0-8-loongson-3-di squashfs-modules-4.19.0-8-loongson-3-di speakup-modules-4.19.0-8-loongson-3-di sound-modules-4.19.0-8-loongson-3-di zlib-modules-4.19.0-8-loongson-3-di compress-modules-4.19.0-8-loongson-3-di udf-modules-4.19.0-8-loongson-3-di fuse-modules-4.19.0-8-loongson-3-di mtd-core-modules-4.19.0-8-loongson-3-di kernel-image-4.19.0-8-octeon-di nic-modules-4.19.0-8-octeon-di nic-wireless-modules-4.19.0-8-octeon-di nic-shared-modules-4.19.0-8-octeon-di usb-serial-modules-4.19.0-8-octeon-di ppp-modules-4.19.0-8-octeon-di pata-modules-4.19.0-8-octeon-di cdrom-core-modules-4.19.0-8-octeon-di scsi-core-modules-4.19.0-8-octeon-di scsi-modules-4.19.0-8-octeon-di scsi-nic-modules-4.19.0-8-octeon-di loop-modules-4.19.0-8-octeon-di btrfs-modules-4.19.0-8-octeon-di ext4-modules-4.19.0-8-octeon-di isofs-modules-4.19.0-8-octeon-di jfs-modules-4.19.0-8-octeon-di xfs-modules-4.19.0-8-octeon-di fat-modules-4.19.0-8-octeon-di hfs-modules-4.19.0-8-octeon-di affs-modules-4.19.0-8-octeon-di minix-modules-4.19.0-8-octeon-di md-modules-4.19.0-8-octeon-di multipath-modules-4.19.0-8-octeon-di usb-modules-4.19.0-8-octeon-di usb-storage-modules-4.19.0-8-octeon-di input-modules-4.19.0-8-octeon-di event-modules-4.19.0-8-octeon-di nic-usb-modules-4.19.0-8-octeon-di sata-modules-4.19.0-8-octeon-di crc-modules-4.19.0-8-octeon-di crypto-modules-4.19.0-8-octeon-di crypto-dm-modules-4.19.0-8-octeon-di nbd-modules-4.19.0-8-octeon-di squashfs-modules-4.19.0-8-octeon-di rtc-modules-4.19.0-8-octeon-di sound-modules-4.19.0-8-octeon-di zlib-modules-4.19.0-8-octeon-di compress-modules-4.19.0-8-octeon-di udf-modules-4.19.0-8-octeon-di fuse-modules-4.19.0-8-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mipsel ABINAME='4.19.0-9' ARCH='mipsel' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-4kc-malta-di nic-modules-4.19.0-9-4kc-malta-di nic-wireless-modules-4.19.0-9-4kc-malta-di nic-shared-modules-4.19.0-9-4kc-malta-di usb-serial-modules-4.19.0-9-4kc-malta-di ppp-modules-4.19.0-9-4kc-malta-di pata-modules-4.19.0-9-4kc-malta-di cdrom-core-modules-4.19.0-9-4kc-malta-di scsi-core-modules-4.19.0-9-4kc-malta-di scsi-modules-4.19.0-9-4kc-malta-di scsi-nic-modules-4.19.0-9-4kc-malta-di loop-modules-4.19.0-9-4kc-malta-di btrfs-modules-4.19.0-9-4kc-malta-di ext4-modules-4.19.0-9-4kc-malta-di isofs-modules-4.19.0-9-4kc-malta-di jfs-modules-4.19.0-9-4kc-malta-di xfs-modules-4.19.0-9-4kc-malta-di fat-modules-4.19.0-9-4kc-malta-di hfs-modules-4.19.0-9-4kc-malta-di affs-modules-4.19.0-9-4kc-malta-di minix-modules-4.19.0-9-4kc-malta-di md-modules-4.19.0-9-4kc-malta-di multipath-modules-4.19.0-9-4kc-malta-di usb-modules-4.19.0-9-4kc-malta-di usb-storage-modules-4.19.0-9-4kc-malta-di fb-modules-4.19.0-9-4kc-malta-di input-modules-4.19.0-9-4kc-malta-di event-modules-4.19.0-9-4kc-malta-di mouse-modules-4.19.0-9-4kc-malta-di nic-usb-modules-4.19.0-9-4kc-malta-di sata-modules-4.19.0-9-4kc-malta-di i2c-modules-4.19.0-9-4kc-malta-di crc-modules-4.19.0-9-4kc-malta-di crypto-modules-4.19.0-9-4kc-malta-di crypto-dm-modules-4.19.0-9-4kc-malta-di ata-modules-4.19.0-9-4kc-malta-di mmc-core-modules-4.19.0-9-4kc-malta-di mmc-modules-4.19.0-9-4kc-malta-di nbd-modules-4.19.0-9-4kc-malta-di squashfs-modules-4.19.0-9-4kc-malta-di sound-modules-4.19.0-9-4kc-malta-di zlib-modules-4.19.0-9-4kc-malta-di compress-modules-4.19.0-9-4kc-malta-di udf-modules-4.19.0-9-4kc-malta-di fuse-modules-4.19.0-9-4kc-malta-di mtd-core-modules-4.19.0-9-4kc-malta-di kernel-image-4.19.0-9-loongson-3-di nic-modules-4.19.0-9-loongson-3-di nic-wireless-modules-4.19.0-9-loongson-3-di nic-shared-modules-4.19.0-9-loongson-3-di usb-serial-modules-4.19.0-9-loongson-3-di ppp-modules-4.19.0-9-loongson-3-di pata-modules-4.19.0-9-loongson-3-di cdrom-core-modules-4.19.0-9-loongson-3-di firewire-core-modules-4.19.0-9-loongson-3-di scsi-core-modules-4.19.0-9-loongson-3-di scsi-modules-4.19.0-9-loongson-3-di scsi-nic-modules-4.19.0-9-loongson-3-di loop-modules-4.19.0-9-loongson-3-di btrfs-modules-4.19.0-9-loongson-3-di ext4-modules-4.19.0-9-loongson-3-di isofs-modules-4.19.0-9-loongson-3-di jfs-modules-4.19.0-9-loongson-3-di xfs-modules-4.19.0-9-loongson-3-di fat-modules-4.19.0-9-loongson-3-di hfs-modules-4.19.0-9-loongson-3-di affs-modules-4.19.0-9-loongson-3-di minix-modules-4.19.0-9-loongson-3-di nfs-modules-4.19.0-9-loongson-3-di md-modules-4.19.0-9-loongson-3-di multipath-modules-4.19.0-9-loongson-3-di usb-modules-4.19.0-9-loongson-3-di usb-storage-modules-4.19.0-9-loongson-3-di fb-modules-4.19.0-9-loongson-3-di input-modules-4.19.0-9-loongson-3-di event-modules-4.19.0-9-loongson-3-di nic-usb-modules-4.19.0-9-loongson-3-di sata-modules-4.19.0-9-loongson-3-di crc-modules-4.19.0-9-loongson-3-di crypto-modules-4.19.0-9-loongson-3-di crypto-dm-modules-4.19.0-9-loongson-3-di ata-modules-4.19.0-9-loongson-3-di nbd-modules-4.19.0-9-loongson-3-di squashfs-modules-4.19.0-9-loongson-3-di speakup-modules-4.19.0-9-loongson-3-di sound-modules-4.19.0-9-loongson-3-di zlib-modules-4.19.0-9-loongson-3-di compress-modules-4.19.0-9-loongson-3-di udf-modules-4.19.0-9-loongson-3-di fuse-modules-4.19.0-9-loongson-3-di mtd-core-modules-4.19.0-9-loongson-3-di kernel-image-4.19.0-9-octeon-di nic-modules-4.19.0-9-octeon-di nic-wireless-modules-4.19.0-9-octeon-di nic-shared-modules-4.19.0-9-octeon-di usb-serial-modules-4.19.0-9-octeon-di ppp-modules-4.19.0-9-octeon-di pata-modules-4.19.0-9-octeon-di cdrom-core-modules-4.19.0-9-octeon-di scsi-core-modules-4.19.0-9-octeon-di scsi-modules-4.19.0-9-octeon-di scsi-nic-modules-4.19.0-9-octeon-di loop-modules-4.19.0-9-octeon-di btrfs-modules-4.19.0-9-octeon-di ext4-modules-4.19.0-9-octeon-di isofs-modules-4.19.0-9-octeon-di jfs-modules-4.19.0-9-octeon-di xfs-modules-4.19.0-9-octeon-di fat-modules-4.19.0-9-octeon-di hfs-modules-4.19.0-9-octeon-di affs-modules-4.19.0-9-octeon-di minix-modules-4.19.0-9-octeon-di md-modules-4.19.0-9-octeon-di multipath-modules-4.19.0-9-octeon-di usb-modules-4.19.0-9-octeon-di usb-storage-modules-4.19.0-9-octeon-di input-modules-4.19.0-9-octeon-di event-modules-4.19.0-9-octeon-di nic-usb-modules-4.19.0-9-octeon-di sata-modules-4.19.0-9-octeon-di crc-modules-4.19.0-9-octeon-di crypto-modules-4.19.0-9-octeon-di crypto-dm-modules-4.19.0-9-octeon-di nbd-modules-4.19.0-9-octeon-di squashfs-modules-4.19.0-9-octeon-di rtc-modules-4.19.0-9-octeon-di sound-modules-4.19.0-9-octeon-di zlib-modules-4.19.0-9-octeon-di compress-modules-4.19.0-9-octeon-di udf-modules-4.19.0-9-octeon-di fuse-modules-4.19.0-9-octeon-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mipsel_none: binary-arch_mipsel_none_4kc-malta binary-arch_mipsel_none_5kc-malta binary-arch_mipsel_none_loongson-3 binary-arch_mipsel_none_octeon binary-arch_mipsel_none_real binary-arch_mipsel_none_4kc-malta: binary-arch_mipsel_none_4kc-malta_real binary-arch_mipsel_none_4kc-malta_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsel_none_5kc-malta: binary-arch_mipsel_none_5kc-malta_real binary-arch_mipsel_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsel_none_loongson-3: binary-arch_mipsel_none_loongson-3_real binary-arch_mipsel_none_loongson-3_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsel_none_octeon: binary-arch_mipsel_none_octeon_real binary-arch_mipsel_none_octeon_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsel_none_real: binary-arch_mipsel_real:: setup_mipsel binary-arch_mipsel_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mipsel' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mipsel' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsn32: binary-arch_mipsn32_real binary-arch_mipsn32_real:: setup_mipsn32 binary-arch_mipsn32_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsn32el: binary-arch_mipsn32el_real binary-arch_mipsn32el_real:: setup_mipsn32el binary-arch_mipsn32el_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsn32r6: binary-arch_mipsn32r6_real binary-arch_mipsn32r6_real:: setup_mipsn32r6 binary-arch_mipsn32r6_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsn32r6el: binary-arch_mipsn32r6el_real binary-arch_mipsn32r6el_real:: setup_mipsn32r6el binary-arch_mipsn32r6el_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsr6:: binary-arch_mipsr6_none binary-arch_mipsr6_real binary-arch_mipsr6:: - $(MAKE) -f debian/rules.real install-udeb_mipsr6 ABINAME='4.19.0-8' ARCH='mipsr6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-mips32r6-di nic-shared-modules-4.19.0-8-mips32r6-di loop-modules-4.19.0-8-mips32r6-di btrfs-modules-4.19.0-8-mips32r6-di ext4-modules-4.19.0-8-mips32r6-di isofs-modules-4.19.0-8-mips32r6-di jfs-modules-4.19.0-8-mips32r6-di xfs-modules-4.19.0-8-mips32r6-di md-modules-4.19.0-8-mips32r6-di multipath-modules-4.19.0-8-mips32r6-di crc-modules-4.19.0-8-mips32r6-di crypto-modules-4.19.0-8-mips32r6-di crypto-dm-modules-4.19.0-8-mips32r6-di nbd-modules-4.19.0-8-mips32r6-di squashfs-modules-4.19.0-8-mips32r6-di zlib-modules-4.19.0-8-mips32r6-di compress-modules-4.19.0-8-mips32r6-di udf-modules-4.19.0-8-mips32r6-di fuse-modules-4.19.0-8-mips32r6-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mipsr6 ABINAME='4.19.0-9' ARCH='mipsr6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-mips32r6-di nic-shared-modules-4.19.0-9-mips32r6-di loop-modules-4.19.0-9-mips32r6-di btrfs-modules-4.19.0-9-mips32r6-di ext4-modules-4.19.0-9-mips32r6-di isofs-modules-4.19.0-9-mips32r6-di jfs-modules-4.19.0-9-mips32r6-di xfs-modules-4.19.0-9-mips32r6-di md-modules-4.19.0-9-mips32r6-di multipath-modules-4.19.0-9-mips32r6-di crc-modules-4.19.0-9-mips32r6-di crypto-modules-4.19.0-9-mips32r6-di crypto-dm-modules-4.19.0-9-mips32r6-di nbd-modules-4.19.0-9-mips32r6-di squashfs-modules-4.19.0-9-mips32r6-di zlib-modules-4.19.0-9-mips32r6-di compress-modules-4.19.0-9-mips32r6-di udf-modules-4.19.0-9-mips32r6-di fuse-modules-4.19.0-9-mips32r6-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mipsr6_none: binary-arch_mipsr6_none_mips32r6 binary-arch_mipsr6_none_mips64r6 binary-arch_mipsr6_none_real binary-arch_mipsr6_none_mips32r6: binary-arch_mipsr6_none_mips32r6_real binary-arch_mipsr6_none_mips32r6_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsr6_none_mips64r6: binary-arch_mipsr6_none_mips64r6_real binary-arch_mipsr6_none_mips64r6_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsr6_none_real: binary-arch_mipsr6_real:: setup_mipsr6 binary-arch_mipsr6_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mipsr6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mipsr6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsr6el:: binary-arch_mipsr6el_none binary-arch_mipsr6el_real binary-arch_mipsr6el:: - $(MAKE) -f debian/rules.real install-udeb_mipsr6el ABINAME='4.19.0-8' ARCH='mipsr6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-mips32r6el-di nic-shared-modules-4.19.0-8-mips32r6el-di loop-modules-4.19.0-8-mips32r6el-di btrfs-modules-4.19.0-8-mips32r6el-di ext4-modules-4.19.0-8-mips32r6el-di isofs-modules-4.19.0-8-mips32r6el-di jfs-modules-4.19.0-8-mips32r6el-di xfs-modules-4.19.0-8-mips32r6el-di md-modules-4.19.0-8-mips32r6el-di multipath-modules-4.19.0-8-mips32r6el-di crc-modules-4.19.0-8-mips32r6el-di crypto-modules-4.19.0-8-mips32r6el-di crypto-dm-modules-4.19.0-8-mips32r6el-di nbd-modules-4.19.0-8-mips32r6el-di squashfs-modules-4.19.0-8-mips32r6el-di zlib-modules-4.19.0-8-mips32r6el-di compress-modules-4.19.0-8-mips32r6el-di udf-modules-4.19.0-8-mips32r6el-di fuse-modules-4.19.0-8-mips32r6el-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_mipsr6el ABINAME='4.19.0-9' ARCH='mipsr6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-mips32r6el-di nic-shared-modules-4.19.0-9-mips32r6el-di loop-modules-4.19.0-9-mips32r6el-di btrfs-modules-4.19.0-9-mips32r6el-di ext4-modules-4.19.0-9-mips32r6el-di isofs-modules-4.19.0-9-mips32r6el-di jfs-modules-4.19.0-9-mips32r6el-di xfs-modules-4.19.0-9-mips32r6el-di md-modules-4.19.0-9-mips32r6el-di multipath-modules-4.19.0-9-mips32r6el-di crc-modules-4.19.0-9-mips32r6el-di crypto-modules-4.19.0-9-mips32r6el-di crypto-dm-modules-4.19.0-9-mips32r6el-di nbd-modules-4.19.0-9-mips32r6el-di squashfs-modules-4.19.0-9-mips32r6el-di zlib-modules-4.19.0-9-mips32r6el-di compress-modules-4.19.0-9-mips32r6el-di udf-modules-4.19.0-9-mips32r6el-di fuse-modules-4.19.0-9-mips32r6el-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_mipsr6el_none: binary-arch_mipsr6el_none_mips32r6el binary-arch_mipsr6el_none_mips64r6el binary-arch_mipsr6el_none_real binary-arch_mipsr6el_none_mips32r6el: binary-arch_mipsr6el_none_mips32r6el_real binary-arch_mipsr6el_none_mips32r6el_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsr6el_none_mips64r6el: binary-arch_mipsr6el_none_mips64r6el_real binary-arch_mipsr6el_none_mips64r6el_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_mipsr6el_none_real: binary-arch_mipsr6el_real:: setup_mipsr6el binary-arch_mipsr6el_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='mipsr6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='mipsr6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_powerpc:: binary-arch_powerpc_none binary-arch_powerpc_real binary-arch_powerpc:: - $(MAKE) -f debian/rules.real install-udeb_powerpc ABINAME='4.19.0-8' ARCH='powerpc' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-powerpc-di nic-modules-4.19.0-8-powerpc-di nic-wireless-modules-4.19.0-8-powerpc-di nic-shared-modules-4.19.0-8-powerpc-di serial-modules-4.19.0-8-powerpc-di usb-serial-modules-4.19.0-8-powerpc-di ppp-modules-4.19.0-8-powerpc-di pata-modules-4.19.0-8-powerpc-di cdrom-core-modules-4.19.0-8-powerpc-di firewire-core-modules-4.19.0-8-powerpc-di scsi-core-modules-4.19.0-8-powerpc-di scsi-modules-4.19.0-8-powerpc-di scsi-nic-modules-4.19.0-8-powerpc-di loop-modules-4.19.0-8-powerpc-di btrfs-modules-4.19.0-8-powerpc-di ext4-modules-4.19.0-8-powerpc-di isofs-modules-4.19.0-8-powerpc-di jfs-modules-4.19.0-8-powerpc-di xfs-modules-4.19.0-8-powerpc-di fat-modules-4.19.0-8-powerpc-di hfs-modules-4.19.0-8-powerpc-di affs-modules-4.19.0-8-powerpc-di md-modules-4.19.0-8-powerpc-di multipath-modules-4.19.0-8-powerpc-di usb-modules-4.19.0-8-powerpc-di usb-storage-modules-4.19.0-8-powerpc-di pcmcia-storage-modules-4.19.0-8-powerpc-di fb-modules-4.19.0-8-powerpc-di input-modules-4.19.0-8-powerpc-di event-modules-4.19.0-8-powerpc-di mouse-modules-4.19.0-8-powerpc-di nic-pcmcia-modules-4.19.0-8-powerpc-di pcmcia-modules-4.19.0-8-powerpc-di nic-usb-modules-4.19.0-8-powerpc-di sata-modules-4.19.0-8-powerpc-di crc-modules-4.19.0-8-powerpc-di crypto-modules-4.19.0-8-powerpc-di crypto-dm-modules-4.19.0-8-powerpc-di ata-modules-4.19.0-8-powerpc-di mmc-core-modules-4.19.0-8-powerpc-di nbd-modules-4.19.0-8-powerpc-di squashfs-modules-4.19.0-8-powerpc-di uinput-modules-4.19.0-8-powerpc-di zlib-modules-4.19.0-8-powerpc-di compress-modules-4.19.0-8-powerpc-di udf-modules-4.19.0-8-powerpc-di fuse-modules-4.19.0-8-powerpc-di kernel-image-4.19.0-8-powerpc64-di nic-modules-4.19.0-8-powerpc64-di nic-wireless-modules-4.19.0-8-powerpc64-di nic-shared-modules-4.19.0-8-powerpc64-di serial-modules-4.19.0-8-powerpc64-di usb-serial-modules-4.19.0-8-powerpc64-di ppp-modules-4.19.0-8-powerpc64-di pata-modules-4.19.0-8-powerpc64-di cdrom-core-modules-4.19.0-8-powerpc64-di firewire-core-modules-4.19.0-8-powerpc64-di scsi-core-modules-4.19.0-8-powerpc64-di scsi-modules-4.19.0-8-powerpc64-di scsi-nic-modules-4.19.0-8-powerpc64-di loop-modules-4.19.0-8-powerpc64-di btrfs-modules-4.19.0-8-powerpc64-di ext4-modules-4.19.0-8-powerpc64-di isofs-modules-4.19.0-8-powerpc64-di jfs-modules-4.19.0-8-powerpc64-di xfs-modules-4.19.0-8-powerpc64-di fat-modules-4.19.0-8-powerpc64-di hfs-modules-4.19.0-8-powerpc64-di affs-modules-4.19.0-8-powerpc64-di md-modules-4.19.0-8-powerpc64-di multipath-modules-4.19.0-8-powerpc64-di usb-modules-4.19.0-8-powerpc64-di usb-storage-modules-4.19.0-8-powerpc64-di pcmcia-storage-modules-4.19.0-8-powerpc64-di fb-modules-4.19.0-8-powerpc64-di input-modules-4.19.0-8-powerpc64-di event-modules-4.19.0-8-powerpc64-di mouse-modules-4.19.0-8-powerpc64-di nic-pcmcia-modules-4.19.0-8-powerpc64-di pcmcia-modules-4.19.0-8-powerpc64-di nic-usb-modules-4.19.0-8-powerpc64-di sata-modules-4.19.0-8-powerpc64-di i2c-modules-4.19.0-8-powerpc64-di crc-modules-4.19.0-8-powerpc64-di crypto-modules-4.19.0-8-powerpc64-di crypto-dm-modules-4.19.0-8-powerpc64-di ata-modules-4.19.0-8-powerpc64-di mmc-core-modules-4.19.0-8-powerpc64-di nbd-modules-4.19.0-8-powerpc64-di squashfs-modules-4.19.0-8-powerpc64-di uinput-modules-4.19.0-8-powerpc64-di compress-modules-4.19.0-8-powerpc64-di udf-modules-4.19.0-8-powerpc64-di fuse-modules-4.19.0-8-powerpc64-di mtd-core-modules-4.19.0-8-powerpc64-di hypervisor-modules-4.19.0-8-powerpc64-di fancontrol-modules-4.19.0-8-powerpc64-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_powerpc ABINAME='4.19.0-9' ARCH='powerpc' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-powerpc-di nic-modules-4.19.0-9-powerpc-di nic-wireless-modules-4.19.0-9-powerpc-di nic-shared-modules-4.19.0-9-powerpc-di serial-modules-4.19.0-9-powerpc-di usb-serial-modules-4.19.0-9-powerpc-di ppp-modules-4.19.0-9-powerpc-di pata-modules-4.19.0-9-powerpc-di cdrom-core-modules-4.19.0-9-powerpc-di firewire-core-modules-4.19.0-9-powerpc-di scsi-core-modules-4.19.0-9-powerpc-di scsi-modules-4.19.0-9-powerpc-di scsi-nic-modules-4.19.0-9-powerpc-di loop-modules-4.19.0-9-powerpc-di btrfs-modules-4.19.0-9-powerpc-di ext4-modules-4.19.0-9-powerpc-di isofs-modules-4.19.0-9-powerpc-di jfs-modules-4.19.0-9-powerpc-di xfs-modules-4.19.0-9-powerpc-di fat-modules-4.19.0-9-powerpc-di hfs-modules-4.19.0-9-powerpc-di affs-modules-4.19.0-9-powerpc-di md-modules-4.19.0-9-powerpc-di multipath-modules-4.19.0-9-powerpc-di usb-modules-4.19.0-9-powerpc-di usb-storage-modules-4.19.0-9-powerpc-di pcmcia-storage-modules-4.19.0-9-powerpc-di fb-modules-4.19.0-9-powerpc-di input-modules-4.19.0-9-powerpc-di event-modules-4.19.0-9-powerpc-di mouse-modules-4.19.0-9-powerpc-di nic-pcmcia-modules-4.19.0-9-powerpc-di pcmcia-modules-4.19.0-9-powerpc-di nic-usb-modules-4.19.0-9-powerpc-di sata-modules-4.19.0-9-powerpc-di crc-modules-4.19.0-9-powerpc-di crypto-modules-4.19.0-9-powerpc-di crypto-dm-modules-4.19.0-9-powerpc-di ata-modules-4.19.0-9-powerpc-di mmc-core-modules-4.19.0-9-powerpc-di nbd-modules-4.19.0-9-powerpc-di squashfs-modules-4.19.0-9-powerpc-di uinput-modules-4.19.0-9-powerpc-di zlib-modules-4.19.0-9-powerpc-di compress-modules-4.19.0-9-powerpc-di udf-modules-4.19.0-9-powerpc-di fuse-modules-4.19.0-9-powerpc-di kernel-image-4.19.0-9-powerpc64-di nic-modules-4.19.0-9-powerpc64-di nic-wireless-modules-4.19.0-9-powerpc64-di nic-shared-modules-4.19.0-9-powerpc64-di serial-modules-4.19.0-9-powerpc64-di usb-serial-modules-4.19.0-9-powerpc64-di ppp-modules-4.19.0-9-powerpc64-di pata-modules-4.19.0-9-powerpc64-di cdrom-core-modules-4.19.0-9-powerpc64-di firewire-core-modules-4.19.0-9-powerpc64-di scsi-core-modules-4.19.0-9-powerpc64-di scsi-modules-4.19.0-9-powerpc64-di scsi-nic-modules-4.19.0-9-powerpc64-di loop-modules-4.19.0-9-powerpc64-di btrfs-modules-4.19.0-9-powerpc64-di ext4-modules-4.19.0-9-powerpc64-di isofs-modules-4.19.0-9-powerpc64-di jfs-modules-4.19.0-9-powerpc64-di xfs-modules-4.19.0-9-powerpc64-di fat-modules-4.19.0-9-powerpc64-di hfs-modules-4.19.0-9-powerpc64-di affs-modules-4.19.0-9-powerpc64-di md-modules-4.19.0-9-powerpc64-di multipath-modules-4.19.0-9-powerpc64-di usb-modules-4.19.0-9-powerpc64-di usb-storage-modules-4.19.0-9-powerpc64-di pcmcia-storage-modules-4.19.0-9-powerpc64-di fb-modules-4.19.0-9-powerpc64-di input-modules-4.19.0-9-powerpc64-di event-modules-4.19.0-9-powerpc64-di mouse-modules-4.19.0-9-powerpc64-di nic-pcmcia-modules-4.19.0-9-powerpc64-di pcmcia-modules-4.19.0-9-powerpc64-di nic-usb-modules-4.19.0-9-powerpc64-di sata-modules-4.19.0-9-powerpc64-di i2c-modules-4.19.0-9-powerpc64-di crc-modules-4.19.0-9-powerpc64-di crypto-modules-4.19.0-9-powerpc64-di crypto-dm-modules-4.19.0-9-powerpc64-di ata-modules-4.19.0-9-powerpc64-di mmc-core-modules-4.19.0-9-powerpc64-di nbd-modules-4.19.0-9-powerpc64-di squashfs-modules-4.19.0-9-powerpc64-di uinput-modules-4.19.0-9-powerpc64-di compress-modules-4.19.0-9-powerpc64-di udf-modules-4.19.0-9-powerpc64-di fuse-modules-4.19.0-9-powerpc64-di mtd-core-modules-4.19.0-9-powerpc64-di hypervisor-modules-4.19.0-9-powerpc64-di fancontrol-modules-4.19.0-9-powerpc64-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_powerpc_none: binary-arch_powerpc_none_powerpc binary-arch_powerpc_none_powerpc-smp binary-arch_powerpc_none_powerpc64 binary-arch_powerpc_none_real binary-arch_powerpc_none_powerpc: binary-arch_powerpc_none_powerpc_real binary-arch_powerpc_none_powerpc-smp: binary-arch_powerpc_none_powerpc-smp_real binary-arch_powerpc_none_powerpc-smp_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_powerpc_none_powerpc64: binary-arch_powerpc_none_powerpc64_real binary-arch_powerpc_none_powerpc64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_powerpc_none_powerpc_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_powerpc_none_real: binary-arch_powerpc_real:: setup_powerpc binary-arch_powerpc_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='powerpc' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='powerpc' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_powerpcspe: binary-arch_powerpcspe_none binary-arch_powerpcspe_real binary-arch_powerpcspe_none: binary-arch_powerpcspe_none_powerpcspe binary-arch_powerpcspe_none_real binary-arch_powerpcspe_none_powerpcspe: binary-arch_powerpcspe_none_powerpcspe_real binary-arch_powerpcspe_none_powerpcspe_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_powerpcspe_none_real: binary-arch_powerpcspe_real:: setup_powerpcspe binary-arch_powerpcspe_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='powerpcspe' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='powerpcspe' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_ppc64:: binary-arch_ppc64_none binary-arch_ppc64_real binary-arch_ppc64:: - $(MAKE) -f debian/rules.real install-udeb_ppc64 ABINAME='4.19.0-8' ARCH='ppc64' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-powerpc64-di nic-modules-4.19.0-8-powerpc64-di nic-wireless-modules-4.19.0-8-powerpc64-di nic-shared-modules-4.19.0-8-powerpc64-di serial-modules-4.19.0-8-powerpc64-di usb-serial-modules-4.19.0-8-powerpc64-di ppp-modules-4.19.0-8-powerpc64-di pata-modules-4.19.0-8-powerpc64-di cdrom-core-modules-4.19.0-8-powerpc64-di firewire-core-modules-4.19.0-8-powerpc64-di scsi-core-modules-4.19.0-8-powerpc64-di scsi-modules-4.19.0-8-powerpc64-di scsi-nic-modules-4.19.0-8-powerpc64-di loop-modules-4.19.0-8-powerpc64-di btrfs-modules-4.19.0-8-powerpc64-di ext4-modules-4.19.0-8-powerpc64-di isofs-modules-4.19.0-8-powerpc64-di jfs-modules-4.19.0-8-powerpc64-di xfs-modules-4.19.0-8-powerpc64-di fat-modules-4.19.0-8-powerpc64-di hfs-modules-4.19.0-8-powerpc64-di affs-modules-4.19.0-8-powerpc64-di md-modules-4.19.0-8-powerpc64-di multipath-modules-4.19.0-8-powerpc64-di usb-modules-4.19.0-8-powerpc64-di usb-storage-modules-4.19.0-8-powerpc64-di pcmcia-storage-modules-4.19.0-8-powerpc64-di fb-modules-4.19.0-8-powerpc64-di input-modules-4.19.0-8-powerpc64-di event-modules-4.19.0-8-powerpc64-di mouse-modules-4.19.0-8-powerpc64-di nic-pcmcia-modules-4.19.0-8-powerpc64-di pcmcia-modules-4.19.0-8-powerpc64-di nic-usb-modules-4.19.0-8-powerpc64-di sata-modules-4.19.0-8-powerpc64-di i2c-modules-4.19.0-8-powerpc64-di crc-modules-4.19.0-8-powerpc64-di crypto-modules-4.19.0-8-powerpc64-di crypto-dm-modules-4.19.0-8-powerpc64-di ata-modules-4.19.0-8-powerpc64-di mmc-core-modules-4.19.0-8-powerpc64-di nbd-modules-4.19.0-8-powerpc64-di squashfs-modules-4.19.0-8-powerpc64-di uinput-modules-4.19.0-8-powerpc64-di compress-modules-4.19.0-8-powerpc64-di udf-modules-4.19.0-8-powerpc64-di fuse-modules-4.19.0-8-powerpc64-di mtd-core-modules-4.19.0-8-powerpc64-di hypervisor-modules-4.19.0-8-powerpc64-di fancontrol-modules-4.19.0-8-powerpc64-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_ppc64 ABINAME='4.19.0-9' ARCH='ppc64' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-powerpc64-di nic-modules-4.19.0-9-powerpc64-di nic-wireless-modules-4.19.0-9-powerpc64-di nic-shared-modules-4.19.0-9-powerpc64-di serial-modules-4.19.0-9-powerpc64-di usb-serial-modules-4.19.0-9-powerpc64-di ppp-modules-4.19.0-9-powerpc64-di pata-modules-4.19.0-9-powerpc64-di cdrom-core-modules-4.19.0-9-powerpc64-di firewire-core-modules-4.19.0-9-powerpc64-di scsi-core-modules-4.19.0-9-powerpc64-di scsi-modules-4.19.0-9-powerpc64-di scsi-nic-modules-4.19.0-9-powerpc64-di loop-modules-4.19.0-9-powerpc64-di btrfs-modules-4.19.0-9-powerpc64-di ext4-modules-4.19.0-9-powerpc64-di isofs-modules-4.19.0-9-powerpc64-di jfs-modules-4.19.0-9-powerpc64-di xfs-modules-4.19.0-9-powerpc64-di fat-modules-4.19.0-9-powerpc64-di hfs-modules-4.19.0-9-powerpc64-di affs-modules-4.19.0-9-powerpc64-di md-modules-4.19.0-9-powerpc64-di multipath-modules-4.19.0-9-powerpc64-di usb-modules-4.19.0-9-powerpc64-di usb-storage-modules-4.19.0-9-powerpc64-di pcmcia-storage-modules-4.19.0-9-powerpc64-di fb-modules-4.19.0-9-powerpc64-di input-modules-4.19.0-9-powerpc64-di event-modules-4.19.0-9-powerpc64-di mouse-modules-4.19.0-9-powerpc64-di nic-pcmcia-modules-4.19.0-9-powerpc64-di pcmcia-modules-4.19.0-9-powerpc64-di nic-usb-modules-4.19.0-9-powerpc64-di sata-modules-4.19.0-9-powerpc64-di i2c-modules-4.19.0-9-powerpc64-di crc-modules-4.19.0-9-powerpc64-di crypto-modules-4.19.0-9-powerpc64-di crypto-dm-modules-4.19.0-9-powerpc64-di ata-modules-4.19.0-9-powerpc64-di mmc-core-modules-4.19.0-9-powerpc64-di nbd-modules-4.19.0-9-powerpc64-di squashfs-modules-4.19.0-9-powerpc64-di uinput-modules-4.19.0-9-powerpc64-di compress-modules-4.19.0-9-powerpc64-di udf-modules-4.19.0-9-powerpc64-di fuse-modules-4.19.0-9-powerpc64-di mtd-core-modules-4.19.0-9-powerpc64-di hypervisor-modules-4.19.0-9-powerpc64-di fancontrol-modules-4.19.0-9-powerpc64-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_ppc64_none: binary-arch_ppc64_none_powerpc64 binary-arch_ppc64_none_real binary-arch_ppc64_none_powerpc64: binary-arch_ppc64_none_powerpc64_real binary-arch_ppc64_none_powerpc64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_ppc64_none_real: binary-arch_ppc64_real:: setup_ppc64 binary-arch_ppc64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='ppc64' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='ppc64' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_ppc64el:: binary-arch_ppc64el_none binary-arch_ppc64el_real binary-arch_ppc64el:: - $(MAKE) -f debian/rules.real install-udeb_ppc64el ABINAME='4.19.0-8' ARCH='ppc64el' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-powerpc64le-di nic-modules-4.19.0-8-powerpc64le-di nic-wireless-modules-4.19.0-8-powerpc64le-di nic-shared-modules-4.19.0-8-powerpc64le-di serial-modules-4.19.0-8-powerpc64le-di usb-serial-modules-4.19.0-8-powerpc64le-di ppp-modules-4.19.0-8-powerpc64le-di cdrom-core-modules-4.19.0-8-powerpc64le-di firewire-core-modules-4.19.0-8-powerpc64le-di scsi-core-modules-4.19.0-8-powerpc64le-di scsi-modules-4.19.0-8-powerpc64le-di scsi-nic-modules-4.19.0-8-powerpc64le-di loop-modules-4.19.0-8-powerpc64le-di btrfs-modules-4.19.0-8-powerpc64le-di ext4-modules-4.19.0-8-powerpc64le-di isofs-modules-4.19.0-8-powerpc64le-di jfs-modules-4.19.0-8-powerpc64le-di xfs-modules-4.19.0-8-powerpc64le-di fat-modules-4.19.0-8-powerpc64le-di md-modules-4.19.0-8-powerpc64le-di multipath-modules-4.19.0-8-powerpc64le-di usb-modules-4.19.0-8-powerpc64le-di usb-storage-modules-4.19.0-8-powerpc64le-di fb-modules-4.19.0-8-powerpc64le-di input-modules-4.19.0-8-powerpc64le-di event-modules-4.19.0-8-powerpc64le-di mouse-modules-4.19.0-8-powerpc64le-di nic-usb-modules-4.19.0-8-powerpc64le-di sata-modules-4.19.0-8-powerpc64le-di i2c-modules-4.19.0-8-powerpc64le-di crc-modules-4.19.0-8-powerpc64le-di crypto-modules-4.19.0-8-powerpc64le-di crypto-dm-modules-4.19.0-8-powerpc64le-di ata-modules-4.19.0-8-powerpc64le-di nbd-modules-4.19.0-8-powerpc64le-di squashfs-modules-4.19.0-8-powerpc64le-di uinput-modules-4.19.0-8-powerpc64le-di compress-modules-4.19.0-8-powerpc64le-di udf-modules-4.19.0-8-powerpc64le-di fuse-modules-4.19.0-8-powerpc64le-di mtd-core-modules-4.19.0-8-powerpc64le-di hypervisor-modules-4.19.0-8-powerpc64le-di fancontrol-modules-4.19.0-8-powerpc64le-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_ppc64el ABINAME='4.19.0-9' ARCH='ppc64el' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-powerpc64le-di nic-modules-4.19.0-9-powerpc64le-di nic-wireless-modules-4.19.0-9-powerpc64le-di nic-shared-modules-4.19.0-9-powerpc64le-di serial-modules-4.19.0-9-powerpc64le-di usb-serial-modules-4.19.0-9-powerpc64le-di ppp-modules-4.19.0-9-powerpc64le-di cdrom-core-modules-4.19.0-9-powerpc64le-di firewire-core-modules-4.19.0-9-powerpc64le-di scsi-core-modules-4.19.0-9-powerpc64le-di scsi-modules-4.19.0-9-powerpc64le-di scsi-nic-modules-4.19.0-9-powerpc64le-di loop-modules-4.19.0-9-powerpc64le-di btrfs-modules-4.19.0-9-powerpc64le-di ext4-modules-4.19.0-9-powerpc64le-di isofs-modules-4.19.0-9-powerpc64le-di jfs-modules-4.19.0-9-powerpc64le-di xfs-modules-4.19.0-9-powerpc64le-di fat-modules-4.19.0-9-powerpc64le-di md-modules-4.19.0-9-powerpc64le-di multipath-modules-4.19.0-9-powerpc64le-di usb-modules-4.19.0-9-powerpc64le-di usb-storage-modules-4.19.0-9-powerpc64le-di fb-modules-4.19.0-9-powerpc64le-di input-modules-4.19.0-9-powerpc64le-di event-modules-4.19.0-9-powerpc64le-di mouse-modules-4.19.0-9-powerpc64le-di nic-usb-modules-4.19.0-9-powerpc64le-di sata-modules-4.19.0-9-powerpc64le-di i2c-modules-4.19.0-9-powerpc64le-di crc-modules-4.19.0-9-powerpc64le-di crypto-modules-4.19.0-9-powerpc64le-di crypto-dm-modules-4.19.0-9-powerpc64le-di ata-modules-4.19.0-9-powerpc64le-di nbd-modules-4.19.0-9-powerpc64le-di squashfs-modules-4.19.0-9-powerpc64le-di uinput-modules-4.19.0-9-powerpc64le-di compress-modules-4.19.0-9-powerpc64le-di udf-modules-4.19.0-9-powerpc64le-di fuse-modules-4.19.0-9-powerpc64le-di mtd-core-modules-4.19.0-9-powerpc64le-di hypervisor-modules-4.19.0-9-powerpc64le-di fancontrol-modules-4.19.0-9-powerpc64le-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_ppc64el_none: binary-arch_ppc64el_none_powerpc64le binary-arch_ppc64el_none_real binary-arch_ppc64el_none_powerpc64le: binary-arch_ppc64el_none_powerpc64le_real binary-arch_ppc64el_none_powerpc64le_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_ppc64el_none_real: binary-arch_ppc64el_real:: setup_ppc64el binary-arch_ppc64el_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='ppc64el' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='ppc64el' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_riscv64:: binary-arch_riscv64_none binary-arch_riscv64_real binary-arch_riscv64:: - $(MAKE) -f debian/rules.real install-udeb_riscv64 ABINAME='4.19.0-8' ARCH='riscv64' KERNEL_ARCH='riscv' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-riscv64-di nic-modules-4.19.0-8-riscv64-di nic-wireless-modules-4.19.0-8-riscv64-di nic-shared-modules-4.19.0-8-riscv64-di usb-serial-modules-4.19.0-8-riscv64-di ppp-modules-4.19.0-8-riscv64-di pata-modules-4.19.0-8-riscv64-di cdrom-core-modules-4.19.0-8-riscv64-di scsi-core-modules-4.19.0-8-riscv64-di scsi-modules-4.19.0-8-riscv64-di scsi-nic-modules-4.19.0-8-riscv64-di loop-modules-4.19.0-8-riscv64-di btrfs-modules-4.19.0-8-riscv64-di ext4-modules-4.19.0-8-riscv64-di isofs-modules-4.19.0-8-riscv64-di jfs-modules-4.19.0-8-riscv64-di fat-modules-4.19.0-8-riscv64-di md-modules-4.19.0-8-riscv64-di multipath-modules-4.19.0-8-riscv64-di usb-modules-4.19.0-8-riscv64-di usb-storage-modules-4.19.0-8-riscv64-di fb-modules-4.19.0-8-riscv64-di input-modules-4.19.0-8-riscv64-di event-modules-4.19.0-8-riscv64-di nic-usb-modules-4.19.0-8-riscv64-di sata-modules-4.19.0-8-riscv64-di i2c-modules-4.19.0-8-riscv64-di crc-modules-4.19.0-8-riscv64-di crypto-modules-4.19.0-8-riscv64-di crypto-dm-modules-4.19.0-8-riscv64-di ata-modules-4.19.0-8-riscv64-di nbd-modules-4.19.0-8-riscv64-di squashfs-modules-4.19.0-8-riscv64-di zlib-modules-4.19.0-8-riscv64-di compress-modules-4.19.0-8-riscv64-di udf-modules-4.19.0-8-riscv64-di fuse-modules-4.19.0-8-riscv64-di mtd-modules-4.19.0-8-riscv64-di mtd-core-modules-4.19.0-8-riscv64-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_riscv64 ABINAME='4.19.0-9' ARCH='riscv64' KERNEL_ARCH='riscv' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-riscv64-di nic-modules-4.19.0-9-riscv64-di nic-wireless-modules-4.19.0-9-riscv64-di nic-shared-modules-4.19.0-9-riscv64-di usb-serial-modules-4.19.0-9-riscv64-di ppp-modules-4.19.0-9-riscv64-di pata-modules-4.19.0-9-riscv64-di cdrom-core-modules-4.19.0-9-riscv64-di scsi-core-modules-4.19.0-9-riscv64-di scsi-modules-4.19.0-9-riscv64-di scsi-nic-modules-4.19.0-9-riscv64-di loop-modules-4.19.0-9-riscv64-di btrfs-modules-4.19.0-9-riscv64-di ext4-modules-4.19.0-9-riscv64-di isofs-modules-4.19.0-9-riscv64-di jfs-modules-4.19.0-9-riscv64-di fat-modules-4.19.0-9-riscv64-di md-modules-4.19.0-9-riscv64-di multipath-modules-4.19.0-9-riscv64-di usb-modules-4.19.0-9-riscv64-di usb-storage-modules-4.19.0-9-riscv64-di fb-modules-4.19.0-9-riscv64-di input-modules-4.19.0-9-riscv64-di event-modules-4.19.0-9-riscv64-di nic-usb-modules-4.19.0-9-riscv64-di sata-modules-4.19.0-9-riscv64-di i2c-modules-4.19.0-9-riscv64-di crc-modules-4.19.0-9-riscv64-di crypto-modules-4.19.0-9-riscv64-di crypto-dm-modules-4.19.0-9-riscv64-di ata-modules-4.19.0-9-riscv64-di nbd-modules-4.19.0-9-riscv64-di squashfs-modules-4.19.0-9-riscv64-di zlib-modules-4.19.0-9-riscv64-di compress-modules-4.19.0-9-riscv64-di udf-modules-4.19.0-9-riscv64-di fuse-modules-4.19.0-9-riscv64-di mtd-modules-4.19.0-9-riscv64-di mtd-core-modules-4.19.0-9-riscv64-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_riscv64_none: binary-arch_riscv64_none_real binary-arch_riscv64_none_riscv64 binary-arch_riscv64_none_real: binary-arch_riscv64_none_riscv64: binary-arch_riscv64_none_riscv64_real binary-arch_riscv64_none_riscv64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_riscv64_real:: setup_riscv64 binary-arch_riscv64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='riscv64' KERNEL_ARCH='riscv' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='riscv64' KERNEL_ARCH='riscv' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_s390: binary-arch_s390_extra binary-arch_s390_real binary-arch_s390_extra:: $(MAKE) -f debian/rules.real install-dummy ARCH='s390' DH_OPTIONS='-plinux-compiler-gcc-8-s390' binary-arch_s390_real:: setup_s390 binary-arch_s390_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='s390' KERNEL_ARCH='s390' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='s390' KERNEL_ARCH='s390' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_s390x:: binary-arch_s390x_extra binary-arch_s390x_none binary-arch_s390x_real binary-arch_s390x:: - $(MAKE) -f debian/rules.real install-udeb_s390x ABINAME='4.19.0-8' ARCH='s390x' KERNEL_ARCH='s390' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-s390x-di nic-modules-4.19.0-8-s390x-di cdrom-core-modules-4.19.0-8-s390x-di scsi-core-modules-4.19.0-8-s390x-di scsi-modules-4.19.0-8-s390x-di loop-modules-4.19.0-8-s390x-di btrfs-modules-4.19.0-8-s390x-di ext4-modules-4.19.0-8-s390x-di isofs-modules-4.19.0-8-s390x-di xfs-modules-4.19.0-8-s390x-di fat-modules-4.19.0-8-s390x-di md-modules-4.19.0-8-s390x-di multipath-modules-4.19.0-8-s390x-di crc-modules-4.19.0-8-s390x-di crypto-modules-4.19.0-8-s390x-di crypto-dm-modules-4.19.0-8-s390x-di nbd-modules-4.19.0-8-s390x-di zlib-modules-4.19.0-8-s390x-di compress-modules-4.19.0-8-s390x-di udf-modules-4.19.0-8-s390x-di fuse-modules-4.19.0-8-s390x-di mtd-core-modules-4.19.0-8-s390x-di dasd-modules-4.19.0-8-s390x-di dasd-extra-modules-4.19.0-8-s390x-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_s390x ABINAME='4.19.0-9' ARCH='s390x' KERNEL_ARCH='s390' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-s390x-di nic-modules-4.19.0-9-s390x-di cdrom-core-modules-4.19.0-9-s390x-di scsi-core-modules-4.19.0-9-s390x-di scsi-modules-4.19.0-9-s390x-di loop-modules-4.19.0-9-s390x-di btrfs-modules-4.19.0-9-s390x-di ext4-modules-4.19.0-9-s390x-di isofs-modules-4.19.0-9-s390x-di xfs-modules-4.19.0-9-s390x-di fat-modules-4.19.0-9-s390x-di md-modules-4.19.0-9-s390x-di multipath-modules-4.19.0-9-s390x-di crc-modules-4.19.0-9-s390x-di crypto-modules-4.19.0-9-s390x-di crypto-dm-modules-4.19.0-9-s390x-di nbd-modules-4.19.0-9-s390x-di zlib-modules-4.19.0-9-s390x-di compress-modules-4.19.0-9-s390x-di udf-modules-4.19.0-9-s390x-di fuse-modules-4.19.0-9-s390x-di mtd-core-modules-4.19.0-9-s390x-di dasd-modules-4.19.0-9-s390x-di dasd-extra-modules-4.19.0-9-s390x-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_s390x_extra:: $(MAKE) -f debian/rules.real install-dummy ARCH='s390x' DH_OPTIONS='-plinux-compiler-gcc-8-s390' binary-arch_s390x_none: binary-arch_s390x_none_real binary-arch_s390x_none_s390x binary-arch_s390x_none_real: binary-arch_s390x_none_s390x: binary-arch_s390x_none_s390x_real binary-arch_s390x_none_s390x_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' binary-arch_s390x_real:: setup_s390x binary-arch_s390x_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='s390x' KERNEL_ARCH='s390' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='s390x' KERNEL_ARCH='s390' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sh3: binary-arch_sh3_real binary-arch_sh3_real:: setup_sh3 binary-arch_sh3_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='sh3' KERNEL_ARCH='sh' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='sh3' KERNEL_ARCH='sh' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sh4:: binary-arch_sh4_none binary-arch_sh4_real binary-arch_sh4:: - $(MAKE) -f debian/rules.real install-udeb_sh4 ABINAME='4.19.0-8' ARCH='sh4' KERNEL_ARCH='sh' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-sh7751r-di nic-modules-4.19.0-8-sh7751r-di nic-shared-modules-4.19.0-8-sh7751r-di usb-serial-modules-4.19.0-8-sh7751r-di ppp-modules-4.19.0-8-sh7751r-di pata-modules-4.19.0-8-sh7751r-di cdrom-core-modules-4.19.0-8-sh7751r-di firewire-core-modules-4.19.0-8-sh7751r-di loop-modules-4.19.0-8-sh7751r-di btrfs-modules-4.19.0-8-sh7751r-di ext4-modules-4.19.0-8-sh7751r-di isofs-modules-4.19.0-8-sh7751r-di jfs-modules-4.19.0-8-sh7751r-di xfs-modules-4.19.0-8-sh7751r-di fat-modules-4.19.0-8-sh7751r-di minix-modules-4.19.0-8-sh7751r-di md-modules-4.19.0-8-sh7751r-di multipath-modules-4.19.0-8-sh7751r-di usb-storage-modules-4.19.0-8-sh7751r-di nic-usb-modules-4.19.0-8-sh7751r-di sata-modules-4.19.0-8-sh7751r-di i2c-modules-4.19.0-8-sh7751r-di crc-modules-4.19.0-8-sh7751r-di crypto-modules-4.19.0-8-sh7751r-di crypto-dm-modules-4.19.0-8-sh7751r-di nbd-modules-4.19.0-8-sh7751r-di squashfs-modules-4.19.0-8-sh7751r-di speakup-modules-4.19.0-8-sh7751r-di sound-modules-4.19.0-8-sh7751r-di zlib-modules-4.19.0-8-sh7751r-di compress-modules-4.19.0-8-sh7751r-di udf-modules-4.19.0-8-sh7751r-di fuse-modules-4.19.0-8-sh7751r-di kernel-image-4.19.0-8-sh7785lcr-di nic-modules-4.19.0-8-sh7785lcr-di nic-shared-modules-4.19.0-8-sh7785lcr-di usb-serial-modules-4.19.0-8-sh7785lcr-di ppp-modules-4.19.0-8-sh7785lcr-di pata-modules-4.19.0-8-sh7785lcr-di cdrom-core-modules-4.19.0-8-sh7785lcr-di firewire-core-modules-4.19.0-8-sh7785lcr-di loop-modules-4.19.0-8-sh7785lcr-di btrfs-modules-4.19.0-8-sh7785lcr-di ext4-modules-4.19.0-8-sh7785lcr-di isofs-modules-4.19.0-8-sh7785lcr-di jfs-modules-4.19.0-8-sh7785lcr-di xfs-modules-4.19.0-8-sh7785lcr-di fat-modules-4.19.0-8-sh7785lcr-di minix-modules-4.19.0-8-sh7785lcr-di md-modules-4.19.0-8-sh7785lcr-di multipath-modules-4.19.0-8-sh7785lcr-di nic-usb-modules-4.19.0-8-sh7785lcr-di sata-modules-4.19.0-8-sh7785lcr-di crc-modules-4.19.0-8-sh7785lcr-di crypto-modules-4.19.0-8-sh7785lcr-di crypto-dm-modules-4.19.0-8-sh7785lcr-di nbd-modules-4.19.0-8-sh7785lcr-di squashfs-modules-4.19.0-8-sh7785lcr-di speakup-modules-4.19.0-8-sh7785lcr-di sound-modules-4.19.0-8-sh7785lcr-di zlib-modules-4.19.0-8-sh7785lcr-di compress-modules-4.19.0-8-sh7785lcr-di udf-modules-4.19.0-8-sh7785lcr-di fuse-modules-4.19.0-8-sh7785lcr-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_sh4 ABINAME='4.19.0-9' ARCH='sh4' KERNEL_ARCH='sh' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-sh7751r-di nic-modules-4.19.0-9-sh7751r-di nic-shared-modules-4.19.0-9-sh7751r-di usb-serial-modules-4.19.0-9-sh7751r-di ppp-modules-4.19.0-9-sh7751r-di pata-modules-4.19.0-9-sh7751r-di cdrom-core-modules-4.19.0-9-sh7751r-di firewire-core-modules-4.19.0-9-sh7751r-di loop-modules-4.19.0-9-sh7751r-di btrfs-modules-4.19.0-9-sh7751r-di ext4-modules-4.19.0-9-sh7751r-di isofs-modules-4.19.0-9-sh7751r-di jfs-modules-4.19.0-9-sh7751r-di xfs-modules-4.19.0-9-sh7751r-di fat-modules-4.19.0-9-sh7751r-di minix-modules-4.19.0-9-sh7751r-di md-modules-4.19.0-9-sh7751r-di multipath-modules-4.19.0-9-sh7751r-di usb-storage-modules-4.19.0-9-sh7751r-di nic-usb-modules-4.19.0-9-sh7751r-di sata-modules-4.19.0-9-sh7751r-di i2c-modules-4.19.0-9-sh7751r-di crc-modules-4.19.0-9-sh7751r-di crypto-modules-4.19.0-9-sh7751r-di crypto-dm-modules-4.19.0-9-sh7751r-di nbd-modules-4.19.0-9-sh7751r-di squashfs-modules-4.19.0-9-sh7751r-di speakup-modules-4.19.0-9-sh7751r-di sound-modules-4.19.0-9-sh7751r-di zlib-modules-4.19.0-9-sh7751r-di compress-modules-4.19.0-9-sh7751r-di udf-modules-4.19.0-9-sh7751r-di fuse-modules-4.19.0-9-sh7751r-di kernel-image-4.19.0-9-sh7785lcr-di nic-modules-4.19.0-9-sh7785lcr-di nic-shared-modules-4.19.0-9-sh7785lcr-di usb-serial-modules-4.19.0-9-sh7785lcr-di ppp-modules-4.19.0-9-sh7785lcr-di pata-modules-4.19.0-9-sh7785lcr-di cdrom-core-modules-4.19.0-9-sh7785lcr-di firewire-core-modules-4.19.0-9-sh7785lcr-di loop-modules-4.19.0-9-sh7785lcr-di btrfs-modules-4.19.0-9-sh7785lcr-di ext4-modules-4.19.0-9-sh7785lcr-di isofs-modules-4.19.0-9-sh7785lcr-di jfs-modules-4.19.0-9-sh7785lcr-di xfs-modules-4.19.0-9-sh7785lcr-di fat-modules-4.19.0-9-sh7785lcr-di minix-modules-4.19.0-9-sh7785lcr-di md-modules-4.19.0-9-sh7785lcr-di multipath-modules-4.19.0-9-sh7785lcr-di nic-usb-modules-4.19.0-9-sh7785lcr-di sata-modules-4.19.0-9-sh7785lcr-di crc-modules-4.19.0-9-sh7785lcr-di crypto-modules-4.19.0-9-sh7785lcr-di crypto-dm-modules-4.19.0-9-sh7785lcr-di nbd-modules-4.19.0-9-sh7785lcr-di squashfs-modules-4.19.0-9-sh7785lcr-di speakup-modules-4.19.0-9-sh7785lcr-di sound-modules-4.19.0-9-sh7785lcr-di zlib-modules-4.19.0-9-sh7785lcr-di compress-modules-4.19.0-9-sh7785lcr-di udf-modules-4.19.0-9-sh7785lcr-di fuse-modules-4.19.0-9-sh7785lcr-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_sh4_none: binary-arch_sh4_none_real binary-arch_sh4_none_sh7751r binary-arch_sh4_none_sh7785lcr binary-arch_sh4_none_real: binary-arch_sh4_none_sh7751r: binary-arch_sh4_none_sh7751r_real binary-arch_sh4_none_sh7751r_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sh4_none_sh7785lcr: binary-arch_sh4_none_sh7785lcr_real binary-arch_sh4_none_sh7785lcr_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sh4_real:: setup_sh4 binary-arch_sh4_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='sh4' KERNEL_ARCH='sh' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='sh4' KERNEL_ARCH='sh' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sparc: binary-arch_sparc_real binary-arch_sparc64:: binary-arch_sparc64_none binary-arch_sparc64_real binary-arch_sparc64:: - $(MAKE) -f debian/rules.real install-udeb_sparc64 ABINAME='4.19.0-8' ARCH='sparc64' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-8-sparc64-di nic-modules-4.19.0-8-sparc64-di nic-shared-modules-4.19.0-8-sparc64-di usb-serial-modules-4.19.0-8-sparc64-di ppp-modules-4.19.0-8-sparc64-di pata-modules-4.19.0-8-sparc64-di cdrom-core-modules-4.19.0-8-sparc64-di scsi-core-modules-4.19.0-8-sparc64-di scsi-modules-4.19.0-8-sparc64-di btrfs-modules-4.19.0-8-sparc64-di ext4-modules-4.19.0-8-sparc64-di isofs-modules-4.19.0-8-sparc64-di jfs-modules-4.19.0-8-sparc64-di ufs-modules-4.19.0-8-sparc64-di xfs-modules-4.19.0-8-sparc64-di fat-modules-4.19.0-8-sparc64-di md-modules-4.19.0-8-sparc64-di multipath-modules-4.19.0-8-sparc64-di usb-modules-4.19.0-8-sparc64-di usb-storage-modules-4.19.0-8-sparc64-di fb-modules-4.19.0-8-sparc64-di input-modules-4.19.0-8-sparc64-di nic-usb-modules-4.19.0-8-sparc64-di sata-modules-4.19.0-8-sparc64-di i2c-modules-4.19.0-8-sparc64-di crc-modules-4.19.0-8-sparc64-di crypto-modules-4.19.0-8-sparc64-di crypto-dm-modules-4.19.0-8-sparc64-di ata-modules-4.19.0-8-sparc64-di nbd-modules-4.19.0-8-sparc64-di squashfs-modules-4.19.0-8-sparc64-di zlib-modules-4.19.0-8-sparc64-di compress-modules-4.19.0-8-sparc64-di udf-modules-4.19.0-8-sparc64-di fuse-modules-4.19.0-8-sparc64-di' UDEB_UNSIGNED_TEST_BUILD=False + $(MAKE) -f debian/rules.real install-udeb_sparc64 ABINAME='4.19.0-9' ARCH='sparc64' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' PACKAGE_NAMES='kernel-image-4.19.0-9-sparc64-di nic-modules-4.19.0-9-sparc64-di nic-shared-modules-4.19.0-9-sparc64-di usb-serial-modules-4.19.0-9-sparc64-di ppp-modules-4.19.0-9-sparc64-di pata-modules-4.19.0-9-sparc64-di cdrom-core-modules-4.19.0-9-sparc64-di scsi-core-modules-4.19.0-9-sparc64-di scsi-modules-4.19.0-9-sparc64-di btrfs-modules-4.19.0-9-sparc64-di ext4-modules-4.19.0-9-sparc64-di isofs-modules-4.19.0-9-sparc64-di jfs-modules-4.19.0-9-sparc64-di ufs-modules-4.19.0-9-sparc64-di xfs-modules-4.19.0-9-sparc64-di fat-modules-4.19.0-9-sparc64-di md-modules-4.19.0-9-sparc64-di multipath-modules-4.19.0-9-sparc64-di usb-modules-4.19.0-9-sparc64-di usb-storage-modules-4.19.0-9-sparc64-di fb-modules-4.19.0-9-sparc64-di input-modules-4.19.0-9-sparc64-di nic-usb-modules-4.19.0-9-sparc64-di sata-modules-4.19.0-9-sparc64-di i2c-modules-4.19.0-9-sparc64-di crc-modules-4.19.0-9-sparc64-di crypto-modules-4.19.0-9-sparc64-di crypto-dm-modules-4.19.0-9-sparc64-di ata-modules-4.19.0-9-sparc64-di nbd-modules-4.19.0-9-sparc64-di squashfs-modules-4.19.0-9-sparc64-di zlib-modules-4.19.0-9-sparc64-di compress-modules-4.19.0-9-sparc64-di udf-modules-4.19.0-9-sparc64-di fuse-modules-4.19.0-9-sparc64-di' UDEB_UNSIGNED_TEST_BUILD=False binary-arch_sparc64_none: binary-arch_sparc64_none_real binary-arch_sparc64_none_sparc64 binary-arch_sparc64_none_sparc64-smp binary-arch_sparc64_none_real: binary-arch_sparc64_none_sparc64: binary-arch_sparc64_none_sparc64_real binary-arch_sparc64_none_sparc64-smp: binary-arch_sparc64_none_sparc64-smp_real binary-arch_sparc64_none_sparc64-smp_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sparc64_none_sparc64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sparc64_real:: setup_sparc64 binary-arch_sparc64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='sparc64' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='sparc64' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_sparc_real:: setup_sparc binary-arch_sparc_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='sparc' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='sparc' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-arch_x32: binary-arch_x32_extra binary-arch_x32_real binary-arch_x32_extra:: $(MAKE) -f debian/rules.real install-dummy ARCH='x32' DH_OPTIONS='-plinux-compiler-gcc-8-x86' binary-arch_x32_real:: setup_x32 binary-arch_x32_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-8' ARCH='x32' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-arch-arch ABINAME='4.19.0-9' ARCH='x32' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-indep:: binary-indep_none binary-indep_rt binary-indep:: - $(MAKE) -f debian/rules.real binary-indep ABINAME='4.19.0-8' ALL_FEATURESETS='none rt' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-indep ABINAME='4.19.0-9' ALL_FEATURESETS='none rt' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-indep_none: binary-indep_none_real binary-indep_none_real:: - $(MAKE) -f debian/rules.real binary-indep-featureset ABINAME='4.19.0-8' ALL_KERNEL_ARCHES='alpha arm arm64 ia64 m68k mips parisc powerpc riscv s390 sh sparc x86' FEATURESET='none' LOCALVERSION='' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-indep-featureset ABINAME='4.19.0-9' ALL_KERNEL_ARCHES='alpha arm arm64 ia64 m68k mips parisc powerpc riscv s390 sh sparc x86' FEATURESET='none' LOCALVERSION='' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' binary-indep_rt: binary-indep_rt_real binary-indep_rt_real:: - $(MAKE) -f debian/rules.real binary-indep-featureset ABINAME='4.19.0-8' ALL_KERNEL_ARCHES='arm arm64 x86' FEATURESET='rt' LOCALVERSION='-rt' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real binary-indep-featureset ABINAME='4.19.0-9' ALL_KERNEL_ARCHES='arm arm64 x86' FEATURESET='rt' LOCALVERSION='-rt' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch: build-arch_alpha build-arch_amd64 build-arch_arm64 build-arch_arm64ilp32 build-arch_armel build-arch_armhf build-arch_hppa build-arch_i386 build-arch_ia64 build-arch_m68k build-arch_mips build-arch_mips64 build-arch_mips64el build-arch_mips64r6 build-arch_mips64r6el build-arch_mipsel build-arch_mipsn32 build-arch_mipsn32el build-arch_mipsn32r6 build-arch_mipsn32r6el build-arch_mipsr6 build-arch_mipsr6el build-arch_powerpc build-arch_powerpcspe build-arch_ppc64 build-arch_ppc64el build-arch_riscv64 build-arch_s390 build-arch_s390x build-arch_sh3 build-arch_sh4 build-arch_sparc build-arch_sparc64 build-arch_x32 build-arch_alpha: build-arch_alpha_none build-arch_alpha_real build-arch_alpha_none: build-arch_alpha_none_alpha-generic build-arch_alpha_none_alpha-smp build-arch_alpha_none_real build-arch_alpha_none_alpha-generic: build-arch_alpha_none_alpha-generic_real build-arch_alpha_none_alpha-generic_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_alpha_none_alpha-smp: build-arch_alpha_none_alpha-smp_real build-arch_alpha_none_alpha-smp_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_alpha_none_real: build-arch_alpha_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='alpha' KERNEL_ARCH='alpha' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='alpha' KERNEL_ARCH='alpha' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_amd64: build-arch_amd64_none build-arch_amd64_real build-arch_amd64_rt build-arch_amd64_none: build-arch_amd64_none_amd64 build-arch_amd64_none_cloud-amd64 build-arch_amd64_none_real build-arch_amd64_none_amd64: build-arch_amd64_none_amd64_real build-arch_amd64_none_amd64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_amd64_none_cloud-amd64: build-arch_amd64_none_cloud-amd64_real build-arch_amd64_none_cloud-amd64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_amd64_none_real: build-arch_amd64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='amd64' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_amd64_rt: build-arch_amd64_rt_amd64 build-arch_amd64_rt_real build-arch_amd64_rt_amd64: build-arch_amd64_rt_amd64_real build-arch_amd64_rt_amd64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_amd64_rt_real: build-arch_arm64: build-arch_arm64_none build-arch_arm64_real build-arch_arm64_rt build-arch_arm64_none: build-arch_arm64_none_arm64 build-arch_arm64_none_real build-arch_arm64_none_arm64: build-arch_arm64_none_arm64_real build-arch_arm64_none_arm64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_arm64_none_real: build-arch_arm64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='arm64' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_arm64_rt: build-arch_arm64_rt_arm64 build-arch_arm64_rt_real build-arch_arm64_rt_arm64: build-arch_arm64_rt_arm64_real build-arch_arm64_rt_arm64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_arm64_rt_real: build-arch_arm64ilp32: build-arch_arm64ilp32_real build-arch_arm64ilp32_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='arm64ilp32' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='arm64ilp32' KERNEL_ARCH='arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_armel: build-arch_armel_none build-arch_armel_real build-arch_armel_none: build-arch_armel_none_marvell build-arch_armel_none_real build-arch_armel_none_rpi build-arch_armel_none_marvell: build-arch_armel_none_marvell_real build-arch_armel_none_marvell_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_armel_none_real: build-arch_armel_none_rpi: build-arch_armel_none_rpi_real build-arch_armel_none_rpi_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_armel_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='armel' KERNEL_ARCH='arm' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='armel' KERNEL_ARCH='arm' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_armhf: build-arch_armhf_none build-arch_armhf_real build-arch_armhf_rt build-arch_armhf_none: build-arch_armhf_none_armmp build-arch_armhf_none_armmp-lpae build-arch_armhf_none_real build-arch_armhf_none_armmp: build-arch_armhf_none_armmp_real build-arch_armhf_none_armmp-lpae: build-arch_armhf_none_armmp-lpae_real build-arch_armhf_none_armmp-lpae_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_armhf_none_armmp_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_armhf_none_real: build-arch_armhf_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='armhf' KERNEL_ARCH='arm' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='armhf' KERNEL_ARCH='arm' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_armhf_rt: build-arch_armhf_rt_armmp build-arch_armhf_rt_real build-arch_armhf_rt_armmp: build-arch_armhf_rt_armmp_real build-arch_armhf_rt_armmp_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_armhf_rt_real: build-arch_hppa: build-arch_hppa_none build-arch_hppa_real build-arch_hppa_none: build-arch_hppa_none_parisc build-arch_hppa_none_parisc-smp build-arch_hppa_none_parisc64-smp build-arch_hppa_none_real build-arch_hppa_none_parisc: build-arch_hppa_none_parisc_real build-arch_hppa_none_parisc-smp: build-arch_hppa_none_parisc-smp_real build-arch_hppa_none_parisc-smp_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_hppa_none_parisc64-smp: build-arch_hppa_none_parisc64-smp_real build-arch_hppa_none_parisc64-smp_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_hppa_none_parisc_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_hppa_none_real: build-arch_hppa_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='hppa' KERNEL_ARCH='parisc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='hppa' KERNEL_ARCH='parisc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_i386: build-arch_i386_none build-arch_i386_real build-arch_i386_rt build-arch_i386_none: build-arch_i386_none_686 build-arch_i386_none_686-pae build-arch_i386_none_real build-arch_i386_none_686: build-arch_i386_none_686_real build-arch_i386_none_686-pae: build-arch_i386_none_686-pae_real build-arch_i386_none_686-pae_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_i386_none_686_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_i386_none_real: build-arch_i386_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='i386' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_i386_rt: build-arch_i386_rt_686-pae build-arch_i386_rt_real build-arch_i386_rt_686-pae: build-arch_i386_rt_686-pae_real build-arch_i386_rt_686-pae_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_i386_rt_real: build-arch_ia64: build-arch_ia64_none build-arch_ia64_real build-arch_ia64_none: build-arch_ia64_none_itanium build-arch_ia64_none_mckinley build-arch_ia64_none_real build-arch_ia64_none_itanium: build-arch_ia64_none_itanium_real build-arch_ia64_none_itanium_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_ia64_none_mckinley: build-arch_ia64_none_mckinley_real build-arch_ia64_none_mckinley_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_ia64_none_real: build-arch_ia64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='ia64' KERNEL_ARCH='ia64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='ia64' KERNEL_ARCH='ia64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_m68k: build-arch_m68k_none build-arch_m68k_real build-arch_m68k_none: build-arch_m68k_none_m68k build-arch_m68k_none_real build-arch_m68k_none_m68k: build-arch_m68k_none_m68k_real build-arch_m68k_none_m68k_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_m68k_none_real: build-arch_m68k_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='m68k' KERNEL_ARCH='m68k' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='m68k' KERNEL_ARCH='m68k' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips: build-arch_mips_none build-arch_mips_real build-arch_mips64: build-arch_mips64_none build-arch_mips64_real build-arch_mips64_none: build-arch_mips64_none_5kc-malta build-arch_mips64_none_octeon build-arch_mips64_none_real build-arch_mips64_none_5kc-malta: build-arch_mips64_none_5kc-malta_real build-arch_mips64_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64_none_octeon: build-arch_mips64_none_octeon_real build-arch_mips64_none_octeon_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64_none_real: build-arch_mips64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mips64' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mips64' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64el: build-arch_mips64el_none build-arch_mips64el_real build-arch_mips64el_none: build-arch_mips64el_none_5kc-malta build-arch_mips64el_none_loongson-3 build-arch_mips64el_none_octeon build-arch_mips64el_none_real build-arch_mips64el_none_5kc-malta: build-arch_mips64el_none_5kc-malta_real build-arch_mips64el_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64el_none_loongson-3: build-arch_mips64el_none_loongson-3_real build-arch_mips64el_none_loongson-3_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64el_none_octeon: build-arch_mips64el_none_octeon_real build-arch_mips64el_none_octeon_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64el_none_real: build-arch_mips64el_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mips64el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mips64el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64r6: build-arch_mips64r6_none build-arch_mips64r6_real build-arch_mips64r6_none: build-arch_mips64r6_none_mips64r6 build-arch_mips64r6_none_real build-arch_mips64r6_none_mips64r6: build-arch_mips64r6_none_mips64r6_real build-arch_mips64r6_none_mips64r6_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64r6_none_real: build-arch_mips64r6_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mips64r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mips64r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64r6el: build-arch_mips64r6el_none build-arch_mips64r6el_real build-arch_mips64r6el_none: build-arch_mips64r6el_none_mips64r6el build-arch_mips64r6el_none_real build-arch_mips64r6el_none_mips64r6el: build-arch_mips64r6el_none_mips64r6el_real build-arch_mips64r6el_none_mips64r6el_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips64r6el_none_real: build-arch_mips64r6el_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mips64r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mips64r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips_none: build-arch_mips_none_4kc-malta build-arch_mips_none_5kc-malta build-arch_mips_none_octeon build-arch_mips_none_real build-arch_mips_none_4kc-malta: build-arch_mips_none_4kc-malta_real build-arch_mips_none_4kc-malta_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips_none_5kc-malta: build-arch_mips_none_5kc-malta_real build-arch_mips_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips_none_octeon: build-arch_mips_none_octeon_real build-arch_mips_none_octeon_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mips_none_real: build-arch_mips_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mips' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mips' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsel: build-arch_mipsel_none build-arch_mipsel_real build-arch_mipsel_none: build-arch_mipsel_none_4kc-malta build-arch_mipsel_none_5kc-malta build-arch_mipsel_none_loongson-3 build-arch_mipsel_none_octeon build-arch_mipsel_none_real build-arch_mipsel_none_4kc-malta: build-arch_mipsel_none_4kc-malta_real build-arch_mipsel_none_4kc-malta_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsel_none_5kc-malta: build-arch_mipsel_none_5kc-malta_real build-arch_mipsel_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsel_none_loongson-3: build-arch_mipsel_none_loongson-3_real build-arch_mipsel_none_loongson-3_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsel_none_octeon: build-arch_mipsel_none_octeon_real build-arch_mipsel_none_octeon_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsel_none_real: build-arch_mipsel_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mipsel' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mipsel' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsn32: build-arch_mipsn32_real build-arch_mipsn32_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsn32el: build-arch_mipsn32el_real build-arch_mipsn32el_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsn32r6: build-arch_mipsn32r6_real build-arch_mipsn32r6_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32r6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsn32r6el: build-arch_mipsn32r6el_real build-arch_mipsn32r6el_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mipsn32r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mipsn32r6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsr6: build-arch_mipsr6_none build-arch_mipsr6_real build-arch_mipsr6_none: build-arch_mipsr6_none_mips32r6 build-arch_mipsr6_none_mips64r6 build-arch_mipsr6_none_real build-arch_mipsr6_none_mips32r6: build-arch_mipsr6_none_mips32r6_real build-arch_mipsr6_none_mips32r6_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsr6_none_mips64r6: build-arch_mipsr6_none_mips64r6_real build-arch_mipsr6_none_mips64r6_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsr6_none_real: build-arch_mipsr6_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mipsr6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mipsr6' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsr6el: build-arch_mipsr6el_none build-arch_mipsr6el_real build-arch_mipsr6el_none: build-arch_mipsr6el_none_mips32r6el build-arch_mipsr6el_none_mips64r6el build-arch_mipsr6el_none_real build-arch_mipsr6el_none_mips32r6el: build-arch_mipsr6el_none_mips32r6el_real build-arch_mipsr6el_none_mips32r6el_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsr6el_none_mips64r6el: build-arch_mipsr6el_none_mips64r6el_real build-arch_mipsr6el_none_mips64r6el_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_mipsr6el_none_real: build-arch_mipsr6el_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='mipsr6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='mipsr6el' KERNEL_ARCH='mips' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_powerpc: build-arch_powerpc_none build-arch_powerpc_real build-arch_powerpc_none: build-arch_powerpc_none_powerpc build-arch_powerpc_none_powerpc-smp build-arch_powerpc_none_powerpc64 build-arch_powerpc_none_real build-arch_powerpc_none_powerpc: build-arch_powerpc_none_powerpc_real build-arch_powerpc_none_powerpc-smp: build-arch_powerpc_none_powerpc-smp_real build-arch_powerpc_none_powerpc-smp_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_powerpc_none_powerpc64: build-arch_powerpc_none_powerpc64_real build-arch_powerpc_none_powerpc64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_powerpc_none_powerpc_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_powerpc_none_real: build-arch_powerpc_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='powerpc' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='powerpc' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_powerpcspe: build-arch_powerpcspe_none build-arch_powerpcspe_real build-arch_powerpcspe_none: build-arch_powerpcspe_none_powerpcspe build-arch_powerpcspe_none_real build-arch_powerpcspe_none_powerpcspe: build-arch_powerpcspe_none_powerpcspe_real build-arch_powerpcspe_none_powerpcspe_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_powerpcspe_none_real: build-arch_powerpcspe_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='powerpcspe' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='powerpcspe' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_ppc64: build-arch_ppc64_none build-arch_ppc64_real build-arch_ppc64_none: build-arch_ppc64_none_powerpc64 build-arch_ppc64_none_real build-arch_ppc64_none_powerpc64: build-arch_ppc64_none_powerpc64_real build-arch_ppc64_none_powerpc64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_ppc64_none_real: build-arch_ppc64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='ppc64' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='ppc64' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_ppc64el: build-arch_ppc64el_none build-arch_ppc64el_real build-arch_ppc64el_none: build-arch_ppc64el_none_powerpc64le build-arch_ppc64el_none_real build-arch_ppc64el_none_powerpc64le: build-arch_ppc64el_none_powerpc64le_real build-arch_ppc64el_none_powerpc64le_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_ppc64el_none_real: build-arch_ppc64el_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='ppc64el' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='ppc64el' KERNEL_ARCH='powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_riscv64: build-arch_riscv64_none build-arch_riscv64_real build-arch_riscv64_none: build-arch_riscv64_none_real build-arch_riscv64_none_riscv64 build-arch_riscv64_none_real: build-arch_riscv64_none_riscv64: build-arch_riscv64_none_riscv64_real build-arch_riscv64_none_riscv64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_riscv64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='riscv64' KERNEL_ARCH='riscv' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='riscv64' KERNEL_ARCH='riscv' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_s390: build-arch_s390_real build-arch_s390_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='s390' KERNEL_ARCH='s390' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='s390' KERNEL_ARCH='s390' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_s390x: build-arch_s390x_none build-arch_s390x_real build-arch_s390x_none: build-arch_s390x_none_real build-arch_s390x_none_s390x build-arch_s390x_none_real: build-arch_s390x_none_s390x: build-arch_s390x_none_s390x_real build-arch_s390x_none_s390x_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' build-arch_s390x_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='s390x' KERNEL_ARCH='s390' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='s390x' KERNEL_ARCH='s390' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sh3: build-arch_sh3_real build-arch_sh3_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='sh3' KERNEL_ARCH='sh' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='sh3' KERNEL_ARCH='sh' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sh4: build-arch_sh4_none build-arch_sh4_real build-arch_sh4_none: build-arch_sh4_none_real build-arch_sh4_none_sh7751r build-arch_sh4_none_sh7785lcr build-arch_sh4_none_real: build-arch_sh4_none_sh7751r: build-arch_sh4_none_sh7751r_real build-arch_sh4_none_sh7751r_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sh4_none_sh7785lcr: build-arch_sh4_none_sh7785lcr_real build-arch_sh4_none_sh7785lcr_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sh4_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='sh4' KERNEL_ARCH='sh' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='sh4' KERNEL_ARCH='sh' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sparc: build-arch_sparc_real build-arch_sparc64: build-arch_sparc64_none build-arch_sparc64_real build-arch_sparc64_none: build-arch_sparc64_none_real build-arch_sparc64_none_sparc64 build-arch_sparc64_none_sparc64-smp @@ -728,162 +728,162 @@ build-arch_sparc64_none_sparc64: build-arch_sparc64_none_sparc64_real build-arch_sparc64_none_sparc64-smp: build-arch_sparc64_none_sparc64-smp_real build-arch_sparc64_none_sparc64-smp_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sparc64_none_sparc64_real:: - $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-flavour ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sparc64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='sparc64' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='sparc64' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_sparc_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='sparc' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='sparc' KERNEL_ARCH='sparc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-arch_x32: build-arch_x32_real build-arch_x32_real:: - $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-8' ARCH='x32' KERNEL_ARCH='x86' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-arch-arch ABINAME='4.19.0-9' ARCH='x32' KERNEL_ARCH='x86' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-indep:: build-indep_none build-indep_rt build-indep:: - $(MAKE) -f debian/rules.real build-indep ABINAME='4.19.0-8' ALL_FEATURESETS='none rt' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real build-indep ABINAME='4.19.0-9' ALL_FEATURESETS='none rt' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' build-indep_none: build-indep_none_real build-indep_none_real: build-indep_rt: build-indep_rt_real build-indep_rt_real: debian/build/config.alpha_none_alpha-generic:: - $(MAKE) -f debian/rules.real debian/build/config.alpha_none_alpha-generic ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.alpha_none_alpha-generic ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.alpha_none_alpha-smp:: - $(MAKE) -f debian/rules.real debian/build/config.alpha_none_alpha-smp ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.alpha_none_alpha-smp ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.amd64_none_amd64:: - $(MAKE) -f debian/rules.real debian/build/config.amd64_none_amd64 ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.amd64_none_amd64 ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.amd64_none_cloud-amd64:: - $(MAKE) -f debian/rules.real debian/build/config.amd64_none_cloud-amd64 ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.amd64_none_cloud-amd64 ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.amd64_rt_amd64:: - $(MAKE) -f debian/rules.real debian/build/config.amd64_rt_amd64 ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.amd64_rt_amd64 ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.arm64_none_arm64:: - $(MAKE) -f debian/rules.real debian/build/config.arm64_none_arm64 ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.arm64_none_arm64 ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.arm64_rt_arm64:: - $(MAKE) -f debian/rules.real debian/build/config.arm64_rt_arm64 ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.arm64_rt_arm64 ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.armel_none_marvell:: - $(MAKE) -f debian/rules.real debian/build/config.armel_none_marvell ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.armel_none_marvell ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.armel_none_rpi:: - $(MAKE) -f debian/rules.real debian/build/config.armel_none_rpi ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.armel_none_rpi ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.armhf_none_armmp:: - $(MAKE) -f debian/rules.real debian/build/config.armhf_none_armmp ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.armhf_none_armmp ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.armhf_none_armmp-lpae:: - $(MAKE) -f debian/rules.real debian/build/config.armhf_none_armmp-lpae ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.armhf_none_armmp-lpae ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.armhf_rt_armmp:: - $(MAKE) -f debian/rules.real debian/build/config.armhf_rt_armmp ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.armhf_rt_armmp ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.hppa_none_parisc:: - $(MAKE) -f debian/rules.real debian/build/config.hppa_none_parisc ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.hppa_none_parisc ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.hppa_none_parisc-smp:: - $(MAKE) -f debian/rules.real debian/build/config.hppa_none_parisc-smp ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.hppa_none_parisc-smp ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.hppa_none_parisc64-smp:: - $(MAKE) -f debian/rules.real debian/build/config.hppa_none_parisc64-smp ABINAME='4.19.0-8' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.hppa_none_parisc64-smp ABINAME='4.19.0-9' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.i386_none_686:: - $(MAKE) -f debian/rules.real debian/build/config.i386_none_686 ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.i386_none_686 ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.i386_none_686-pae:: - $(MAKE) -f debian/rules.real debian/build/config.i386_none_686-pae ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.i386_none_686-pae ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.i386_rt_686-pae:: - $(MAKE) -f debian/rules.real debian/build/config.i386_rt_686-pae ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.i386_rt_686-pae ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.ia64_none_itanium:: - $(MAKE) -f debian/rules.real debian/build/config.ia64_none_itanium ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.ia64_none_itanium ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.ia64_none_mckinley:: - $(MAKE) -f debian/rules.real debian/build/config.ia64_none_mckinley ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.ia64_none_mckinley ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.m68k_none_m68k:: - $(MAKE) -f debian/rules.real debian/build/config.m68k_none_m68k ABINAME='4.19.0-8' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.m68k_none_m68k ABINAME='4.19.0-9' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips64_none_5kc-malta:: - $(MAKE) -f debian/rules.real debian/build/config.mips64_none_5kc-malta ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips64_none_5kc-malta ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips64_none_octeon:: - $(MAKE) -f debian/rules.real debian/build/config.mips64_none_octeon ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips64_none_octeon ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips64el_none_5kc-malta:: - $(MAKE) -f debian/rules.real debian/build/config.mips64el_none_5kc-malta ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips64el_none_5kc-malta ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips64el_none_loongson-3:: - $(MAKE) -f debian/rules.real debian/build/config.mips64el_none_loongson-3 ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips64el_none_loongson-3 ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips64el_none_octeon:: - $(MAKE) -f debian/rules.real debian/build/config.mips64el_none_octeon ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips64el_none_octeon ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips64r6_none_mips64r6:: - $(MAKE) -f debian/rules.real debian/build/config.mips64r6_none_mips64r6 ABINAME='4.19.0-8' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips64r6_none_mips64r6 ABINAME='4.19.0-9' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips64r6el_none_mips64r6el:: - $(MAKE) -f debian/rules.real debian/build/config.mips64r6el_none_mips64r6el ABINAME='4.19.0-8' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips64r6el_none_mips64r6el ABINAME='4.19.0-9' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips_none_4kc-malta:: - $(MAKE) -f debian/rules.real debian/build/config.mips_none_4kc-malta ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips_none_4kc-malta ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips_none_5kc-malta:: - $(MAKE) -f debian/rules.real debian/build/config.mips_none_5kc-malta ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips_none_5kc-malta ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mips_none_octeon:: - $(MAKE) -f debian/rules.real debian/build/config.mips_none_octeon ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mips_none_octeon ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsel_none_4kc-malta:: - $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_4kc-malta ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_4kc-malta ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsel_none_5kc-malta:: - $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_5kc-malta ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_5kc-malta ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsel_none_loongson-3:: - $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_loongson-3 ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_loongson-3 ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsel_none_octeon:: - $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_octeon ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsel_none_octeon ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsr6_none_mips32r6:: - $(MAKE) -f debian/rules.real debian/build/config.mipsr6_none_mips32r6 ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsr6_none_mips32r6 ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsr6_none_mips64r6:: - $(MAKE) -f debian/rules.real debian/build/config.mipsr6_none_mips64r6 ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsr6_none_mips64r6 ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsr6el_none_mips32r6el:: - $(MAKE) -f debian/rules.real debian/build/config.mipsr6el_none_mips32r6el ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsr6el_none_mips32r6el ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.mipsr6el_none_mips64r6el:: - $(MAKE) -f debian/rules.real debian/build/config.mipsr6el_none_mips64r6el ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.mipsr6el_none_mips64r6el ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.powerpc_none_powerpc:: - $(MAKE) -f debian/rules.real debian/build/config.powerpc_none_powerpc ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.powerpc_none_powerpc ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.powerpc_none_powerpc-smp:: - $(MAKE) -f debian/rules.real debian/build/config.powerpc_none_powerpc-smp ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.powerpc_none_powerpc-smp ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.powerpc_none_powerpc64:: - $(MAKE) -f debian/rules.real debian/build/config.powerpc_none_powerpc64 ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.powerpc_none_powerpc64 ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.powerpcspe_none_powerpcspe:: - $(MAKE) -f debian/rules.real debian/build/config.powerpcspe_none_powerpcspe ABINAME='4.19.0-8' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.powerpcspe_none_powerpcspe ABINAME='4.19.0-9' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.ppc64_none_powerpc64:: - $(MAKE) -f debian/rules.real debian/build/config.ppc64_none_powerpc64 ABINAME='4.19.0-8' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.ppc64_none_powerpc64 ABINAME='4.19.0-9' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.ppc64el_none_powerpc64le:: - $(MAKE) -f debian/rules.real debian/build/config.ppc64el_none_powerpc64le ABINAME='4.19.0-8' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.ppc64el_none_powerpc64le ABINAME='4.19.0-9' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.riscv64_none_riscv64:: - $(MAKE) -f debian/rules.real debian/build/config.riscv64_none_riscv64 ABINAME='4.19.0-8' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.riscv64_none_riscv64 ABINAME='4.19.0-9' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.s390x_none_s390x:: - $(MAKE) -f debian/rules.real debian/build/config.s390x_none_s390x ABINAME='4.19.0-8' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.s390x_none_s390x ABINAME='4.19.0-9' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' debian/build/config.sh4_none_sh7751r:: - $(MAKE) -f debian/rules.real debian/build/config.sh4_none_sh7751r ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.sh4_none_sh7751r ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.sh4_none_sh7785lcr:: - $(MAKE) -f debian/rules.real debian/build/config.sh4_none_sh7785lcr ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.sh4_none_sh7785lcr ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.sparc64_none_sparc64:: - $(MAKE) -f debian/rules.real debian/build/config.sparc64_none_sparc64 ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.sparc64_none_sparc64 ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' debian/build/config.sparc64_none_sparc64-smp:: - $(MAKE) -f debian/rules.real debian/build/config.sparc64_none_sparc64-smp ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real debian/build/config.sparc64_none_sparc64-smp ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup: setup_alpha setup_amd64 setup_arm64 setup_arm64ilp32 setup_armel setup_armhf setup_hppa setup_i386 setup_ia64 setup_m68k setup_mips setup_mips64 setup_mips64el setup_mips64r6 setup_mips64r6el setup_mipsel setup_mipsn32 setup_mipsn32el setup_mipsn32r6 setup_mipsn32r6el setup_mipsr6 setup_mipsr6el setup_none setup_powerpc setup_powerpcspe setup_ppc64 setup_ppc64el setup_riscv64 setup_rt setup_s390 setup_s390x setup_sh3 setup_sh4 setup_sparc setup_sparc64 setup_x32 setup_alpha: setup_alpha_none setup_alpha_real setup_alpha_none: setup_alpha_none_alpha-generic setup_alpha_none_alpha-smp setup_alpha_none_real setup_alpha_none_alpha-generic: setup_alpha_none_alpha-generic_real setup_alpha_none_alpha-generic_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-generic' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-generic' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-generic' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-generic\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-generic' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-generic' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_alpha_none_alpha-smp: setup_alpha_none_alpha-smp_real setup_alpha_none_alpha-smp_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='alpha' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='alpha-smp' IMAGE_FILE='arch/alpha/boot/vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-alpha-smp' KCONFIG='debian/config/config debian/config/alpha/config debian/config/alpha/config.alpha-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-alpha-smp\""' KERNEL_ARCH='alpha' LOCALVERSION='-alpha-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-alpha-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_alpha_none_real: setup_alpha_real: setup_amd64: setup_amd64_none setup_amd64_real setup_amd64_rt setup_amd64_none: setup_amd64_none_amd64 setup_amd64_none_cloud-amd64 setup_amd64_none_real setup_amd64_none_amd64: setup_amd64_none_amd64_real setup_amd64_none_amd64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_amd64_none_cloud-amd64: setup_amd64_none_cloud-amd64_real setup_amd64_none_cloud-amd64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='cloud-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-cloud-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/amd64/config.cloud-amd64' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-cloud-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-cloud-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-cloud-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_amd64_none_real: setup_amd64_real: setup_amd64_rt: setup_amd64_rt_amd64 setup_amd64_rt_real setup_amd64_rt_amd64: setup_amd64_rt_amd64_real setup_amd64_rt_amd64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='amd64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-amd64-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/amd64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-amd64\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-amd64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-amd64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_amd64_rt_real: setup_arm64: setup_arm64_none setup_arm64_real setup_arm64_rt setup_arm64_none: setup_arm64_none_arm64 setup_arm64_none_real setup_arm64_none_arm64: setup_arm64_none_arm64_real setup_arm64_none_arm64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-arm64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_arm64_none_real: setup_arm64_real: setup_arm64_rt: setup_arm64_rt_arm64 setup_arm64_rt_real setup_arm64_rt_arm64: setup_arm64_rt_arm64_real setup_arm64_rt_arm64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='arm64' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='arm64' IMAGE_FILE='arch/arm64/boot/Image' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-arm64-unsigned' KCONFIG='debian/config/config debian/config/arm64/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-arm64\""' KERNEL_ARCH='arm64' LOCALVERSION='-rt-arm64' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-arm64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_arm64_rt_real: setup_arm64ilp32: setup_arm64ilp32_real setup_arm64ilp32_real: @@ -891,38 +891,38 @@ setup_armel_none: setup_armel_none_marvell setup_armel_none_real setup_armel_none_rpi setup_armel_none_marvell: setup_armel_none_marvell_real setup_armel_none_marvell_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='marvell' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-marvell' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.marvell' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-marvell\""' KERNEL_ARCH='arm' LOCALVERSION='-marvell' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-marvell' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_armel_none_real: setup_armel_none_rpi: setup_armel_none_rpi_real setup_armel_none_rpi_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='armel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='rpi' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rpi' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armel/config debian/config/armel/config.rpi' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rpi\""' KERNEL_ARCH='arm' LOCALVERSION='-rpi' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-rpi' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_armel_real: setup_armhf: setup_armhf_none setup_armhf_real setup_armhf_rt setup_armhf_none: setup_armhf_none_armmp setup_armhf_none_armmp-lpae setup_armhf_none_real setup_armhf_none_armmp: setup_armhf_none_armmp_real setup_armhf_none_armmp-lpae: setup_armhf_none_armmp-lpae_real setup_armhf_none_armmp-lpae_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp-lpae' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp-lpae' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/armhf/config.armmp-lpae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp-lpae\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp-lpae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp-lpae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_armhf_none_armmp_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-armmp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_armhf_none_real: setup_armhf_real: setup_armhf_rt: setup_armhf_rt_armmp setup_armhf_rt_real setup_armhf_rt_armmp: setup_armhf_rt_armmp_real setup_armhf_rt_armmp_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='armhf' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='armmp' IMAGE_FILE='arch/arm/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-armmp' KCONFIG='debian/config/config debian/config/kernelarch-arm/config debian/config/armhf/config debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-rt-armmp\""' KERNEL_ARCH='arm' LOCALVERSION='-rt-armmp' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-armmp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_armhf_rt_real: setup_hppa: setup_hppa_none setup_hppa_real setup_hppa_none: setup_hppa_none_parisc setup_hppa_none_parisc-smp setup_hppa_none_parisc64-smp setup_hppa_none_real setup_hppa_none_parisc: setup_hppa_none_parisc_real setup_hppa_none_parisc-smp: setup_hppa_none_parisc-smp_real setup_hppa_none_parisc-smp_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_hppa_none_parisc64-smp: setup_hppa_none_parisc64-smp_real setup_hppa_none_parisc64-smp_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' CFLAGS_KERNEL='-fno-cse-follow-jumps' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc64-smp' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc64-smp' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc64-smp' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc64-smp\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc64-smp' OVERRIDE_HOST_TYPE='hppa64-linux-gnu' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_hppa_none_parisc_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-8-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='hppa' COMPILER='gcc-8' FEATURESET='none' FLAVOUR='parisc' IMAGE_FILE='arch/parisc/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-parisc' KCONFIG='debian/config/config debian/config/hppa/config debian/config/hppa/config.parisc' KCONFIG_OPTIONS=' -o "BUILD_SALT=\"4.19.0-9-parisc\""' KERNEL_ARCH='parisc' LOCALVERSION='-parisc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-parisc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_hppa_none_real: setup_hppa_real: setup_i386: setup_i386_none setup_i386_real setup_i386_rt @@ -930,31 +930,31 @@ setup_i386_none_686: setup_i386_none_686_real setup_i386_none_686-pae: setup_i386_none_686-pae_real setup_i386_none_686-pae_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-686-pae' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_i386_none_686_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='686' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-686-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-686\""' KERNEL_ARCH='x86' LOCALVERSION='-686' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-686' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_i386_none_real: setup_i386_real: setup_i386_rt: setup_i386_rt_686-pae setup_i386_rt_real setup_i386_rt_686-pae: setup_i386_rt_686-pae_real setup_i386_rt_686-pae_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-8-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='i386' COMPILER='gcc-8' DEBUG='True' FEATURESET='rt' FLAVOUR='686-pae' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-rt-686-pae-unsigned' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/i386/config debian/config/i386/config.686-pae debian/config/featureset-rt/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o MODULE_SIG=y -o "BUILD_SALT=\"4.19.0-9-rt-686-pae\""' KERNEL_ARCH='x86' LOCALVERSION='-rt-686-pae' LOCALVERSION_HEADERS='-rt' LOCALVERSION_IMAGE='-rt-686-pae' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_i386_rt_real: setup_ia64: setup_ia64_none setup_ia64_real setup_ia64_none: setup_ia64_none_itanium setup_ia64_none_mckinley setup_ia64_none_real setup_ia64_none_itanium: setup_ia64_none_itanium_real setup_ia64_none_itanium_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='itanium' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-itanium' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.itanium' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-itanium\""' KERNEL_ARCH='ia64' LOCALVERSION='-itanium' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-itanium' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_ia64_none_mckinley: setup_ia64_none_mckinley_real setup_ia64_none_mckinley_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='ia64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mckinley' IMAGE_FILE='vmlinux.gz' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mckinley' KCONFIG='debian/config/config debian/config/ia64/config debian/config/ia64/config.mckinley' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mckinley\""' KERNEL_ARCH='ia64' LOCALVERSION='-mckinley' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mckinley' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_ia64_none_real: setup_ia64_real: setup_m68k: setup_m68k_none setup_m68k_real setup_m68k_none: setup_m68k_none_m68k setup_m68k_none_real setup_m68k_none_m68k: setup_m68k_none_m68k_real setup_m68k_none_m68k_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='m68k' CFLAGS_KERNEL='-ffreestanding' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='m68k' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-m68k' KCONFIG='debian/config/config debian/config/m68k/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-m68k\""' KERNEL_ARCH='m68k' LOCALVERSION='-m68k' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-m68k' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_m68k_none_real: setup_m68k_real: setup_mips: setup_mips_none setup_mips_real @@ -962,65 +962,65 @@ setup_mips64_none: setup_mips64_none_5kc-malta setup_mips64_none_octeon setup_mips64_none_real setup_mips64_none_5kc-malta: setup_mips64_none_5kc-malta_real setup_mips64_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips64_none_octeon: setup_mips64_none_octeon_real setup_mips64_none_octeon_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips64_none_real: setup_mips64_real: setup_mips64el: setup_mips64el_none setup_mips64el_real setup_mips64el_none: setup_mips64el_none_5kc-malta setup_mips64el_none_loongson-3 setup_mips64el_none_octeon setup_mips64el_none_real setup_mips64el_none_5kc-malta: setup_mips64el_none_5kc-malta_real setup_mips64el_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips64el_none_loongson-3: setup_mips64el_none_loongson-3_real setup_mips64el_none_loongson-3_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips64el_none_octeon: setup_mips64el_none_octeon_real setup_mips64el_none_octeon_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64el/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips64el_none_real: setup_mips64el_real: setup_mips64r6: setup_mips64r6_none setup_mips64r6_real setup_mips64r6_none: setup_mips64r6_none_mips64r6 setup_mips64r6_none_real setup_mips64r6_none_mips64r6: setup_mips64r6_none_mips64r6_real setup_mips64r6_none_mips64r6_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips64r6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips64r6_none_real: setup_mips64r6_real: setup_mips64r6el: setup_mips64r6el_none setup_mips64r6el_real setup_mips64r6el_none: setup_mips64r6el_none_mips64r6el setup_mips64r6el_none_real setup_mips64r6el_none_mips64r6el: setup_mips64r6el_none_mips64r6el_real setup_mips64r6el_none_mips64r6el_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips64r6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips64r6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips64r6el_none_real: setup_mips64r6el_real: setup_mips_none: setup_mips_none_4kc-malta setup_mips_none_5kc-malta setup_mips_none_octeon setup_mips_none_real setup_mips_none_4kc-malta: setup_mips_none_4kc-malta_real setup_mips_none_4kc-malta_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips_none_5kc-malta: setup_mips_none_5kc-malta_real setup_mips_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips_none_octeon: setup_mips_none_octeon_real setup_mips_none_octeon_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mips' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mips/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mips_none_real: setup_mips_real: setup_mipsel: setup_mipsel_none setup_mipsel_real setup_mipsel_none: setup_mipsel_none_4kc-malta setup_mipsel_none_5kc-malta setup_mipsel_none_loongson-3 setup_mipsel_none_octeon setup_mipsel_none_real setup_mipsel_none_4kc-malta: setup_mipsel_none_4kc-malta_real setup_mipsel_none_4kc-malta_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='4kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-4kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips32r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-4kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-4kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-4kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsel_none_5kc-malta: setup_mipsel_none_5kc-malta_real setup_mipsel_none_5kc-malta_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='5kc-malta' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-5kc-malta' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.malta debian/config/kernelarch-mips/config.mips64r2' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-5kc-malta\""' KERNEL_ARCH='mips' LOCALVERSION='-5kc-malta' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-5kc-malta' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsel_none_loongson-3: setup_mipsel_none_loongson-3_real setup_mipsel_none_loongson-3_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='loongson-3' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-loongson-3' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.loongson-3' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-loongson-3\""' KERNEL_ARCH='mips' LOCALVERSION='-loongson-3' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-loongson-3' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsel_none_octeon: setup_mipsel_none_octeon_real setup_mipsel_none_octeon_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsel' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='octeon' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-octeon' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsel/config debian/config/kernelarch-mips/config.octeon' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-octeon\""' KERNEL_ARCH='mips' LOCALVERSION='-octeon' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-octeon' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsel_none_real: setup_mipsel_real: setup_mipsn32: setup_mipsn32_real @@ -1035,20 +1035,20 @@ setup_mipsr6_none: setup_mipsr6_none_mips32r6 setup_mipsr6_none_mips64r6 setup_mipsr6_none_real setup_mipsr6_none_mips32r6: setup_mipsr6_none_mips32r6_real setup_mipsr6_none_mips32r6_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsr6_none_mips64r6: setup_mipsr6_none_mips64r6_real setup_mipsr6_none_mips64r6_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsr6_none_real: setup_mipsr6_real: setup_mipsr6el: setup_mipsr6el_none setup_mipsr6el_real setup_mipsr6el_none: setup_mipsr6el_none_mips32r6el setup_mipsr6el_none_mips64r6el setup_mipsr6el_none_real setup_mipsr6el_none_mips32r6el: setup_mipsr6el_none_mips32r6el_real setup_mipsr6el_none_mips32r6el_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips32r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips32r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips32r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips32r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips32r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips32r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsr6el_none_mips64r6el: setup_mipsr6el_none_mips64r6el_real setup_mipsr6el_none_mips64r6el_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='mipsr6el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='mips64r6el' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-mips64r6el' KCONFIG='debian/config/config debian/config/kernelarch-mips/config debian/config/mipsr6el/config debian/config/kernelarch-mips/config.boston debian/config/kernelarch-mips/config.mips64r6' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-mips64r6el\""' KERNEL_ARCH='mips' LOCALVERSION='-mips64r6el' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-mips64r6el' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_mipsr6el_none_real: setup_mipsr6el_real: setup_none: setup_none_real @@ -1058,33 +1058,33 @@ setup_powerpc_none_powerpc: setup_powerpc_none_powerpc_real setup_powerpc_none_powerpc-smp: setup_powerpc_none_powerpc-smp_real setup_powerpc_none_powerpc-smp_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc-smp' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc debian/config/powerpc/config.powerpc-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc-smp\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_powerpc_none_powerpc64: setup_powerpc_none_powerpc64_real setup_powerpc_none_powerpc64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_powerpc_none_powerpc_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='powerpc' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpc/config.powerpc' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_powerpc_none_real: setup_powerpc_real: setup_powerpcspe: setup_powerpcspe_none setup_powerpcspe_real setup_powerpcspe_none: setup_powerpcspe_none_powerpcspe setup_powerpcspe_none_real setup_powerpcspe_none_powerpcspe: setup_powerpcspe_none_powerpcspe_real setup_powerpcspe_none_powerpcspe_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='powerpcspe' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpcspe' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpcspe' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/powerpcspe/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpcspe\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpcspe' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpcspe' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_powerpcspe_none_real: setup_powerpcspe_real: setup_ppc64: setup_ppc64_none setup_ppc64_real setup_ppc64_none: setup_ppc64_none_powerpc64 setup_ppc64_none_real setup_ppc64_none_powerpc64: setup_ppc64_none_powerpc64_real setup_ppc64_none_powerpc64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='ppc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-be' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_ppc64_none_real: setup_ppc64_real: setup_ppc64el: setup_ppc64el_none setup_ppc64el_real setup_ppc64el_none: setup_ppc64el_none_powerpc64le setup_ppc64el_none_real setup_ppc64el_none_powerpc64le: setup_ppc64el_none_powerpc64le_real setup_ppc64el_none_powerpc64le_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='ppc64el' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='powerpc64le' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-powerpc64le' KCONFIG='debian/config/config debian/config/kernelarch-powerpc/config debian/config/kernelarch-powerpc/config-arch-64 debian/config/kernelarch-powerpc/config-arch-64-le' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-powerpc64le\""' KERNEL_ARCH='powerpc' LOCALVERSION='-powerpc64le' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-powerpc64le' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_ppc64el_none_real: setup_ppc64el_real: setup_riscv64: setup_riscv64_none setup_riscv64_real @@ -1092,7 +1092,7 @@ setup_riscv64_none_real: setup_riscv64_none_riscv64: setup_riscv64_none_riscv64_real setup_riscv64_none_riscv64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='riscv64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='riscv64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-riscv64' KCONFIG='debian/config/config debian/config/riscv64/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-riscv64\""' KERNEL_ARCH='riscv' LOCALVERSION='-riscv64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-riscv64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_riscv64_real: setup_rt: setup_rt_real setup_rt_real: @@ -1103,7 +1103,7 @@ setup_s390x_none_real: setup_s390x_none_s390x: setup_s390x_none_s390x_real setup_s390x_none_s390x_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='s390x' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='s390x' IMAGE_FILE='arch/s390/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-s390x' KCONFIG='debian/config/config debian/config/s390x/config' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-s390x\""' KERNEL_ARCH='s390' LOCALVERSION='-s390x' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-s390x' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VDSO='True' VERSION='4.19' setup_s390x_real: setup_sh3: setup_sh3_real setup_sh3_real: @@ -1112,10 +1112,10 @@ setup_sh4_none_real: setup_sh4_none_sh7751r: setup_sh4_none_sh7751r_real setup_sh4_none_sh7751r_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7751r' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7751r' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7751r' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7751r\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7751r' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7751r' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_sh4_none_sh7785lcr: setup_sh4_none_sh7785lcr_real setup_sh4_none_sh7785lcr_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='sh4' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sh7785lcr' IMAGE_FILE='arch/sh/boot/zImage' IMAGE_INSTALL_STEM='vmlinuz' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sh7785lcr' KCONFIG='debian/config/config debian/config/sh4/config debian/config/sh4/config.sh7785lcr' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sh7785lcr\""' KERNEL_ARCH='sh' LOCALVERSION='-sh7785lcr' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sh7785lcr' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_sh4_real: setup_sparc: setup_sparc_real setup_sparc64: setup_sparc64_none setup_sparc64_real @@ -1124,9 +1124,9 @@ setup_sparc64_none_sparc64: setup_sparc64_none_sparc64_real setup_sparc64_none_sparc64-smp: setup_sparc64_none_sparc64-smp_real setup_sparc64_none_sparc64-smp_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64-smp' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64-smp' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-smp' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64-smp\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64-smp' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64-smp' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_sparc64_none_sparc64_real:: - $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-8' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-8-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-8-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real setup-arch-flavour ABINAME='4.19.0-9' ARCH='sparc64' COMPILER='gcc-8' DEBUG='True' FEATURESET='none' FLAVOUR='sparc64' IMAGE_FILE='vmlinux' IMAGE_INSTALL_STEM='vmlinux' IMAGE_PACKAGE_NAME='linux-image-4.19.0-9-sparc64' KCONFIG='debian/config/config debian/config/kernelarch-sparc/config debian/config/kernelarch-sparc/config-up' KCONFIG_OPTIONS=' -o DEBUG_INFO=y -o "BUILD_SALT=\"4.19.0-9-sparc64\""' KERNEL_ARCH='sparc' LOCALVERSION='-sparc64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-sparc64' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' setup_sparc64_real: setup_sparc_real: setup_x32: setup_x32_real @@ -1134,7 +1134,7 @@ source: source_none source_rt source_none: source_none_real source_none_real:: - $(MAKE) -f debian/rules.real source-featureset ABINAME='4.19.0-8' FEATURESET='none' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real source-featureset ABINAME='4.19.0-9' FEATURESET='none' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' source_rt: source_rt_real source_rt_real:: - $(MAKE) -f debian/rules.real source-featureset ABINAME='4.19.0-8' FEATURESET='rt' SOURCEVERSION='4.19.98-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' + $(MAKE) -f debian/rules.real source-featureset ABINAME='4.19.0-9' FEATURESET='rt' SOURCEVERSION='4.19.118-1' SOURCE_BASENAME='linux' UPSTREAMVERSION='4.19' VERSION='4.19' diff -Nru linux-4.19.98/debian/tests/control linux-4.19.118/debian/tests/control --- linux-4.19.98/debian/tests/control 2020-01-26 20:01:13.000000000 +0000 +++ linux-4.19.118/debian/tests/control 2020-04-26 13:04:11.000000000 +0000 @@ -3,6 +3,6 @@ Tests: selftests Restrictions: breaks-testbed, needs-root, isolation-machine -Depends: kexec-tools, python3, gcc, make, libpopt-dev, gcc-multilib [amd64], bc, fuse, libfuse-dev, pkg-config, linux-image-4.19.0-8-alpha-generic [alpha], linux-image-4.19.0-8-alpha-smp [alpha], linux-image-4.19.0-8-amd64-unsigned [amd64], linux-image-4.19.0-8-cloud-amd64-unsigned [amd64], linux-image-4.19.0-8-rt-amd64-unsigned [amd64], linux-image-4.19.0-8-arm64-unsigned [arm64], linux-image-4.19.0-8-rt-arm64-unsigned [arm64], linux-image-4.19.0-8-marvell [armel], linux-image-4.19.0-8-rpi [armel], linux-image-4.19.0-8-armmp [armhf], linux-image-4.19.0-8-armmp-lpae [armhf], linux-image-4.19.0-8-rt-armmp [armhf], linux-image-4.19.0-8-parisc [hppa], linux-image-4.19.0-8-parisc-smp [hppa], linux-image-4.19.0-8-parisc64-smp [hppa], linux-image-4.19.0-8-686-unsigned [i386], linux-image-4.19.0-8-686-pae-unsigned [i386], linux-image-4.19.0-8-rt-686-pae-unsigned [i386], linux-image-4.19.0-8-itanium [ia64], linux-image-4.19.0-8-mckinley [ia64], linux-image-4.19.0-8-m68k [m68k], linux-image-4.19.0-8-4kc-malta [mips mipsel], linux-image-4.19.0-8-5kc-malta [mips mips64 mips64el mipsel], linux-image-4.19.0-8-octeon [mips mips64 mips64el mipsel], linux-image-4.19.0-8-loongson-3 [mips64el mipsel], linux-image-4.19.0-8-mips64r6 [mips64r6 mipsr6], linux-image-4.19.0-8-mips64r6el [mips64r6el mipsr6el], linux-image-4.19.0-8-mips32r6 [mipsr6], linux-image-4.19.0-8-mips32r6el [mipsr6el], linux-image-4.19.0-8-powerpc [powerpc], linux-image-4.19.0-8-powerpc-smp [powerpc], linux-image-4.19.0-8-powerpc64 [powerpc ppc64], linux-image-4.19.0-8-powerpcspe [powerpcspe], linux-image-4.19.0-8-powerpc64le [ppc64el], linux-image-4.19.0-8-riscv64 [riscv64], linux-image-4.19.0-8-s390x [s390x], linux-image-4.19.0-8-sh7751r [sh4], linux-image-4.19.0-8-sh7785lcr [sh4], linux-image-4.19.0-8-sparc64 [sparc64], linux-image-4.19.0-8-sparc64-smp [sparc64] +Depends: kexec-tools, python3, gcc, make, libpopt-dev, gcc-multilib [amd64], bc, fuse, libfuse-dev, pkg-config, linux-image-4.19.0-9-alpha-generic [alpha], linux-image-4.19.0-9-alpha-smp [alpha], linux-image-4.19.0-9-amd64-unsigned [amd64], linux-image-4.19.0-9-cloud-amd64-unsigned [amd64], linux-image-4.19.0-9-rt-amd64-unsigned [amd64], linux-image-4.19.0-9-arm64-unsigned [arm64], linux-image-4.19.0-9-rt-arm64-unsigned [arm64], linux-image-4.19.0-9-marvell [armel], linux-image-4.19.0-9-rpi [armel], linux-image-4.19.0-9-armmp [armhf], linux-image-4.19.0-9-armmp-lpae [armhf], linux-image-4.19.0-9-rt-armmp [armhf], linux-image-4.19.0-9-parisc [hppa], linux-image-4.19.0-9-parisc-smp [hppa], linux-image-4.19.0-9-parisc64-smp [hppa], linux-image-4.19.0-9-686-unsigned [i386], linux-image-4.19.0-9-686-pae-unsigned [i386], linux-image-4.19.0-9-rt-686-pae-unsigned [i386], linux-image-4.19.0-9-itanium [ia64], linux-image-4.19.0-9-mckinley [ia64], linux-image-4.19.0-9-m68k [m68k], linux-image-4.19.0-9-4kc-malta [mips mipsel], linux-image-4.19.0-9-5kc-malta [mips mips64 mips64el mipsel], linux-image-4.19.0-9-octeon [mips mips64 mips64el mipsel], linux-image-4.19.0-9-loongson-3 [mips64el mipsel], linux-image-4.19.0-9-mips64r6 [mips64r6 mipsr6], linux-image-4.19.0-9-mips64r6el [mips64r6el mipsr6el], linux-image-4.19.0-9-mips32r6 [mipsr6], linux-image-4.19.0-9-mips32r6el [mipsr6el], linux-image-4.19.0-9-powerpc [powerpc], linux-image-4.19.0-9-powerpc-smp [powerpc], linux-image-4.19.0-9-powerpc64 [powerpc ppc64], linux-image-4.19.0-9-powerpcspe [powerpcspe], linux-image-4.19.0-9-powerpc64le [ppc64el], linux-image-4.19.0-9-riscv64 [riscv64], linux-image-4.19.0-9-s390x [s390x], linux-image-4.19.0-9-sh7751r [sh4], linux-image-4.19.0-9-sh7785lcr [sh4], linux-image-4.19.0-9-sparc64 [sparc64], linux-image-4.19.0-9-sparc64-smp [sparc64] Classes: smp diff -Nru linux-4.19.98/drivers/acpi/acpi_lpss.c linux-4.19.118/drivers/acpi/acpi_lpss.c --- linux-4.19.98/drivers/acpi/acpi_lpss.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/acpi_lpss.c 2020-04-23 08:30:24.000000000 +0000 @@ -1056,6 +1056,13 @@ int ret; if (pdata->dev_desc->resume_from_noirq) { + /* + * The driver's ->suspend_late callback will be invoked by + * acpi_lpss_do_suspend_late(), with the assumption that the + * driver really wanted to run that code in ->suspend_noirq, but + * it could not run after acpi_dev_suspend() and the driver + * expected the latter to be called in the "late" phase. + */ ret = acpi_lpss_do_suspend_late(dev); if (ret) return ret; @@ -1086,16 +1093,99 @@ struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); int ret; - ret = acpi_subsys_resume_noirq(dev); + /* Follow acpi_subsys_resume_noirq(). */ + if (dev_pm_may_skip_resume(dev)) + return 0; + + if (dev_pm_smart_suspend_and_suspended(dev)) + pm_runtime_set_active(dev); + + ret = pm_generic_resume_noirq(dev); + if (ret) + return ret; + + if (!pdata->dev_desc->resume_from_noirq) + return 0; + + /* + * The driver's ->resume_early callback will be invoked by + * acpi_lpss_do_resume_early(), with the assumption that the driver + * really wanted to run that code in ->resume_noirq, but it could not + * run before acpi_dev_resume() and the driver expected the latter to be + * called in the "early" phase. + */ + return acpi_lpss_do_resume_early(dev); +} + +static int acpi_lpss_do_restore_early(struct device *dev) +{ + int ret = acpi_lpss_resume(dev); + + return ret ? ret : pm_generic_restore_early(dev); +} + +static int acpi_lpss_restore_early(struct device *dev) +{ + struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); + + if (pdata->dev_desc->resume_from_noirq) + return 0; + + return acpi_lpss_do_restore_early(dev); +} + +static int acpi_lpss_restore_noirq(struct device *dev) +{ + struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); + int ret; + + ret = pm_generic_restore_noirq(dev); if (ret) return ret; - if (!dev_pm_may_skip_resume(dev) && pdata->dev_desc->resume_from_noirq) - ret = acpi_lpss_do_resume_early(dev); + if (!pdata->dev_desc->resume_from_noirq) + return 0; - return ret; + /* This is analogous to what happens in acpi_lpss_resume_noirq(). */ + return acpi_lpss_do_restore_early(dev); } +static int acpi_lpss_do_poweroff_late(struct device *dev) +{ + int ret = pm_generic_poweroff_late(dev); + + return ret ? ret : acpi_lpss_suspend(dev, device_may_wakeup(dev)); +} + +static int acpi_lpss_poweroff_late(struct device *dev) +{ + struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); + + if (dev_pm_smart_suspend_and_suspended(dev)) + return 0; + + if (pdata->dev_desc->resume_from_noirq) + return 0; + + return acpi_lpss_do_poweroff_late(dev); +} + +static int acpi_lpss_poweroff_noirq(struct device *dev) +{ + struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); + + if (dev_pm_smart_suspend_and_suspended(dev)) + return 0; + + if (pdata->dev_desc->resume_from_noirq) { + /* This is analogous to the acpi_lpss_suspend_noirq() case. */ + int ret = acpi_lpss_do_poweroff_late(dev); + if (ret) + return ret; + } + + return pm_generic_poweroff_noirq(dev); +} #endif /* CONFIG_PM_SLEEP */ static int acpi_lpss_runtime_suspend(struct device *dev) @@ -1129,14 +1219,11 @@ .resume_noirq = acpi_lpss_resume_noirq, .resume_early = acpi_lpss_resume_early, .freeze = acpi_subsys_freeze, - .freeze_late = acpi_subsys_freeze_late, - .freeze_noirq = acpi_subsys_freeze_noirq, - .thaw_noirq = acpi_subsys_thaw_noirq, - .poweroff = acpi_subsys_suspend, - .poweroff_late = acpi_lpss_suspend_late, - .poweroff_noirq = acpi_lpss_suspend_noirq, - .restore_noirq = acpi_lpss_resume_noirq, - .restore_early = acpi_lpss_resume_early, + .poweroff = acpi_subsys_poweroff, + .poweroff_late = acpi_lpss_poweroff_late, + .poweroff_noirq = acpi_lpss_poweroff_noirq, + .restore_noirq = acpi_lpss_restore_noirq, + .restore_early = acpi_lpss_restore_early, #endif .runtime_suspend = acpi_lpss_runtime_suspend, .runtime_resume = acpi_lpss_runtime_resume, diff -Nru linux-4.19.98/drivers/acpi/acpi_memhotplug.c linux-4.19.118/drivers/acpi/acpi_memhotplug.c --- linux-4.19.98/drivers/acpi/acpi_memhotplug.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/acpi_memhotplug.c 2020-04-23 08:30:24.000000000 +0000 @@ -282,7 +282,7 @@ nid = memory_add_physaddr_to_nid(info->start_addr); acpi_unbind_memory_blocks(info); - remove_memory(nid, info->start_addr, info->length); + __remove_memory(nid, info->start_addr, info->length); list_del(&info->list); kfree(info); } diff -Nru linux-4.19.98/drivers/acpi/acpi_watchdog.c linux-4.19.118/drivers/acpi/acpi_watchdog.c --- linux-4.19.98/drivers/acpi/acpi_watchdog.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/acpi_watchdog.c 2020-04-23 08:30:24.000000000 +0000 @@ -58,12 +58,14 @@ } #endif +static bool acpi_no_watchdog; + static const struct acpi_table_wdat *acpi_watchdog_get_wdat(void) { const struct acpi_table_wdat *wdat = NULL; acpi_status status; - if (acpi_disabled) + if (acpi_disabled || acpi_no_watchdog) return NULL; status = acpi_get_table(ACPI_SIG_WDAT, 0, @@ -91,6 +93,14 @@ } EXPORT_SYMBOL_GPL(acpi_has_watchdog); +/* ACPI watchdog can be disabled on boot command line */ +static int __init disable_acpi_watchdog(char *str) +{ + acpi_no_watchdog = true; + return 1; +} +__setup("acpi_no_watchdog", disable_acpi_watchdog); + void __init acpi_watchdog_init(void) { const struct acpi_wdat_entry *entries; @@ -129,12 +139,11 @@ gas = &entries[i].register_region; res.start = gas->address; + res.end = res.start + ACPI_ACCESS_BYTE_WIDTH(gas->access_width) - 1; if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { res.flags = IORESOURCE_MEM; - res.end = res.start + ALIGN(gas->access_width, 4) - 1; } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { res.flags = IORESOURCE_IO; - res.end = res.start + gas->access_width - 1; } else { pr_warn("Unsupported address space: %u\n", gas->space_id); diff -Nru linux-4.19.98/drivers/acpi/acpica/dsfield.c linux-4.19.118/drivers/acpi/acpica/dsfield.c --- linux-4.19.98/drivers/acpi/acpica/dsfield.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/acpica/dsfield.c 2020-04-23 08:30:24.000000000 +0000 @@ -244,7 +244,7 @@ * FUNCTION: acpi_ds_get_field_names * * PARAMETERS: info - create_field info structure - * ` walk_state - Current method state + * walk_state - Current method state * arg - First parser arg for the field name list * * RETURN: Status diff -Nru linux-4.19.98/drivers/acpi/acpica/dswload.c linux-4.19.118/drivers/acpi/acpica/dswload.c --- linux-4.19.98/drivers/acpi/acpica/dswload.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/acpica/dswload.c 2020-04-23 08:30:24.000000000 +0000 @@ -412,6 +412,27 @@ ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); + /* + * Disassembler: handle create field operators here. + * + * create_buffer_field is a deferred op that is typically processed in load + * pass 2. However, disassembly of control method contents walk the parse + * tree with ACPI_PARSE_LOAD_PASS1 and AML_CREATE operators are processed + * in a later walk. This is a problem when there is a control method that + * has the same name as the AML_CREATE object. In this case, any use of the + * name segment will be detected as a method call rather than a reference + * to a buffer field. + * + * This earlier creation during disassembly solves this issue by inserting + * the named object in the ACPI namespace so that references to this name + * would be a name string rather than a method call. + */ + if ((walk_state->parse_flags & ACPI_PARSE_DISASSEMBLE) && + (walk_state->op_info->flags & AML_CREATE)) { + status = acpi_ds_create_buffer_field(op, walk_state); + return_ACPI_STATUS(status); + } + /* We are only interested in opcodes that have an associated name */ if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) { diff -Nru linux-4.19.98/drivers/acpi/apei/ghes.c linux-4.19.118/drivers/acpi/apei/ghes.c --- linux-4.19.98/drivers/acpi/apei/ghes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/apei/ghes.c 2020-04-23 08:30:24.000000000 +0000 @@ -201,7 +201,7 @@ * New allocation must be visible in all pgd before it can be found by * an NMI allocating from the pool. */ - vmalloc_sync_all(); + vmalloc_sync_mappings(); return gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); } diff -Nru linux-4.19.98/drivers/acpi/battery.c linux-4.19.118/drivers/acpi/battery.c --- linux-4.19.98/drivers/acpi/battery.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/battery.c 2020-04-23 08:30:24.000000000 +0000 @@ -51,6 +51,8 @@ #define PREFIX "ACPI: " #define ACPI_BATTERY_VALUE_UNKNOWN 0xFFFFFFFF +#define ACPI_BATTERY_CAPACITY_VALID(capacity) \ + ((capacity) != 0 && (capacity) != ACPI_BATTERY_VALUE_UNKNOWN) #define ACPI_BATTERY_DEVICE_NAME "Battery" @@ -205,7 +207,8 @@ static bool acpi_battery_is_degraded(struct acpi_battery *battery) { - return battery->full_charge_capacity && battery->design_capacity && + return ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) && + ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity) && battery->full_charge_capacity < battery->design_capacity; } @@ -227,7 +230,7 @@ enum power_supply_property psp, union power_supply_propval *val) { - int ret = 0; + int full_capacity = ACPI_BATTERY_VALUE_UNKNOWN, ret = 0; struct acpi_battery *battery = to_acpi_battery(psy); if (acpi_battery_present(battery)) { @@ -276,14 +279,14 @@ break; case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN: - if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) + if (!ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) ret = -ENODEV; else val->intval = battery->design_capacity * 1000; break; case POWER_SUPPLY_PROP_CHARGE_FULL: case POWER_SUPPLY_PROP_ENERGY_FULL: - if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) + if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity)) ret = -ENODEV; else val->intval = battery->full_charge_capacity * 1000; @@ -296,11 +299,17 @@ val->intval = battery->capacity_now * 1000; break; case POWER_SUPPLY_PROP_CAPACITY: - if (battery->capacity_now && battery->full_charge_capacity) - val->intval = battery->capacity_now * 100/ - battery->full_charge_capacity; + if (ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity)) + full_capacity = battery->full_charge_capacity; + else if (ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) + full_capacity = battery->design_capacity; + + if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN || + full_capacity == ACPI_BATTERY_VALUE_UNKNOWN) + ret = -ENODEV; else - val->intval = 0; + val->intval = battery->capacity_now * 100/ + full_capacity; break; case POWER_SUPPLY_PROP_CAPACITY_LEVEL: if (battery->state & ACPI_BATTERY_STATE_CRITICAL) @@ -346,6 +355,20 @@ POWER_SUPPLY_PROP_SERIAL_NUMBER, }; +static enum power_supply_property charge_battery_full_cap_broken_props[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_CYCLE_COUNT, + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_CHARGE_NOW, + POWER_SUPPLY_PROP_MODEL_NAME, + POWER_SUPPLY_PROP_MANUFACTURER, + POWER_SUPPLY_PROP_SERIAL_NUMBER, +}; + static enum power_supply_property energy_battery_props[] = { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_PRESENT, @@ -807,20 +830,34 @@ static int sysfs_add_battery(struct acpi_battery *battery) { struct power_supply_config psy_cfg = { .drv_data = battery, }; + bool full_cap_broken = false; + + if (!ACPI_BATTERY_CAPACITY_VALID(battery->full_charge_capacity) && + !ACPI_BATTERY_CAPACITY_VALID(battery->design_capacity)) + full_cap_broken = true; if (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) { - battery->bat_desc.properties = charge_battery_props; - battery->bat_desc.num_properties = - ARRAY_SIZE(charge_battery_props); - } else if (battery->full_charge_capacity == 0) { - battery->bat_desc.properties = - energy_battery_full_cap_broken_props; - battery->bat_desc.num_properties = - ARRAY_SIZE(energy_battery_full_cap_broken_props); + if (full_cap_broken) { + battery->bat_desc.properties = + charge_battery_full_cap_broken_props; + battery->bat_desc.num_properties = + ARRAY_SIZE(charge_battery_full_cap_broken_props); + } else { + battery->bat_desc.properties = charge_battery_props; + battery->bat_desc.num_properties = + ARRAY_SIZE(charge_battery_props); + } } else { - battery->bat_desc.properties = energy_battery_props; - battery->bat_desc.num_properties = - ARRAY_SIZE(energy_battery_props); + if (full_cap_broken) { + battery->bat_desc.properties = + energy_battery_full_cap_broken_props; + battery->bat_desc.num_properties = + ARRAY_SIZE(energy_battery_full_cap_broken_props); + } else { + battery->bat_desc.properties = energy_battery_props; + battery->bat_desc.num_properties = + ARRAY_SIZE(energy_battery_props); + } } battery->bat_desc.name = acpi_device_bid(battery->device); diff -Nru linux-4.19.98/drivers/acpi/button.c linux-4.19.118/drivers/acpi/button.c --- linux-4.19.98/drivers/acpi/button.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/button.c 2020-04-23 08:30:24.000000000 +0000 @@ -102,6 +102,17 @@ }, .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN, }, + { + /* + * Razer Blade Stealth 13 late 2019, notification of the LID device + * only happens on close, not on open and _LID always returns closed. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Razer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Razer Blade Stealth 13 Late 2019"), + }, + .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN, + }, {} }; @@ -467,8 +478,11 @@ struct acpi_button *button = acpi_driver_data(device); button->suspended = false; - if (button->type == ACPI_BUTTON_TYPE_LID && button->input->users) + if (button->type == ACPI_BUTTON_TYPE_LID && button->input->users) { + button->last_state = !!acpi_lid_evaluate_state(device); + button->last_time = ktime_get(); acpi_lid_initialize_state(device); + } return 0; } #endif diff -Nru linux-4.19.98/drivers/acpi/device_pm.c linux-4.19.118/drivers/acpi/device_pm.c --- linux-4.19.98/drivers/acpi/device_pm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/device_pm.c 2020-04-23 08:30:24.000000000 +0000 @@ -1077,7 +1077,7 @@ * acpi_subsys_resume_noirq - Run the device driver's "noirq" resume callback. * @dev: Device to handle. */ -int acpi_subsys_resume_noirq(struct device *dev) +static int acpi_subsys_resume_noirq(struct device *dev) { if (dev_pm_may_skip_resume(dev)) return 0; @@ -1092,7 +1092,6 @@ return pm_generic_resume_noirq(dev); } -EXPORT_SYMBOL_GPL(acpi_subsys_resume_noirq); /** * acpi_subsys_resume_early - Resume device using ACPI. @@ -1102,12 +1101,11 @@ * generic early resume procedure for it during system transition into the * working state. */ -int acpi_subsys_resume_early(struct device *dev) +static int acpi_subsys_resume_early(struct device *dev) { int ret = acpi_dev_resume(dev); return ret ? ret : pm_generic_resume_early(dev); } -EXPORT_SYMBOL_GPL(acpi_subsys_resume_early); /** * acpi_subsys_freeze - Run the device driver's freeze callback. @@ -1116,65 +1114,81 @@ int acpi_subsys_freeze(struct device *dev) { /* - * This used to be done in acpi_subsys_prepare() for all devices and - * some drivers may depend on it, so do it here. Ideally, however, - * runtime-suspended devices should not be touched during freeze/thaw - * transitions. + * Resume all runtime-suspended devices before creating a snapshot + * image of system memory, because the restore kernel generally cannot + * be expected to always handle them consistently and they need to be + * put into the runtime-active metastate during system resume anyway, + * so it is better to ensure that the state saved in the image will be + * always consistent with that. */ - if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND)) - pm_runtime_resume(dev); + pm_runtime_resume(dev); return pm_generic_freeze(dev); } EXPORT_SYMBOL_GPL(acpi_subsys_freeze); /** - * acpi_subsys_freeze_late - Run the device driver's "late" freeze callback. - * @dev: Device to handle. + * acpi_subsys_restore_early - Restore device using ACPI. + * @dev: Device to restore. */ -int acpi_subsys_freeze_late(struct device *dev) +int acpi_subsys_restore_early(struct device *dev) { + int ret = acpi_dev_resume(dev); + return ret ? ret : pm_generic_restore_early(dev); +} +EXPORT_SYMBOL_GPL(acpi_subsys_restore_early); - if (dev_pm_smart_suspend_and_suspended(dev)) - return 0; +/** + * acpi_subsys_poweroff - Run the device driver's poweroff callback. + * @dev: Device to handle. + * + * Follow PCI and resume devices from runtime suspend before running their + * system poweroff callbacks, unless the driver can cope with runtime-suspended + * devices during system suspend and there are no ACPI-specific reasons for + * resuming them. + */ +int acpi_subsys_poweroff(struct device *dev) +{ + if (!dev_pm_test_driver_flags(dev, DPM_FLAG_SMART_SUSPEND) || + acpi_dev_needs_resume(dev, ACPI_COMPANION(dev))) + pm_runtime_resume(dev); - return pm_generic_freeze_late(dev); + return pm_generic_poweroff(dev); } -EXPORT_SYMBOL_GPL(acpi_subsys_freeze_late); +EXPORT_SYMBOL_GPL(acpi_subsys_poweroff); /** - * acpi_subsys_freeze_noirq - Run the device driver's "noirq" freeze callback. + * acpi_subsys_poweroff_late - Run the device driver's poweroff callback. * @dev: Device to handle. + * + * Carry out the generic late poweroff procedure for @dev and use ACPI to put + * it into a low-power state during system transition into a sleep state. */ -int acpi_subsys_freeze_noirq(struct device *dev) +static int acpi_subsys_poweroff_late(struct device *dev) { + int ret; if (dev_pm_smart_suspend_and_suspended(dev)) return 0; - return pm_generic_freeze_noirq(dev); + ret = pm_generic_poweroff_late(dev); + if (ret) + return ret; + + return acpi_dev_suspend(dev, device_may_wakeup(dev)); } -EXPORT_SYMBOL_GPL(acpi_subsys_freeze_noirq); /** - * acpi_subsys_thaw_noirq - Run the device driver's "noirq" thaw callback. - * @dev: Device to handle. + * acpi_subsys_poweroff_noirq - Run the driver's "noirq" poweroff callback. + * @dev: Device to suspend. */ -int acpi_subsys_thaw_noirq(struct device *dev) +static int acpi_subsys_poweroff_noirq(struct device *dev) { - /* - * If the device is in runtime suspend, the "thaw" code may not work - * correctly with it, so skip the driver callback and make the PM core - * skip all of the subsequent "thaw" callbacks for the device. - */ - if (dev_pm_smart_suspend_and_suspended(dev)) { - dev_pm_skip_next_resume_phases(dev); + if (dev_pm_smart_suspend_and_suspended(dev)) return 0; - } - return pm_generic_thaw_noirq(dev); + return pm_generic_poweroff_noirq(dev); } -EXPORT_SYMBOL_GPL(acpi_subsys_thaw_noirq); #endif /* CONFIG_PM_SLEEP */ static struct dev_pm_domain acpi_general_pm_domain = { @@ -1190,14 +1204,10 @@ .resume_noirq = acpi_subsys_resume_noirq, .resume_early = acpi_subsys_resume_early, .freeze = acpi_subsys_freeze, - .freeze_late = acpi_subsys_freeze_late, - .freeze_noirq = acpi_subsys_freeze_noirq, - .thaw_noirq = acpi_subsys_thaw_noirq, - .poweroff = acpi_subsys_suspend, - .poweroff_late = acpi_subsys_suspend_late, - .poweroff_noirq = acpi_subsys_suspend_noirq, - .restore_noirq = acpi_subsys_resume_noirq, - .restore_early = acpi_subsys_resume_early, + .poweroff = acpi_subsys_poweroff, + .poweroff_late = acpi_subsys_poweroff_late, + .poweroff_noirq = acpi_subsys_poweroff_noirq, + .restore_early = acpi_subsys_restore_early, #endif }, }; diff -Nru linux-4.19.98/drivers/acpi/processor_throttling.c linux-4.19.118/drivers/acpi/processor_throttling.c --- linux-4.19.98/drivers/acpi/processor_throttling.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/processor_throttling.c 2020-04-23 08:30:24.000000000 +0000 @@ -910,13 +910,6 @@ return pr->throttling.acpi_processor_get_throttling(pr); } -static int call_on_cpu(int cpu, long (*fn)(void *), void *arg, bool direct) -{ - if (direct || (is_percpu_thread() && cpu == smp_processor_id())) - return fn(arg); - return work_on_cpu(cpu, fn, arg); -} - static int acpi_processor_get_throttling(struct acpi_processor *pr) { if (!pr) diff -Nru linux-4.19.98/drivers/acpi/video_detect.c linux-4.19.118/drivers/acpi/video_detect.c --- linux-4.19.98/drivers/acpi/video_detect.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/acpi/video_detect.c 2020-04-23 08:30:24.000000000 +0000 @@ -328,6 +328,11 @@ DMI_MATCH(DMI_PRODUCT_NAME, "Precision 7510"), }, }, + + /* + * Desktops which falsely report a backlight and which our heuristics + * for this do not catch. + */ { .callback = video_detect_force_none, .ident = "Dell OptiPlex 9020M", @@ -336,6 +341,14 @@ DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 9020M"), }, }, + { + .callback = video_detect_force_none, + .ident = "MSI MS-7721", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MSI"), + DMI_MATCH(DMI_PRODUCT_NAME, "MS-7721"), + }, + }, { }, }; diff -Nru linux-4.19.98/drivers/ata/ahci.c linux-4.19.118/drivers/ata/ahci.c --- linux-4.19.98/drivers/ata/ahci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ata/ahci.c 2020-04-23 08:30:24.000000000 +0000 @@ -96,6 +96,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); static void ahci_remove_one(struct pci_dev *dev); +static void ahci_shutdown_one(struct pci_dev *dev); static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class, unsigned long deadline); static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class, @@ -408,6 +409,7 @@ { PCI_VDEVICE(INTEL, 0xa252), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa256), board_ahci }, /* Lewisburg RAID*/ { PCI_VDEVICE(INTEL, 0xa356), board_ahci }, /* Cannon Lake PCH-H RAID */ + { PCI_VDEVICE(INTEL, 0x06d7), board_ahci }, /* Comet Lake-H RAID */ { PCI_VDEVICE(INTEL, 0x0f22), board_ahci_mobile }, /* Bay Trail AHCI */ { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_mobile }, /* Bay Trail AHCI */ { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_mobile }, /* Cherry Tr. AHCI */ @@ -609,6 +611,7 @@ .id_table = ahci_pci_tbl, .probe = ahci_init_one, .remove = ahci_remove_one, + .shutdown = ahci_shutdown_one, .driver = { .pm = &ahci_pci_pm_ops, }, @@ -1897,6 +1900,11 @@ return 0; } +static void ahci_shutdown_one(struct pci_dev *pdev) +{ + ata_pci_shutdown_one(pdev); +} + static void ahci_remove_one(struct pci_dev *pdev) { pm_runtime_get_noresume(&pdev->dev); diff -Nru linux-4.19.98/drivers/ata/libahci.c linux-4.19.118/drivers/ata/libahci.c --- linux-4.19.98/drivers/ata/libahci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ata/libahci.c 2020-04-23 08:30:24.000000000 +0000 @@ -191,7 +191,6 @@ EXPORT_SYMBOL_GPL(ahci_pmp_retry_srst_ops); static bool ahci_em_messages __read_mostly = true; -EXPORT_SYMBOL_GPL(ahci_em_messages); module_param(ahci_em_messages, bool, 0444); /* add other LED protocol types when they become supported */ MODULE_PARM_DESC(ahci_em_messages, diff -Nru linux-4.19.98/drivers/ata/libata-core.c linux-4.19.118/drivers/ata/libata-core.c --- linux-4.19.98/drivers/ata/libata-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ata/libata-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -6780,6 +6780,26 @@ ata_host_detach(host); } +void ata_pci_shutdown_one(struct pci_dev *pdev) +{ + struct ata_host *host = pci_get_drvdata(pdev); + int i; + + for (i = 0; i < host->n_ports; i++) { + struct ata_port *ap = host->ports[i]; + + ap->pflags |= ATA_PFLAG_FROZEN; + + /* Disable port interrupts */ + if (ap->ops->freeze) + ap->ops->freeze(ap); + + /* Stop the port DMA engines */ + if (ap->ops->port_stop) + ap->ops->port_stop(ap); + } +} + /* move to PCI subsystem */ int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits) { @@ -7400,6 +7420,7 @@ #ifdef CONFIG_PCI EXPORT_SYMBOL_GPL(pci_test_config_bits); +EXPORT_SYMBOL_GPL(ata_pci_shutdown_one); EXPORT_SYMBOL_GPL(ata_pci_remove_one); #ifdef CONFIG_PM EXPORT_SYMBOL_GPL(ata_pci_device_do_suspend); diff -Nru linux-4.19.98/drivers/ata/libata-pmp.c linux-4.19.118/drivers/ata/libata-pmp.c --- linux-4.19.98/drivers/ata/libata-pmp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ata/libata-pmp.c 2020-04-23 08:30:24.000000000 +0000 @@ -764,6 +764,7 @@ if (dev->flags & ATA_DFLAG_DETACH) { detach = 1; + rc = -ENODEV; goto fail; } diff -Nru linux-4.19.98/drivers/ata/libata-scsi.c linux-4.19.118/drivers/ata/libata-scsi.c --- linux-4.19.98/drivers/ata/libata-scsi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ata/libata-scsi.c 2020-04-23 08:30:24.000000000 +0000 @@ -4570,22 +4570,19 @@ */ shost->max_host_blocked = 1; - rc = scsi_add_host_with_dma(ap->scsi_host, - &ap->tdev, ap->host->dev); + rc = scsi_add_host_with_dma(shost, &ap->tdev, ap->host->dev); if (rc) - goto err_add; + goto err_alloc; } return 0; - err_add: - scsi_host_put(host->ports[i]->scsi_host); err_alloc: while (--i >= 0) { struct Scsi_Host *shost = host->ports[i]->scsi_host; + /* scsi_host_put() is in ata_devres_release() */ scsi_remove_host(shost); - scsi_host_put(shost); } return rc; } diff -Nru linux-4.19.98/drivers/atm/eni.c linux-4.19.118/drivers/atm/eni.c --- linux-4.19.98/drivers/atm/eni.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/atm/eni.c 2020-04-23 08:30:24.000000000 +0000 @@ -372,7 +372,7 @@ here = (eni_vcc->descr+skip) & (eni_vcc->words-1); dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; - j++; + dma[j++] = 0; } here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); if (!eff) size += skip; @@ -445,7 +445,7 @@ if (size != eff) { dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; - j++; + dma[j++] = 0; } if (!j || j > 2*RX_DMA_BUF) { printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); diff -Nru linux-4.19.98/drivers/atm/firestream.c linux-4.19.118/drivers/atm/firestream.c --- linux-4.19.98/drivers/atm/firestream.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/atm/firestream.c 2020-04-23 08:30:24.000000000 +0000 @@ -927,6 +927,7 @@ } if (!to) { printk ("No more free channels for FS50..\n"); + kfree(vcc); return -EBUSY; } vcc->channo = dev->channo; @@ -937,6 +938,7 @@ if (((DO_DIRECTION(rxtp) && dev->atm_vccs[vcc->channo])) || ( DO_DIRECTION(txtp) && test_bit (vcc->channo, dev->tx_inuse))) { printk ("Channel is in use for FS155.\n"); + kfree(vcc); return -EBUSY; } } @@ -950,6 +952,7 @@ tc, sizeof (struct fs_transmit_config)); if (!tc) { fs_dprintk (FS_DEBUG_OPEN, "fs: can't alloc transmit_config.\n"); + kfree(vcc); return -ENOMEM; } diff -Nru linux-4.19.98/drivers/atm/fore200e.c linux-4.19.118/drivers/atm/fore200e.c --- linux-4.19.98/drivers/atm/fore200e.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/atm/fore200e.c 2020-04-23 08:30:24.000000000 +0000 @@ -1504,12 +1504,14 @@ static void fore200e_close(struct atm_vcc* vcc) { - struct fore200e* fore200e = FORE200E_DEV(vcc->dev); struct fore200e_vcc* fore200e_vcc; + struct fore200e* fore200e; struct fore200e_vc_map* vc_map; unsigned long flags; ASSERT(vcc); + fore200e = FORE200E_DEV(vcc->dev); + ASSERT((vcc->vpi >= 0) && (vcc->vpi < 1<vci >= 0) && (vcc->vci < 1<dev); - struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc); + struct fore200e* fore200e; + struct fore200e_vcc* fore200e_vcc; struct fore200e_vc_map* vc_map; - struct host_txq* txq = &fore200e->host_txq; + struct host_txq* txq; struct host_txq_entry* entry; struct tpd* tpd; struct tpd_haddr tpd_haddr; @@ -1570,9 +1572,18 @@ unsigned char* data; unsigned long flags; - ASSERT(vcc); - ASSERT(fore200e); - ASSERT(fore200e_vcc); + if (!vcc) + return -EINVAL; + + fore200e = FORE200E_DEV(vcc->dev); + fore200e_vcc = FORE200E_VCC(vcc); + + if (!fore200e) + return -EINVAL; + + txq = &fore200e->host_txq; + if (!fore200e_vcc) + return -EINVAL; if (!test_bit(ATM_VF_READY, &vcc->flags)) { DPRINTK(1, "VC %d.%d.%d not ready for tx\n", vcc->itf, vcc->vpi, vcc->vpi); diff -Nru linux-4.19.98/drivers/base/component.c linux-4.19.118/drivers/base/component.c --- linux-4.19.98/drivers/base/component.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/component.c 2020-04-23 08:30:24.000000000 +0000 @@ -74,11 +74,11 @@ seq_printf(s, "%-40s %20s\n", "device name", "status"); seq_puts(s, "-------------------------------------------------------------\n"); for (i = 0; i < match->num; i++) { - struct device *d = (struct device *)match->compare[i].data; + struct component *component = match->compare[i].component; - seq_printf(s, "%-40s %20s\n", dev_name(d), - match->compare[i].component ? - "registered" : "not registered"); + seq_printf(s, "%-40s %20s\n", + component ? dev_name(component->dev) : "(unknown)", + component ? (component->bound ? "bound" : "not bound") : "not registered"); } mutex_unlock(&component_mutex); diff -Nru linux-4.19.98/drivers/base/core.c linux-4.19.118/drivers/base/core.c --- linux-4.19.98/drivers/base/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -124,6 +124,50 @@ return ret; } +static void device_link_init_status(struct device_link *link, + struct device *consumer, + struct device *supplier) +{ + switch (supplier->links.status) { + case DL_DEV_PROBING: + switch (consumer->links.status) { + case DL_DEV_PROBING: + /* + * A consumer driver can create a link to a supplier + * that has not completed its probing yet as long as it + * knows that the supplier is already functional (for + * example, it has just acquired some resources from the + * supplier). + */ + link->status = DL_STATE_CONSUMER_PROBE; + break; + default: + link->status = DL_STATE_DORMANT; + break; + } + break; + case DL_DEV_DRIVER_BOUND: + switch (consumer->links.status) { + case DL_DEV_PROBING: + link->status = DL_STATE_CONSUMER_PROBE; + break; + case DL_DEV_DRIVER_BOUND: + link->status = DL_STATE_ACTIVE; + break; + default: + link->status = DL_STATE_AVAILABLE; + break; + } + break; + case DL_DEV_UNBINDING: + link->status = DL_STATE_SUPPLIER_UNBIND; + break; + default: + link->status = DL_STATE_DORMANT; + break; + } +} + static int device_reorder_to_tail(struct device *dev, void *not_used) { struct device_link *link; @@ -165,6 +209,13 @@ device_links_read_unlock(idx); } +#define DL_MANAGED_LINK_FLAGS (DL_FLAG_AUTOREMOVE_CONSUMER | \ + DL_FLAG_AUTOREMOVE_SUPPLIER | \ + DL_FLAG_AUTOPROBE_CONSUMER) + +#define DL_ADD_VALID_FLAGS (DL_MANAGED_LINK_FLAGS | DL_FLAG_STATELESS | \ + DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE) + /** * device_link_add - Create a link between two devices. * @consumer: Consumer end of the link. @@ -179,10 +230,38 @@ * of the link. If DL_FLAG_PM_RUNTIME is not set, DL_FLAG_RPM_ACTIVE will be * ignored. * - * If the DL_FLAG_AUTOREMOVE_CONSUMER is set, the link will be removed - * automatically when the consumer device driver unbinds from it. - * The combination of both DL_FLAG_AUTOREMOVE_CONSUMER and DL_FLAG_STATELESS - * set is invalid and will cause NULL to be returned. + * If DL_FLAG_STATELESS is set in @flags, the caller of this function is + * expected to release the link returned by it directly with the help of either + * device_link_del() or device_link_remove(). + * + * If that flag is not set, however, the caller of this function is handing the + * management of the link over to the driver core entirely and its return value + * can only be used to check whether or not the link is present. In that case, + * the DL_FLAG_AUTOREMOVE_CONSUMER and DL_FLAG_AUTOREMOVE_SUPPLIER device link + * flags can be used to indicate to the driver core when the link can be safely + * deleted. Namely, setting one of them in @flags indicates to the driver core + * that the link is not going to be used (by the given caller of this function) + * after unbinding the consumer or supplier driver, respectively, from its + * device, so the link can be deleted at that point. If none of them is set, + * the link will be maintained until one of the devices pointed to by it (either + * the consumer or the supplier) is unregistered. + * + * Also, if DL_FLAG_STATELESS, DL_FLAG_AUTOREMOVE_CONSUMER and + * DL_FLAG_AUTOREMOVE_SUPPLIER are not set in @flags (that is, a persistent + * managed device link is being added), the DL_FLAG_AUTOPROBE_CONSUMER flag can + * be used to request the driver core to automaticall probe for a consmer + * driver after successfully binding a driver to the supplier device. + * + * The combination of DL_FLAG_STATELESS and one of DL_FLAG_AUTOREMOVE_CONSUMER, + * DL_FLAG_AUTOREMOVE_SUPPLIER, or DL_FLAG_AUTOPROBE_CONSUMER set in @flags at + * the same time is invalid and will cause NULL to be returned upfront. + * However, if a device link between the given @consumer and @supplier pair + * exists already when this function is called for them, the existing link will + * be returned regardless of its current type and status (the link's flags may + * be modified then). The caller of this function is then expected to treat + * the link as though it has just been created, so (in particular) if + * DL_FLAG_STATELESS was passed in @flags, the link needs to be released + * explicitly when not needed any more (as stated above). * * A side effect of the link creation is re-ordering of dpm_list and the * devices_kset list by moving the consumer device and all devices depending @@ -198,11 +277,23 @@ { struct device_link *link; - if (!consumer || !supplier || - ((flags & DL_FLAG_STATELESS) && - (flags & DL_FLAG_AUTOREMOVE_CONSUMER))) + if (!consumer || !supplier || flags & ~DL_ADD_VALID_FLAGS || + (flags & DL_FLAG_STATELESS && flags & DL_MANAGED_LINK_FLAGS) || + (flags & DL_FLAG_AUTOPROBE_CONSUMER && + flags & (DL_FLAG_AUTOREMOVE_CONSUMER | + DL_FLAG_AUTOREMOVE_SUPPLIER))) return NULL; + if (flags & DL_FLAG_PM_RUNTIME && flags & DL_FLAG_RPM_ACTIVE) { + if (pm_runtime_get_sync(supplier) < 0) { + pm_runtime_put_noidle(supplier); + return NULL; + } + } + + if (!(flags & DL_FLAG_STATELESS)) + flags |= DL_FLAG_MANAGED; + device_links_write_lock(); device_pm_lock(); @@ -217,35 +308,68 @@ goto out; } - list_for_each_entry(link, &supplier->links.consumers, s_node) - if (link->consumer == consumer) { + /* + * DL_FLAG_AUTOREMOVE_SUPPLIER indicates that the link will be needed + * longer than for DL_FLAG_AUTOREMOVE_CONSUMER and setting them both + * together doesn't make sense, so prefer DL_FLAG_AUTOREMOVE_SUPPLIER. + */ + if (flags & DL_FLAG_AUTOREMOVE_SUPPLIER) + flags &= ~DL_FLAG_AUTOREMOVE_CONSUMER; + + list_for_each_entry(link, &supplier->links.consumers, s_node) { + if (link->consumer != consumer) + continue; + + if (flags & DL_FLAG_PM_RUNTIME) { + if (!(link->flags & DL_FLAG_PM_RUNTIME)) { + pm_runtime_new_link(consumer); + link->flags |= DL_FLAG_PM_RUNTIME; + } + if (flags & DL_FLAG_RPM_ACTIVE) + refcount_inc(&link->rpm_active); + } + + if (flags & DL_FLAG_STATELESS) { + link->flags |= DL_FLAG_STATELESS; kref_get(&link->kref); goto out; } + /* + * If the life time of the link following from the new flags is + * longer than indicated by the flags of the existing link, + * update the existing link to stay around longer. + */ + if (flags & DL_FLAG_AUTOREMOVE_SUPPLIER) { + if (link->flags & DL_FLAG_AUTOREMOVE_CONSUMER) { + link->flags &= ~DL_FLAG_AUTOREMOVE_CONSUMER; + link->flags |= DL_FLAG_AUTOREMOVE_SUPPLIER; + } + } else if (!(flags & DL_FLAG_AUTOREMOVE_CONSUMER)) { + link->flags &= ~(DL_FLAG_AUTOREMOVE_CONSUMER | + DL_FLAG_AUTOREMOVE_SUPPLIER); + } + if (!(link->flags & DL_FLAG_MANAGED)) { + kref_get(&link->kref); + link->flags |= DL_FLAG_MANAGED; + device_link_init_status(link, consumer, supplier); + } + goto out; + } + link = kzalloc(sizeof(*link), GFP_KERNEL); if (!link) goto out; + refcount_set(&link->rpm_active, 1); + if (flags & DL_FLAG_PM_RUNTIME) { - if (flags & DL_FLAG_RPM_ACTIVE) { - if (pm_runtime_get_sync(supplier) < 0) { - pm_runtime_put_noidle(supplier); - kfree(link); - link = NULL; - goto out; - } - link->rpm_active = true; - } + if (flags & DL_FLAG_RPM_ACTIVE) + refcount_inc(&link->rpm_active); + pm_runtime_new_link(consumer); - /* - * If the link is being added by the consumer driver at probe - * time, balance the decrementation of the supplier's runtime PM - * usage counter after consumer probe in driver_probe_device(). - */ - if (consumer->links.status == DL_DEV_PROBING) - pm_runtime_get_noresume(supplier); } + get_device(supplier); link->supplier = supplier; INIT_LIST_HEAD(&link->s_node); @@ -256,39 +380,18 @@ kref_init(&link->kref); /* Determine the initial link state. */ - if (flags & DL_FLAG_STATELESS) { + if (flags & DL_FLAG_STATELESS) link->status = DL_STATE_NONE; - } else { - switch (supplier->links.status) { - case DL_DEV_DRIVER_BOUND: - switch (consumer->links.status) { - case DL_DEV_PROBING: - /* - * Some callers expect the link creation during - * consumer driver probe to resume the supplier - * even without DL_FLAG_RPM_ACTIVE. - */ - if (flags & DL_FLAG_PM_RUNTIME) - pm_runtime_resume(supplier); - - link->status = DL_STATE_CONSUMER_PROBE; - break; - case DL_DEV_DRIVER_BOUND: - link->status = DL_STATE_ACTIVE; - break; - default: - link->status = DL_STATE_AVAILABLE; - break; - } - break; - case DL_DEV_UNBINDING: - link->status = DL_STATE_SUPPLIER_UNBIND; - break; - default: - link->status = DL_STATE_DORMANT; - break; - } - } + else + device_link_init_status(link, consumer, supplier); + + /* + * Some callers expect the link creation during consumer driver probe to + * resume the supplier even without DL_FLAG_RPM_ACTIVE. + */ + if (link->status == DL_STATE_CONSUMER_PROBE && + flags & DL_FLAG_PM_RUNTIME) + pm_runtime_resume(supplier); /* * Move the consumer and all of the devices depending on it to the end @@ -307,12 +410,19 @@ out: device_pm_unlock(); device_links_write_unlock(); + + if ((flags & DL_FLAG_PM_RUNTIME && flags & DL_FLAG_RPM_ACTIVE) && !link) + pm_runtime_put(supplier); + return link; } EXPORT_SYMBOL_GPL(device_link_add); static void device_link_free(struct device_link *link) { + while (refcount_dec_not_one(&link->rpm_active)) + pm_runtime_put(link->supplier); + put_device(link->consumer); put_device(link->supplier); kfree(link); @@ -355,8 +465,16 @@ } #endif /* !CONFIG_SRCU */ +static void device_link_put_kref(struct device_link *link) +{ + if (link->flags & DL_FLAG_STATELESS) + kref_put(&link->kref, __device_link_del); + else + WARN(1, "Unable to drop a managed device link reference\n"); +} + /** - * device_link_del - Delete a link between two devices. + * device_link_del - Delete a stateless link between two devices. * @link: Device link to delete. * * The caller must ensure proper synchronization of this function with runtime @@ -368,14 +486,14 @@ { device_links_write_lock(); device_pm_lock(); - kref_put(&link->kref, __device_link_del); + device_link_put_kref(link); device_pm_unlock(); device_links_write_unlock(); } EXPORT_SYMBOL_GPL(device_link_del); /** - * device_link_remove - remove a link between two devices. + * device_link_remove - Delete a stateless link between two devices. * @consumer: Consumer end of the link. * @supplier: Supplier end of the link. * @@ -394,7 +512,7 @@ list_for_each_entry(link, &supplier->links.consumers, s_node) { if (link->consumer == consumer) { - kref_put(&link->kref, __device_link_del); + device_link_put_kref(link); break; } } @@ -427,7 +545,7 @@ * mark the link as "consumer probe in progress" to make the supplier removal * wait for us to complete (or bad things may happen). * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links without the DL_FLAG_MANAGED flag set are ignored. */ int device_links_check_suppliers(struct device *dev) { @@ -437,7 +555,7 @@ device_links_write_lock(); list_for_each_entry(link, &dev->links.suppliers, c_node) { - if (link->flags & DL_FLAG_STATELESS) + if (!(link->flags & DL_FLAG_MANAGED)) continue; if (link->status != DL_STATE_AVAILABLE) { @@ -462,7 +580,7 @@ * * Also change the status of @dev's links to suppliers to "active". * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links without the DL_FLAG_MANAGED flag set are ignored. */ void device_links_driver_bound(struct device *dev) { @@ -471,15 +589,28 @@ device_links_write_lock(); list_for_each_entry(link, &dev->links.consumers, s_node) { - if (link->flags & DL_FLAG_STATELESS) + if (!(link->flags & DL_FLAG_MANAGED)) + continue; + + /* + * Links created during consumer probe may be in the "consumer + * probe" state to start with if the supplier is still probing + * when they are created and they may become "active" if the + * consumer probe returns first. Skip them here. + */ + if (link->status == DL_STATE_CONSUMER_PROBE || + link->status == DL_STATE_ACTIVE) continue; WARN_ON(link->status != DL_STATE_DORMANT); WRITE_ONCE(link->status, DL_STATE_AVAILABLE); + + if (link->flags & DL_FLAG_AUTOPROBE_CONSUMER) + driver_deferred_probe_add(link->consumer); } list_for_each_entry(link, &dev->links.suppliers, c_node) { - if (link->flags & DL_FLAG_STATELESS) + if (!(link->flags & DL_FLAG_MANAGED)) continue; WARN_ON(link->status != DL_STATE_CONSUMER_PROBE); @@ -491,6 +622,13 @@ device_links_write_unlock(); } +static void device_link_drop_managed(struct device_link *link) +{ + link->flags &= ~DL_FLAG_MANAGED; + WRITE_ONCE(link->status, DL_STATE_NONE); + kref_put(&link->kref, __device_link_del); +} + /** * __device_links_no_driver - Update links of a device without a driver. * @dev: Device without a drvier. @@ -501,29 +639,60 @@ * unless they already are in the "supplier unbind in progress" state in which * case they need not be updated. * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links without the DL_FLAG_MANAGED flag set are ignored. */ static void __device_links_no_driver(struct device *dev) { struct device_link *link, *ln; list_for_each_entry_safe_reverse(link, ln, &dev->links.suppliers, c_node) { - if (link->flags & DL_FLAG_STATELESS) + if (!(link->flags & DL_FLAG_MANAGED)) continue; if (link->flags & DL_FLAG_AUTOREMOVE_CONSUMER) - kref_put(&link->kref, __device_link_del); - else if (link->status != DL_STATE_SUPPLIER_UNBIND) + device_link_drop_managed(link); + else if (link->status == DL_STATE_CONSUMER_PROBE || + link->status == DL_STATE_ACTIVE) WRITE_ONCE(link->status, DL_STATE_AVAILABLE); } dev->links.status = DL_DEV_NO_DRIVER; } +/** + * device_links_no_driver - Update links after failing driver probe. + * @dev: Device whose driver has just failed to probe. + * + * Clean up leftover links to consumers for @dev and invoke + * %__device_links_no_driver() to update links to suppliers for it as + * appropriate. + * + * Links without the DL_FLAG_MANAGED flag set are ignored. + */ void device_links_no_driver(struct device *dev) { + struct device_link *link; + device_links_write_lock(); + + list_for_each_entry(link, &dev->links.consumers, s_node) { + if (!(link->flags & DL_FLAG_MANAGED)) + continue; + + /* + * The probe has failed, so if the status of the link is + * "consumer probe" or "active", it must have been added by + * a probing consumer while this device was still probing. + * Change its state to "dormant", as it represents a valid + * relationship, but it is not functionally meaningful. + */ + if (link->status == DL_STATE_CONSUMER_PROBE || + link->status == DL_STATE_ACTIVE) + WRITE_ONCE(link->status, DL_STATE_DORMANT); + } + __device_links_no_driver(dev); + device_links_write_unlock(); } @@ -535,16 +704,16 @@ * invoke %__device_links_no_driver() to update links to suppliers for it as * appropriate. * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links without the DL_FLAG_MANAGED flag set are ignored. */ void device_links_driver_cleanup(struct device *dev) { - struct device_link *link; + struct device_link *link, *ln; device_links_write_lock(); - list_for_each_entry(link, &dev->links.consumers, s_node) { - if (link->flags & DL_FLAG_STATELESS) + list_for_each_entry_safe(link, ln, &dev->links.consumers, s_node) { + if (!(link->flags & DL_FLAG_MANAGED)) continue; WARN_ON(link->flags & DL_FLAG_AUTOREMOVE_CONSUMER); @@ -557,7 +726,7 @@ */ if (link->status == DL_STATE_SUPPLIER_UNBIND && link->flags & DL_FLAG_AUTOREMOVE_SUPPLIER) - kref_put(&link->kref, __device_link_del); + device_link_drop_managed(link); WRITE_ONCE(link->status, DL_STATE_DORMANT); } @@ -579,7 +748,7 @@ * * Return 'false' if there are no probing or active consumers. * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links without the DL_FLAG_MANAGED flag set are ignored. */ bool device_links_busy(struct device *dev) { @@ -589,7 +758,7 @@ device_links_write_lock(); list_for_each_entry(link, &dev->links.consumers, s_node) { - if (link->flags & DL_FLAG_STATELESS) + if (!(link->flags & DL_FLAG_MANAGED)) continue; if (link->status == DL_STATE_CONSUMER_PROBE @@ -619,7 +788,7 @@ * driver to unbind and start over (the consumer will not re-probe as we have * changed the state of the link already). * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links without the DL_FLAG_MANAGED flag set are ignored. */ void device_links_unbind_consumers(struct device *dev) { @@ -631,7 +800,7 @@ list_for_each_entry(link, &dev->links.consumers, s_node) { enum device_link_state status; - if (link->flags & DL_FLAG_STATELESS) + if (!(link->flags & DL_FLAG_MANAGED)) continue; status = link->status; diff -Nru linux-4.19.98/drivers/base/dd.c linux-4.19.118/drivers/base/dd.c --- linux-4.19.98/drivers/base/dd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/dd.c 2020-04-23 08:30:24.000000000 +0000 @@ -116,7 +116,7 @@ } static DECLARE_WORK(deferred_probe_work, deferred_probe_work_func); -static void driver_deferred_probe_add(struct device *dev) +void driver_deferred_probe_add(struct device *dev) { mutex_lock(&deferred_probe_mutex); if (list_empty(&dev->p->deferred_probe)) { @@ -470,7 +470,10 @@ atomic_inc(&probe_count); pr_debug("bus: '%s': %s: probing driver %s with device %s\n", drv->bus->name, __func__, drv->name, dev_name(dev)); - WARN_ON(!list_empty(&dev->devres_head)); + if (!list_empty(&dev->devres_head)) { + dev_crit(dev, "Resources present before probing\n"); + return -EBUSY; + } re_probe: dev->driver = drv; diff -Nru linux-4.19.98/drivers/base/firmware_loader/fallback.c linux-4.19.118/drivers/base/firmware_loader/fallback.c --- linux-4.19.98/drivers/base/firmware_loader/fallback.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/firmware_loader/fallback.c 2020-04-23 08:30:24.000000000 +0000 @@ -572,7 +572,7 @@ } retval = fw_sysfs_wait_timeout(fw_priv, timeout); - if (retval < 0) { + if (retval < 0 && retval != -ENOENT) { mutex_lock(&fw_lock); fw_load_abort(fw_sysfs); mutex_unlock(&fw_lock); diff -Nru linux-4.19.98/drivers/base/memory.c linux-4.19.118/drivers/base/memory.c --- linux-4.19.98/drivers/base/memory.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/memory.c 2020-04-23 08:30:24.000000000 +0000 @@ -39,6 +39,11 @@ return section_nr / sections_per_block; } +static inline int pfn_to_block_id(unsigned long pfn) +{ + return base_memory_block_id(pfn_to_section_nr(pfn)); +} + static int memory_subsys_online(struct device *dev); static int memory_subsys_offline(struct device *dev); @@ -230,13 +235,14 @@ * OK to have direct references to sparsemem variables in here. */ static int -memory_block_action(unsigned long phys_index, unsigned long action, int online_type) +memory_block_action(unsigned long start_section_nr, unsigned long action, + int online_type) { unsigned long start_pfn; unsigned long nr_pages = PAGES_PER_SECTION * sections_per_block; int ret; - start_pfn = section_nr_to_pfn(phys_index); + start_pfn = section_nr_to_pfn(start_section_nr); switch (action) { case MEM_ONLINE: @@ -250,7 +256,7 @@ break; default: WARN(1, KERN_WARNING "%s(%ld, %ld) unknown action: " - "%ld\n", __func__, phys_index, action, action); + "%ld\n", __func__, start_section_nr, action, action); ret = -EINVAL; } @@ -590,10 +596,9 @@ * A reference for the returned object is held and the reference for the * hinted object is released. */ -struct memory_block *find_memory_block_hinted(struct mem_section *section, - struct memory_block *hint) +static struct memory_block *find_memory_block_by_id(int block_id, + struct memory_block *hint) { - int block_id = base_memory_block_id(__section_nr(section)); struct device *hintdev = hint ? &hint->dev : NULL; struct device *dev; @@ -605,6 +610,14 @@ return to_memory_block(dev); } +struct memory_block *find_memory_block_hinted(struct mem_section *section, + struct memory_block *hint) +{ + int block_id = base_memory_block_id(__section_nr(section)); + + return find_memory_block_by_id(block_id, hint); +} + /* * For now, we have a linear search to go find the appropriate * memory_block corresponding to a particular phys_index. If @@ -659,25 +672,28 @@ return ret; } -static int init_memory_block(struct memory_block **memory, - struct mem_section *section, unsigned long state) +static int init_memory_block(struct memory_block **memory, int block_id, + unsigned long state) { struct memory_block *mem; unsigned long start_pfn; - int scn_nr; int ret = 0; + mem = find_memory_block_by_id(block_id, NULL); + if (mem) { + put_device(&mem->dev); + return -EEXIST; + } mem = kzalloc(sizeof(*mem), GFP_KERNEL); if (!mem) return -ENOMEM; - scn_nr = __section_nr(section); - mem->start_section_nr = - base_memory_block_id(scn_nr) * sections_per_block; + mem->start_section_nr = block_id * sections_per_block; mem->end_section_nr = mem->start_section_nr + sections_per_block - 1; mem->state = state; start_pfn = section_nr_to_pfn(mem->start_section_nr); mem->phys_device = arch_get_memory_phys_device(start_pfn); + mem->nid = NUMA_NO_NODE; ret = register_memory(mem); @@ -688,101 +704,98 @@ static int add_memory_block(int base_section_nr) { struct memory_block *mem; - int i, ret, section_count = 0, section_nr; + int i, ret, section_count = 0; for (i = base_section_nr; - (i < base_section_nr + sections_per_block) && i < NR_MEM_SECTIONS; - i++) { - if (!present_section_nr(i)) - continue; - if (section_count == 0) - section_nr = i; - section_count++; - } + i < base_section_nr + sections_per_block; + i++) + if (present_section_nr(i)) + section_count++; if (section_count == 0) return 0; - ret = init_memory_block(&mem, __nr_to_section(section_nr), MEM_ONLINE); + ret = init_memory_block(&mem, base_memory_block_id(base_section_nr), + MEM_ONLINE); if (ret) return ret; mem->section_count = section_count; return 0; } +static void unregister_memory(struct memory_block *memory) +{ + if (WARN_ON_ONCE(memory->dev.bus != &memory_subsys)) + return; + + /* drop the ref. we got via find_memory_block() */ + put_device(&memory->dev); + device_unregister(&memory->dev); +} + /* - * need an interface for the VM to add new memory regions, - * but without onlining it. + * Create memory block devices for the given memory area. Start and size + * have to be aligned to memory block granularity. Memory block devices + * will be initialized as offline. */ -int hotplug_memory_register(int nid, struct mem_section *section) +int create_memory_block_devices(unsigned long start, unsigned long size) { - int ret = 0; + const int start_block_id = pfn_to_block_id(PFN_DOWN(start)); + int end_block_id = pfn_to_block_id(PFN_DOWN(start + size)); struct memory_block *mem; + unsigned long block_id; + int ret = 0; - mutex_lock(&mem_sysfs_mutex); + if (WARN_ON_ONCE(!IS_ALIGNED(start, memory_block_size_bytes()) || + !IS_ALIGNED(size, memory_block_size_bytes()))) + return -EINVAL; - mem = find_memory_block(section); - if (mem) { - mem->section_count++; - put_device(&mem->dev); - } else { - ret = init_memory_block(&mem, section, MEM_OFFLINE); + mutex_lock(&mem_sysfs_mutex); + for (block_id = start_block_id; block_id != end_block_id; block_id++) { + ret = init_memory_block(&mem, block_id, MEM_OFFLINE); if (ret) - goto out; - mem->section_count++; + break; + mem->section_count = sections_per_block; + } + if (ret) { + end_block_id = block_id; + for (block_id = start_block_id; block_id != end_block_id; + block_id++) { + mem = find_memory_block_by_id(block_id, NULL); + mem->section_count = 0; + unregister_memory(mem); + } } - -out: mutex_unlock(&mem_sysfs_mutex); return ret; } -#ifdef CONFIG_MEMORY_HOTREMOVE -static void -unregister_memory(struct memory_block *memory) -{ - BUG_ON(memory->dev.bus != &memory_subsys); - - /* drop the ref. we got in remove_memory_block() */ - put_device(&memory->dev); - device_unregister(&memory->dev); -} - -static int remove_memory_section(unsigned long node_id, - struct mem_section *section, int phys_device) +/* + * Remove memory block devices for the given memory area. Start and size + * have to be aligned to memory block granularity. Memory block devices + * have to be offline. + */ +void remove_memory_block_devices(unsigned long start, unsigned long size) { + const int start_block_id = pfn_to_block_id(PFN_DOWN(start)); + const int end_block_id = pfn_to_block_id(PFN_DOWN(start + size)); struct memory_block *mem; + int block_id; - mutex_lock(&mem_sysfs_mutex); - - /* - * Some users of the memory hotplug do not want/need memblock to - * track all sections. Skip over those. - */ - mem = find_memory_block(section); - if (!mem) - goto out_unlock; + if (WARN_ON_ONCE(!IS_ALIGNED(start, memory_block_size_bytes()) || + !IS_ALIGNED(size, memory_block_size_bytes()))) + return; - unregister_mem_sect_under_nodes(mem, __section_nr(section)); - - mem->section_count--; - if (mem->section_count == 0) + mutex_lock(&mem_sysfs_mutex); + for (block_id = start_block_id; block_id != end_block_id; block_id++) { + mem = find_memory_block_by_id(block_id, NULL); + if (WARN_ON_ONCE(!mem)) + continue; + mem->section_count = 0; + unregister_memory_block_under_nodes(mem); unregister_memory(mem); - else - put_device(&mem->dev); - -out_unlock: + } mutex_unlock(&mem_sysfs_mutex); - return 0; -} - -int unregister_memory_section(struct mem_section *section) -{ - if (!present_section(section)) - return -EINVAL; - - return remove_memory_section(0, section, 0); } -#endif /* CONFIG_MEMORY_HOTREMOVE */ /* return true if the memory block is offlined, otherwise, return false */ bool is_memblock_offlined(struct memory_block *mem) @@ -849,3 +862,39 @@ printk(KERN_ERR "%s() failed: %d\n", __func__, ret); return ret; } + +struct for_each_memory_block_cb_data { + walk_memory_blocks_func_t func; + void *arg; +}; + +static int for_each_memory_block_cb(struct device *dev, void *data) +{ + struct memory_block *mem = to_memory_block(dev); + struct for_each_memory_block_cb_data *cb_data = data; + + return cb_data->func(mem, cb_data->arg); +} + +/** + * for_each_memory_block - walk through all present memory blocks + * + * @arg: argument passed to func + * @func: callback for each memory block walked + * + * This function walks through all present memory blocks, calling func on + * each memory block. + * + * In case func() returns an error, walking is aborted and the error is + * returned. + */ +int for_each_memory_block(void *arg, walk_memory_blocks_func_t func) +{ + struct for_each_memory_block_cb_data cb_data = { + .func = func, + .arg = arg, + }; + + return bus_for_each_dev(&memory_subsys, NULL, &cb_data, + for_each_memory_block_cb); +} diff -Nru linux-4.19.98/drivers/base/node.c linux-4.19.118/drivers/base/node.c --- linux-4.19.98/drivers/base/node.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/node.c 2020-04-23 08:30:24.000000000 +0000 @@ -409,8 +409,6 @@ int ret, nid = *(int *)arg; unsigned long pfn, sect_start_pfn, sect_end_pfn; - mem_blk->nid = nid; - sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr); sect_end_pfn = section_nr_to_pfn(mem_blk->end_section_nr); sect_end_pfn += PAGES_PER_SECTION - 1; @@ -439,6 +437,13 @@ if (page_nid != nid) continue; } + + /* + * If this memory block spans multiple nodes, we only indicate + * the last processed node. + */ + mem_blk->nid = nid; + ret = sysfs_create_link_nowarn(&node_devices[nid]->dev.kobj, &mem_blk->dev.kobj, kobject_name(&mem_blk->dev.kobj)); @@ -453,40 +458,19 @@ return 0; } -/* unregister memory section under all nodes that it spans */ -int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, - unsigned long phys_index) +/* + * Unregister a memory block device under the node it spans. Memory blocks + * with multiple nodes cannot be offlined and therefore also never be removed. + */ +void unregister_memory_block_under_nodes(struct memory_block *mem_blk) { - NODEMASK_ALLOC(nodemask_t, unlinked_nodes, GFP_KERNEL); - unsigned long pfn, sect_start_pfn, sect_end_pfn; - - if (!mem_blk) { - NODEMASK_FREE(unlinked_nodes); - return -EFAULT; - } - if (!unlinked_nodes) - return -ENOMEM; - nodes_clear(*unlinked_nodes); + if (mem_blk->nid == NUMA_NO_NODE) + return; - sect_start_pfn = section_nr_to_pfn(phys_index); - sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1; - for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { - int nid; - - nid = get_nid_for_pfn(pfn); - if (nid < 0) - continue; - if (!node_online(nid)) - continue; - if (node_test_and_set(nid, *unlinked_nodes)) - continue; - sysfs_remove_link(&node_devices[nid]->dev.kobj, - kobject_name(&mem_blk->dev.kobj)); - sysfs_remove_link(&mem_blk->dev.kobj, - kobject_name(&node_devices[nid]->dev.kobj)); - } - NODEMASK_FREE(unlinked_nodes); - return 0; + sysfs_remove_link(&node_devices[mem_blk->nid]->dev.kobj, + kobject_name(&mem_blk->dev.kobj)); + sysfs_remove_link(&mem_blk->dev.kobj, + kobject_name(&node_devices[mem_blk->nid]->dev.kobj)); } int link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn) diff -Nru linux-4.19.98/drivers/base/platform.c linux-4.19.118/drivers/base/platform.c --- linux-4.19.98/drivers/base/platform.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/platform.c 2020-04-23 08:30:24.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include #include "base.h" #include "power/power.h" @@ -67,7 +68,7 @@ struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num) { - int i; + u32 i; for (i = 0; i < dev->num_resources; i++) { struct resource *r = &dev->resource[i]; @@ -162,7 +163,7 @@ unsigned int type, const char *name) { - int i; + u32 i; for (i = 0; i < dev->num_resources; i++) { struct resource *r = &dev->resource[i]; @@ -359,7 +360,8 @@ */ int platform_device_add(struct platform_device *pdev) { - int i, ret; + u32 i; + int ret; if (!pdev) return -EINVAL; @@ -425,7 +427,7 @@ pdev->id = PLATFORM_DEVID_AUTO; } - while (--i >= 0) { + while (i--) { struct resource *r = &pdev->resource[i]; if (r->parent) release_resource(r); @@ -446,7 +448,7 @@ */ void platform_device_del(struct platform_device *pdev) { - int i; + u32 i; if (pdev) { device_remove_properties(&pdev->dev); diff -Nru linux-4.19.98/drivers/base/power/main.c linux-4.19.118/drivers/base/power/main.c --- linux-4.19.98/drivers/base/power/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/power/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -265,10 +265,38 @@ device_links_read_unlock(idx); } -static void dpm_wait_for_superior(struct device *dev, bool async) +static bool dpm_wait_for_superior(struct device *dev, bool async) { - dpm_wait(dev->parent, async); + struct device *parent; + + /* + * If the device is resumed asynchronously and the parent's callback + * deletes both the device and the parent itself, the parent object may + * be freed while this function is running, so avoid that by reference + * counting the parent once more unless the device has been deleted + * already (in which case return right away). + */ + mutex_lock(&dpm_list_mtx); + + if (!device_pm_initialized(dev)) { + mutex_unlock(&dpm_list_mtx); + return false; + } + + parent = get_device(dev->parent); + + mutex_unlock(&dpm_list_mtx); + + dpm_wait(parent, async); + put_device(parent); + dpm_wait_for_suppliers(dev, async); + + /* + * If the parent's callback has deleted the device, attempting to resume + * it would be invalid, so avoid doing that then. + */ + return device_pm_initialized(dev); } static void dpm_wait_for_consumers(struct device *dev, bool async) @@ -628,7 +656,8 @@ if (!dev->power.is_noirq_suspended) goto Out; - dpm_wait_for_superior(dev, async); + if (!dpm_wait_for_superior(dev, async)) + goto Out; skip_resume = dev_pm_may_skip_resume(dev); @@ -829,7 +858,8 @@ if (!dev->power.is_late_suspended) goto Out; - dpm_wait_for_superior(dev, async); + if (!dpm_wait_for_superior(dev, async)) + goto Out; callback = dpm_subsys_resume_early_cb(dev, state, &info); @@ -949,7 +979,9 @@ goto Complete; } - dpm_wait_for_superior(dev, async); + if (!dpm_wait_for_superior(dev, async)) + goto Complete; + dpm_watchdog_set(&wd, dev); device_lock(dev); diff -Nru linux-4.19.98/drivers/base/power/runtime.c linux-4.19.118/drivers/base/power/runtime.c --- linux-4.19.98/drivers/base/power/runtime.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/power/runtime.c 2020-04-23 08:30:24.000000000 +0000 @@ -268,11 +268,8 @@ list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { int retval; - if (!(link->flags & DL_FLAG_PM_RUNTIME)) - continue; - - if (READ_ONCE(link->status) == DL_STATE_SUPPLIER_UNBIND || - link->rpm_active) + if (!(link->flags & DL_FLAG_PM_RUNTIME) || + READ_ONCE(link->status) == DL_STATE_SUPPLIER_UNBIND) continue; retval = pm_runtime_get_sync(link->supplier); @@ -281,7 +278,7 @@ pm_runtime_put_noidle(link->supplier); return retval; } - link->rpm_active = true; + refcount_inc(&link->rpm_active); } return 0; } @@ -290,12 +287,13 @@ { struct device_link *link; - list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) - if (link->rpm_active && - READ_ONCE(link->status) != DL_STATE_SUPPLIER_UNBIND) { + list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) { + if (READ_ONCE(link->status) == DL_STATE_SUPPLIER_UNBIND) + continue; + + while (refcount_dec_not_one(&link->rpm_active)) pm_runtime_put(link->supplier); - link->rpm_active = false; - } + } } /** @@ -1531,9 +1529,9 @@ * * Check links from this device to any consumers and if any of them have active * runtime PM references to the device, drop the usage counter of the device - * (once per link). + * (as many times as needed). * - * Links with the DL_FLAG_STATELESS flag set are ignored. + * Links with the DL_FLAG_MANAGED flag unset are ignored. * * Since the device is guaranteed to be runtime-active at the point this is * called, nothing else needs to be done here. @@ -1550,13 +1548,11 @@ idx = device_links_read_lock(); list_for_each_entry_rcu(link, &dev->links.consumers, s_node) { - if (link->flags & DL_FLAG_STATELESS) + if (!(link->flags & DL_FLAG_MANAGED)) continue; - if (link->rpm_active) { + while (refcount_dec_not_one(&link->rpm_active)) pm_runtime_put_noidle(dev); - link->rpm_active = false; - } } device_links_read_unlock(idx); @@ -1574,8 +1570,11 @@ idx = device_links_read_lock(); list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) - if (link->flags & DL_FLAG_PM_RUNTIME) + if (link->flags & DL_FLAG_PM_RUNTIME) { + link->supplier_preactivated = true; + refcount_inc(&link->rpm_active); pm_runtime_get_sync(link->supplier); + } device_links_read_unlock(idx); } @@ -1592,8 +1591,11 @@ idx = device_links_read_lock(); list_for_each_entry_rcu(link, &dev->links.suppliers, c_node) - if (link->flags & DL_FLAG_PM_RUNTIME) - pm_runtime_put(link->supplier); + if (link->supplier_preactivated) { + link->supplier_preactivated = false; + if (refcount_dec_not_one(&link->rpm_active)) + pm_runtime_put(link->supplier); + } device_links_read_unlock(idx); } @@ -1607,8 +1609,6 @@ void pm_runtime_drop_link(struct device *dev) { - rpm_put_suppliers(dev); - spin_lock_irq(&dev->power.lock); WARN_ON(dev->power.links_count == 0); dev->power.links_count--; diff -Nru linux-4.19.98/drivers/base/power/wakeup.c linux-4.19.118/drivers/base/power/wakeup.c --- linux-4.19.98/drivers/base/power/wakeup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/base/power/wakeup.c 2020-04-23 08:30:24.000000000 +0000 @@ -875,7 +875,7 @@ void pm_system_cancel_wakeup(void) { - atomic_dec(&pm_abort_suspend); + atomic_dec_if_positive(&pm_abort_suspend); } void pm_wakeup_clear(bool reset) diff -Nru linux-4.19.98/drivers/bcma/driver_pci.c linux-4.19.118/drivers/bcma/driver_pci.c --- linux-4.19.98/drivers/bcma/driver_pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/bcma/driver_pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -78,7 +78,7 @@ v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); } - v = BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_START; v |= BCMA_CORE_PCI_MDIODATA_READ; v |= BCMA_CORE_PCI_MDIODATA_TA; @@ -121,7 +121,7 @@ v |= (address << BCMA_CORE_PCI_MDIODATA_REGADDR_SHF_OLD); } - v = BCMA_CORE_PCI_MDIODATA_START; + v |= BCMA_CORE_PCI_MDIODATA_START; v |= BCMA_CORE_PCI_MDIODATA_WRITE; v |= BCMA_CORE_PCI_MDIODATA_TA; v |= data; diff -Nru linux-4.19.98/drivers/block/brd.c linux-4.19.118/drivers/block/brd.c --- linux-4.19.98/drivers/block/brd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/brd.c 2020-04-23 08:30:24.000000000 +0000 @@ -463,6 +463,25 @@ return kobj; } +static inline void brd_check_and_reset_par(void) +{ + if (unlikely(!max_part)) + max_part = 1; + + /* + * make sure 'max_part' can be divided exactly by (1U << MINORBITS), + * otherwise, it is possiable to get same dev_t when adding partitions. + */ + if ((1U << MINORBITS) % max_part != 0) + max_part = 1UL << fls(max_part); + + if (max_part > DISK_MAX_PARTS) { + pr_info("brd: max_part can't be larger than %d, reset max_part = %d.\n", + DISK_MAX_PARTS, DISK_MAX_PARTS); + max_part = DISK_MAX_PARTS; + } +} + static int __init brd_init(void) { struct brd_device *brd, *next; @@ -486,8 +505,7 @@ if (register_blkdev(RAMDISK_MAJOR, "ramdisk")) return -EIO; - if (unlikely(!max_part)) - max_part = 1; + brd_check_and_reset_par(); for (i = 0; i < rd_nr; i++) { brd = brd_alloc(i); diff -Nru linux-4.19.98/drivers/block/drbd/drbd_main.c linux-4.19.118/drivers/block/drbd/drbd_main.c --- linux-4.19.98/drivers/block/drbd/drbd_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/drbd/drbd_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -334,6 +334,8 @@ thi->name[0], resource->name); + allow_kernel_signal(DRBD_SIGKILL); + allow_kernel_signal(SIGXCPU); restart: retval = thi->function(thi); diff -Nru linux-4.19.98/drivers/block/floppy.c linux-4.19.118/drivers/block/floppy.c --- linux-4.19.98/drivers/block/floppy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/floppy.c 2020-04-23 08:30:24.000000000 +0000 @@ -852,14 +852,17 @@ /* selects the fdc and drive, and enables the fdc's input/dma. */ static void set_fdc(int drive) { + unsigned int new_fdc = fdc; + if (drive >= 0 && drive < N_DRIVE) { - fdc = FDC(drive); + new_fdc = FDC(drive); current_drive = drive; } - if (fdc != 1 && fdc != 0) { + if (new_fdc >= N_FDC) { pr_info("bad fdc value\n"); return; } + fdc = new_fdc; set_dor(fdc, ~0, 8); #if N_FDC > 1 set_dor(1 - fdc, ~8, 0); diff -Nru linux-4.19.98/drivers/block/nbd.c linux-4.19.118/drivers/block/nbd.c --- linux-4.19.98/drivers/block/nbd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/nbd.c 2020-04-23 08:30:24.000000000 +0000 @@ -1216,6 +1216,16 @@ args = kzalloc(sizeof(*args), GFP_KERNEL); if (!args) { sock_shutdown(nbd); + /* + * If num_connections is m (2 < m), + * and NO.1 ~ NO.n(1 < n < m) kzallocs are successful. + * But NO.(n + 1) failed. We still have n recv threads. + * So, add flush_workqueue here to prevent recv threads + * dropping the last config_refs and trying to destroy + * the workqueue from inside the workqueue. + */ + if (i) + flush_workqueue(nbd->recv_workq); return -ENOMEM; } sk_set_memalloc(config->socks[i]->sock->sk); diff -Nru linux-4.19.98/drivers/block/null_blk_main.c linux-4.19.118/drivers/block/null_blk_main.c --- linux-4.19.98/drivers/block/null_blk_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/null_blk_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -571,6 +571,7 @@ if (tag != -1U) { cmd = &nq->cmds[tag]; cmd->tag = tag; + cmd->error = BLK_STS_OK; cmd->nq = nq; if (nq->dev->irqmode == NULL_IRQ_TIMER) { hrtimer_init(&cmd->timer, CLOCK_MONOTONIC, @@ -1433,6 +1434,7 @@ cmd->timer.function = null_cmd_timer_expired; } cmd->rq = bd->rq; + cmd->error = BLK_STS_OK; cmd->nq = nq; blk_mq_start_request(bd->rq); @@ -1480,7 +1482,12 @@ static void null_del_dev(struct nullb *nullb) { - struct nullb_device *dev = nullb->dev; + struct nullb_device *dev; + + if (!nullb) + return; + + dev = nullb->dev; ida_simple_remove(&nullb_indexes, nullb->index); @@ -1844,6 +1851,7 @@ cleanup_queues(nullb); out_free_nullb: kfree(nullb); + dev->nullb = NULL; out: return rv; } diff -Nru linux-4.19.98/drivers/block/rbd.c linux-4.19.118/drivers/block/rbd.c --- linux-4.19.98/drivers/block/rbd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/rbd.c 2020-04-23 08:30:24.000000000 +0000 @@ -2097,7 +2097,7 @@ u64 off, u64 len) { struct ceph_file_extent ex = { off, len }; - union rbd_img_fill_iter dummy; + union rbd_img_fill_iter dummy = {}; struct rbd_img_fill_ctx fctx = { .pos_type = OBJ_REQUEST_NODATA, .pos = &dummy, @@ -2506,6 +2506,7 @@ ret = rbd_obj_issue_copyup(obj_req, obj_req->xferred); if (ret) { obj_req->result = ret; + obj_req->xferred = 0; return true; } return false; @@ -3426,6 +3427,10 @@ cancel_work_sync(&rbd_dev->unlock_work); } +/* + * header_rwsem must not be held to avoid a deadlock with + * rbd_dev_refresh() when flushing notifies. + */ static void rbd_unregister_watch(struct rbd_device *rbd_dev) { WARN_ON(waitqueue_active(&rbd_dev->lock_waitq)); @@ -5718,9 +5723,10 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev) { - rbd_dev_unprobe(rbd_dev); if (rbd_dev->opts) rbd_unregister_watch(rbd_dev); + + rbd_dev_unprobe(rbd_dev); rbd_dev->image_format = 0; kfree(rbd_dev->spec->image_id); rbd_dev->spec->image_id = NULL; @@ -5731,6 +5737,9 @@ * device. If this image is the one being mapped (i.e., not a * parent), initiate a watch on its header object before using that * object to get detailed information about the rbd image. + * + * On success, returns with header_rwsem held for write if called + * with @depth == 0. */ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) { @@ -5763,9 +5772,12 @@ } } + if (!depth) + down_write(&rbd_dev->header_rwsem); + ret = rbd_dev_header_info(rbd_dev); if (ret) - goto err_out_watch; + goto err_out_probe; /* * If this image is the one being mapped, we have pool name and @@ -5811,10 +5823,11 @@ return 0; err_out_probe: - rbd_dev_unprobe(rbd_dev); -err_out_watch: + if (!depth) + up_write(&rbd_dev->header_rwsem); if (!depth) rbd_unregister_watch(rbd_dev); + rbd_dev_unprobe(rbd_dev); err_out_format: rbd_dev->image_format = 0; kfree(rbd_dev->spec->image_id); @@ -5871,12 +5884,9 @@ goto err_out_rbd_dev; } - down_write(&rbd_dev->header_rwsem); rc = rbd_dev_image_probe(rbd_dev, 0); - if (rc < 0) { - up_write(&rbd_dev->header_rwsem); + if (rc < 0) goto err_out_rbd_dev; - } /* If we are mapping a snapshot it must be marked read-only */ if (rbd_dev->spec->snap_id != CEPH_NOSNAP) diff -Nru linux-4.19.98/drivers/block/virtio_blk.c linux-4.19.118/drivers/block/virtio_blk.c --- linux-4.19.98/drivers/block/virtio_blk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/virtio_blk.c 2020-04-23 08:30:24.000000000 +0000 @@ -271,10 +271,12 @@ err = virtblk_add_req(vblk->vqs[qid].vq, vbr, vbr->sg, num); if (err) { virtqueue_kick(vblk->vqs[qid].vq); - blk_mq_stop_hw_queue(hctx); + /* Don't stop the queue if -ENOMEM: we may have failed to + * bounce the buffer due to global resource outage. + */ + if (err == -ENOSPC) + blk_mq_stop_hw_queue(hctx); spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags); - /* Out of mem doesn't actually happen, since we fall back - * to direct descriptors */ if (err == -ENOMEM || err == -ENOSPC) return BLK_STS_DEV_RESOURCE; return BLK_STS_IOERR; diff -Nru linux-4.19.98/drivers/block/xen-blkfront.c linux-4.19.118/drivers/block/xen-blkfront.c --- linux-4.19.98/drivers/block/xen-blkfront.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/block/xen-blkfront.c 2020-04-23 08:30:24.000000000 +0000 @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -2188,10 +2189,12 @@ static int blkfront_setup_indirect(struct blkfront_ring_info *rinfo) { - unsigned int psegs, grants; + unsigned int psegs, grants, memflags; int err, i; struct blkfront_info *info = rinfo->dev_info; + memflags = memalloc_noio_save(); + if (info->max_indirect_segments == 0) { if (!HAS_EXTRA_REQ) grants = BLKIF_MAX_SEGMENTS_PER_REQUEST; @@ -2223,7 +2226,7 @@ BUG_ON(!list_empty(&rinfo->indirect_pages)); for (i = 0; i < num; i++) { - struct page *indirect_page = alloc_page(GFP_NOIO); + struct page *indirect_page = alloc_page(GFP_KERNEL); if (!indirect_page) goto out_of_memory; list_add(&indirect_page->lru, &rinfo->indirect_pages); @@ -2234,15 +2237,15 @@ rinfo->shadow[i].grants_used = kvcalloc(grants, sizeof(rinfo->shadow[i].grants_used[0]), - GFP_NOIO); + GFP_KERNEL); rinfo->shadow[i].sg = kvcalloc(psegs, sizeof(rinfo->shadow[i].sg[0]), - GFP_NOIO); + GFP_KERNEL); if (info->max_indirect_segments) rinfo->shadow[i].indirect_grants = kvcalloc(INDIRECT_GREFS(grants), sizeof(rinfo->shadow[i].indirect_grants[0]), - GFP_NOIO); + GFP_KERNEL); if ((rinfo->shadow[i].grants_used == NULL) || (rinfo->shadow[i].sg == NULL) || (info->max_indirect_segments && @@ -2251,6 +2254,7 @@ sg_init_table(rinfo->shadow[i].sg, psegs); } + memalloc_noio_restore(memflags); return 0; @@ -2270,6 +2274,9 @@ __free_page(indirect_page); } } + + memalloc_noio_restore(memflags); + return -ENOMEM; } diff -Nru linux-4.19.98/drivers/bus/sunxi-rsb.c linux-4.19.118/drivers/bus/sunxi-rsb.c --- linux-4.19.98/drivers/bus/sunxi-rsb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/bus/sunxi-rsb.c 2020-04-23 08:30:24.000000000 +0000 @@ -345,7 +345,7 @@ if (ret) goto unlock; - *buf = readl(rsb->regs + RSB_DATA); + *buf = readl(rsb->regs + RSB_DATA) & GENMASK(len * 8 - 1, 0); unlock: mutex_unlock(&rsb->lock); diff -Nru linux-4.19.98/drivers/bus/ti-sysc.c linux-4.19.118/drivers/bus/ti-sysc.c --- linux-4.19.98/drivers/bus/ti-sysc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/bus/ti-sysc.c 2020-04-23 08:30:24.000000000 +0000 @@ -888,10 +888,10 @@ SYSC_QUIRK("smartreflex", 0, -1, 0x38, -1, 0x00000000, 0xffffffff, SYSC_QUIRK_LEGACY_IDLE), SYSC_QUIRK("timer", 0, 0, 0x10, 0x14, 0x00000015, 0xffffffff, - SYSC_QUIRK_LEGACY_IDLE), + 0), /* Some timers on omap4 and later */ SYSC_QUIRK("timer", 0, 0, 0x10, -1, 0x4fff1301, 0xffffffff, - SYSC_QUIRK_LEGACY_IDLE), + 0), SYSC_QUIRK("uart", 0, 0x50, 0x54, 0x58, 0x00000052, 0xffffffff, SYSC_QUIRK_LEGACY_IDLE), /* Uarts on omap4 and later */ @@ -1400,6 +1400,9 @@ { int i; + if (!ddata->clocks) + return; + for (i = 0; i < SYSC_MAX_CLOCKS; i++) { if (!IS_ERR_OR_NULL(ddata->clocks[i])) clk_unprepare(ddata->clocks[i]); @@ -1593,6 +1596,16 @@ static const struct sysc_capabilities sysc_omap4_mcasp = { .type = TI_SYSC_OMAP4_MCASP, .regbits = &sysc_regbits_omap4_mcasp, + .mod_quirks = SYSC_QUIRK_OPT_CLKS_NEEDED, +}; + +/* + * McASP found on dra7 and later + */ +static const struct sysc_capabilities sysc_dra7_mcasp = { + .type = TI_SYSC_OMAP4_SIMPLE, + .regbits = &sysc_regbits_omap4_simple, + .mod_quirks = SYSC_QUIRK_OPT_CLKS_NEEDED, }; /* @@ -1821,6 +1834,7 @@ { .compatible = "ti,sysc-omap3-sham", .data = &sysc_omap3_sham, }, { .compatible = "ti,sysc-omap-aes", .data = &sysc_omap3_aes, }, { .compatible = "ti,sysc-mcasp", .data = &sysc_omap4_mcasp, }, + { .compatible = "ti,sysc-dra7-mcasp", .data = &sysc_dra7_mcasp, }, { .compatible = "ti,sysc-usb-host-fs", .data = &sysc_omap4_usb_host_fs, }, { .compatible = "ti,sysc-dra7-mcan", .data = &sysc_dra7_mcan, }, diff -Nru linux-4.19.98/drivers/char/hw_random/bcm2835-rng.c linux-4.19.118/drivers/char/hw_random/bcm2835-rng.c --- linux-4.19.98/drivers/char/hw_random/bcm2835-rng.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/hw_random/bcm2835-rng.c 2020-04-23 08:30:24.000000000 +0000 @@ -171,14 +171,16 @@ priv->rng.read = bcm2835_rng_read; priv->rng.cleanup = bcm2835_rng_cleanup; - rng_id = of_match_node(bcm2835_rng_of_match, np); - if (!rng_id) - return -EINVAL; + if (dev_of_node(dev)) { + rng_id = of_match_node(bcm2835_rng_of_match, np); + if (!rng_id) + return -EINVAL; - /* Check for rng init function, execute it */ - of_data = rng_id->data; - if (of_data) - priv->mask_interrupts = of_data->mask_interrupts; + /* Check for rng init function, execute it */ + of_data = rng_id->data; + if (of_data) + priv->mask_interrupts = of_data->mask_interrupts; + } /* register driver */ err = devm_hwrng_register(dev, &priv->rng); diff -Nru linux-4.19.98/drivers/char/hw_random/imx-rngc.c linux-4.19.118/drivers/char/hw_random/imx-rngc.c --- linux-4.19.98/drivers/char/hw_random/imx-rngc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/hw_random/imx-rngc.c 2020-04-23 08:30:24.000000000 +0000 @@ -111,8 +111,10 @@ return -ETIMEDOUT; } - if (rngc->err_reg != 0) + if (rngc->err_reg != 0) { + imx_rngc_irq_mask_clear(rngc); return -EIO; + } return 0; } diff -Nru linux-4.19.98/drivers/char/hw_random/omap3-rom-rng.c linux-4.19.118/drivers/char/hw_random/omap3-rom-rng.c --- linux-4.19.98/drivers/char/hw_random/omap3-rom-rng.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/hw_random/omap3-rom-rng.c 2020-04-23 08:30:24.000000000 +0000 @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #define RNG_RESET 0x01 @@ -86,14 +88,18 @@ static struct hwrng omap3_rom_rng_ops = { .name = "omap3-rom", - .read = omap3_rom_rng_read, }; static int omap3_rom_rng_probe(struct platform_device *pdev) { int ret = 0; - pr_info("initializing\n"); + omap3_rom_rng_ops.read = of_device_get_match_data(&pdev->dev); + if (!omap3_rom_rng_ops.read) { + dev_err(&pdev->dev, "missing rom code handler\n"); + + return -ENODEV; + } omap3_rom_rng_call = pdev->dev.platform_data; if (!omap3_rom_rng_call) { @@ -126,9 +132,16 @@ return 0; } +static const struct of_device_id omap_rom_rng_match[] = { + { .compatible = "nokia,n900-rom-rng", .data = omap3_rom_rng_read, }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, omap_rom_rng_match); + static struct platform_driver omap3_rom_rng_driver = { .driver = { .name = "omap3-rom-rng", + .of_match_table = omap_rom_rng_match, }, .probe = omap3_rom_rng_probe, .remove = omap3_rom_rng_remove, diff -Nru linux-4.19.98/drivers/char/ipmi/ipmi_msghandler.c linux-4.19.118/drivers/char/ipmi/ipmi_msghandler.c --- linux-4.19.98/drivers/char/ipmi/ipmi_msghandler.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/ipmi/ipmi_msghandler.c 2020-04-23 08:30:24.000000000 +0000 @@ -2965,8 +2965,11 @@ bmc->pdev.name = "ipmi_bmc"; rv = ida_simple_get(&ipmi_bmc_ida, 0, 0, GFP_KERNEL); - if (rv < 0) + if (rv < 0) { + kfree(bmc); goto out; + } + bmc->pdev.dev.driver = &ipmidriver.driver; bmc->pdev.id = rv; bmc->pdev.dev.release = release_bmc_device; @@ -3131,8 +3134,8 @@ if (rv) /* Send failed, no GUID available. */ bmc->dyn_guid_set = 0; - - wait_event(intf->waitq, bmc->dyn_guid_set != 2); + else + wait_event(intf->waitq, bmc->dyn_guid_set != 2); /* dyn_guid_set makes the guid data available. */ smp_rmb(); diff -Nru linux-4.19.98/drivers/char/ipmi/ipmi_ssif.c linux-4.19.118/drivers/char/ipmi/ipmi_ssif.c --- linux-4.19.98/drivers/char/ipmi/ipmi_ssif.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/ipmi/ipmi_ssif.c 2020-04-23 08:30:24.000000000 +0000 @@ -735,10 +735,14 @@ flags = ipmi_ssif_lock_cond(ssif_info, &oflags); msg = ssif_info->curr_msg; if (msg) { + if (data) { + if (len > IPMI_MAX_MSG_LENGTH) + len = IPMI_MAX_MSG_LENGTH; + memcpy(msg->rsp, data, len); + } else { + len = 0; + } msg->rsp_size = len; - if (msg->rsp_size > IPMI_MAX_MSG_LENGTH) - msg->rsp_size = IPMI_MAX_MSG_LENGTH; - memcpy(msg->rsp, data, msg->rsp_size); ssif_info->curr_msg = NULL; } diff -Nru linux-4.19.98/drivers/char/ipmi/kcs_bmc.c linux-4.19.118/drivers/char/ipmi/kcs_bmc.c --- linux-4.19.98/drivers/char/ipmi/kcs_bmc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/ipmi/kcs_bmc.c 2020-04-23 08:30:24.000000000 +0000 @@ -440,12 +440,13 @@ kcs_bmc->data_in = devm_kmalloc(dev, KCS_MSG_BUFSIZ, GFP_KERNEL); kcs_bmc->data_out = devm_kmalloc(dev, KCS_MSG_BUFSIZ, GFP_KERNEL); kcs_bmc->kbuffer = devm_kmalloc(dev, KCS_MSG_BUFSIZ, GFP_KERNEL); - if (!kcs_bmc->data_in || !kcs_bmc->data_out || !kcs_bmc->kbuffer) - return NULL; kcs_bmc->miscdev.minor = MISC_DYNAMIC_MINOR; kcs_bmc->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "%s%u", DEVICE_NAME, channel); + if (!kcs_bmc->data_in || !kcs_bmc->data_out || !kcs_bmc->kbuffer || + !kcs_bmc->miscdev.name) + return NULL; kcs_bmc->miscdev.fops = &kcs_bmc_fops; return kcs_bmc; diff -Nru linux-4.19.98/drivers/char/random.c linux-4.19.118/drivers/char/random.c --- linux-4.19.98/drivers/char/random.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/random.c 2020-04-23 08:30:24.000000000 +0000 @@ -1653,6 +1653,56 @@ } EXPORT_SYMBOL(get_random_bytes); + +/* + * Each time the timer fires, we expect that we got an unpredictable + * jump in the cycle counter. Even if the timer is running on another + * CPU, the timer activity will be touching the stack of the CPU that is + * generating entropy.. + * + * Note that we don't re-arm the timer in the timer itself - we are + * happy to be scheduled away, since that just makes the load more + * complex, but we do not want the timer to keep ticking unless the + * entropy loop is running. + * + * So the re-arming always happens in the entropy loop itself. + */ +static void entropy_timer(struct timer_list *t) +{ + credit_entropy_bits(&input_pool, 1); +} + +/* + * If we have an actual cycle counter, see if we can + * generate enough entropy with timing noise + */ +static void try_to_generate_entropy(void) +{ + struct { + unsigned long now; + struct timer_list timer; + } stack; + + stack.now = random_get_entropy(); + + /* Slow counter - or none. Don't even bother */ + if (stack.now == random_get_entropy()) + return; + + timer_setup_on_stack(&stack.timer, entropy_timer, 0); + while (!crng_ready()) { + if (!timer_pending(&stack.timer)) + mod_timer(&stack.timer, jiffies+1); + mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now)); + schedule(); + stack.now = random_get_entropy(); + } + + del_timer_sync(&stack.timer); + destroy_timer_on_stack(&stack.timer); + mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now)); +} + /* * Wait for the urandom pool to be seeded and thus guaranteed to supply * cryptographically secure random numbers. This applies to: the /dev/urandom @@ -1667,7 +1717,17 @@ { if (likely(crng_ready())) return 0; - return wait_event_interruptible(crng_init_wait, crng_ready()); + + do { + int ret; + ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ); + if (ret) + return ret > 0 ? 0 : ret; + + try_to_generate_entropy(); + } while (!crng_ready()); + + return 0; } EXPORT_SYMBOL(wait_for_random_bytes); @@ -2220,11 +2280,11 @@ /* * Get a random word for internal kernel use only. The quality of the random - * number is either as good as RDRAND or as good as /dev/urandom, with the - * goal of being quite fast and not depleting entropy. In order to ensure + * number is good as /dev/urandom, but there is no backtrack protection, with + * the goal of being quite fast and not depleting entropy. In order to ensure * that the randomness provided by this function is okay, the function - * wait_for_random_bytes() should be called and return 0 at least once - * at any point prior. + * wait_for_random_bytes() should be called and return 0 at least once at any + * point prior. */ static DEFINE_PER_CPU(struct batched_entropy, batched_entropy_u64) = { .batch_lock = __SPIN_LOCK_UNLOCKED(batched_entropy_u64.lock), @@ -2237,15 +2297,6 @@ struct batched_entropy *batch; static void *previous; -#if BITS_PER_LONG == 64 - if (arch_get_random_long((unsigned long *)&ret)) - return ret; -#else - if (arch_get_random_long((unsigned long *)&ret) && - arch_get_random_long((unsigned long *)&ret + 1)) - return ret; -#endif - warn_unseeded_randomness(&previous); batch = raw_cpu_ptr(&batched_entropy_u64); @@ -2270,9 +2321,6 @@ struct batched_entropy *batch; static void *previous; - if (arch_get_random_int(&ret)) - return ret; - warn_unseeded_randomness(&previous); batch = raw_cpu_ptr(&batched_entropy_u32); diff -Nru linux-4.19.98/drivers/char/tpm/eventlog/common.c linux-4.19.118/drivers/char/tpm/eventlog/common.c --- linux-4.19.98/drivers/char/tpm/eventlog/common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/tpm/eventlog/common.c 2020-04-23 08:30:24.000000000 +0000 @@ -104,11 +104,8 @@ * * If an event log is found then the securityfs files are setup to * export it to userspace, otherwise nothing is done. - * - * Returns -ENODEV if the firmware has no event log or securityfs is not - * supported. */ -int tpm_bios_log_setup(struct tpm_chip *chip) +void tpm_bios_log_setup(struct tpm_chip *chip) { const char *name = dev_name(&chip->dev); unsigned int cnt; @@ -117,7 +114,7 @@ rc = tpm_read_log(chip); if (rc < 0) - return rc; + return; log_version = rc; cnt = 0; @@ -163,13 +160,12 @@ cnt++; } - return 0; + return; err: - rc = PTR_ERR(chip->bios_dir[cnt]); chip->bios_dir[cnt] = NULL; tpm_bios_log_teardown(chip); - return rc; + return; } void tpm_bios_log_teardown(struct tpm_chip *chip) diff -Nru linux-4.19.98/drivers/char/tpm/eventlog/tpm1.c linux-4.19.118/drivers/char/tpm/eventlog/tpm1.c --- linux-4.19.98/drivers/char/tpm/eventlog/tpm1.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/tpm/eventlog/tpm1.c 2020-04-23 08:30:24.000000000 +0000 @@ -129,6 +129,7 @@ u32 converted_event_size; u32 converted_event_type; + (*pos)++; converted_event_size = do_endian_conversion(event->event_size); v += sizeof(struct tcpa_event) + converted_event_size; @@ -146,7 +147,6 @@ ((v + sizeof(struct tcpa_event) + converted_event_size) >= limit)) return NULL; - (*pos)++; return v; } diff -Nru linux-4.19.98/drivers/char/tpm/eventlog/tpm2.c linux-4.19.118/drivers/char/tpm/eventlog/tpm2.c --- linux-4.19.98/drivers/char/tpm/eventlog/tpm2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/tpm/eventlog/tpm2.c 2020-04-23 08:30:24.000000000 +0000 @@ -143,6 +143,7 @@ size_t event_size; void *marker; + (*pos)++; event_header = log->bios_event_log; if (v == SEQ_START_TOKEN) { @@ -167,7 +168,6 @@ if (((v + event_size) >= limit) || (event_size == 0)) return NULL; - (*pos)++; return v; } diff -Nru linux-4.19.98/drivers/char/tpm/tpm-chip.c linux-4.19.118/drivers/char/tpm/tpm-chip.c --- linux-4.19.98/drivers/char/tpm/tpm-chip.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/tpm/tpm-chip.c 2020-04-23 08:30:24.000000000 +0000 @@ -463,9 +463,7 @@ tpm_sysfs_add_device(chip); - rc = tpm_bios_log_setup(chip); - if (rc != 0 && rc != -ENODEV) - return rc; + tpm_bios_log_setup(chip); tpm_add_ppi(chip); diff -Nru linux-4.19.98/drivers/char/tpm/tpm.h linux-4.19.118/drivers/char/tpm/tpm.h --- linux-4.19.98/drivers/char/tpm/tpm.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/tpm/tpm.h 2020-04-23 08:30:24.000000000 +0000 @@ -602,6 +602,6 @@ int tpm2_commit_space(struct tpm_chip *chip, struct tpm_space *space, u32 cc, u8 *buf, size_t *bufsiz); -int tpm_bios_log_setup(struct tpm_chip *chip); +void tpm_bios_log_setup(struct tpm_chip *chip); void tpm_bios_log_teardown(struct tpm_chip *chip); #endif diff -Nru linux-4.19.98/drivers/char/ttyprintk.c linux-4.19.118/drivers/char/ttyprintk.c --- linux-4.19.98/drivers/char/ttyprintk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/char/ttyprintk.c 2020-04-23 08:30:24.000000000 +0000 @@ -18,10 +18,11 @@ #include #include #include +#include struct ttyprintk_port { struct tty_port port; - struct mutex port_write_mutex; + spinlock_t spinlock; }; static struct ttyprintk_port tpk_port; @@ -100,11 +101,12 @@ static void tpk_close(struct tty_struct *tty, struct file *filp) { struct ttyprintk_port *tpkp = tty->driver_data; + unsigned long flags; - mutex_lock(&tpkp->port_write_mutex); + spin_lock_irqsave(&tpkp->spinlock, flags); /* flush tpk_printk buffer */ tpk_printk(NULL, 0); - mutex_unlock(&tpkp->port_write_mutex); + spin_unlock_irqrestore(&tpkp->spinlock, flags); tty_port_close(&tpkp->port, tty, filp); } @@ -116,13 +118,14 @@ const unsigned char *buf, int count) { struct ttyprintk_port *tpkp = tty->driver_data; + unsigned long flags; int ret; /* exclusive use of tpk_printk within this tty */ - mutex_lock(&tpkp->port_write_mutex); + spin_lock_irqsave(&tpkp->spinlock, flags); ret = tpk_printk(buf, count); - mutex_unlock(&tpkp->port_write_mutex); + spin_unlock_irqrestore(&tpkp->spinlock, flags); return ret; } @@ -172,7 +175,7 @@ { int ret = -ENOMEM; - mutex_init(&tpk_port.port_write_mutex); + spin_lock_init(&tpk_port.spinlock); ttyprintk_driver = tty_alloc_driver(1, TTY_DRIVER_RESET_TERMIOS | diff -Nru linux-4.19.98/drivers/clk/actions/owl-factor.c linux-4.19.118/drivers/clk/actions/owl-factor.c --- linux-4.19.98/drivers/clk/actions/owl-factor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/actions/owl-factor.c 2020-04-23 08:30:24.000000000 +0000 @@ -64,11 +64,10 @@ return val; } -static int clk_val_best(struct clk_hw *hw, unsigned long rate, +static int owl_clk_val_best(const struct owl_factor_hw *factor_hw, + struct clk_hw *hw, unsigned long rate, unsigned long *best_parent_rate) { - struct owl_factor *factor = hw_to_owl_factor(hw); - struct owl_factor_hw *factor_hw = &factor->factor_hw; const struct clk_factor_table *clkt = factor_hw->table; unsigned long parent_rate, try_parent_rate, best = 0, cur_rate; unsigned long parent_rate_saved = *best_parent_rate; @@ -126,7 +125,7 @@ const struct clk_factor_table *clkt = factor_hw->table; unsigned int val, mul = 0, div = 1; - val = clk_val_best(&common->hw, rate, parent_rate); + val = owl_clk_val_best(factor_hw, &common->hw, rate, parent_rate); _get_table_div_mul(clkt, val, &mul, &div); return *parent_rate * mul / div; diff -Nru linux-4.19.98/drivers/clk/at91/clk-usb.c linux-4.19.118/drivers/clk/at91/clk-usb.c --- linux-4.19.98/drivers/clk/at91/clk-usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/at91/clk-usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -78,6 +78,9 @@ tmp_parent_rate = req->rate * div; tmp_parent_rate = clk_hw_round_rate(parent, tmp_parent_rate); + if (!tmp_parent_rate) + continue; + tmp_rate = DIV_ROUND_CLOSEST(tmp_parent_rate, div); if (tmp_rate < req->rate) tmp_diff = req->rate - tmp_rate; diff -Nru linux-4.19.98/drivers/clk/clk-highbank.c linux-4.19.118/drivers/clk/clk-highbank.c --- linux-4.19.98/drivers/clk/clk-highbank.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/clk-highbank.c 2020-04-23 08:30:24.000000000 +0000 @@ -293,6 +293,7 @@ /* Map system registers */ srnp = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs"); hb_clk->reg = of_iomap(srnp, 0); + of_node_put(srnp); BUG_ON(!hb_clk->reg); hb_clk->reg += reg; diff -Nru linux-4.19.98/drivers/clk/clk-qoriq.c linux-4.19.118/drivers/clk/clk-qoriq.c --- linux-4.19.98/drivers/clk/clk-qoriq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/clk-qoriq.c 2020-04-23 08:30:24.000000000 +0000 @@ -1389,6 +1389,7 @@ pr_err("%s: Couldn't map %pOF regs\n", __func__, guts); } + of_node_put(guts); } } diff -Nru linux-4.19.98/drivers/clk/imx/clk-imx6q.c linux-4.19.118/drivers/clk/imx/clk-imx6q.c --- linux-4.19.98/drivers/clk/imx/clk-imx6q.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/imx/clk-imx6q.c 2020-04-23 08:30:24.000000000 +0000 @@ -424,6 +424,7 @@ np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop"); anatop_base = base = of_iomap(np, 0); WARN_ON(!base); + of_node_put(np); /* Audio/video PLL post dividers do not work on i.MX6q revision 1.0 */ if (clk_on_imx6q() && imx_get_soc_revision() == IMX_CHIP_REVISION_1_0) { diff -Nru linux-4.19.98/drivers/clk/imx/clk-imx6sx.c linux-4.19.118/drivers/clk/imx/clk-imx6sx.c --- linux-4.19.98/drivers/clk/imx/clk-imx6sx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/imx/clk-imx6sx.c 2020-04-23 08:30:24.000000000 +0000 @@ -151,6 +151,7 @@ np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop"); base = of_iomap(np, 0); WARN_ON(!base); + of_node_put(np); clks[IMX6SX_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); clks[IMX6SX_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); diff -Nru linux-4.19.98/drivers/clk/imx/clk-imx7d.c linux-4.19.118/drivers/clk/imx/clk-imx7d.c --- linux-4.19.98/drivers/clk/imx/clk-imx7d.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/imx/clk-imx7d.c 2020-04-23 08:30:24.000000000 +0000 @@ -413,6 +413,7 @@ np = of_find_compatible_node(NULL, NULL, "fsl,imx7d-anatop"); base = of_iomap(np, 0); WARN_ON(!base); + of_node_put(np); clks[IMX7D_PLL_ARM_MAIN_SRC] = imx_clk_mux("pll_arm_main_src", base + 0x60, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); clks[IMX7D_PLL_DRAM_MAIN_SRC] = imx_clk_mux("pll_dram_main_src", base + 0x70, 14, 2, pll_bypass_src_sel, ARRAY_SIZE(pll_bypass_src_sel)); diff -Nru linux-4.19.98/drivers/clk/imx/clk-vf610.c linux-4.19.118/drivers/clk/imx/clk-vf610.c --- linux-4.19.98/drivers/clk/imx/clk-vf610.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/imx/clk-vf610.c 2020-04-23 08:30:24.000000000 +0000 @@ -203,6 +203,7 @@ np = of_find_compatible_node(NULL, NULL, "fsl,vf610-anatop"); anatop_base = of_iomap(np, 0); BUG_ON(!anatop_base); + of_node_put(np); np = ccm_node; ccm_base = of_iomap(np, 0); diff -Nru linux-4.19.98/drivers/clk/ingenic/jz4740-cgu.c linux-4.19.118/drivers/clk/ingenic/jz4740-cgu.c --- linux-4.19.98/drivers/clk/ingenic/jz4740-cgu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/ingenic/jz4740-cgu.c 2020-04-23 08:30:24.000000000 +0000 @@ -165,7 +165,7 @@ .parents = { JZ4740_CLK_EXT, JZ4740_CLK_PLL_HALF, -1, -1 }, .mux = { CGU_REG_CPCCR, 29, 1 }, .div = { CGU_REG_CPCCR, 23, 1, 6, -1, -1, -1 }, - .gate = { CGU_REG_SCR, 6 }, + .gate = { CGU_REG_SCR, 6, true }, }, /* Gate-only clocks */ diff -Nru linux-4.19.98/drivers/clk/ingenic/jz4770-cgu.c linux-4.19.118/drivers/clk/ingenic/jz4770-cgu.c --- linux-4.19.98/drivers/clk/ingenic/jz4770-cgu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/ingenic/jz4770-cgu.c 2020-04-23 08:30:24.000000000 +0000 @@ -436,8 +436,10 @@ cgu = ingenic_cgu_new(jz4770_cgu_clocks, ARRAY_SIZE(jz4770_cgu_clocks), np); - if (!cgu) + if (!cgu) { pr_err("%s: failed to initialise CGU\n", __func__); + return; + } retval = ingenic_cgu_register_clocks(cgu); if (retval) diff -Nru linux-4.19.98/drivers/clk/meson/axg.c linux-4.19.118/drivers/clk/meson/axg.c --- linux-4.19.98/drivers/clk/meson/axg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/meson/axg.c 2020-04-23 08:30:24.000000000 +0000 @@ -461,11 +461,6 @@ .shift = 16, .width = 9, }, - .ssen = { - .reg_off = HHI_MPLL_CNTL, - .shift = 25, - .width = 1, - }, .misc = { .reg_off = HHI_PLL_TOP_MISC, .shift = 0, @@ -560,6 +555,11 @@ .shift = 16, .width = 9, }, + .ssen = { + .reg_off = HHI_MPLL_CNTL, + .shift = 25, + .width = 1, + }, .misc = { .reg_off = HHI_PLL_TOP_MISC, .shift = 2, diff -Nru linux-4.19.98/drivers/clk/meson/gxbb.c linux-4.19.118/drivers/clk/meson/gxbb.c --- linux-4.19.98/drivers/clk/meson/gxbb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/meson/gxbb.c 2020-04-23 08:30:24.000000000 +0000 @@ -650,11 +650,6 @@ .shift = 16, .width = 9, }, - .ssen = { - .reg_off = HHI_MPLL_CNTL, - .shift = 25, - .width = 1, - }, .lock = &meson_clk_lock, }, .hw.init = &(struct clk_init_data){ diff -Nru linux-4.19.98/drivers/clk/mmp/clk-of-mmp2.c linux-4.19.118/drivers/clk/mmp/clk-of-mmp2.c --- linux-4.19.98/drivers/clk/mmp/clk-of-mmp2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/mmp/clk-of-mmp2.c 2020-04-23 08:30:24.000000000 +0000 @@ -134,7 +134,7 @@ static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; static DEFINE_SPINLOCK(timer_lock); -static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"}; +static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"}; static DEFINE_SPINLOCK(reset_lock); diff -Nru linux-4.19.98/drivers/clk/mvebu/armada-370.c linux-4.19.118/drivers/clk/mvebu/armada-370.c --- linux-4.19.98/drivers/clk/mvebu/armada-370.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/mvebu/armada-370.c 2020-04-23 08:30:24.000000000 +0000 @@ -177,8 +177,10 @@ mvebu_coreclk_setup(np, &a370_coreclks); - if (cgnp) + if (cgnp) { mvebu_clk_gating_setup(cgnp, a370_gating_desc); + of_node_put(cgnp); + } } CLK_OF_DECLARE(a370_clk, "marvell,armada-370-core-clock", a370_clk_init); diff -Nru linux-4.19.98/drivers/clk/mvebu/armada-xp.c linux-4.19.118/drivers/clk/mvebu/armada-xp.c --- linux-4.19.98/drivers/clk/mvebu/armada-xp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/mvebu/armada-xp.c 2020-04-23 08:30:24.000000000 +0000 @@ -228,7 +228,9 @@ mvebu_coreclk_setup(np, &axp_coreclks); - if (cgnp) + if (cgnp) { mvebu_clk_gating_setup(cgnp, axp_gating_desc); + of_node_put(cgnp); + } } CLK_OF_DECLARE(axp_clk, "marvell,armada-xp-core-clock", axp_clk_init); diff -Nru linux-4.19.98/drivers/clk/mvebu/dove.c linux-4.19.118/drivers/clk/mvebu/dove.c --- linux-4.19.98/drivers/clk/mvebu/dove.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/mvebu/dove.c 2020-04-23 08:30:24.000000000 +0000 @@ -190,10 +190,14 @@ mvebu_coreclk_setup(np, &dove_coreclks); - if (ddnp) + if (ddnp) { dove_divider_clk_init(ddnp); + of_node_put(ddnp); + } - if (cgnp) + if (cgnp) { mvebu_clk_gating_setup(cgnp, dove_gating_desc); + of_node_put(cgnp); + } } CLK_OF_DECLARE(dove_clk, "marvell,dove-core-clock", dove_clk_init); diff -Nru linux-4.19.98/drivers/clk/mvebu/kirkwood.c linux-4.19.118/drivers/clk/mvebu/kirkwood.c --- linux-4.19.98/drivers/clk/mvebu/kirkwood.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/mvebu/kirkwood.c 2020-04-23 08:30:24.000000000 +0000 @@ -333,6 +333,8 @@ if (cgnp) { mvebu_clk_gating_setup(cgnp, kirkwood_gating_desc); kirkwood_clk_muxing_setup(cgnp, kirkwood_mux_desc); + + of_node_put(cgnp); } } CLK_OF_DECLARE(kirkwood_clk, "marvell,kirkwood-core-clock", diff -Nru linux-4.19.98/drivers/clk/mvebu/mv98dx3236.c linux-4.19.118/drivers/clk/mvebu/mv98dx3236.c --- linux-4.19.98/drivers/clk/mvebu/mv98dx3236.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/mvebu/mv98dx3236.c 2020-04-23 08:30:24.000000000 +0000 @@ -174,7 +174,9 @@ mvebu_coreclk_setup(np, &mv98dx3236_core_clocks); - if (cgnp) + if (cgnp) { mvebu_clk_gating_setup(cgnp, mv98dx3236_gating_desc); + of_node_put(cgnp); + } } CLK_OF_DECLARE(mv98dx3236_clk, "marvell,mv98dx3236-core-clock", mv98dx3236_clk_init); diff -Nru linux-4.19.98/drivers/clk/qcom/clk-rcg2.c linux-4.19.118/drivers/clk/qcom/clk-rcg2.c --- linux-4.19.98/drivers/clk/qcom/clk-rcg2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/qcom/clk-rcg2.c 2020-04-23 08:30:24.000000000 +0000 @@ -105,7 +105,7 @@ } WARN(1, "%s: rcg didn't update its configuration.", name); - return 0; + return -EBUSY; } static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index) @@ -203,6 +203,9 @@ clk_flags = clk_hw_get_flags(hw); p = clk_hw_get_parent_by_index(hw, index); + if (!p) + return -EINVAL; + if (clk_flags & CLK_SET_RATE_PARENT) { rate = f->freq; if (f->pre_div) { diff -Nru linux-4.19.98/drivers/clk/qcom/gcc-msm8996.c linux-4.19.118/drivers/clk/qcom/gcc-msm8996.c --- linux-4.19.98/drivers/clk/qcom/gcc-msm8996.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/qcom/gcc-msm8996.c 2020-04-23 08:30:24.000000000 +0000 @@ -138,22 +138,6 @@ "gpll0_early_div" }; -static const struct parent_map gcc_xo_gpll0_gpll2_gpll3_gpll0_early_div_map[] = { - { P_XO, 0 }, - { P_GPLL0, 1 }, - { P_GPLL2, 2 }, - { P_GPLL3, 3 }, - { P_GPLL0_EARLY_DIV, 6 } -}; - -static const char * const gcc_xo_gpll0_gpll2_gpll3_gpll0_early_div[] = { - "xo", - "gpll0", - "gpll2", - "gpll3", - "gpll0_early_div" -}; - static const struct parent_map gcc_xo_gpll0_gpll1_early_div_gpll1_gpll4_gpll0_early_div_map[] = { { P_XO, 0 }, { P_GPLL0, 1 }, @@ -192,26 +176,6 @@ "gpll0_early_div" }; -static const struct parent_map gcc_xo_gpll0_gpll2_gpll3_gpll1_gpll4_gpll0_early_div_map[] = { - { P_XO, 0 }, - { P_GPLL0, 1 }, - { P_GPLL2, 2 }, - { P_GPLL3, 3 }, - { P_GPLL1, 4 }, - { P_GPLL4, 5 }, - { P_GPLL0_EARLY_DIV, 6 } -}; - -static const char * const gcc_xo_gpll0_gpll2_gpll3_gpll1_gpll4_gpll0_early_div[] = { - "xo", - "gpll0", - "gpll2", - "gpll3", - "gpll1", - "gpll4", - "gpll0_early_div" -}; - static struct clk_fixed_factor xo = { .mult = 1, .div = 1, diff -Nru linux-4.19.98/drivers/clk/qcom/gcc-msm8998.c linux-4.19.118/drivers/clk/qcom/gcc-msm8998.c --- linux-4.19.98/drivers/clk/qcom/gcc-msm8998.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/qcom/gcc-msm8998.c 2020-04-23 08:30:24.000000000 +0000 @@ -2144,7 +2144,7 @@ static struct clk_branch gcc_pcie_0_pipe_clk = { .halt_reg = 0x6b018, - .halt_check = BRANCH_HALT, + .halt_check = BRANCH_HALT_SKIP, .clkr = { .enable_reg = 0x6b018, .enable_mask = BIT(0), diff -Nru linux-4.19.98/drivers/clk/samsung/clk-exynos4.c linux-4.19.118/drivers/clk/samsung/clk-exynos4.c --- linux-4.19.98/drivers/clk/samsung/clk-exynos4.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/samsung/clk-exynos4.c 2020-04-23 08:30:24.000000000 +0000 @@ -1226,6 +1226,7 @@ xom = readl(chipid_base + 8); iounmap(chipid_base); + of_node_put(np); } return xom; diff -Nru linux-4.19.98/drivers/clk/socfpga/clk-pll-a10.c linux-4.19.118/drivers/clk/socfpga/clk-pll-a10.c --- linux-4.19.98/drivers/clk/socfpga/clk-pll-a10.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/socfpga/clk-pll-a10.c 2020-04-23 08:30:24.000000000 +0000 @@ -95,6 +95,7 @@ clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); clk_mgr_a10_base_addr = of_iomap(clkmgr_np, 0); + of_node_put(clkmgr_np); BUG_ON(!clk_mgr_a10_base_addr); pll_clk->hw.reg = clk_mgr_a10_base_addr + reg; diff -Nru linux-4.19.98/drivers/clk/socfpga/clk-pll.c linux-4.19.118/drivers/clk/socfpga/clk-pll.c --- linux-4.19.98/drivers/clk/socfpga/clk-pll.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/socfpga/clk-pll.c 2020-04-23 08:30:24.000000000 +0000 @@ -100,6 +100,7 @@ clkmgr_np = of_find_compatible_node(NULL, NULL, "altr,clk-mgr"); clk_mgr_base_addr = of_iomap(clkmgr_np, 0); + of_node_put(clkmgr_np); BUG_ON(!clk_mgr_base_addr); pll_clk->hw.reg = clk_mgr_base_addr + reg; diff -Nru linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun50i-a64.c linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun50i-a64.c --- linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun50i-a64.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun50i-a64.c 2020-04-23 08:30:24.000000000 +0000 @@ -901,11 +901,26 @@ .num_resets = ARRAY_SIZE(sun50i_a64_ccu_resets), }; +static struct ccu_pll_nb sun50i_a64_pll_cpu_nb = { + .common = &pll_cpux_clk.common, + /* copy from pll_cpux_clk */ + .enable = BIT(31), + .lock = BIT(28), +}; + +static struct ccu_mux_nb sun50i_a64_cpu_nb = { + .common = &cpux_clk.common, + .cm = &cpux_clk.mux, + .delay_us = 1, /* > 8 clock cycles at 24 MHz */ + .bypass_index = 1, /* index of 24 MHz oscillator */ +}; + static int sun50i_a64_ccu_probe(struct platform_device *pdev) { struct resource *res; void __iomem *reg; u32 val; + int ret; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); reg = devm_ioremap_resource(&pdev->dev, res); @@ -919,7 +934,18 @@ writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG); - return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc); + ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc); + if (ret) + return ret; + + /* Gate then ungate PLL CPU after any rate changes */ + ccu_pll_notifier_register(&sun50i_a64_pll_cpu_nb); + + /* Reparent CPU during PLL CPU rate changes */ + ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk, + &sun50i_a64_cpu_nb); + + return 0; } static const struct of_device_id sun50i_a64_ccu_ids[] = { diff -Nru linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c --- linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c 2020-04-23 08:30:24.000000000 +0000 @@ -23,9 +23,9 @@ */ static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k", - "pll-periph0", "iosc" }; + "iosc", "pll-periph0" }; static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = { - { .index = 2, .shift = 0, .width = 5 }, + { .index = 3, .shift = 0, .width = 5 }, }; static struct ccu_div ar100_clk = { @@ -104,7 +104,7 @@ static SUNXI_CCU_GATE(r_apb1_ir_clk, "r-apb1-ir", "r-apb1", 0x1cc, BIT(0), 0); static SUNXI_CCU_GATE(r_apb1_w1_clk, "r-apb1-w1", "r-apb1", - 0x1cc, BIT(0), 0); + 0x1ec, BIT(0), 0); /* Information of IR(RX) mod clock is gathered from BSP source code */ static const char * const r_mod0_default_parents[] = { "osc32k", "osc24M" }; diff -Nru linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun8i-a23.c linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun8i-a23.c --- linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun8i-a23.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun8i-a23.c 2020-04-23 08:30:24.000000000 +0000 @@ -144,7 +144,7 @@ 8, 4, /* N */ 4, 2, /* K */ 0, 4, /* M */ - BIT(31), /* gate */ + BIT(31) | BIT(23) | BIT(22), /* gate */ BIT(28), /* lock */ CLK_SET_RATE_UNGATE); diff -Nru linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c --- linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c 2020-04-23 08:30:24.000000000 +0000 @@ -84,7 +84,7 @@ BIT(28), /* lock */ 0); -static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_ddr_clk, "pll-ddr", +static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_ddr0_clk, "pll-ddr0", "osc24M", 0x020, 8, 5, /* N */ 4, 2, /* K */ @@ -123,6 +123,14 @@ 2, /* post-div */ 0); +static SUNXI_CCU_NM_WITH_GATE_LOCK(pll_ddr1_clk, "pll-ddr1", + "osc24M", 0x04c, + 8, 7, /* N */ + 0, 2, /* M */ + BIT(31), /* gate */ + BIT(28), /* lock */ + 0); + static const char * const cpu_parents[] = { "osc32k", "osc24M", "pll-cpu", "pll-cpu" }; static SUNXI_CCU_MUX(cpu_clk, "cpu", cpu_parents, @@ -310,7 +318,8 @@ static SUNXI_CCU_GATE(usb_ohci0_clk, "usb-ohci0", "osc24M", 0x0cc, BIT(16), 0); -static const char * const dram_parents[] = { "pll-ddr", "pll-periph0-2x" }; +static const char * const dram_parents[] = { "pll-ddr0", "pll-ddr1", + "pll-periph0-2x" }; static SUNXI_CCU_M_WITH_MUX(dram_clk, "dram", dram_parents, 0x0f4, 0, 4, 20, 2, CLK_IS_CRITICAL); @@ -369,10 +378,11 @@ &pll_audio_base_clk.common, &pll_video_clk.common, &pll_ve_clk.common, - &pll_ddr_clk.common, + &pll_ddr0_clk.common, &pll_periph0_clk.common, &pll_isp_clk.common, &pll_periph1_clk.common, + &pll_ddr1_clk.common, &cpu_clk.common, &axi_clk.common, &ahb1_clk.common, @@ -457,11 +467,12 @@ [CLK_PLL_AUDIO_8X] = &pll_audio_8x_clk.hw, [CLK_PLL_VIDEO] = &pll_video_clk.common.hw, [CLK_PLL_VE] = &pll_ve_clk.common.hw, - [CLK_PLL_DDR] = &pll_ddr_clk.common.hw, + [CLK_PLL_DDR0] = &pll_ddr0_clk.common.hw, [CLK_PLL_PERIPH0] = &pll_periph0_clk.common.hw, [CLK_PLL_PERIPH0_2X] = &pll_periph0_2x_clk.hw, [CLK_PLL_ISP] = &pll_isp_clk.common.hw, [CLK_PLL_PERIPH1] = &pll_periph1_clk.common.hw, + [CLK_PLL_DDR1] = &pll_ddr1_clk.common.hw, [CLK_CPU] = &cpu_clk.common.hw, [CLK_AXI] = &axi_clk.common.hw, [CLK_AHB1] = &ahb1_clk.common.hw, diff -Nru linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h --- linux-4.19.98/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h 2020-04-23 08:30:24.000000000 +0000 @@ -29,7 +29,7 @@ #define CLK_PLL_AUDIO_8X 5 #define CLK_PLL_VIDEO 6 #define CLK_PLL_VE 7 -#define CLK_PLL_DDR 8 +#define CLK_PLL_DDR0 8 #define CLK_PLL_PERIPH0 9 #define CLK_PLL_PERIPH0_2X 10 #define CLK_PLL_ISP 11 @@ -58,6 +58,8 @@ /* And the GPU module clock is exported */ -#define CLK_NUMBER (CLK_MIPI_CSI + 1) +#define CLK_PLL_DDR1 74 + +#define CLK_NUMBER (CLK_PLL_DDR1 + 1) #endif /* _CCU_SUN8I_H3_H_ */ diff -Nru linux-4.19.98/drivers/clk/tegra/clk-tegra-periph.c linux-4.19.118/drivers/clk/tegra/clk-tegra-periph.c --- linux-4.19.98/drivers/clk/tegra/clk-tegra-periph.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/tegra/clk-tegra-periph.c 2020-04-23 08:30:24.000000000 +0000 @@ -799,7 +799,11 @@ GATE("ahbdma", "hclk", 33, 0, tegra_clk_ahbdma, 0), GATE("apbdma", "pclk", 34, 0, tegra_clk_apbdma, 0), GATE("kbc", "clk_32k", 36, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_kbc, 0), - GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, 0), + /* + * Critical for RAM re-repair operation, which must occur on resume + * from LP1 system suspend and as part of CCPLEX cluster switching. + */ + GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, CLK_IS_CRITICAL), GATE("fuse_burn", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse_burn, 0), GATE("kfuse", "clk_m", 40, TEGRA_PERIPH_ON_APB, tegra_clk_kfuse, 0), GATE("apbif", "clk_m", 107, TEGRA_PERIPH_ON_APB, tegra_clk_apbif, 0), diff -Nru linux-4.19.98/drivers/clk/tegra/clk-tegra-pmc.c linux-4.19.118/drivers/clk/tegra/clk-tegra-pmc.c --- linux-4.19.98/drivers/clk/tegra/clk-tegra-pmc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/tegra/clk-tegra-pmc.c 2020-04-23 08:30:24.000000000 +0000 @@ -60,16 +60,16 @@ static DEFINE_SPINLOCK(clk_out_lock); -static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2", - "clk_m_div4", "extern1", +static const char *clk_out1_parents[] = { "osc", "osc_div2", + "osc_div4", "extern1", }; -static const char *clk_out2_parents[] = { "clk_m", "clk_m_div2", - "clk_m_div4", "extern2", +static const char *clk_out2_parents[] = { "osc", "osc_div2", + "osc_div4", "extern2", }; -static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2", - "clk_m_div4", "extern3", +static const char *clk_out3_parents[] = { "osc", "osc_div2", + "osc_div4", "extern3", }; static struct pmc_clk_init_data pmc_clks[] = { diff -Nru linux-4.19.98/drivers/clk/ti/clk.c linux-4.19.118/drivers/clk/ti/clk.c --- linux-4.19.98/drivers/clk/ti/clk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/ti/clk.c 2020-04-23 08:30:24.000000000 +0000 @@ -188,9 +188,13 @@ clkdev_add(&c->lk); } else { if (num_args && !has_clkctrl_data) { - if (of_find_compatible_node(NULL, NULL, - "ti,clkctrl")) { + struct device_node *np; + + np = of_find_compatible_node(NULL, NULL, + "ti,clkctrl"); + if (np) { has_clkctrl_data = true; + of_node_put(np); } else { clkctrl_nodes_missing = true; diff -Nru linux-4.19.98/drivers/clk/uniphier/clk-uniphier-peri.c linux-4.19.118/drivers/clk/uniphier/clk-uniphier-peri.c --- linux-4.19.98/drivers/clk/uniphier/clk-uniphier-peri.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clk/uniphier/clk-uniphier-peri.c 2020-04-23 08:30:24.000000000 +0000 @@ -27,8 +27,8 @@ #define UNIPHIER_PERI_CLK_FI2C(idx, ch) \ UNIPHIER_CLK_GATE("i2c" #ch, (idx), "i2c", 0x24, 24 + (ch)) -#define UNIPHIER_PERI_CLK_SCSSI(idx) \ - UNIPHIER_CLK_GATE("scssi", (idx), "spi", 0x20, 17) +#define UNIPHIER_PERI_CLK_SCSSI(idx, ch) \ + UNIPHIER_CLK_GATE("scssi" #ch, (idx), "spi", 0x20, 17 + (ch)) #define UNIPHIER_PERI_CLK_MCSSI(idx) \ UNIPHIER_CLK_GATE("mcssi", (idx), "spi", 0x24, 14) @@ -44,7 +44,7 @@ UNIPHIER_PERI_CLK_I2C(6, 2), UNIPHIER_PERI_CLK_I2C(7, 3), UNIPHIER_PERI_CLK_I2C(8, 4), - UNIPHIER_PERI_CLK_SCSSI(11), + UNIPHIER_PERI_CLK_SCSSI(11, 0), { /* sentinel */ } }; @@ -60,7 +60,10 @@ UNIPHIER_PERI_CLK_FI2C(8, 4), UNIPHIER_PERI_CLK_FI2C(9, 5), UNIPHIER_PERI_CLK_FI2C(10, 6), - UNIPHIER_PERI_CLK_SCSSI(11), - UNIPHIER_PERI_CLK_MCSSI(12), + UNIPHIER_PERI_CLK_SCSSI(11, 0), + UNIPHIER_PERI_CLK_SCSSI(12, 1), + UNIPHIER_PERI_CLK_SCSSI(13, 2), + UNIPHIER_PERI_CLK_SCSSI(14, 3), + UNIPHIER_PERI_CLK_MCSSI(15), { /* sentinel */ } }; diff -Nru linux-4.19.98/drivers/clocksource/bcm2835_timer.c linux-4.19.118/drivers/clocksource/bcm2835_timer.c --- linux-4.19.98/drivers/clocksource/bcm2835_timer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clocksource/bcm2835_timer.c 2020-04-23 08:30:24.000000000 +0000 @@ -134,7 +134,7 @@ ret = setup_irq(irq, &timer->act); if (ret) { pr_err("Can't set up timer IRQ\n"); - goto err_iounmap; + goto err_timer_free; } clockevents_config_and_register(&timer->evt, freq, 0xf, 0xffffffff); @@ -143,6 +143,9 @@ return 0; +err_timer_free: + kfree(timer); + err_iounmap: iounmap(base); return ret; diff -Nru linux-4.19.98/drivers/clocksource/exynos_mct.c linux-4.19.118/drivers/clocksource/exynos_mct.c --- linux-4.19.98/drivers/clocksource/exynos_mct.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clocksource/exynos_mct.c 2020-04-23 08:30:24.000000000 +0000 @@ -563,7 +563,19 @@ return 0; out_irq: - free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick); + if (mct_int_type == MCT_INT_PPI) { + free_percpu_irq(mct_irqs[MCT_L0_IRQ], &percpu_mct_tick); + } else { + for_each_possible_cpu(cpu) { + struct mct_clock_event_device *pcpu_mevt = + per_cpu_ptr(&percpu_mct_tick, cpu); + + if (pcpu_mevt->evt.irq != -1) { + free_irq(pcpu_mevt->evt.irq, pcpu_mevt); + pcpu_mevt->evt.irq = -1; + } + } + } return err; } diff -Nru linux-4.19.98/drivers/clocksource/timer-sun5i.c linux-4.19.118/drivers/clocksource/timer-sun5i.c --- linux-4.19.98/drivers/clocksource/timer-sun5i.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clocksource/timer-sun5i.c 2020-04-23 08:30:24.000000000 +0000 @@ -202,6 +202,11 @@ } rate = clk_get_rate(clk); + if (!rate) { + pr_err("Couldn't get parent clock rate\n"); + ret = -EINVAL; + goto err_disable_clk; + } cs->timer.base = base; cs->timer.clk = clk; @@ -275,6 +280,11 @@ } rate = clk_get_rate(clk); + if (!rate) { + pr_err("Couldn't get parent clock rate\n"); + ret = -EINVAL; + goto err_disable_clk; + } ce->timer.base = base; ce->timer.ticks_per_jiffy = DIV_ROUND_UP(rate, HZ); diff -Nru linux-4.19.98/drivers/clocksource/timer-ti-dm.c linux-4.19.118/drivers/clocksource/timer-ti-dm.c --- linux-4.19.98/drivers/clocksource/timer-ti-dm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/clocksource/timer-ti-dm.c 2020-04-23 08:30:24.000000000 +0000 @@ -868,7 +868,6 @@ timer->pdev = pdev; pm_runtime_enable(dev); - pm_runtime_irq_safe(dev); if (!timer->reserved) { ret = pm_runtime_get_sync(dev); diff -Nru linux-4.19.98/drivers/cpufreq/brcmstb-avs-cpufreq.c linux-4.19.118/drivers/cpufreq/brcmstb-avs-cpufreq.c --- linux-4.19.98/drivers/cpufreq/brcmstb-avs-cpufreq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/cpufreq/brcmstb-avs-cpufreq.c 2020-04-23 08:30:24.000000000 +0000 @@ -384,12 +384,12 @@ return __issue_avs_command(priv, AVS_CMD_SET_PSTATE, true, args); } -static unsigned long brcm_avs_get_voltage(void __iomem *base) +static u32 brcm_avs_get_voltage(void __iomem *base) { return readl(base + AVS_MBOX_VOLTAGE1); } -static unsigned long brcm_avs_get_frequency(void __iomem *base) +static u32 brcm_avs_get_frequency(void __iomem *base) { return readl(base + AVS_MBOX_FREQUENCY) * 1000; /* in kHz */ } @@ -446,8 +446,8 @@ rc = brcm_avs_get_pmap(priv, NULL); magic = readl(priv->base + AVS_MBOX_MAGIC); - return (magic == AVS_FIRMWARE_MAGIC) && (rc != -ENOTSUPP) && - (rc != -EINVAL); + return (magic == AVS_FIRMWARE_MAGIC) && ((rc != -ENOTSUPP) || + (rc != -EINVAL)); } static unsigned int brcm_avs_cpufreq_get(unsigned int cpu) @@ -653,14 +653,14 @@ { struct private_data *priv = policy->driver_data; - return sprintf(buf, "0x%08lx\n", brcm_avs_get_voltage(priv->base)); + return sprintf(buf, "0x%08x\n", brcm_avs_get_voltage(priv->base)); } static ssize_t show_brcm_avs_frequency(struct cpufreq_policy *policy, char *buf) { struct private_data *priv = policy->driver_data; - return sprintf(buf, "0x%08lx\n", brcm_avs_get_frequency(priv->base)); + return sprintf(buf, "0x%08x\n", brcm_avs_get_frequency(priv->base)); } cpufreq_freq_attr_ro(brcm_avs_pstate); diff -Nru linux-4.19.98/drivers/cpufreq/imx6q-cpufreq.c linux-4.19.118/drivers/cpufreq/imx6q-cpufreq.c --- linux-4.19.98/drivers/cpufreq/imx6q-cpufreq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/cpufreq/imx6q-cpufreq.c 2020-04-23 08:30:24.000000000 +0000 @@ -311,6 +311,9 @@ np = of_find_compatible_node(NULL, NULL, "fsl,imx6ul-ocotp"); if (!np) + np = of_find_compatible_node(NULL, NULL, + "fsl,imx6ull-ocotp"); + if (!np) return -ENOENT; base = of_iomap(np, 0); diff -Nru linux-4.19.98/drivers/cpufreq/powernv-cpufreq.c linux-4.19.118/drivers/cpufreq/powernv-cpufreq.c --- linux-4.19.98/drivers/cpufreq/powernv-cpufreq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/cpufreq/powernv-cpufreq.c 2020-04-23 08:30:24.000000000 +0000 @@ -1081,6 +1081,12 @@ static inline void clean_chip_info(void) { + int i; + + /* flush any pending work items */ + if (chips) + for (i = 0; i < nr_chips; i++) + cancel_work_sync(&chips[i].throttle); kfree(chips); } diff -Nru linux-4.19.98/drivers/crypto/amcc/crypto4xx_trng.h linux-4.19.118/drivers/crypto/amcc/crypto4xx_trng.h --- linux-4.19.98/drivers/crypto/amcc/crypto4xx_trng.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/amcc/crypto4xx_trng.h 2020-04-23 08:30:24.000000000 +0000 @@ -26,9 +26,9 @@ void ppc4xx_trng_remove(struct crypto4xx_core_device *core_dev); #else static inline void ppc4xx_trng_probe( - struct crypto4xx_device *dev __maybe_unused) { } + struct crypto4xx_core_device *dev __maybe_unused) { } static inline void ppc4xx_trng_remove( - struct crypto4xx_device *dev __maybe_unused) { } + struct crypto4xx_core_device *dev __maybe_unused) { } #endif #endif diff -Nru linux-4.19.98/drivers/crypto/atmel-aes.c linux-4.19.118/drivers/crypto/atmel-aes.c --- linux-4.19.98/drivers/crypto/atmel-aes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/atmel-aes.c 2020-04-23 08:30:24.000000000 +0000 @@ -91,7 +91,6 @@ struct atmel_aes_caps { bool has_dualbuff; bool has_cfb64; - bool has_ctr32; bool has_gcm; bool has_xts; bool has_authenc; @@ -1016,8 +1015,9 @@ struct atmel_aes_ctr_ctx *ctx = atmel_aes_ctr_ctx_cast(dd->ctx); struct ablkcipher_request *req = ablkcipher_request_cast(dd->areq); struct scatterlist *src, *dst; - u32 ctr, blocks; size_t datalen; + u32 ctr; + u16 blocks, start, end; bool use_dma, fragmented = false; /* Check for transfer completion. */ @@ -1029,27 +1029,17 @@ datalen = req->nbytes - ctx->offset; blocks = DIV_ROUND_UP(datalen, AES_BLOCK_SIZE); ctr = be32_to_cpu(ctx->iv[3]); - if (dd->caps.has_ctr32) { - /* Check 32bit counter overflow. */ - u32 start = ctr; - u32 end = start + blocks - 1; - - if (end < start) { - ctr |= 0xffffffff; - datalen = AES_BLOCK_SIZE * -start; - fragmented = true; - } - } else { - /* Check 16bit counter overflow. */ - u16 start = ctr & 0xffff; - u16 end = start + (u16)blocks - 1; - - if (blocks >> 16 || end < start) { - ctr |= 0xffff; - datalen = AES_BLOCK_SIZE * (0x10000-start); - fragmented = true; - } + + /* Check 16bit counter overflow. */ + start = ctr & 0xffff; + end = start + blocks - 1; + + if (blocks >> 16 || end < start) { + ctr |= 0xffff; + datalen = AES_BLOCK_SIZE * (0x10000 - start); + fragmented = true; } + use_dma = (datalen >= ATMEL_AES_DMA_THRESHOLD); /* Jump to offset. */ @@ -2553,7 +2543,6 @@ { dd->caps.has_dualbuff = 0; dd->caps.has_cfb64 = 0; - dd->caps.has_ctr32 = 0; dd->caps.has_gcm = 0; dd->caps.has_xts = 0; dd->caps.has_authenc = 0; @@ -2564,7 +2553,6 @@ case 0x500: dd->caps.has_dualbuff = 1; dd->caps.has_cfb64 = 1; - dd->caps.has_ctr32 = 1; dd->caps.has_gcm = 1; dd->caps.has_xts = 1; dd->caps.has_authenc = 1; @@ -2573,7 +2561,6 @@ case 0x200: dd->caps.has_dualbuff = 1; dd->caps.has_cfb64 = 1; - dd->caps.has_ctr32 = 1; dd->caps.has_gcm = 1; dd->caps.max_burst_size = 4; break; diff -Nru linux-4.19.98/drivers/crypto/atmel-sha.c linux-4.19.118/drivers/crypto/atmel-sha.c --- linux-4.19.98/drivers/crypto/atmel-sha.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/atmel-sha.c 2020-04-23 08:30:24.000000000 +0000 @@ -1921,12 +1921,7 @@ { struct atmel_sha_hmac_ctx *hmac = crypto_ahash_ctx(tfm); - if (atmel_sha_hmac_key_set(&hmac->hkey, key, keylen)) { - crypto_ahash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); - return -EINVAL; - } - - return 0; + return atmel_sha_hmac_key_set(&hmac->hkey, key, keylen); } static int atmel_sha_hmac_init(struct ahash_request *req) diff -Nru linux-4.19.98/drivers/crypto/axis/artpec6_crypto.c linux-4.19.118/drivers/crypto/axis/artpec6_crypto.c --- linux-4.19.98/drivers/crypto/axis/artpec6_crypto.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/axis/artpec6_crypto.c 2020-04-23 08:30:24.000000000 +0000 @@ -1256,7 +1256,7 @@ if (len != 16 && len != 24 && len != 32) { crypto_aead_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); - return -1; + return -EINVAL; } ctx->key_length = len; diff -Nru linux-4.19.98/drivers/crypto/bcm/cipher.c linux-4.19.118/drivers/crypto/bcm/cipher.c --- linux-4.19.98/drivers/crypto/bcm/cipher.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/bcm/cipher.c 2020-04-23 08:30:24.000000000 +0000 @@ -717,7 +717,7 @@ */ unsigned int new_data_len; - unsigned int chunk_start = 0; + unsigned int __maybe_unused chunk_start = 0; u32 db_size; /* Length of data field, incl gcm and hash padding */ int pad_len = 0; /* total pad len, including gcm, hash, stat padding */ u32 data_pad_len = 0; /* length of GCM/CCM padding */ @@ -1675,8 +1675,6 @@ struct spu_hw *spu = &iproc_priv.spu; struct brcm_message *mssg = msg; struct iproc_reqctx_s *rctx; - struct iproc_ctx_s *ctx; - struct crypto_async_request *areq; int err = 0; rctx = mssg->ctx; @@ -1686,8 +1684,6 @@ err = -EFAULT; goto cb_finish; } - areq = rctx->parent; - ctx = rctx->ctx; /* process the SPU status */ err = spu->spu_status_process(rctx->msg_buf.rx_stat); diff -Nru linux-4.19.98/drivers/crypto/caam/caamalg_desc.c linux-4.19.118/drivers/crypto/caam/caamalg_desc.c --- linux-4.19.98/drivers/crypto/caam/caamalg_desc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/caam/caamalg_desc.c 2020-04-23 08:30:24.000000000 +0000 @@ -1457,7 +1457,13 @@ */ void cnstr_shdsc_xts_ablkcipher_encap(u32 * const desc, struct alginfo *cdata) { - __be64 sector_size = cpu_to_be64(512); + /* + * Set sector size to a big value, practically disabling + * sector size segmentation in xts implementation. We cannot + * take full advantage of this HW feature with existing + * crypto API / dm-crypt SW architecture. + */ + __be64 sector_size = cpu_to_be64(BIT(15)); u32 *key_jump_cmd; init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); @@ -1509,7 +1515,13 @@ */ void cnstr_shdsc_xts_ablkcipher_decap(u32 * const desc, struct alginfo *cdata) { - __be64 sector_size = cpu_to_be64(512); + /* + * Set sector size to a big value, practically disabling + * sector size segmentation in xts implementation. We cannot + * take full advantage of this HW feature with existing + * crypto API / dm-crypt SW architecture. + */ + __be64 sector_size = cpu_to_be64(BIT(15)); u32 *key_jump_cmd; init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); diff -Nru linux-4.19.98/drivers/crypto/caam/caamrng.c linux-4.19.118/drivers/crypto/caam/caamrng.c --- linux-4.19.98/drivers/crypto/caam/caamrng.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/caam/caamrng.c 2020-04-23 08:30:24.000000000 +0000 @@ -353,7 +353,10 @@ goto free_rng_ctx; dev_info(dev, "registering rng-caam\n"); - return hwrng_register(&caam_rng); + + err = hwrng_register(&caam_rng); + if (!err) + return err; free_rng_ctx: kfree(rng_ctx); diff -Nru linux-4.19.98/drivers/crypto/caam/error.c linux-4.19.118/drivers/crypto/caam/error.c --- linux-4.19.98/drivers/crypto/caam/error.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/caam/error.c 2020-04-23 08:30:24.000000000 +0000 @@ -22,7 +22,7 @@ size_t len; void *buf; - for (it = sg; it && tlen > 0 ; it = sg_next(sg)) { + for (it = sg; it && tlen > 0 ; it = sg_next(it)) { /* * make sure the scatterlist's page * has a valid virtual memory mapping diff -Nru linux-4.19.98/drivers/crypto/ccp/ccp-crypto-aes.c linux-4.19.118/drivers/crypto/ccp/ccp-crypto-aes.c --- linux-4.19.98/drivers/crypto/ccp/ccp-crypto-aes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccp/ccp-crypto-aes.c 2020-04-23 08:30:24.000000000 +0000 @@ -1,7 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0 /* * AMD Cryptographic Coprocessor (CCP) AES crypto API support * - * Copyright (C) 2013,2016 Advanced Micro Devices, Inc. + * Copyright (C) 2013-2019 Advanced Micro Devices, Inc. * * Author: Tom Lendacky * @@ -79,8 +80,7 @@ return -EINVAL; if (((ctx->u.aes.mode == CCP_AES_MODE_ECB) || - (ctx->u.aes.mode == CCP_AES_MODE_CBC) || - (ctx->u.aes.mode == CCP_AES_MODE_CFB)) && + (ctx->u.aes.mode == CCP_AES_MODE_CBC)) && (req->nbytes & (AES_BLOCK_SIZE - 1))) return -EINVAL; @@ -291,7 +291,7 @@ .version = CCP_VERSION(3, 0), .name = "cfb(aes)", .driver_name = "cfb-aes-ccp", - .blocksize = AES_BLOCK_SIZE, + .blocksize = 1, .ivsize = AES_BLOCK_SIZE, .alg_defaults = &ccp_aes_defaults, }, diff -Nru linux-4.19.98/drivers/crypto/ccp/ccp-dev-v3.c linux-4.19.118/drivers/crypto/ccp/ccp-dev-v3.c --- linux-4.19.98/drivers/crypto/ccp/ccp-dev-v3.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccp/ccp-dev-v3.c 2020-04-23 08:30:24.000000000 +0000 @@ -590,6 +590,7 @@ .setup = NULL, .perform = &ccp3_actions, .offset = 0, + .rsamax = CCP_RSA_MAX_WIDTH, }; const struct ccp_vdata ccpv3 = { diff -Nru linux-4.19.98/drivers/crypto/ccp/ccp-ops.c linux-4.19.118/drivers/crypto/ccp/ccp-ops.c --- linux-4.19.98/drivers/crypto/ccp/ccp-ops.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccp/ccp-ops.c 2020-04-23 08:30:24.000000000 +0000 @@ -458,8 +458,8 @@ return ccp_copy_to_from_sb(cmd_q, wa, jobid, sb, byte_swap, true); } -static int ccp_run_aes_cmac_cmd(struct ccp_cmd_queue *cmd_q, - struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_aes_cmac_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_aes_engine *aes = &cmd->u.aes; struct ccp_dm_workarea key, ctx; @@ -614,8 +614,8 @@ return ret; } -static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_aes_engine *aes = &cmd->u.aes; struct ccp_dm_workarea key, ctx, final_wa, tag; @@ -897,7 +897,8 @@ return ret; } -static int ccp_run_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_aes_engine *aes = &cmd->u.aes; struct ccp_dm_workarea key, ctx; @@ -907,12 +908,6 @@ bool in_place = false; int ret; - if (aes->mode == CCP_AES_MODE_CMAC) - return ccp_run_aes_cmac_cmd(cmd_q, cmd); - - if (aes->mode == CCP_AES_MODE_GCM) - return ccp_run_aes_gcm_cmd(cmd_q, cmd); - if (!((aes->key_len == AES_KEYSIZE_128) || (aes->key_len == AES_KEYSIZE_192) || (aes->key_len == AES_KEYSIZE_256))) @@ -1080,8 +1075,8 @@ return ret; } -static int ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q, - struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_xts_aes_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_xts_aes_engine *xts = &cmd->u.xts; struct ccp_dm_workarea key, ctx; @@ -1280,7 +1275,8 @@ return ret; } -static int ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_des3_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_des3_engine *des3 = &cmd->u.des3; @@ -1293,6 +1289,9 @@ int ret; /* Error checks */ + if (cmd_q->ccp->vdata->version < CCP_VERSION(5, 0)) + return -EINVAL; + if (!cmd_q->ccp->vdata->perform->des3) return -EINVAL; @@ -1375,8 +1374,6 @@ * passthru option to convert from big endian to little endian. */ if (des3->mode != CCP_DES3_MODE_ECB) { - u32 load_mode; - op.sb_ctx = cmd_q->sb_ctx; ret = ccp_init_dm_workarea(&ctx, cmd_q, @@ -1392,12 +1389,8 @@ if (ret) goto e_ctx; - if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0)) - load_mode = CCP_PASSTHRU_BYTESWAP_NOOP; - else - load_mode = CCP_PASSTHRU_BYTESWAP_256BIT; ret = ccp_copy_to_sb(cmd_q, &ctx, op.jobid, op.sb_ctx, - load_mode); + CCP_PASSTHRU_BYTESWAP_256BIT); if (ret) { cmd->engine_error = cmd_q->cmd_error; goto e_ctx; @@ -1459,10 +1452,6 @@ } /* ...but we only need the last DES3_EDE_BLOCK_SIZE bytes */ - if (cmd_q->ccp->vdata->version == CCP_VERSION(3, 0)) - dm_offset = CCP_SB_BYTES - des3->iv_len; - else - dm_offset = 0; ccp_get_dm_area(&ctx, dm_offset, des3->iv, 0, DES3_EDE_BLOCK_SIZE); } @@ -1483,7 +1472,8 @@ return ret; } -static int ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_sha_engine *sha = &cmd->u.sha; struct ccp_dm_workarea ctx; @@ -1827,7 +1817,8 @@ return ret; } -static int ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_rsa_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_rsa_engine *rsa = &cmd->u.rsa; struct ccp_dm_workarea exp, src, dst; @@ -1958,8 +1949,8 @@ return ret; } -static int ccp_run_passthru_cmd(struct ccp_cmd_queue *cmd_q, - struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_passthru_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_passthru_engine *pt = &cmd->u.passthru; struct ccp_dm_workarea mask; @@ -2090,7 +2081,8 @@ return ret; } -static int ccp_run_passthru_nomap_cmd(struct ccp_cmd_queue *cmd_q, +static noinline_for_stack int +ccp_run_passthru_nomap_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_passthru_nomap_engine *pt = &cmd->u.passthru_nomap; @@ -2431,7 +2423,8 @@ return ret; } -static int ccp_run_ecc_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) +static noinline_for_stack int +ccp_run_ecc_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) { struct ccp_ecc_engine *ecc = &cmd->u.ecc; @@ -2468,7 +2461,17 @@ switch (cmd->engine) { case CCP_ENGINE_AES: - ret = ccp_run_aes_cmd(cmd_q, cmd); + switch (cmd->u.aes.mode) { + case CCP_AES_MODE_CMAC: + ret = ccp_run_aes_cmac_cmd(cmd_q, cmd); + break; + case CCP_AES_MODE_GCM: + ret = ccp_run_aes_gcm_cmd(cmd_q, cmd); + break; + default: + ret = ccp_run_aes_cmd(cmd_q, cmd); + break; + } break; case CCP_ENGINE_XTS_AES_128: ret = ccp_run_xts_aes_cmd(cmd_q, cmd); diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_aead.c linux-4.19.118/drivers/crypto/ccree/cc_aead.c --- linux-4.19.98/drivers/crypto/ccree/cc_aead.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_aead.c 2020-04-23 08:30:24.000000000 +0000 @@ -731,7 +731,7 @@ dev_dbg(dev, "ASSOC buffer type DLLI\n"); hw_desc_init(&desc[idx]); set_din_type(&desc[idx], DMA_DLLI, sg_dma_address(areq->src), - areq->assoclen, NS_BIT); + areq_ctx->assoclen, NS_BIT); set_flow_mode(&desc[idx], flow_mode); if (ctx->auth_mode == DRV_HASH_XCBC_MAC && areq_ctx->cryptlen > 0) @@ -1080,9 +1080,11 @@ struct cc_hw_desc desc[], unsigned int *seq_size) { + struct aead_req_ctx *areq_ctx = aead_request_ctx(req); unsigned int idx = *seq_size; + /* Hash associated data */ - if (req->assoclen > 0) + if (areq_ctx->assoclen > 0) cc_set_assoc_desc(req, DIN_HASH, desc, &idx); /* Hash IV */ @@ -1310,7 +1312,7 @@ { struct aead_req_ctx *areq_ctx = aead_request_ctx(req); struct device *dev = drvdata_to_dev(ctx->drvdata); - unsigned int assoclen = req->assoclen; + unsigned int assoclen = areq_ctx->assoclen; unsigned int cipherlen = (direct == DRV_CRYPTO_DIRECTION_DECRYPT) ? (req->cryptlen - ctx->authsize) : req->cryptlen; @@ -1469,7 +1471,7 @@ idx++; /* process assoc data */ - if (req->assoclen > 0) { + if (req_ctx->assoclen > 0) { cc_set_assoc_desc(req, DIN_HASH, desc, &idx); } else { hw_desc_init(&desc[idx]); @@ -1561,7 +1563,7 @@ * NIST Special Publication 800-38C */ *b0 |= (8 * ((m - 2) / 2)); - if (req->assoclen > 0) + if (req_ctx->assoclen > 0) *b0 |= 64; /* Enable bit 6 if Adata exists. */ rc = set_msg_len(b0 + 16 - l, cryptlen, l); /* Write L'. */ @@ -1572,7 +1574,7 @@ /* END of "taken from crypto/ccm.c" */ /* l(a) - size of associated data. */ - req_ctx->ccm_hdr_size = format_ccm_a0(a0, req->assoclen); + req_ctx->ccm_hdr_size = format_ccm_a0(a0, req_ctx->assoclen); memset(req->iv + 15 - req->iv[0], 0, req->iv[0] + 1); req->iv[15] = 1; @@ -1604,7 +1606,7 @@ memcpy(areq_ctx->ctr_iv + CCM_BLOCK_IV_OFFSET, req->iv, CCM_BLOCK_IV_SIZE); req->iv = areq_ctx->ctr_iv; - req->assoclen -= CCM_BLOCK_IV_SIZE; + areq_ctx->assoclen -= CCM_BLOCK_IV_SIZE; } static void cc_set_ghash_desc(struct aead_request *req, @@ -1812,7 +1814,7 @@ // for gcm and rfc4106. cc_set_ghash_desc(req, desc, seq_size); /* process(ghash) assoc data */ - if (req->assoclen > 0) + if (req_ctx->assoclen > 0) cc_set_assoc_desc(req, DIN_HASH, desc, seq_size); cc_set_gctr_desc(req, desc, seq_size); /* process(gctr+ghash) */ @@ -1836,8 +1838,8 @@ (req->cryptlen - ctx->authsize); __be32 counter = cpu_to_be32(2); - dev_dbg(dev, "%s() cryptlen = %d, req->assoclen = %d ctx->authsize = %d\n", - __func__, cryptlen, req->assoclen, ctx->authsize); + dev_dbg(dev, "%s() cryptlen = %d, req_ctx->assoclen = %d ctx->authsize = %d\n", + __func__, cryptlen, req_ctx->assoclen, ctx->authsize); memset(req_ctx->hkey, 0, AES_BLOCK_SIZE); @@ -1853,7 +1855,7 @@ if (!req_ctx->plaintext_authenticate_only) { __be64 temp64; - temp64 = cpu_to_be64(req->assoclen * 8); + temp64 = cpu_to_be64(req_ctx->assoclen * 8); memcpy(&req_ctx->gcm_len_block.len_a, &temp64, sizeof(temp64)); temp64 = cpu_to_be64(cryptlen * 8); memcpy(&req_ctx->gcm_len_block.len_c, &temp64, 8); @@ -1863,8 +1865,8 @@ */ __be64 temp64; - temp64 = cpu_to_be64((req->assoclen + GCM_BLOCK_RFC4_IV_SIZE + - cryptlen) * 8); + temp64 = cpu_to_be64((req_ctx->assoclen + + GCM_BLOCK_RFC4_IV_SIZE + cryptlen) * 8); memcpy(&req_ctx->gcm_len_block.len_a, &temp64, sizeof(temp64)); temp64 = 0; memcpy(&req_ctx->gcm_len_block.len_c, &temp64, 8); @@ -1884,7 +1886,7 @@ memcpy(areq_ctx->ctr_iv + GCM_BLOCK_RFC4_IV_OFFSET, req->iv, GCM_BLOCK_RFC4_IV_SIZE); req->iv = areq_ctx->ctr_iv; - req->assoclen -= GCM_BLOCK_RFC4_IV_SIZE; + areq_ctx->assoclen -= GCM_BLOCK_RFC4_IV_SIZE; } static int cc_proc_aead(struct aead_request *req, @@ -1909,7 +1911,7 @@ /* Check data length according to mode */ if (validate_data_size(ctx, direct, req)) { dev_err(dev, "Unsupported crypt/assoc len %d/%d.\n", - req->cryptlen, req->assoclen); + req->cryptlen, areq_ctx->assoclen); crypto_aead_set_flags(tfm, CRYPTO_TFM_RES_BAD_BLOCK_LEN); return -EINVAL; } @@ -2058,8 +2060,11 @@ struct aead_req_ctx *areq_ctx = aead_request_ctx(req); int rc; + memset(areq_ctx, 0, sizeof(*areq_ctx)); + /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; areq_ctx->is_gcm4543 = false; @@ -2087,8 +2092,11 @@ goto out; } + memset(areq_ctx, 0, sizeof(*areq_ctx)); + /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; areq_ctx->is_gcm4543 = true; @@ -2106,8 +2114,11 @@ struct aead_req_ctx *areq_ctx = aead_request_ctx(req); int rc; + memset(areq_ctx, 0, sizeof(*areq_ctx)); + /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; areq_ctx->is_gcm4543 = false; @@ -2133,8 +2144,11 @@ goto out; } + memset(areq_ctx, 0, sizeof(*areq_ctx)); + /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; areq_ctx->is_gcm4543 = true; @@ -2250,8 +2264,11 @@ goto out; } + memset(areq_ctx, 0, sizeof(*areq_ctx)); + /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; areq_ctx->plaintext_authenticate_only = false; @@ -2273,11 +2290,14 @@ struct aead_req_ctx *areq_ctx = aead_request_ctx(req); int rc; + memset(areq_ctx, 0, sizeof(*areq_ctx)); + //plaintext is not encryped with rfc4543 areq_ctx->plaintext_authenticate_only = true; /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; cc_proc_rfc4_gcm(req); @@ -2305,8 +2325,11 @@ goto out; } + memset(areq_ctx, 0, sizeof(*areq_ctx)); + /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; areq_ctx->plaintext_authenticate_only = false; @@ -2328,11 +2351,14 @@ struct aead_req_ctx *areq_ctx = aead_request_ctx(req); int rc; + memset(areq_ctx, 0, sizeof(*areq_ctx)); + //plaintext is not decryped with rfc4543 areq_ctx->plaintext_authenticate_only = true; /* No generated IV required */ areq_ctx->backup_iv = req->iv; + areq_ctx->assoclen = req->assoclen; areq_ctx->backup_giv = NULL; cc_proc_rfc4_gcm(req); diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_aead.h linux-4.19.118/drivers/crypto/ccree/cc_aead.h --- linux-4.19.98/drivers/crypto/ccree/cc_aead.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_aead.h 2020-04-23 08:30:24.000000000 +0000 @@ -67,6 +67,7 @@ u8 backup_mac[MAX_MAC_SIZE]; u8 *backup_iv; /*store iv for generated IV flow*/ u8 *backup_giv; /*store iv for rfc3686(ctr) flow*/ + u32 assoclen; /* internal assoclen */ dma_addr_t mac_buf_dma_addr; /* internal ICV DMA buffer */ /* buffer for internal ccm configurations */ dma_addr_t ccm_iv0_dma_addr; diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_buffer_mgr.c linux-4.19.118/drivers/crypto/ccree/cc_buffer_mgr.c --- linux-4.19.98/drivers/crypto/ccree/cc_buffer_mgr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_buffer_mgr.c 2020-04-23 08:30:24.000000000 +0000 @@ -65,7 +65,7 @@ { struct aead_req_ctx *areq_ctx = aead_request_ctx(req); struct crypto_aead *tfm = crypto_aead_reqtfm(req); - u32 skip = req->assoclen + req->cryptlen; + u32 skip = areq_ctx->assoclen + req->cryptlen; if (areq_ctx->is_gcm4543) skip += crypto_aead_ivsize(tfm); @@ -460,10 +460,8 @@ /* Map the src SGL */ rc = cc_map_sg(dev, src, nbytes, DMA_BIDIRECTIONAL, &req_ctx->in_nents, LLI_MAX_NUM_OF_DATA_ENTRIES, &dummy, &mapped_nents); - if (rc) { - rc = -ENOMEM; + if (rc) goto cipher_exit; - } if (mapped_nents > 1) req_ctx->dma_buf_type = CC_DMA_BUF_MLLI; @@ -477,12 +475,11 @@ } } else { /* Map the dst sg */ - if (cc_map_sg(dev, dst, nbytes, DMA_BIDIRECTIONAL, - &req_ctx->out_nents, LLI_MAX_NUM_OF_DATA_ENTRIES, - &dummy, &mapped_nents)) { - rc = -ENOMEM; + rc = cc_map_sg(dev, dst, nbytes, DMA_BIDIRECTIONAL, + &req_ctx->out_nents, LLI_MAX_NUM_OF_DATA_ENTRIES, + &dummy, &mapped_nents); + if (rc) goto cipher_exit; - } if (mapped_nents > 1) req_ctx->dma_buf_type = CC_DMA_BUF_MLLI; @@ -577,8 +574,8 @@ dev_dbg(dev, "Unmapping src sgl: req->src=%pK areq_ctx->src.nents=%u areq_ctx->assoc.nents=%u assoclen:%u cryptlen=%u\n", sg_virt(req->src), areq_ctx->src.nents, areq_ctx->assoc.nents, - req->assoclen, req->cryptlen); - size_to_unmap = req->assoclen + req->cryptlen; + areq_ctx->assoclen, req->cryptlen); + size_to_unmap = areq_ctx->assoclen + req->cryptlen; if (areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_ENCRYPT) size_to_unmap += areq_ctx->req_authsize; if (areq_ctx->is_gcm4543) @@ -720,7 +717,7 @@ struct scatterlist *current_sg = req->src; struct crypto_aead *tfm = crypto_aead_reqtfm(req); unsigned int sg_index = 0; - u32 size_of_assoc = req->assoclen; + u32 size_of_assoc = areq_ctx->assoclen; struct device *dev = drvdata_to_dev(drvdata); if (areq_ctx->is_gcm4543) @@ -731,7 +728,7 @@ goto chain_assoc_exit; } - if (req->assoclen == 0) { + if (areq_ctx->assoclen == 0) { areq_ctx->assoc_buff_type = CC_DMA_BUF_NULL; areq_ctx->assoc.nents = 0; areq_ctx->assoc.mlli_nents = 0; @@ -791,7 +788,7 @@ cc_dma_buf_type(areq_ctx->assoc_buff_type), areq_ctx->assoc.nents); cc_add_sg_entry(dev, sg_data, areq_ctx->assoc.nents, req->src, - req->assoclen, 0, is_last, + areq_ctx->assoclen, 0, is_last, &areq_ctx->assoc.mlli_nents); areq_ctx->assoc_buff_type = CC_DMA_BUF_MLLI; } @@ -975,11 +972,11 @@ u32 src_mapped_nents = 0, dst_mapped_nents = 0; u32 offset = 0; /* non-inplace mode */ - unsigned int size_for_map = req->assoclen + req->cryptlen; + unsigned int size_for_map = areq_ctx->assoclen + req->cryptlen; struct crypto_aead *tfm = crypto_aead_reqtfm(req); u32 sg_index = 0; bool is_gcm4543 = areq_ctx->is_gcm4543; - u32 size_to_skip = req->assoclen; + u32 size_to_skip = areq_ctx->assoclen; if (is_gcm4543) size_to_skip += crypto_aead_ivsize(tfm); @@ -1023,9 +1020,13 @@ areq_ctx->src_offset = offset; if (req->src != req->dst) { - size_for_map = req->assoclen + req->cryptlen; - size_for_map += (direct == DRV_CRYPTO_DIRECTION_ENCRYPT) ? - authsize : 0; + size_for_map = areq_ctx->assoclen + req->cryptlen; + + if (direct == DRV_CRYPTO_DIRECTION_ENCRYPT) + size_for_map += authsize; + else + size_for_map -= authsize; + if (is_gcm4543) size_for_map += crypto_aead_ivsize(tfm); @@ -1033,10 +1034,8 @@ &areq_ctx->dst.nents, LLI_MAX_NUM_OF_DATA_ENTRIES, &dst_last_bytes, &dst_mapped_nents); - if (rc) { - rc = -ENOMEM; + if (rc) goto chain_data_exit; - } } dst_mapped_nents = cc_get_sgl_nents(dev, req->dst, size_for_map, @@ -1190,11 +1189,10 @@ } areq_ctx->ccm_iv0_dma_addr = dma_addr; - if (cc_set_aead_conf_buf(dev, areq_ctx, areq_ctx->ccm_config, - &sg_data, req->assoclen)) { - rc = -ENOMEM; + rc = cc_set_aead_conf_buf(dev, areq_ctx, areq_ctx->ccm_config, + &sg_data, areq_ctx->assoclen); + if (rc) goto aead_map_failure; - } } if (areq_ctx->cipher_mode == DRV_CIPHER_GCTR) { @@ -1243,10 +1241,12 @@ areq_ctx->gcm_iv_inc2_dma_addr = dma_addr; } - size_to_map = req->cryptlen + req->assoclen; - if (areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_ENCRYPT) + size_to_map = req->cryptlen + areq_ctx->assoclen; + /* If we do in-place encryption, we also need the auth tag */ + if ((areq_ctx->gen_ctx.op_type == DRV_CRYPTO_DIRECTION_ENCRYPT) && + (req->src == req->dst)) { size_to_map += authsize; - + } if (is_gcm4543) size_to_map += crypto_aead_ivsize(tfm); rc = cc_map_sg(dev, req->src, size_to_map, DMA_BIDIRECTIONAL, @@ -1254,10 +1254,8 @@ (LLI_MAX_NUM_OF_ASSOC_DATA_ENTRIES + LLI_MAX_NUM_OF_DATA_ENTRIES), &dummy, &mapped_nents); - if (rc) { - rc = -ENOMEM; + if (rc) goto aead_map_failure; - } if (areq_ctx->is_single_pass) { /* @@ -1341,6 +1339,7 @@ struct mlli_params *mlli_params = &areq_ctx->mlli_params; struct buffer_array sg_data; struct buff_mgr_handle *buff_mgr = drvdata->buff_mgr_handle; + int rc = 0; u32 dummy = 0; u32 mapped_nents = 0; @@ -1360,18 +1359,18 @@ /*TODO: copy data in case that buffer is enough for operation */ /* map the previous buffer */ if (*curr_buff_cnt) { - if (cc_set_hash_buf(dev, areq_ctx, curr_buff, *curr_buff_cnt, - &sg_data)) { - return -ENOMEM; - } + rc = cc_set_hash_buf(dev, areq_ctx, curr_buff, *curr_buff_cnt, + &sg_data); + if (rc) + return rc; } if (src && nbytes > 0 && do_update) { - if (cc_map_sg(dev, src, nbytes, DMA_TO_DEVICE, - &areq_ctx->in_nents, LLI_MAX_NUM_OF_DATA_ENTRIES, - &dummy, &mapped_nents)) { + rc = cc_map_sg(dev, src, nbytes, DMA_TO_DEVICE, + &areq_ctx->in_nents, LLI_MAX_NUM_OF_DATA_ENTRIES, + &dummy, &mapped_nents); + if (rc) goto unmap_curr_buff; - } if (src && mapped_nents == 1 && areq_ctx->data_dma_buf_type == CC_DMA_BUF_NULL) { memcpy(areq_ctx->buff_sg, src, @@ -1390,7 +1389,8 @@ /* add the src data to the sg_data */ cc_add_sg_entry(dev, &sg_data, areq_ctx->in_nents, src, nbytes, 0, true, &areq_ctx->mlli_nents); - if (cc_generate_mlli(dev, &sg_data, mlli_params, flags)) + rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags); + if (rc) goto fail_unmap_din; } /* change the buffer index for the unmap function */ @@ -1406,7 +1406,7 @@ if (*curr_buff_cnt) dma_unmap_sg(dev, areq_ctx->buff_sg, 1, DMA_TO_DEVICE); - return -ENOMEM; + return rc; } int cc_map_hash_request_update(struct cc_drvdata *drvdata, void *ctx, @@ -1425,6 +1425,7 @@ struct buffer_array sg_data; struct buff_mgr_handle *buff_mgr = drvdata->buff_mgr_handle; unsigned int swap_index = 0; + int rc = 0; u32 dummy = 0; u32 mapped_nents = 0; @@ -1469,21 +1470,21 @@ } if (*curr_buff_cnt) { - if (cc_set_hash_buf(dev, areq_ctx, curr_buff, *curr_buff_cnt, - &sg_data)) { - return -ENOMEM; - } + rc = cc_set_hash_buf(dev, areq_ctx, curr_buff, *curr_buff_cnt, + &sg_data); + if (rc) + return rc; /* change the buffer index for next operation */ swap_index = 1; } if (update_data_len > *curr_buff_cnt) { - if (cc_map_sg(dev, src, (update_data_len - *curr_buff_cnt), - DMA_TO_DEVICE, &areq_ctx->in_nents, - LLI_MAX_NUM_OF_DATA_ENTRIES, &dummy, - &mapped_nents)) { + rc = cc_map_sg(dev, src, (update_data_len - *curr_buff_cnt), + DMA_TO_DEVICE, &areq_ctx->in_nents, + LLI_MAX_NUM_OF_DATA_ENTRIES, &dummy, + &mapped_nents); + if (rc) goto unmap_curr_buff; - } if (mapped_nents == 1 && areq_ctx->data_dma_buf_type == CC_DMA_BUF_NULL) { /* only one entry in the SG and no previous data */ @@ -1503,7 +1504,8 @@ cc_add_sg_entry(dev, &sg_data, areq_ctx->in_nents, src, (update_data_len - *curr_buff_cnt), 0, true, &areq_ctx->mlli_nents); - if (cc_generate_mlli(dev, &sg_data, mlli_params, flags)) + rc = cc_generate_mlli(dev, &sg_data, mlli_params, flags); + if (rc) goto fail_unmap_din; } areq_ctx->buff_index = (areq_ctx->buff_index ^ swap_index); @@ -1517,7 +1519,7 @@ if (*curr_buff_cnt) dma_unmap_sg(dev, areq_ctx->buff_sg, 1, DMA_TO_DEVICE); - return -ENOMEM; + return rc; } void cc_unmap_hash_request(struct device *dev, void *ctx, diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_cipher.c linux-4.19.118/drivers/crypto/ccree/cc_cipher.c --- linux-4.19.98/drivers/crypto/ccree/cc_cipher.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_cipher.c 2020-04-23 08:30:24.000000000 +0000 @@ -306,7 +306,6 @@ struct crypto_tfm *tfm = crypto_skcipher_tfm(sktfm); struct cc_cipher_ctx *ctx_p = crypto_tfm_ctx(tfm); struct device *dev = drvdata_to_dev(ctx_p->drvdata); - u32 tmp[DES3_EDE_EXPKEY_WORDS]; struct cc_crypto_alg *cc_alg = container_of(tfm->__crt_alg, struct cc_crypto_alg, skcipher_alg.base); @@ -332,6 +331,7 @@ * HW does the expansion on its own. */ if (ctx_p->flow_mode == S_DIN_to_DES) { + u32 tmp[DES3_EDE_EXPKEY_WORDS]; if (keylen == DES3_EDE_KEY_SIZE && __des3_ede_setkey(tmp, &tfm->crt_flags, key, DES3_EDE_KEY_SIZE)) { diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_driver.h linux-4.19.118/drivers/crypto/ccree/cc_driver.h --- linux-4.19.98/drivers/crypto/ccree/cc_driver.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_driver.h 2020-04-23 08:30:24.000000000 +0000 @@ -131,6 +131,7 @@ u32 axim_mon_offset; u32 sig_offset; u32 ver_offset; + bool pm_on; }; struct cc_crypto_alg { diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_pm.c linux-4.19.118/drivers/crypto/ccree/cc_pm.c --- linux-4.19.98/drivers/crypto/ccree/cc_pm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_pm.c 2020-04-23 08:30:24.000000000 +0000 @@ -23,14 +23,8 @@ int cc_pm_suspend(struct device *dev) { struct cc_drvdata *drvdata = dev_get_drvdata(dev); - int rc; dev_dbg(dev, "set HOST_POWER_DOWN_EN\n"); - rc = cc_suspend_req_queue(drvdata); - if (rc) { - dev_err(dev, "cc_suspend_req_queue (%x)\n", rc); - return rc; - } fini_cc_regs(drvdata); cc_iowrite(drvdata, CC_REG(HOST_POWER_DOWN_EN), POWER_DOWN_ENABLE); cc_clk_off(drvdata); @@ -59,13 +53,6 @@ /* check if tee fips error occurred during power down */ cc_tee_handle_fips_error(drvdata); - rc = cc_resume_req_queue(drvdata); - if (rc) { - dev_err(dev, "cc_resume_req_queue (%x)\n", rc); - return rc; - } - - /* must be after the queue resuming as it uses the HW queue*/ cc_init_hash_sram(drvdata); cc_init_iv_sram(drvdata); @@ -77,12 +64,10 @@ int rc = 0; struct cc_drvdata *drvdata = dev_get_drvdata(dev); - if (cc_req_queue_suspended(drvdata)) + if (drvdata->pm_on) rc = pm_runtime_get_sync(dev); - else - pm_runtime_get_noresume(dev); - return rc; + return (rc == 1 ? 0 : rc); } int cc_pm_put_suspend(struct device *dev) @@ -90,14 +75,11 @@ int rc = 0; struct cc_drvdata *drvdata = dev_get_drvdata(dev); - if (!cc_req_queue_suspended(drvdata)) { + if (drvdata->pm_on) { pm_runtime_mark_last_busy(dev); rc = pm_runtime_put_autosuspend(dev); - } else { - /* Something wrong happens*/ - dev_err(dev, "request to suspend already suspended queue"); - rc = -EBUSY; } + return rc; } @@ -108,7 +90,7 @@ /* must be before the enabling to avoid resdundent suspending */ pm_runtime_set_autosuspend_delay(dev, CC_SUSPEND_TIMEOUT); pm_runtime_use_autosuspend(dev); - /* activate the PM module */ + /* set us as active - note we won't do PM ops until cc_pm_go()! */ return pm_runtime_set_active(dev); } @@ -116,9 +98,11 @@ void cc_pm_go(struct cc_drvdata *drvdata) { pm_runtime_enable(drvdata_to_dev(drvdata)); + drvdata->pm_on = true; } void cc_pm_fini(struct cc_drvdata *drvdata) { pm_runtime_disable(drvdata_to_dev(drvdata)); + drvdata->pm_on = false; } diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_request_mgr.c linux-4.19.118/drivers/crypto/ccree/cc_request_mgr.c --- linux-4.19.98/drivers/crypto/ccree/cc_request_mgr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_request_mgr.c 2020-04-23 08:30:24.000000000 +0000 @@ -41,7 +41,6 @@ #else struct tasklet_struct comptask; #endif - bool is_runtime_suspended; }; struct cc_bl_item { @@ -403,6 +402,7 @@ spin_lock(&mgr->bl_lock); list_del(&bli->list); --mgr->bl_len; + kfree(bli); } spin_unlock(&mgr->bl_lock); @@ -660,52 +660,3 @@ cc_proc_backlog(drvdata); } - -/* - * resume the queue configuration - no need to take the lock as this happens - * inside the spin lock protection - */ -#if defined(CONFIG_PM) -int cc_resume_req_queue(struct cc_drvdata *drvdata) -{ - struct cc_req_mgr_handle *request_mgr_handle = - drvdata->request_mgr_handle; - - spin_lock_bh(&request_mgr_handle->hw_lock); - request_mgr_handle->is_runtime_suspended = false; - spin_unlock_bh(&request_mgr_handle->hw_lock); - - return 0; -} - -/* - * suspend the queue configuration. Since it is used for the runtime suspend - * only verify that the queue can be suspended. - */ -int cc_suspend_req_queue(struct cc_drvdata *drvdata) -{ - struct cc_req_mgr_handle *request_mgr_handle = - drvdata->request_mgr_handle; - - /* lock the send_request */ - spin_lock_bh(&request_mgr_handle->hw_lock); - if (request_mgr_handle->req_queue_head != - request_mgr_handle->req_queue_tail) { - spin_unlock_bh(&request_mgr_handle->hw_lock); - return -EBUSY; - } - request_mgr_handle->is_runtime_suspended = true; - spin_unlock_bh(&request_mgr_handle->hw_lock); - - return 0; -} - -bool cc_req_queue_suspended(struct cc_drvdata *drvdata) -{ - struct cc_req_mgr_handle *request_mgr_handle = - drvdata->request_mgr_handle; - - return request_mgr_handle->is_runtime_suspended; -} - -#endif diff -Nru linux-4.19.98/drivers/crypto/ccree/cc_request_mgr.h linux-4.19.118/drivers/crypto/ccree/cc_request_mgr.h --- linux-4.19.98/drivers/crypto/ccree/cc_request_mgr.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/ccree/cc_request_mgr.h 2020-04-23 08:30:24.000000000 +0000 @@ -40,12 +40,4 @@ void cc_req_mgr_fini(struct cc_drvdata *drvdata); -#if defined(CONFIG_PM) -int cc_resume_req_queue(struct cc_drvdata *drvdata); - -int cc_suspend_req_queue(struct cc_drvdata *drvdata); - -bool cc_req_queue_suspended(struct cc_drvdata *drvdata); -#endif - #endif /*__REQUEST_MGR_H__*/ diff -Nru linux-4.19.98/drivers/crypto/chelsio/chcr_algo.c linux-4.19.118/drivers/crypto/chelsio/chcr_algo.c --- linux-4.19.98/drivers/crypto/chelsio/chcr_algo.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/chelsio/chcr_algo.c 2020-04-23 08:30:24.000000000 +0000 @@ -3135,9 +3135,6 @@ aeadctx->mayverify = VERIFY_SW; break; default: - - crypto_tfm_set_flags((struct crypto_tfm *) tfm, - CRYPTO_TFM_RES_BAD_KEY_LEN); return -EINVAL; } return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); @@ -3162,8 +3159,6 @@ aeadctx->mayverify = VERIFY_HW; break; default: - crypto_tfm_set_flags((struct crypto_tfm *)tfm, - CRYPTO_TFM_RES_BAD_KEY_LEN); return -EINVAL; } return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); @@ -3204,8 +3199,6 @@ aeadctx->mayverify = VERIFY_HW; break; default: - crypto_tfm_set_flags((struct crypto_tfm *)tfm, - CRYPTO_TFM_RES_BAD_KEY_LEN); return -EINVAL; } return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize); @@ -3230,8 +3223,7 @@ ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256; } else { - crypto_tfm_set_flags((struct crypto_tfm *)aead, - CRYPTO_TFM_RES_BAD_KEY_LEN); + crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); aeadctx->enckey_len = 0; return -EINVAL; } @@ -3269,8 +3261,7 @@ int error; if (keylen < 3) { - crypto_tfm_set_flags((struct crypto_tfm *)aead, - CRYPTO_TFM_RES_BAD_KEY_LEN); + crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); aeadctx->enckey_len = 0; return -EINVAL; } @@ -3320,8 +3311,7 @@ } else if (keylen == AES_KEYSIZE_256) { ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256; } else { - crypto_tfm_set_flags((struct crypto_tfm *)aead, - CRYPTO_TFM_RES_BAD_KEY_LEN); + crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); pr_err("GCM: Invalid key length %d\n", keylen); ret = -EINVAL; goto out; diff -Nru linux-4.19.98/drivers/crypto/chelsio/chtls/chtls_cm.c linux-4.19.118/drivers/crypto/chelsio/chtls/chtls_cm.c --- linux-4.19.98/drivers/crypto/chelsio/chtls/chtls_cm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/chelsio/chtls/chtls_cm.c 2020-04-23 08:30:24.000000000 +0000 @@ -731,6 +731,14 @@ return 0; } +static void chtls_purge_wr_queue(struct sock *sk) +{ + struct sk_buff *skb; + + while ((skb = dequeue_wr(sk)) != NULL) + kfree_skb(skb); +} + static void chtls_release_resources(struct sock *sk) { struct chtls_sock *csk = rcu_dereference_sk_user_data(sk); @@ -745,6 +753,11 @@ kfree_skb(csk->txdata_skb_cache); csk->txdata_skb_cache = NULL; + if (csk->wr_credits != csk->wr_max_credits) { + chtls_purge_wr_queue(sk); + chtls_reset_wr_list(csk); + } + if (csk->l2t_entry) { cxgb4_l2t_release(csk->l2t_entry); csk->l2t_entry = NULL; @@ -1714,6 +1727,7 @@ else sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); } + kfree_skb(skb); } static void chtls_close_con_rpl(struct sock *sk, struct sk_buff *skb) @@ -2041,19 +2055,6 @@ return 0; } -static struct sk_buff *dequeue_wr(struct sock *sk) -{ - struct chtls_sock *csk = rcu_dereference_sk_user_data(sk); - struct sk_buff *skb = csk->wr_skb_head; - - if (likely(skb)) { - /* Don't bother clearing the tail */ - csk->wr_skb_head = WR_SKB_CB(skb)->next_wr; - WR_SKB_CB(skb)->next_wr = NULL; - } - return skb; -} - static void chtls_rx_ack(struct sock *sk, struct sk_buff *skb) { struct cpl_fw4_ack *hdr = cplhdr(skb) + RSS_HDR; diff -Nru linux-4.19.98/drivers/crypto/chelsio/chtls/chtls_cm.h linux-4.19.118/drivers/crypto/chelsio/chtls/chtls_cm.h --- linux-4.19.98/drivers/crypto/chelsio/chtls/chtls_cm.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/chelsio/chtls/chtls_cm.h 2020-04-23 08:30:24.000000000 +0000 @@ -188,6 +188,12 @@ kfree_skb(skb); } +static inline void chtls_reset_wr_list(struct chtls_sock *csk) +{ + csk->wr_skb_head = NULL; + csk->wr_skb_tail = NULL; +} + static inline void enqueue_wr(struct chtls_sock *csk, struct sk_buff *skb) { WR_SKB_CB(skb)->next_wr = NULL; @@ -200,4 +206,19 @@ WR_SKB_CB(csk->wr_skb_tail)->next_wr = skb; csk->wr_skb_tail = skb; } + +static inline struct sk_buff *dequeue_wr(struct sock *sk) +{ + struct chtls_sock *csk = rcu_dereference_sk_user_data(sk); + struct sk_buff *skb = NULL; + + skb = csk->wr_skb_head; + + if (likely(skb)) { + /* Don't bother clearing the tail */ + csk->wr_skb_head = WR_SKB_CB(skb)->next_wr; + WR_SKB_CB(skb)->next_wr = NULL; + } + return skb; +} #endif diff -Nru linux-4.19.98/drivers/crypto/chelsio/chtls/chtls_hw.c linux-4.19.118/drivers/crypto/chelsio/chtls/chtls_hw.c --- linux-4.19.98/drivers/crypto/chelsio/chtls/chtls_hw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/chelsio/chtls/chtls_hw.c 2020-04-23 08:30:24.000000000 +0000 @@ -361,6 +361,7 @@ kwr->sc_imm.cmd_more = cpu_to_be32(ULPTX_CMD_V(ULP_TX_SC_IMM)); kwr->sc_imm.len = cpu_to_be32(klen); + lock_sock(sk); /* key info */ kctx = (struct _key_ctx *)(kwr + 1); ret = chtls_key_info(csk, kctx, keylen, optname); @@ -399,8 +400,10 @@ csk->tlshws.txkey = keyid; } + release_sock(sk); return ret; out_notcb: + release_sock(sk); free_tls_keyid(sk); out_nokey: kfree_skb(skb); diff -Nru linux-4.19.98/drivers/crypto/geode-aes.c linux-4.19.118/drivers/crypto/geode-aes.c --- linux-4.19.98/drivers/crypto/geode-aes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/geode-aes.c 2020-04-23 08:30:24.000000000 +0000 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -27,12 +28,12 @@ /* Write a 128 bit field (either a writable key or IV) */ static inline void -_writefield(u32 offset, void *value) +_writefield(u32 offset, const void *value) { int i; for (i = 0; i < 4; i++) - iowrite32(((u32 *) value)[i], _iobase + offset + (i * 4)); + iowrite32(((const u32 *) value)[i], _iobase + offset + (i * 4)); } /* Read a 128 bit field (either a writable key or IV) */ @@ -46,12 +47,12 @@ } static int -do_crypt(void *src, void *dst, int len, u32 flags) +do_crypt(const void *src, void *dst, u32 len, u32 flags) { u32 status; u32 counter = AES_OP_TIMEOUT; - iowrite32(virt_to_phys(src), _iobase + AES_SOURCEA_REG); + iowrite32(virt_to_phys((void *)src), _iobase + AES_SOURCEA_REG); iowrite32(virt_to_phys(dst), _iobase + AES_DSTA_REG); iowrite32(len, _iobase + AES_LENA_REG); @@ -68,16 +69,14 @@ return counter ? 0 : 1; } -static unsigned int -geode_aes_crypt(struct geode_aes_op *op) +static void +geode_aes_crypt(const struct geode_aes_tfm_ctx *tctx, const void *src, + void *dst, u32 len, u8 *iv, int mode, int dir) { u32 flags = 0; unsigned long iflags; int ret; - if (op->len == 0) - return 0; - /* If the source and destination is the same, then * we need to turn on the coherent flags, otherwise * we don't need to worry @@ -85,32 +84,28 @@ flags |= (AES_CTRL_DCA | AES_CTRL_SCA); - if (op->dir == AES_DIR_ENCRYPT) + if (dir == AES_DIR_ENCRYPT) flags |= AES_CTRL_ENCRYPT; /* Start the critical section */ spin_lock_irqsave(&lock, iflags); - if (op->mode == AES_MODE_CBC) { + if (mode == AES_MODE_CBC) { flags |= AES_CTRL_CBC; - _writefield(AES_WRITEIV0_REG, op->iv); + _writefield(AES_WRITEIV0_REG, iv); } - if (!(op->flags & AES_FLAGS_HIDDENKEY)) { - flags |= AES_CTRL_WRKEY; - _writefield(AES_WRITEKEY0_REG, op->key); - } + flags |= AES_CTRL_WRKEY; + _writefield(AES_WRITEKEY0_REG, tctx->key); - ret = do_crypt(op->src, op->dst, op->len, flags); + ret = do_crypt(src, dst, len, flags); BUG_ON(ret); - if (op->mode == AES_MODE_CBC) - _readfield(AES_WRITEIV0_REG, op->iv); + if (mode == AES_MODE_CBC) + _readfield(AES_WRITEIV0_REG, iv); spin_unlock_irqrestore(&lock, iflags); - - return op->len; } /* CRYPTO-API Functions */ @@ -118,13 +113,13 @@ static int geode_setkey_cip(struct crypto_tfm *tfm, const u8 *key, unsigned int len) { - struct geode_aes_op *op = crypto_tfm_ctx(tfm); + struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); unsigned int ret; - op->keylen = len; + tctx->keylen = len; if (len == AES_KEYSIZE_128) { - memcpy(op->key, key, len); + memcpy(tctx->key, key, len); return 0; } @@ -137,135 +132,93 @@ /* * The requested key size is not supported by HW, do a fallback */ - op->fallback.cip->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; - op->fallback.cip->base.crt_flags |= (tfm->crt_flags & CRYPTO_TFM_REQ_MASK); + tctx->fallback.cip->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; + tctx->fallback.cip->base.crt_flags |= + (tfm->crt_flags & CRYPTO_TFM_REQ_MASK); - ret = crypto_cipher_setkey(op->fallback.cip, key, len); + ret = crypto_cipher_setkey(tctx->fallback.cip, key, len); if (ret) { tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; - tfm->crt_flags |= (op->fallback.cip->base.crt_flags & CRYPTO_TFM_RES_MASK); + tfm->crt_flags |= (tctx->fallback.cip->base.crt_flags & + CRYPTO_TFM_RES_MASK); } return ret; } -static int geode_setkey_blk(struct crypto_tfm *tfm, const u8 *key, - unsigned int len) +static int geode_setkey_skcipher(struct crypto_skcipher *tfm, const u8 *key, + unsigned int len) { - struct geode_aes_op *op = crypto_tfm_ctx(tfm); + struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); unsigned int ret; - op->keylen = len; + tctx->keylen = len; if (len == AES_KEYSIZE_128) { - memcpy(op->key, key, len); + memcpy(tctx->key, key, len); return 0; } if (len != AES_KEYSIZE_192 && len != AES_KEYSIZE_256) { /* not supported at all */ - tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; + crypto_skcipher_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); return -EINVAL; } /* * The requested key size is not supported by HW, do a fallback */ - op->fallback.blk->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK; - op->fallback.blk->base.crt_flags |= (tfm->crt_flags & CRYPTO_TFM_REQ_MASK); - - ret = crypto_blkcipher_setkey(op->fallback.blk, key, len); - if (ret) { - tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK; - tfm->crt_flags |= (op->fallback.blk->base.crt_flags & CRYPTO_TFM_RES_MASK); - } - return ret; -} - -static int fallback_blk_dec(struct blkcipher_desc *desc, - struct scatterlist *dst, struct scatterlist *src, - unsigned int nbytes) -{ - unsigned int ret; - struct crypto_blkcipher *tfm; - struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); - - tfm = desc->tfm; - desc->tfm = op->fallback.blk; - - ret = crypto_blkcipher_decrypt_iv(desc, dst, src, nbytes); - - desc->tfm = tfm; - return ret; -} -static int fallback_blk_enc(struct blkcipher_desc *desc, - struct scatterlist *dst, struct scatterlist *src, - unsigned int nbytes) -{ - unsigned int ret; - struct crypto_blkcipher *tfm; - struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); - - tfm = desc->tfm; - desc->tfm = op->fallback.blk; - - ret = crypto_blkcipher_encrypt_iv(desc, dst, src, nbytes); - - desc->tfm = tfm; + crypto_skcipher_clear_flags(tctx->fallback.skcipher, + CRYPTO_TFM_REQ_MASK); + crypto_skcipher_set_flags(tctx->fallback.skcipher, + crypto_skcipher_get_flags(tfm) & + CRYPTO_TFM_REQ_MASK); + ret = crypto_skcipher_setkey(tctx->fallback.skcipher, key, len); + crypto_skcipher_set_flags(tfm, + crypto_skcipher_get_flags(tctx->fallback.skcipher) & + CRYPTO_TFM_RES_MASK); return ret; } static void geode_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) { - struct geode_aes_op *op = crypto_tfm_ctx(tfm); + const struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - if (unlikely(op->keylen != AES_KEYSIZE_128)) { - crypto_cipher_encrypt_one(op->fallback.cip, out, in); + if (unlikely(tctx->keylen != AES_KEYSIZE_128)) { + crypto_cipher_encrypt_one(tctx->fallback.cip, out, in); return; } - op->src = (void *) in; - op->dst = (void *) out; - op->mode = AES_MODE_ECB; - op->flags = 0; - op->len = AES_BLOCK_SIZE; - op->dir = AES_DIR_ENCRYPT; - - geode_aes_crypt(op); + geode_aes_crypt(tctx, in, out, AES_BLOCK_SIZE, NULL, + AES_MODE_ECB, AES_DIR_ENCRYPT); } static void geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) { - struct geode_aes_op *op = crypto_tfm_ctx(tfm); + const struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - if (unlikely(op->keylen != AES_KEYSIZE_128)) { - crypto_cipher_decrypt_one(op->fallback.cip, out, in); + if (unlikely(tctx->keylen != AES_KEYSIZE_128)) { + crypto_cipher_decrypt_one(tctx->fallback.cip, out, in); return; } - op->src = (void *) in; - op->dst = (void *) out; - op->mode = AES_MODE_ECB; - op->flags = 0; - op->len = AES_BLOCK_SIZE; - op->dir = AES_DIR_DECRYPT; - - geode_aes_crypt(op); + geode_aes_crypt(tctx, in, out, AES_BLOCK_SIZE, NULL, + AES_MODE_ECB, AES_DIR_DECRYPT); } static int fallback_init_cip(struct crypto_tfm *tfm) { const char *name = crypto_tfm_alg_name(tfm); - struct geode_aes_op *op = crypto_tfm_ctx(tfm); + struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - op->fallback.cip = crypto_alloc_cipher(name, 0, - CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK); + tctx->fallback.cip = crypto_alloc_cipher(name, 0, + CRYPTO_ALG_NEED_FALLBACK); - if (IS_ERR(op->fallback.cip)) { + if (IS_ERR(tctx->fallback.cip)) { printk(KERN_ERR "Error allocating fallback algo %s\n", name); - return PTR_ERR(op->fallback.cip); + return PTR_ERR(tctx->fallback.cip); } return 0; @@ -273,10 +226,9 @@ static void fallback_exit_cip(struct crypto_tfm *tfm) { - struct geode_aes_op *op = crypto_tfm_ctx(tfm); + struct geode_aes_tfm_ctx *tctx = crypto_tfm_ctx(tfm); - crypto_free_cipher(op->fallback.cip); - op->fallback.cip = NULL; + crypto_free_cipher(tctx->fallback.cip); } static struct crypto_alg geode_alg = { @@ -289,7 +241,7 @@ .cra_init = fallback_init_cip, .cra_exit = fallback_exit_cip, .cra_blocksize = AES_BLOCK_SIZE, - .cra_ctxsize = sizeof(struct geode_aes_op), + .cra_ctxsize = sizeof(struct geode_aes_tfm_ctx), .cra_module = THIS_MODULE, .cra_u = { .cipher = { @@ -302,209 +254,126 @@ } }; -static int -geode_cbc_decrypt(struct blkcipher_desc *desc, - struct scatterlist *dst, struct scatterlist *src, - unsigned int nbytes) -{ - struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); - struct blkcipher_walk walk; - int err, ret; - - if (unlikely(op->keylen != AES_KEYSIZE_128)) - return fallback_blk_dec(desc, dst, src, nbytes); - - blkcipher_walk_init(&walk, dst, src, nbytes); - err = blkcipher_walk_virt(desc, &walk); - op->iv = walk.iv; - - while ((nbytes = walk.nbytes)) { - op->src = walk.src.virt.addr, - op->dst = walk.dst.virt.addr; - op->mode = AES_MODE_CBC; - op->len = nbytes - (nbytes % AES_BLOCK_SIZE); - op->dir = AES_DIR_DECRYPT; - - ret = geode_aes_crypt(op); - - nbytes -= ret; - err = blkcipher_walk_done(desc, &walk, nbytes); - } - - return err; -} - -static int -geode_cbc_encrypt(struct blkcipher_desc *desc, - struct scatterlist *dst, struct scatterlist *src, - unsigned int nbytes) -{ - struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); - struct blkcipher_walk walk; - int err, ret; - - if (unlikely(op->keylen != AES_KEYSIZE_128)) - return fallback_blk_enc(desc, dst, src, nbytes); - - blkcipher_walk_init(&walk, dst, src, nbytes); - err = blkcipher_walk_virt(desc, &walk); - op->iv = walk.iv; - - while ((nbytes = walk.nbytes)) { - op->src = walk.src.virt.addr, - op->dst = walk.dst.virt.addr; - op->mode = AES_MODE_CBC; - op->len = nbytes - (nbytes % AES_BLOCK_SIZE); - op->dir = AES_DIR_ENCRYPT; - - ret = geode_aes_crypt(op); - nbytes -= ret; - err = blkcipher_walk_done(desc, &walk, nbytes); - } - - return err; -} - -static int fallback_init_blk(struct crypto_tfm *tfm) +static int geode_init_skcipher(struct crypto_skcipher *tfm) { - const char *name = crypto_tfm_alg_name(tfm); - struct geode_aes_op *op = crypto_tfm_ctx(tfm); - - op->fallback.blk = crypto_alloc_blkcipher(name, 0, - CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK); + const char *name = crypto_tfm_alg_name(&tfm->base); + struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); - if (IS_ERR(op->fallback.blk)) { + tctx->fallback.skcipher = + crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK | + CRYPTO_ALG_ASYNC); + if (IS_ERR(tctx->fallback.skcipher)) { printk(KERN_ERR "Error allocating fallback algo %s\n", name); - return PTR_ERR(op->fallback.blk); + return PTR_ERR(tctx->fallback.skcipher); } + crypto_skcipher_set_reqsize(tfm, sizeof(struct skcipher_request) + + crypto_skcipher_reqsize(tctx->fallback.skcipher)); return 0; } -static void fallback_exit_blk(struct crypto_tfm *tfm) +static void geode_exit_skcipher(struct crypto_skcipher *tfm) { - struct geode_aes_op *op = crypto_tfm_ctx(tfm); + struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); - crypto_free_blkcipher(op->fallback.blk); - op->fallback.blk = NULL; + crypto_free_skcipher(tctx->fallback.skcipher); } -static struct crypto_alg geode_cbc_alg = { - .cra_name = "cbc(aes)", - .cra_driver_name = "cbc-aes-geode", - .cra_priority = 400, - .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_ALG_NEED_FALLBACK, - .cra_init = fallback_init_blk, - .cra_exit = fallback_exit_blk, - .cra_blocksize = AES_BLOCK_SIZE, - .cra_ctxsize = sizeof(struct geode_aes_op), - .cra_alignmask = 15, - .cra_type = &crypto_blkcipher_type, - .cra_module = THIS_MODULE, - .cra_u = { - .blkcipher = { - .min_keysize = AES_MIN_KEY_SIZE, - .max_keysize = AES_MAX_KEY_SIZE, - .setkey = geode_setkey_blk, - .encrypt = geode_cbc_encrypt, - .decrypt = geode_cbc_decrypt, - .ivsize = AES_BLOCK_SIZE, - } +static int geode_skcipher_crypt(struct skcipher_request *req, int mode, int dir) +{ + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + const struct geode_aes_tfm_ctx *tctx = crypto_skcipher_ctx(tfm); + struct skcipher_walk walk; + unsigned int nbytes; + int err; + + if (unlikely(tctx->keylen != AES_KEYSIZE_128)) { + struct skcipher_request *subreq = skcipher_request_ctx(req); + + *subreq = *req; + skcipher_request_set_tfm(subreq, tctx->fallback.skcipher); + if (dir == AES_DIR_DECRYPT) + return crypto_skcipher_decrypt(subreq); + else + return crypto_skcipher_encrypt(subreq); } -}; -static int -geode_ecb_decrypt(struct blkcipher_desc *desc, - struct scatterlist *dst, struct scatterlist *src, - unsigned int nbytes) -{ - struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); - struct blkcipher_walk walk; - int err, ret; - - if (unlikely(op->keylen != AES_KEYSIZE_128)) - return fallback_blk_dec(desc, dst, src, nbytes); - - blkcipher_walk_init(&walk, dst, src, nbytes); - err = blkcipher_walk_virt(desc, &walk); - - while ((nbytes = walk.nbytes)) { - op->src = walk.src.virt.addr, - op->dst = walk.dst.virt.addr; - op->mode = AES_MODE_ECB; - op->len = nbytes - (nbytes % AES_BLOCK_SIZE); - op->dir = AES_DIR_DECRYPT; - - ret = geode_aes_crypt(op); - nbytes -= ret; - err = blkcipher_walk_done(desc, &walk, nbytes); + err = skcipher_walk_virt(&walk, req, false); + + while ((nbytes = walk.nbytes) != 0) { + geode_aes_crypt(tctx, walk.src.virt.addr, walk.dst.virt.addr, + round_down(nbytes, AES_BLOCK_SIZE), + walk.iv, mode, dir); + err = skcipher_walk_done(&walk, nbytes % AES_BLOCK_SIZE); } return err; } -static int -geode_ecb_encrypt(struct blkcipher_desc *desc, - struct scatterlist *dst, struct scatterlist *src, - unsigned int nbytes) -{ - struct geode_aes_op *op = crypto_blkcipher_ctx(desc->tfm); - struct blkcipher_walk walk; - int err, ret; - - if (unlikely(op->keylen != AES_KEYSIZE_128)) - return fallback_blk_enc(desc, dst, src, nbytes); - - blkcipher_walk_init(&walk, dst, src, nbytes); - err = blkcipher_walk_virt(desc, &walk); - - while ((nbytes = walk.nbytes)) { - op->src = walk.src.virt.addr, - op->dst = walk.dst.virt.addr; - op->mode = AES_MODE_ECB; - op->len = nbytes - (nbytes % AES_BLOCK_SIZE); - op->dir = AES_DIR_ENCRYPT; - - ret = geode_aes_crypt(op); - nbytes -= ret; - ret = blkcipher_walk_done(desc, &walk, nbytes); - } +static int geode_cbc_encrypt(struct skcipher_request *req) +{ + return geode_skcipher_crypt(req, AES_MODE_CBC, AES_DIR_ENCRYPT); +} - return err; +static int geode_cbc_decrypt(struct skcipher_request *req) +{ + return geode_skcipher_crypt(req, AES_MODE_CBC, AES_DIR_DECRYPT); } -static struct crypto_alg geode_ecb_alg = { - .cra_name = "ecb(aes)", - .cra_driver_name = "ecb-aes-geode", - .cra_priority = 400, - .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER | - CRYPTO_ALG_KERN_DRIVER_ONLY | - CRYPTO_ALG_NEED_FALLBACK, - .cra_init = fallback_init_blk, - .cra_exit = fallback_exit_blk, - .cra_blocksize = AES_BLOCK_SIZE, - .cra_ctxsize = sizeof(struct geode_aes_op), - .cra_alignmask = 15, - .cra_type = &crypto_blkcipher_type, - .cra_module = THIS_MODULE, - .cra_u = { - .blkcipher = { - .min_keysize = AES_MIN_KEY_SIZE, - .max_keysize = AES_MAX_KEY_SIZE, - .setkey = geode_setkey_blk, - .encrypt = geode_ecb_encrypt, - .decrypt = geode_ecb_decrypt, - } - } +static int geode_ecb_encrypt(struct skcipher_request *req) +{ + return geode_skcipher_crypt(req, AES_MODE_ECB, AES_DIR_ENCRYPT); +} + +static int geode_ecb_decrypt(struct skcipher_request *req) +{ + return geode_skcipher_crypt(req, AES_MODE_ECB, AES_DIR_DECRYPT); +} + +static struct skcipher_alg geode_skcipher_algs[] = { + { + .base.cra_name = "cbc(aes)", + .base.cra_driver_name = "cbc-aes-geode", + .base.cra_priority = 400, + .base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = AES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct geode_aes_tfm_ctx), + .base.cra_alignmask = 15, + .base.cra_module = THIS_MODULE, + .init = geode_init_skcipher, + .exit = geode_exit_skcipher, + .setkey = geode_setkey_skcipher, + .encrypt = geode_cbc_encrypt, + .decrypt = geode_cbc_decrypt, + .min_keysize = AES_MIN_KEY_SIZE, + .max_keysize = AES_MAX_KEY_SIZE, + .ivsize = AES_BLOCK_SIZE, + }, { + .base.cra_name = "ecb(aes)", + .base.cra_driver_name = "ecb-aes-geode", + .base.cra_priority = 400, + .base.cra_flags = CRYPTO_ALG_KERN_DRIVER_ONLY | + CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = AES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct geode_aes_tfm_ctx), + .base.cra_alignmask = 15, + .base.cra_module = THIS_MODULE, + .init = geode_init_skcipher, + .exit = geode_exit_skcipher, + .setkey = geode_setkey_skcipher, + .encrypt = geode_ecb_encrypt, + .decrypt = geode_ecb_decrypt, + .min_keysize = AES_MIN_KEY_SIZE, + .max_keysize = AES_MAX_KEY_SIZE, + }, }; static void geode_aes_remove(struct pci_dev *dev) { crypto_unregister_alg(&geode_alg); - crypto_unregister_alg(&geode_ecb_alg); - crypto_unregister_alg(&geode_cbc_alg); + crypto_unregister_skciphers(geode_skcipher_algs, + ARRAY_SIZE(geode_skcipher_algs)); pci_iounmap(dev, _iobase); _iobase = NULL; @@ -542,20 +411,14 @@ if (ret) goto eiomap; - ret = crypto_register_alg(&geode_ecb_alg); + ret = crypto_register_skciphers(geode_skcipher_algs, + ARRAY_SIZE(geode_skcipher_algs)); if (ret) goto ealg; - ret = crypto_register_alg(&geode_cbc_alg); - if (ret) - goto eecb; - dev_notice(&dev->dev, "GEODE AES engine enabled.\n"); return 0; - eecb: - crypto_unregister_alg(&geode_ecb_alg); - ealg: crypto_unregister_alg(&geode_alg); diff -Nru linux-4.19.98/drivers/crypto/geode-aes.h linux-4.19.118/drivers/crypto/geode-aes.h --- linux-4.19.98/drivers/crypto/geode-aes.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/geode-aes.h 2020-04-23 08:30:24.000000000 +0000 @@ -50,21 +50,10 @@ #define AES_OP_TIMEOUT 0x50000 -struct geode_aes_op { - - void *src; - void *dst; - - u32 mode; - u32 dir; - u32 flags; - int len; - +struct geode_aes_tfm_ctx { u8 key[AES_KEYSIZE_128]; - u8 *iv; - union { - struct crypto_blkcipher *blk; + struct crypto_skcipher *skcipher; struct crypto_cipher *cip; } fallback; u32 keylen; diff -Nru linux-4.19.98/drivers/crypto/hisilicon/sec/sec_algs.c linux-4.19.118/drivers/crypto/hisilicon/sec/sec_algs.c --- linux-4.19.98/drivers/crypto/hisilicon/sec/sec_algs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/hisilicon/sec/sec_algs.c 2020-04-23 08:30:24.000000000 +0000 @@ -153,6 +153,24 @@ ctx->cipher_alg); } +static void sec_free_hw_sgl(struct sec_hw_sgl *hw_sgl, + dma_addr_t psec_sgl, struct sec_dev_info *info) +{ + struct sec_hw_sgl *sgl_current, *sgl_next; + dma_addr_t sgl_next_dma; + + sgl_current = hw_sgl; + while (sgl_current) { + sgl_next = sgl_current->next; + sgl_next_dma = sgl_current->next_sgl; + + dma_pool_free(info->hw_sgl_pool, sgl_current, psec_sgl); + + sgl_current = sgl_next; + psec_sgl = sgl_next_dma; + } +} + static int sec_alloc_and_fill_hw_sgl(struct sec_hw_sgl **sec_sgl, dma_addr_t *psec_sgl, struct scatterlist *sgl, @@ -199,36 +217,12 @@ return 0; err_free_hw_sgls: - sgl_current = *sec_sgl; - while (sgl_current) { - sgl_next = sgl_current->next; - dma_pool_free(info->hw_sgl_pool, sgl_current, - sgl_current->next_sgl); - sgl_current = sgl_next; - } + sec_free_hw_sgl(*sec_sgl, *psec_sgl, info); *psec_sgl = 0; return ret; } -static void sec_free_hw_sgl(struct sec_hw_sgl *hw_sgl, - dma_addr_t psec_sgl, struct sec_dev_info *info) -{ - struct sec_hw_sgl *sgl_current, *sgl_next; - dma_addr_t sgl_next_dma; - - sgl_current = hw_sgl; - while (sgl_current) { - sgl_next = sgl_current->next; - sgl_next_dma = sgl_current->next_sgl; - - dma_pool_free(info->hw_sgl_pool, sgl_current, psec_sgl); - - sgl_current = sgl_next; - psec_sgl = sgl_next_dma; - } -} - static int sec_alg_skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, unsigned int keylen, enum sec_cipher_alg alg) diff -Nru linux-4.19.98/drivers/crypto/inside-secure/safexcel_hash.c linux-4.19.118/drivers/crypto/inside-secure/safexcel_hash.c --- linux-4.19.98/drivers/crypto/inside-secure/safexcel_hash.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/inside-secure/safexcel_hash.c 2020-04-23 08:30:24.000000000 +0000 @@ -50,10 +50,12 @@ static inline u64 safexcel_queued_len(struct safexcel_ahash_req *req) { - if (req->len[1] > req->processed[1]) - return 0xffffffff - (req->len[0] - req->processed[0]); + u64 len, processed; - return req->len[0] - req->processed[0]; + len = (0xffffffff * req->len[1]) + req->len[0]; + processed = (0xffffffff * req->processed[1]) + req->processed[0]; + + return len - processed; } static void safexcel_hash_token(struct safexcel_command_desc *cdesc, @@ -486,7 +488,7 @@ struct safexcel_inv_result result = {}; int ring = ctx->base.ring; - memset(req, 0, sizeof(struct ahash_request)); + memset(req, 0, EIP197_AHASH_REQ_SIZE); /* create invalidation request */ init_completion(&result.completion); diff -Nru linux-4.19.98/drivers/crypto/mxs-dcp.c linux-4.19.118/drivers/crypto/mxs-dcp.c --- linux-4.19.98/drivers/crypto/mxs-dcp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/mxs-dcp.c 2020-04-23 08:30:24.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include #define DCP_MAX_CHANS 4 #define DCP_BUF_SZ PAGE_SIZE @@ -621,49 +622,46 @@ struct dcp_async_ctx *actx = crypto_ahash_ctx(tfm); struct dcp_sha_req_ctx *rctx = ahash_request_ctx(req); struct hash_alg_common *halg = crypto_hash_alg_common(tfm); - const int nents = sg_nents(req->src); uint8_t *in_buf = sdcp->coh->sha_in_buf; uint8_t *out_buf = sdcp->coh->sha_out_buf; - uint8_t *src_buf; - struct scatterlist *src; - unsigned int i, len, clen; + unsigned int i, len, clen, oft = 0; int ret; int fin = rctx->fini; if (fin) rctx->fini = 0; - for_each_sg(req->src, src, nents, i) { - src_buf = sg_virt(src); - len = sg_dma_len(src); + src = req->src; + len = req->nbytes; - do { - if (actx->fill + len > DCP_BUF_SZ) - clen = DCP_BUF_SZ - actx->fill; - else - clen = len; + while (len) { + if (actx->fill + len > DCP_BUF_SZ) + clen = DCP_BUF_SZ - actx->fill; + else + clen = len; - memcpy(in_buf + actx->fill, src_buf, clen); - len -= clen; - src_buf += clen; - actx->fill += clen; + scatterwalk_map_and_copy(in_buf + actx->fill, src, oft, clen, + 0); - /* - * If we filled the buffer and still have some - * more data, submit the buffer. - */ - if (len && actx->fill == DCP_BUF_SZ) { - ret = mxs_dcp_run_sha(req); - if (ret) - return ret; - actx->fill = 0; - rctx->init = 0; - } - } while (len); + len -= clen; + oft += clen; + actx->fill += clen; + + /* + * If we filled the buffer and still have some + * more data, submit the buffer. + */ + if (len && actx->fill == DCP_BUF_SZ) { + ret = mxs_dcp_run_sha(req); + if (ret) + return ret; + actx->fill = 0; + rctx->init = 0; + } } if (fin) { diff -Nru linux-4.19.98/drivers/crypto/picoxcell_crypto.c linux-4.19.118/drivers/crypto/picoxcell_crypto.c --- linux-4.19.98/drivers/crypto/picoxcell_crypto.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/picoxcell_crypto.c 2020-04-23 08:30:24.000000000 +0000 @@ -1616,6 +1616,11 @@ MODULE_DEVICE_TABLE(of, spacc_of_id_table); #endif /* CONFIG_OF */ +static void spacc_tasklet_kill(void *data) +{ + tasklet_kill(data); +} + static int spacc_probe(struct platform_device *pdev) { int i, err, ret; @@ -1659,6 +1664,14 @@ return -ENXIO; } + tasklet_init(&engine->complete, spacc_spacc_complete, + (unsigned long)engine); + + ret = devm_add_action(&pdev->dev, spacc_tasklet_kill, + &engine->complete); + if (ret) + return ret; + if (devm_request_irq(&pdev->dev, irq->start, spacc_spacc_irq, 0, engine->name, engine)) { dev_err(engine->dev, "failed to request IRQ\n"); @@ -1716,8 +1729,6 @@ INIT_LIST_HEAD(&engine->completed); INIT_LIST_HEAD(&engine->in_progress); engine->in_flight = 0; - tasklet_init(&engine->complete, spacc_spacc_complete, - (unsigned long)engine); platform_set_drvdata(pdev, engine); diff -Nru linux-4.19.98/drivers/crypto/sunxi-ss/sun4i-ss-hash.c linux-4.19.118/drivers/crypto/sunxi-ss/sun4i-ss-hash.c --- linux-4.19.98/drivers/crypto/sunxi-ss/sun4i-ss-hash.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/sunxi-ss/sun4i-ss-hash.c 2020-04-23 08:30:24.000000000 +0000 @@ -179,7 +179,7 @@ */ unsigned int i = 0, end, fill, min_fill, nwait, nbw = 0, j = 0, todo; unsigned int in_i = 0; - u32 spaces, rx_cnt = SS_RX_DEFAULT, bf[32] = {0}, wb = 0, v, ivmode = 0; + u32 spaces, rx_cnt = SS_RX_DEFAULT, bf[32] = {0}, v, ivmode = 0; struct sun4i_req_ctx *op = ahash_request_ctx(areq); struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); struct sun4i_tfm_ctx *tfmctx = crypto_ahash_ctx(tfm); @@ -188,6 +188,7 @@ struct sg_mapping_iter mi; int in_r, err = 0; size_t copied = 0; + __le32 wb = 0; dev_dbg(ss->dev, "%s %s bc=%llu len=%u mode=%x wl=%u h0=%0x", __func__, crypto_tfm_alg_name(areq->base.tfm), @@ -399,7 +400,7 @@ nbw = op->len - 4 * nwait; if (nbw) { - wb = *(u32 *)(op->buf + nwait * 4); + wb = cpu_to_le32(*(u32 *)(op->buf + nwait * 4)); wb &= GENMASK((nbw * 8) - 1, 0); op->byte_count += nbw; @@ -408,7 +409,7 @@ /* write the remaining bytes of the nbw buffer */ wb |= ((1 << 7) << (nbw * 8)); - bf[j++] = wb; + bf[j++] = le32_to_cpu(wb); /* * number of space to pad to obtain 64o minus 8(size) minus 4 (final 1) @@ -427,13 +428,13 @@ /* write the length of data */ if (op->mode == SS_OP_SHA1) { - __be64 bits = cpu_to_be64(op->byte_count << 3); - bf[j++] = lower_32_bits(bits); - bf[j++] = upper_32_bits(bits); + __be64 *bits = (__be64 *)&bf[j]; + *bits = cpu_to_be64(op->byte_count << 3); + j += 2; } else { - __le64 bits = op->byte_count << 3; - bf[j++] = lower_32_bits(bits); - bf[j++] = upper_32_bits(bits); + __le64 *bits = (__le64 *)&bf[j]; + *bits = cpu_to_le64(op->byte_count << 3); + j += 2; } writesl(ss->base + SS_RXFIFO, bf, j); @@ -475,7 +476,7 @@ } } else { for (i = 0; i < 4; i++) { - v = readl(ss->base + SS_MD0 + i * 4); + v = cpu_to_le32(readl(ss->base + SS_MD0 + i * 4)); memcpy(areq->result + i * 4, &v, 4); } } diff -Nru linux-4.19.98/drivers/crypto/talitos.c linux-4.19.118/drivers/crypto/talitos.c --- linux-4.19.98/drivers/crypto/talitos.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/talitos.c 2020-04-23 08:30:24.000000000 +0000 @@ -974,8 +974,8 @@ DMA_FROM_DEVICE); unmap_single_talitos_ptr(dev, civ_ptr, DMA_TO_DEVICE); - talitos_sg_unmap(dev, edesc, areq->src, areq->dst, cryptlen, - areq->assoclen); + talitos_sg_unmap(dev, edesc, areq->src, areq->dst, + cryptlen + authsize, areq->assoclen); if (edesc->dma_len) dma_unmap_single(dev, edesc->dma_link_tbl, edesc->dma_len, @@ -996,30 +996,15 @@ struct talitos_desc *desc, void *context, int err) { - struct talitos_private *priv = dev_get_drvdata(dev); - bool is_sec1 = has_ftr_sec1(priv); struct aead_request *areq = context; struct crypto_aead *authenc = crypto_aead_reqtfm(areq); - unsigned int authsize = crypto_aead_authsize(authenc); unsigned int ivsize = crypto_aead_ivsize(authenc); struct talitos_edesc *edesc; - void *icvdata; edesc = container_of(desc, struct talitos_edesc, desc); ipsec_esp_unmap(dev, edesc, areq, true); - /* copy the generated ICV to dst */ - if (edesc->icv_ool) { - if (is_sec1) - icvdata = edesc->buf + areq->assoclen + areq->cryptlen; - else - icvdata = &edesc->link_tbl[edesc->src_nents + - edesc->dst_nents + 2]; - sg_pcopy_from_buffer(areq->dst, edesc->dst_nents ? : 1, icvdata, - authsize, areq->assoclen + areq->cryptlen); - } - dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE); kfree(edesc); @@ -1036,39 +1021,15 @@ unsigned int authsize = crypto_aead_authsize(authenc); struct talitos_edesc *edesc; char *oicv, *icv; - struct talitos_private *priv = dev_get_drvdata(dev); - bool is_sec1 = has_ftr_sec1(priv); edesc = container_of(desc, struct talitos_edesc, desc); ipsec_esp_unmap(dev, edesc, req, false); if (!err) { - char icvdata[SHA512_DIGEST_SIZE]; - int nents = edesc->dst_nents ? : 1; - unsigned int len = req->assoclen + req->cryptlen; - /* auth check */ - if (nents > 1) { - sg_pcopy_to_buffer(req->dst, nents, icvdata, authsize, - len - authsize); - icv = icvdata; - } else { - icv = (char *)sg_virt(req->dst) + len - authsize; - } - - if (edesc->dma_len) { - if (is_sec1) - oicv = (char *)&edesc->dma_link_tbl + - req->assoclen + req->cryptlen; - else - oicv = (char *) - &edesc->link_tbl[edesc->src_nents + - edesc->dst_nents + 2]; - if (edesc->icv_ool) - icv = oicv + authsize; - } else - oicv = (char *)&edesc->link_tbl[0]; + oicv = edesc->buf + edesc->dma_len; + icv = oicv - authsize; err = crypto_memneq(oicv, icv, authsize) ? -EBADMSG : 0; } @@ -1104,11 +1065,12 @@ * stop at cryptlen bytes */ static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count, - unsigned int offset, int cryptlen, + unsigned int offset, int datalen, int elen, struct talitos_ptr *link_tbl_ptr) { - int n_sg = sg_count; + int n_sg = elen ? sg_count + 1 : sg_count; int count = 0; + int cryptlen = datalen + elen; while (cryptlen && sg && n_sg--) { unsigned int len = sg_dma_len(sg); @@ -1123,11 +1085,20 @@ if (len > cryptlen) len = cryptlen; + if (datalen > 0 && len > datalen) { + to_talitos_ptr(link_tbl_ptr + count, + sg_dma_address(sg) + offset, datalen, 0); + to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0); + count++; + len -= datalen; + offset += datalen; + } to_talitos_ptr(link_tbl_ptr + count, sg_dma_address(sg) + offset, len, 0); to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0); count++; cryptlen -= len; + datalen -= len; offset = 0; next: @@ -1137,7 +1108,7 @@ /* tag end of link table */ if (count > 0) to_talitos_ptr_ext_set(link_tbl_ptr + count - 1, - DESC_PTR_LNKTBL_RETURN, 0); + DESC_PTR_LNKTBL_RET, 0); return count; } @@ -1145,7 +1116,8 @@ static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src, unsigned int len, struct talitos_edesc *edesc, struct talitos_ptr *ptr, int sg_count, - unsigned int offset, int tbl_off, int elen) + unsigned int offset, int tbl_off, int elen, + bool force) { struct talitos_private *priv = dev_get_drvdata(dev); bool is_sec1 = has_ftr_sec1(priv); @@ -1155,7 +1127,7 @@ return 1; } to_talitos_ptr_ext_set(ptr, elen, is_sec1); - if (sg_count == 1) { + if (sg_count == 1 && !force) { to_talitos_ptr(ptr, sg_dma_address(src) + offset, len, is_sec1); return sg_count; } @@ -1163,9 +1135,9 @@ to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, len, is_sec1); return sg_count; } - sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len + elen, + sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len, elen, &edesc->link_tbl[tbl_off]); - if (sg_count == 1) { + if (sg_count == 1 && !force) { /* Only one segment now, so no link tbl needed*/ copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1); return sg_count; @@ -1183,7 +1155,7 @@ unsigned int offset, int tbl_off) { return talitos_sg_map_ext(dev, src, len, edesc, ptr, sg_count, offset, - tbl_off, 0); + tbl_off, 0, false); } /* @@ -1211,6 +1183,7 @@ bool is_ipsec_esp = desc->hdr & DESC_HDR_TYPE_IPSEC_ESP; struct talitos_ptr *civ_ptr = &desc->ptr[is_ipsec_esp ? 2 : 3]; struct talitos_ptr *ckey_ptr = &desc->ptr[is_ipsec_esp ? 3 : 2]; + dma_addr_t dma_icv = edesc->dma_link_tbl + edesc->dma_len - authsize; /* hmac key */ to_talitos_ptr(&desc->ptr[0], ctx->dma_key, ctx->authkeylen, is_sec1); @@ -1250,7 +1223,8 @@ elen = authsize; ret = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4], - sg_count, areq->assoclen, tbl_off, elen); + sg_count, areq->assoclen, tbl_off, elen, + false); if (ret > 1) { tbl_off += ret; @@ -1264,55 +1238,35 @@ dma_map_sg(dev, areq->dst, sg_count, DMA_FROM_DEVICE); } - ret = talitos_sg_map(dev, areq->dst, cryptlen, edesc, &desc->ptr[5], - sg_count, areq->assoclen, tbl_off); - - if (is_ipsec_esp) - to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1); + if (is_ipsec_esp && encrypt) + elen = authsize; + else + elen = 0; + ret = talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5], + sg_count, areq->assoclen, tbl_off, elen, + is_ipsec_esp && !encrypt); + tbl_off += ret; /* ICV data */ - if (ret > 1) { - tbl_off += ret; - edesc->icv_ool = true; - sync_needed = true; + edesc->icv_ool = !encrypt; - if (is_ipsec_esp) { - struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off]; - int offset = (edesc->src_nents + edesc->dst_nents + 2) * - sizeof(struct talitos_ptr) + authsize; - - /* Add an entry to the link table for ICV data */ - to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1); - to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RETURN, - is_sec1); - - /* icv data follows link tables */ - to_talitos_ptr(tbl_ptr, edesc->dma_link_tbl + offset, - authsize, is_sec1); - } else { - dma_addr_t addr = edesc->dma_link_tbl; - - if (is_sec1) - addr += areq->assoclen + cryptlen; - else - addr += sizeof(struct talitos_ptr) * tbl_off; + if (!encrypt && is_ipsec_esp) { + struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off]; - to_talitos_ptr(&desc->ptr[6], addr, authsize, is_sec1); - } + /* Add an entry to the link table for ICV data */ + to_talitos_ptr_ext_set(tbl_ptr - 1, 0, is_sec1); + to_talitos_ptr_ext_set(tbl_ptr, DESC_PTR_LNKTBL_RET, is_sec1); + + /* icv data follows link tables */ + to_talitos_ptr(tbl_ptr, dma_icv, authsize, is_sec1); + to_talitos_ptr_ext_or(&desc->ptr[5], authsize, is_sec1); + sync_needed = true; + } else if (!encrypt) { + to_talitos_ptr(&desc->ptr[6], dma_icv, authsize, is_sec1); + sync_needed = true; } else if (!is_ipsec_esp) { - ret = talitos_sg_map(dev, areq->dst, authsize, edesc, - &desc->ptr[6], sg_count, areq->assoclen + - cryptlen, - tbl_off); - if (ret > 1) { - tbl_off += ret; - edesc->icv_ool = true; - sync_needed = true; - } else { - edesc->icv_ool = false; - } - } else { - edesc->icv_ool = false; + talitos_sg_map(dev, areq->dst, authsize, edesc, &desc->ptr[6], + sg_count, areq->assoclen + cryptlen, tbl_off); } /* iv out */ @@ -1395,18 +1349,18 @@ * and space for two sets of ICVs (stashed and generated) */ alloc_len = sizeof(struct talitos_edesc); - if (src_nents || dst_nents) { + if (src_nents || dst_nents || !encrypt) { if (is_sec1) dma_len = (src_nents ? src_len : 0) + - (dst_nents ? dst_len : 0); + (dst_nents ? dst_len : 0) + authsize; else dma_len = (src_nents + dst_nents + 2) * - sizeof(struct talitos_ptr) + authsize * 2; + sizeof(struct talitos_ptr) + authsize; alloc_len += dma_len; } else { dma_len = 0; - alloc_len += icv_stashing ? authsize : 0; } + alloc_len += icv_stashing ? authsize : 0; /* if its a ahash, add space for a second desc next to the first one */ if (is_sec1 && !dst) @@ -1500,11 +1454,7 @@ edesc->desc.hdr = ctx->desc_hdr_template | DESC_HDR_DIR_INBOUND; /* stash incoming ICV for later cmp with ICV generated by the h/w */ - if (edesc->dma_len) - icvdata = (char *)&edesc->link_tbl[edesc->src_nents + - edesc->dst_nents + 2]; - else - icvdata = &edesc->link_tbl[0]; + icvdata = edesc->buf + edesc->dma_len; sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize, req->assoclen + req->cryptlen - authsize); diff -Nru linux-4.19.98/drivers/crypto/talitos.h linux-4.19.118/drivers/crypto/talitos.h --- linux-4.19.98/drivers/crypto/talitos.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/crypto/talitos.h 2020-04-23 08:30:24.000000000 +0000 @@ -442,5 +442,5 @@ /* link table extent field bits */ #define DESC_PTR_LNKTBL_JUMP 0x80 -#define DESC_PTR_LNKTBL_RETURN 0x02 +#define DESC_PTR_LNKTBL_RET 0x02 #define DESC_PTR_LNKTBL_NEXT 0x01 diff -Nru linux-4.19.98/drivers/devfreq/Kconfig linux-4.19.118/drivers/devfreq/Kconfig --- linux-4.19.98/drivers/devfreq/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/devfreq/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -103,7 +103,8 @@ config ARM_RK3399_DMC_DEVFREQ tristate "ARM RK3399 DMC DEVFREQ Driver" - depends on ARCH_ROCKCHIP + depends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \ + (COMPILE_TEST && HAVE_ARM_SMCCC) select DEVFREQ_EVENT_ROCKCHIP_DFI select DEVFREQ_GOV_SIMPLE_ONDEMAND select PM_DEVFREQ_EVENT diff -Nru linux-4.19.98/drivers/devfreq/devfreq.c linux-4.19.118/drivers/devfreq/devfreq.c --- linux-4.19.98/drivers/devfreq/devfreq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/devfreq/devfreq.c 2020-04-23 08:30:24.000000000 +0000 @@ -600,7 +600,6 @@ { struct devfreq *devfreq; struct devfreq_governor *governor; - static atomic_t devfreq_no = ATOMIC_INIT(-1); int err = 0; if (!dev || !profile || !governor_name) { @@ -661,8 +660,7 @@ } devfreq->max_freq = devfreq->scaling_max_freq; - dev_set_name(&devfreq->dev, "devfreq%d", - atomic_inc_return(&devfreq_no)); + dev_set_name(&devfreq->dev, "%s", dev_name(dev)); err = device_register(&devfreq->dev); if (err) { mutex_unlock(&devfreq->lock); @@ -1014,6 +1012,14 @@ } EXPORT_SYMBOL(devfreq_remove_governor); +static ssize_t name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct devfreq *devfreq = to_devfreq(dev); + return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent)); +} +static DEVICE_ATTR_RO(name); + static ssize_t governor_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -1330,6 +1336,7 @@ static DEVICE_ATTR_RO(trans_stat); static struct attribute *devfreq_attrs[] = { + &dev_attr_name.attr, &dev_attr_governor.attr, &dev_attr_available_governors.attr, &dev_attr_cur_freq.attr, diff -Nru linux-4.19.98/drivers/devfreq/event/Kconfig linux-4.19.118/drivers/devfreq/event/Kconfig --- linux-4.19.98/drivers/devfreq/event/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/devfreq/event/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -33,7 +33,7 @@ config DEVFREQ_EVENT_ROCKCHIP_DFI tristate "ROCKCHIP DFI DEVFREQ event Driver" - depends on ARCH_ROCKCHIP + depends on ARCH_ROCKCHIP || COMPILE_TEST help This add the devfreq-event driver for Rockchip SoC. It provides DFI (DDR Monitor Module) driver to count ddr load. diff -Nru linux-4.19.98/drivers/dma/coh901318.c linux-4.19.118/drivers/dma/coh901318.c --- linux-4.19.98/drivers/dma/coh901318.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/coh901318.c 2020-04-23 08:30:24.000000000 +0000 @@ -1944,8 +1944,6 @@ return; } - spin_lock(&cohc->lock); - /* * When we reach this point, at least one queue item * should have been moved over from cohc->queue to @@ -1966,8 +1964,6 @@ if (coh901318_queue_start(cohc) == NULL) cohc->busy = 0; - spin_unlock(&cohc->lock); - /* * This tasklet will remove items from cohc->active * and thus terminates them. diff -Nru linux-4.19.98/drivers/dma/dma-axi-dmac.c linux-4.19.118/drivers/dma/dma-axi-dmac.c --- linux-4.19.98/drivers/dma/dma-axi-dmac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/dma-axi-dmac.c 2020-04-23 08:30:24.000000000 +0000 @@ -486,7 +486,7 @@ if (chan->hw_2d) { if (!axi_dmac_check_len(chan, xt->sgl[0].size) || - !axi_dmac_check_len(chan, xt->numf)) + xt->numf == 0) return NULL; if (xt->sgl[0].size + dst_icg > chan->max_length || xt->sgl[0].size + src_icg > chan->max_length) diff -Nru linux-4.19.98/drivers/dma/dmaengine.c linux-4.19.118/drivers/dma/dmaengine.c --- linux-4.19.98/drivers/dma/dmaengine.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/dmaengine.c 2020-04-23 08:30:24.000000000 +0000 @@ -190,7 +190,7 @@ static struct module *dma_chan_to_owner(struct dma_chan *chan) { - return chan->device->dev->driver->owner; + return chan->device->owner; } /** @@ -923,6 +923,8 @@ return -EIO; } + device->owner = device->dev->driver->owner; + if (dma_has_cap(DMA_MEMCPY, device->cap_mask) && !device->device_prep_dma_memcpy) { dev_err(device->dev, "Device claims capability %s, but op is not defined\n", diff -Nru linux-4.19.98/drivers/dma/dw/platform.c linux-4.19.118/drivers/dma/dw/platform.c --- linux-4.19.98/drivers/dma/dw/platform.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/dw/platform.c 2020-04-23 08:30:24.000000000 +0000 @@ -87,13 +87,20 @@ dma_cap_set(DMA_SLAVE, info->dma_cap); info->filter_fn = dw_dma_acpi_filter; - ret = devm_acpi_dma_controller_register(dev, acpi_dma_simple_xlate, - info); + ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info); if (ret) dev_err(dev, "could not register acpi_dma_controller\n"); } + +static void dw_dma_acpi_controller_free(struct dw_dma *dw) +{ + struct device *dev = dw->dma.dev; + + acpi_dma_controller_free(dev); +} #else /* !CONFIG_ACPI */ static inline void dw_dma_acpi_controller_register(struct dw_dma *dw) {} +static inline void dw_dma_acpi_controller_free(struct dw_dma *dw) {} #endif /* !CONFIG_ACPI */ #ifdef CONFIG_OF @@ -249,6 +256,9 @@ { struct dw_dma_chip *chip = platform_get_drvdata(pdev); + if (ACPI_HANDLE(&pdev->dev)) + dw_dma_acpi_controller_free(chip->dw); + if (pdev->dev.of_node) of_dma_controller_free(pdev->dev.of_node); diff -Nru linux-4.19.98/drivers/dma/hsu/hsu.c linux-4.19.118/drivers/dma/hsu/hsu.c --- linux-4.19.98/drivers/dma/hsu/hsu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/hsu/hsu.c 2020-04-23 08:30:24.000000000 +0000 @@ -64,10 +64,10 @@ if (hsuc->direction == DMA_MEM_TO_DEV) { bsr = config->dst_maxburst; - mtsr = config->src_addr_width; + mtsr = config->dst_addr_width; } else if (hsuc->direction == DMA_DEV_TO_MEM) { bsr = config->src_maxburst; - mtsr = config->dst_addr_width; + mtsr = config->src_addr_width; } hsu_chan_disable(hsuc); diff -Nru linux-4.19.98/drivers/dma/imx-sdma.c linux-4.19.118/drivers/dma/imx-sdma.c --- linux-4.19.98/drivers/dma/imx-sdma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/imx-sdma.c 2020-04-23 08:30:24.000000000 +0000 @@ -335,6 +335,7 @@ * @sdma: pointer to the SDMA engine for this channel * @channel: the channel number, matches dmaengine chan_id + 1 * @direction: transfer type. Needed for setting SDMA script + * @slave_config Slave configuration * @peripheral_type: Peripheral type. Needed for setting SDMA script * @event_id0: aka dma request line * @event_id1: for channels that use 2 events @@ -362,6 +363,7 @@ struct sdma_engine *sdma; unsigned int channel; enum dma_transfer_direction direction; + struct dma_slave_config slave_config; enum sdma_peripheral_type peripheral_type; unsigned int event_id0; unsigned int event_id1; @@ -440,6 +442,10 @@ struct sdma_buffer_descriptor *bd0; }; +static int sdma_config_write(struct dma_chan *chan, + struct dma_slave_config *dmaengine_cfg, + enum dma_transfer_direction direction); + static struct sdma_driver_data sdma_imx31 = { .chnenbl0 = SDMA_CHNENBL0_IMX31, .num_events = 32, @@ -1122,18 +1128,6 @@ sdmac->shp_addr = 0; sdmac->per_addr = 0; - if (sdmac->event_id0) { - if (sdmac->event_id0 >= sdmac->sdma->drvdata->num_events) - return -EINVAL; - sdma_event_enable(sdmac, sdmac->event_id0); - } - - if (sdmac->event_id1) { - if (sdmac->event_id1 >= sdmac->sdma->drvdata->num_events) - return -EINVAL; - sdma_event_enable(sdmac, sdmac->event_id1); - } - switch (sdmac->peripheral_type) { case IMX_DMATYPE_DSP: sdma_config_ownership(sdmac, false, true, true); @@ -1431,6 +1425,8 @@ struct scatterlist *sg; struct sdma_desc *desc; + sdma_config_write(chan, &sdmac->slave_config, direction); + desc = sdma_transfer_init(sdmac, direction, sg_len); if (!desc) goto err_out; @@ -1515,6 +1511,8 @@ dev_dbg(sdma->dev, "%s channel: %d\n", __func__, channel); + sdma_config_write(chan, &sdmac->slave_config, direction); + desc = sdma_transfer_init(sdmac, direction, num_periods); if (!desc) goto err_out; @@ -1570,17 +1568,18 @@ return NULL; } -static int sdma_config(struct dma_chan *chan, - struct dma_slave_config *dmaengine_cfg) +static int sdma_config_write(struct dma_chan *chan, + struct dma_slave_config *dmaengine_cfg, + enum dma_transfer_direction direction) { struct sdma_channel *sdmac = to_sdma_chan(chan); - if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { + if (direction == DMA_DEV_TO_MEM) { sdmac->per_address = dmaengine_cfg->src_addr; sdmac->watermark_level = dmaengine_cfg->src_maxburst * dmaengine_cfg->src_addr_width; sdmac->word_size = dmaengine_cfg->src_addr_width; - } else if (dmaengine_cfg->direction == DMA_DEV_TO_DEV) { + } else if (direction == DMA_DEV_TO_DEV) { sdmac->per_address2 = dmaengine_cfg->src_addr; sdmac->per_address = dmaengine_cfg->dst_addr; sdmac->watermark_level = dmaengine_cfg->src_maxburst & @@ -1594,10 +1593,33 @@ dmaengine_cfg->dst_addr_width; sdmac->word_size = dmaengine_cfg->dst_addr_width; } - sdmac->direction = dmaengine_cfg->direction; + sdmac->direction = direction; return sdma_config_channel(chan); } +static int sdma_config(struct dma_chan *chan, + struct dma_slave_config *dmaengine_cfg) +{ + struct sdma_channel *sdmac = to_sdma_chan(chan); + + memcpy(&sdmac->slave_config, dmaengine_cfg, sizeof(*dmaengine_cfg)); + + /* Set ENBLn earlier to make sure dma request triggered after that */ + if (sdmac->event_id0) { + if (sdmac->event_id0 >= sdmac->sdma->drvdata->num_events) + return -EINVAL; + sdma_event_enable(sdmac, sdmac->event_id0); + } + + if (sdmac->event_id1) { + if (sdmac->event_id1 >= sdmac->sdma->drvdata->num_events) + return -EINVAL; + sdma_event_enable(sdmac, sdmac->event_id1); + } + + return 0; +} + static enum dma_status sdma_tx_status(struct dma_chan *chan, dma_cookie_t cookie, struct dma_tx_state *txstate) @@ -1662,6 +1684,14 @@ if (!sdma->script_number) sdma->script_number = SDMA_SCRIPT_ADDRS_ARRAY_SIZE_V1; + if (sdma->script_number > sizeof(struct sdma_script_start_addrs) + / sizeof(s32)) { + dev_err(sdma->dev, + "SDMA script number %d not match with firmware.\n", + sdma->script_number); + return; + } + for (i = 0; i < sdma->script_number; i++) if (addr_arr[i] > 0) saddr_arr[i] = addr_arr[i]; diff -Nru linux-4.19.98/drivers/dma/mv_xor.c linux-4.19.118/drivers/dma/mv_xor.c --- linux-4.19.98/drivers/dma/mv_xor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/mv_xor.c 2020-04-23 08:30:24.000000000 +0000 @@ -1059,6 +1059,7 @@ mv_chan->op_in_desc = XOR_MODE_IN_DESC; dma_dev = &mv_chan->dmadev; + dma_dev->dev = &pdev->dev; mv_chan->xordev = xordev; /* @@ -1091,7 +1092,6 @@ dma_dev->device_free_chan_resources = mv_xor_free_chan_resources; dma_dev->device_tx_status = mv_xor_status; dma_dev->device_issue_pending = mv_xor_issue_pending; - dma_dev->dev = &pdev->dev; /* set prep routines based on capability */ if (dma_has_cap(DMA_INTERRUPT, dma_dev->cap_mask)) diff -Nru linux-4.19.98/drivers/dma/tegra20-apb-dma.c linux-4.19.118/drivers/dma/tegra20-apb-dma.c --- linux-4.19.98/drivers/dma/tegra20-apb-dma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/tegra20-apb-dma.c 2020-04-23 08:30:24.000000000 +0000 @@ -288,7 +288,7 @@ /* Do not allocate if desc are waiting for ack */ list_for_each_entry(dma_desc, &tdc->free_dma_desc, node) { - if (async_tx_test_ack(&dma_desc->txd)) { + if (async_tx_test_ack(&dma_desc->txd) && !dma_desc->cb_count) { list_del(&dma_desc->node); spin_unlock_irqrestore(&tdc->lock, flags); dma_desc->txd.flags = 0; @@ -756,10 +756,6 @@ bool was_busy; spin_lock_irqsave(&tdc->lock, flags); - if (list_empty(&tdc->pending_sg_req)) { - spin_unlock_irqrestore(&tdc->lock, flags); - return 0; - } if (!tdc->busy) goto skip_dma_stop; diff -Nru linux-4.19.98/drivers/dma/tegra210-adma.c linux-4.19.118/drivers/dma/tegra210-adma.c --- linux-4.19.98/drivers/dma/tegra210-adma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/tegra210-adma.c 2020-04-23 08:30:24.000000000 +0000 @@ -98,6 +98,7 @@ unsigned int src_addr; unsigned int trg_addr; unsigned int fifo_ctrl; + unsigned int cmd; unsigned int tc; }; @@ -127,6 +128,7 @@ enum dma_transfer_direction sreq_dir; unsigned int sreq_index; bool sreq_reserved; + struct tegra_adma_chan_regs ch_regs; /* Transfer count and position info */ unsigned int tx_buf_count; @@ -635,8 +637,30 @@ static int tegra_adma_runtime_suspend(struct device *dev) { struct tegra_adma *tdma = dev_get_drvdata(dev); + struct tegra_adma_chan_regs *ch_reg; + struct tegra_adma_chan *tdc; + int i; tdma->global_cmd = tdma_read(tdma, ADMA_GLOBAL_CMD); + if (!tdma->global_cmd) + goto clk_disable; + + for (i = 0; i < tdma->nr_channels; i++) { + tdc = &tdma->channels[i]; + ch_reg = &tdc->ch_regs; + ch_reg->cmd = tdma_ch_read(tdc, ADMA_CH_CMD); + /* skip if channel is not active */ + if (!ch_reg->cmd) + continue; + ch_reg->tc = tdma_ch_read(tdc, ADMA_CH_TC); + ch_reg->src_addr = tdma_ch_read(tdc, ADMA_CH_LOWER_SRC_ADDR); + ch_reg->trg_addr = tdma_ch_read(tdc, ADMA_CH_LOWER_TRG_ADDR); + ch_reg->ctrl = tdma_ch_read(tdc, ADMA_CH_CTRL); + ch_reg->fifo_ctrl = tdma_ch_read(tdc, ADMA_CH_FIFO_CTRL); + ch_reg->config = tdma_ch_read(tdc, ADMA_CH_CONFIG); + } + +clk_disable: clk_disable_unprepare(tdma->ahub_clk); return 0; @@ -645,7 +669,9 @@ static int tegra_adma_runtime_resume(struct device *dev) { struct tegra_adma *tdma = dev_get_drvdata(dev); - int ret; + struct tegra_adma_chan_regs *ch_reg; + struct tegra_adma_chan *tdc; + int ret, i; ret = clk_prepare_enable(tdma->ahub_clk); if (ret) { @@ -654,6 +680,24 @@ } tdma_write(tdma, ADMA_GLOBAL_CMD, tdma->global_cmd); + if (!tdma->global_cmd) + return 0; + + for (i = 0; i < tdma->nr_channels; i++) { + tdc = &tdma->channels[i]; + ch_reg = &tdc->ch_regs; + /* skip if channel was not active earlier */ + if (!ch_reg->cmd) + continue; + tdma_ch_write(tdc, ADMA_CH_TC, ch_reg->tc); + tdma_ch_write(tdc, ADMA_CH_LOWER_SRC_ADDR, ch_reg->src_addr); + tdma_ch_write(tdc, ADMA_CH_LOWER_TRG_ADDR, ch_reg->trg_addr); + tdma_ch_write(tdc, ADMA_CH_CTRL, ch_reg->ctrl); + tdma_ch_write(tdc, ADMA_CH_FIFO_CTRL, ch_reg->fifo_ctrl); + tdma_ch_write(tdc, ADMA_CH_CONFIG, ch_reg->config); + tdma_ch_write(tdc, ADMA_CH_CMD, ch_reg->cmd); + } + return 0; } @@ -700,16 +744,6 @@ return PTR_ERR(tdma->ahub_clk); } - pm_runtime_enable(&pdev->dev); - - ret = pm_runtime_get_sync(&pdev->dev); - if (ret < 0) - goto rpm_disable; - - ret = tegra_adma_init(tdma); - if (ret) - goto rpm_put; - INIT_LIST_HEAD(&tdma->dma_dev.channels); for (i = 0; i < tdma->nr_channels; i++) { struct tegra_adma_chan *tdc = &tdma->channels[i]; @@ -727,6 +761,16 @@ tdc->tdma = tdma; } + pm_runtime_enable(&pdev->dev); + + ret = pm_runtime_get_sync(&pdev->dev); + if (ret < 0) + goto rpm_disable; + + ret = tegra_adma_init(tdma); + if (ret) + goto rpm_put; + dma_cap_set(DMA_SLAVE, tdma->dma_dev.cap_mask); dma_cap_set(DMA_PRIVATE, tdma->dma_dev.cap_mask); dma_cap_set(DMA_CYCLIC, tdma->dma_dev.cap_mask); @@ -768,13 +812,13 @@ dma_remove: dma_async_device_unregister(&tdma->dma_dev); -irq_dispose: - while (--i >= 0) - irq_dispose_mapping(tdma->channels[i].irq); rpm_put: pm_runtime_put_sync(&pdev->dev); rpm_disable: pm_runtime_disable(&pdev->dev); +irq_dispose: + while (--i >= 0) + irq_dispose_mapping(tdma->channels[i].irq); return ret; } diff -Nru linux-4.19.98/drivers/dma/ti/edma.c linux-4.19.118/drivers/dma/ti/edma.c --- linux-4.19.98/drivers/dma/ti/edma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/dma/ti/edma.c 2020-04-23 08:30:24.000000000 +0000 @@ -2345,8 +2345,10 @@ ecc->tc_list = devm_kcalloc(dev, ecc->num_tc, sizeof(*ecc->tc_list), GFP_KERNEL); - if (!ecc->tc_list) - return -ENOMEM; + if (!ecc->tc_list) { + ret = -ENOMEM; + goto err_reg1; + } for (i = 0;; i++) { ret = of_parse_phandle_with_fixed_args(node, "ti,tptcs", diff -Nru linux-4.19.98/drivers/edac/amd64_edac.c linux-4.19.118/drivers/edac/amd64_edac.c --- linux-4.19.98/drivers/edac/amd64_edac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/edac/amd64_edac.c 2020-04-23 08:30:24.000000000 +0000 @@ -2863,6 +2863,7 @@ dimm = csrow->channels[j]->dimm; dimm->mtype = pvt->dram_type; dimm->edac_mode = edac_mode; + dimm->grain = 64; } } diff -Nru linux-4.19.98/drivers/edac/edac_mc.c linux-4.19.118/drivers/edac/edac_mc.c --- linux-4.19.98/drivers/edac/edac_mc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/edac/edac_mc.c 2020-04-23 08:30:24.000000000 +0000 @@ -681,22 +681,18 @@ struct mem_ctl_info *edac_mc_find(int idx) { - struct mem_ctl_info *mci = NULL; + struct mem_ctl_info *mci; struct list_head *item; mutex_lock(&mem_ctls_mutex); list_for_each(item, &mc_devices) { mci = list_entry(item, struct mem_ctl_info, link); - - if (mci->mc_idx >= idx) { - if (mci->mc_idx == idx) { - goto unlock; - } - break; - } + if (mci->mc_idx == idx) + goto unlock; } + mci = NULL; unlock: mutex_unlock(&mem_ctls_mutex); return mci; diff -Nru linux-4.19.98/drivers/extcon/extcon-axp288.c linux-4.19.118/drivers/extcon/extcon-axp288.c --- linux-4.19.98/drivers/extcon/extcon-axp288.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/extcon/extcon-axp288.c 2020-04-23 08:30:24.000000000 +0000 @@ -428,9 +428,40 @@ /* Start charger cable type detection */ axp288_extcon_enable(info); + device_init_wakeup(dev, true); + platform_set_drvdata(pdev, info); + + return 0; +} + +static int __maybe_unused axp288_extcon_suspend(struct device *dev) +{ + struct axp288_extcon_info *info = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + enable_irq_wake(info->irq[VBUS_RISING_IRQ]); + return 0; } +static int __maybe_unused axp288_extcon_resume(struct device *dev) +{ + struct axp288_extcon_info *info = dev_get_drvdata(dev); + + /* + * Wakeup when a charger is connected to do charger-type + * connection and generate an extcon event which makes the + * axp288 charger driver set the input current limit. + */ + if (device_may_wakeup(dev)) + disable_irq_wake(info->irq[VBUS_RISING_IRQ]); + + return 0; +} + +static SIMPLE_DEV_PM_OPS(axp288_extcon_pm_ops, axp288_extcon_suspend, + axp288_extcon_resume); + static const struct platform_device_id axp288_extcon_table[] = { { .name = "axp288_extcon" }, {}, @@ -442,6 +473,7 @@ .id_table = axp288_extcon_table, .driver = { .name = "axp288_extcon", + .pm = &axp288_extcon_pm_ops, }, }; diff -Nru linux-4.19.98/drivers/firmware/arm_scmi/clock.c linux-4.19.118/drivers/firmware/arm_scmi/clock.c --- linux-4.19.98/drivers/firmware/arm_scmi/clock.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/arm_scmi/clock.c 2020-04-23 08:30:24.000000000 +0000 @@ -185,6 +185,8 @@ if (rate_discrete) clk->list.num_rates = tot_rate_cnt; + clk->rate_discrete = rate_discrete; + err: scmi_xfer_put(handle, t); return ret; diff -Nru linux-4.19.98/drivers/firmware/arm_scmi/driver.c linux-4.19.118/drivers/firmware/arm_scmi/driver.c --- linux-4.19.98/drivers/firmware/arm_scmi/driver.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/arm_scmi/driver.c 2020-04-23 08:30:24.000000000 +0000 @@ -662,9 +662,7 @@ static int scmi_mailbox_check(struct device_node *np) { - struct of_phandle_args arg; - - return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells", 0, &arg); + return of_parse_phandle_with_args(np, "mboxes", "#mbox-cells", 0, NULL); } static int scmi_mbox_free_channel(int id, void *p, void *data) diff -Nru linux-4.19.98/drivers/firmware/arm_scmi/sensors.c linux-4.19.118/drivers/firmware/arm_scmi/sensors.c --- linux-4.19.98/drivers/firmware/arm_scmi/sensors.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/arm_scmi/sensors.c 2020-04-23 08:30:24.000000000 +0000 @@ -30,10 +30,10 @@ __le32 id; __le32 attributes_low; #define SUPPORTS_ASYNC_READ(x) ((x) & BIT(31)) -#define NUM_TRIP_POINTS(x) (((x) >> 4) & 0xff) +#define NUM_TRIP_POINTS(x) ((x) & 0xff) __le32 attributes_high; #define SENSOR_TYPE(x) ((x) & 0xff) -#define SENSOR_SCALE(x) (((x) >> 11) & 0x3f) +#define SENSOR_SCALE(x) (((x) >> 11) & 0x1f) #define SENSOR_UPDATE_SCALE(x) (((x) >> 22) & 0x1f) #define SENSOR_UPDATE_BASE(x) (((x) >> 27) & 0x1f) u8 name[SCMI_MAX_STR_SIZE]; diff -Nru linux-4.19.98/drivers/firmware/arm_sdei.c linux-4.19.118/drivers/firmware/arm_sdei.c --- linux-4.19.98/drivers/firmware/arm_sdei.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/arm_sdei.c 2020-04-23 08:30:24.000000000 +0000 @@ -489,11 +489,6 @@ { lockdep_assert_held(&sdei_events_lock); - spin_lock(&sdei_list_lock); - event->reregister = false; - event->reenable = false; - spin_unlock(&sdei_list_lock); - if (event->type == SDEI_EVENT_TYPE_SHARED) return sdei_api_event_unregister(event->event_num); @@ -516,6 +511,11 @@ break; } + spin_lock(&sdei_list_lock); + event->reregister = false; + event->reenable = false; + spin_unlock(&sdei_list_lock); + err = _sdei_event_unregister(event); if (err) break; @@ -583,26 +583,15 @@ lockdep_assert_held(&sdei_events_lock); - spin_lock(&sdei_list_lock); - event->reregister = true; - spin_unlock(&sdei_list_lock); - if (event->type == SDEI_EVENT_TYPE_SHARED) return sdei_api_event_register(event->event_num, sdei_entry_point, event->registered, SDEI_EVENT_REGISTER_RM_ANY, 0); - err = sdei_do_cross_call(_local_event_register, event); - if (err) { - spin_lock(&sdei_list_lock); - event->reregister = false; - event->reenable = false; - spin_unlock(&sdei_list_lock); - + if (err) sdei_do_cross_call(_local_event_unregister, event); - } return err; } @@ -630,8 +619,17 @@ break; } + spin_lock(&sdei_list_lock); + event->reregister = true; + spin_unlock(&sdei_list_lock); + err = _sdei_event_register(event); if (err) { + spin_lock(&sdei_list_lock); + event->reregister = false; + event->reenable = false; + spin_unlock(&sdei_list_lock); + sdei_event_destroy(event); pr_warn("Failed to register event %u: %d\n", event_num, err); diff -Nru linux-4.19.98/drivers/firmware/dmi_scan.c linux-4.19.118/drivers/firmware/dmi_scan.c --- linux-4.19.98/drivers/firmware/dmi_scan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/dmi_scan.c 2020-04-23 08:30:24.000000000 +0000 @@ -407,7 +407,7 @@ bytes = ~0ull; else if (size & 0x8000) bytes = (u64)(size & 0x7fff) << 10; - else if (size != 0x7fff) + else if (size != 0x7fff || dm->length < 0x20) bytes = (u64)size << 20; else bytes = (u64)get_unaligned((u32 *)&d[0x1C]) << 20; diff -Nru linux-4.19.98/drivers/firmware/efi/efi.c linux-4.19.118/drivers/firmware/efi/efi.c --- linux-4.19.98/drivers/firmware/efi/efi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/efi/efi.c 2020-04-23 08:30:24.000000000 +0000 @@ -572,7 +572,7 @@ } } - if (efi_enabled(EFI_MEMMAP)) + if (!IS_ENABLED(CONFIG_X86_32) && efi_enabled(EFI_MEMMAP)) efi_memattr_init(); efi_tpm_eventlog_init(); diff -Nru linux-4.19.98/drivers/firmware/efi/efivars.c linux-4.19.118/drivers/firmware/efi/efivars.c --- linux-4.19.98/drivers/firmware/efi/efivars.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/efi/efivars.c 2020-04-23 08:30:24.000000000 +0000 @@ -139,13 +139,16 @@ efivar_attr_read(struct efivar_entry *entry, char *buf) { struct efi_variable *var = &entry->var; + unsigned long size = sizeof(var->Data); char *str = buf; + int ret; if (!entry || !buf) return -EINVAL; - var->DataSize = 1024; - if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) + ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); + var->DataSize = size; + if (ret) return -EIO; if (var->Attributes & EFI_VARIABLE_NON_VOLATILE) @@ -172,13 +175,16 @@ efivar_size_read(struct efivar_entry *entry, char *buf) { struct efi_variable *var = &entry->var; + unsigned long size = sizeof(var->Data); char *str = buf; + int ret; if (!entry || !buf) return -EINVAL; - var->DataSize = 1024; - if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) + ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); + var->DataSize = size; + if (ret) return -EIO; str += sprintf(str, "0x%lx\n", var->DataSize); @@ -189,12 +195,15 @@ efivar_data_read(struct efivar_entry *entry, char *buf) { struct efi_variable *var = &entry->var; + unsigned long size = sizeof(var->Data); + int ret; if (!entry || !buf) return -EINVAL; - var->DataSize = 1024; - if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data)) + ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data); + var->DataSize = size; + if (ret) return -EIO; memcpy(buf, var->Data, var->DataSize); @@ -263,6 +272,9 @@ u8 *data; int err; + if (!entry || !buf) + return -EINVAL; + if (is_compat()) { struct compat_efi_variable *compat; @@ -314,14 +326,16 @@ { struct efi_variable *var = &entry->var; struct compat_efi_variable *compat; + unsigned long datasize = sizeof(var->Data); size_t size; + int ret; if (!entry || !buf) return 0; - var->DataSize = 1024; - if (efivar_entry_get(entry, &entry->var.Attributes, - &entry->var.DataSize, entry->var.Data)) + ret = efivar_entry_get(entry, &var->Attributes, &datasize, var->Data); + var->DataSize = datasize; + if (ret) return -EIO; if (is_compat()) { diff -Nru linux-4.19.98/drivers/firmware/efi/runtime-wrappers.c linux-4.19.118/drivers/firmware/efi/runtime-wrappers.c --- linux-4.19.98/drivers/firmware/efi/runtime-wrappers.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/efi/runtime-wrappers.c 2020-04-23 08:30:24.000000000 +0000 @@ -45,39 +45,7 @@ #define __efi_call_virt(f, args...) \ __efi_call_virt_pointer(efi.systab->runtime, f, args) -/* efi_runtime_service() function identifiers */ -enum efi_rts_ids { - GET_TIME, - SET_TIME, - GET_WAKEUP_TIME, - SET_WAKEUP_TIME, - GET_VARIABLE, - GET_NEXT_VARIABLE, - SET_VARIABLE, - QUERY_VARIABLE_INFO, - GET_NEXT_HIGH_MONO_COUNT, - UPDATE_CAPSULE, - QUERY_CAPSULE_CAPS, -}; - -/* - * efi_runtime_work: Details of EFI Runtime Service work - * @arg<1-5>: EFI Runtime Service function arguments - * @status: Status of executing EFI Runtime Service - * @efi_rts_id: EFI Runtime Service function identifier - * @efi_rts_comp: Struct used for handling completions - */ -struct efi_runtime_work { - void *arg1; - void *arg2; - void *arg3; - void *arg4; - void *arg5; - efi_status_t status; - struct work_struct work; - enum efi_rts_ids efi_rts_id; - struct completion efi_rts_comp; -}; +struct efi_runtime_work efi_rts_work; /* * efi_queue_work: Queue efi_runtime_service() and wait until it's done @@ -91,7 +59,6 @@ */ #define efi_queue_work(_rts, _arg1, _arg2, _arg3, _arg4, _arg5) \ ({ \ - struct efi_runtime_work efi_rts_work; \ efi_rts_work.status = EFI_ABORTED; \ \ init_completion(&efi_rts_work.efi_rts_comp); \ @@ -191,18 +158,16 @@ */ static void efi_call_rts(struct work_struct *work) { - struct efi_runtime_work *efi_rts_work; void *arg1, *arg2, *arg3, *arg4, *arg5; efi_status_t status = EFI_NOT_FOUND; - efi_rts_work = container_of(work, struct efi_runtime_work, work); - arg1 = efi_rts_work->arg1; - arg2 = efi_rts_work->arg2; - arg3 = efi_rts_work->arg3; - arg4 = efi_rts_work->arg4; - arg5 = efi_rts_work->arg5; + arg1 = efi_rts_work.arg1; + arg2 = efi_rts_work.arg2; + arg3 = efi_rts_work.arg3; + arg4 = efi_rts_work.arg4; + arg5 = efi_rts_work.arg5; - switch (efi_rts_work->efi_rts_id) { + switch (efi_rts_work.efi_rts_id) { case GET_TIME: status = efi_call_virt(get_time, (efi_time_t *)arg1, (efi_time_cap_t *)arg2); @@ -260,8 +225,8 @@ */ pr_err("Requested executing invalid EFI Runtime Service.\n"); } - efi_rts_work->status = status; - complete(&efi_rts_work->efi_rts_comp); + efi_rts_work.status = status; + complete(&efi_rts_work.efi_rts_comp); } static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) diff -Nru linux-4.19.98/drivers/firmware/google/coreboot_table-of.c linux-4.19.118/drivers/firmware/google/coreboot_table-of.c --- linux-4.19.98/drivers/firmware/google/coreboot_table-of.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/firmware/google/coreboot_table-of.c 2020-04-23 08:30:24.000000000 +0000 @@ -19,7 +19,6 @@ #include #include #include -#include #include #include "coreboot_table.h" @@ -30,7 +29,6 @@ void __iomem *ptr; ptr = of_iomap(fw_dn, 0); - of_node_put(fw_dn); if (!ptr) return -ENOMEM; @@ -44,8 +42,9 @@ static const struct of_device_id coreboot_of_match[] = { { .compatible = "coreboot" }, - {}, + {} }; +MODULE_DEVICE_TABLE(of, coreboot_of_match); static struct platform_driver coreboot_table_of_driver = { .probe = coreboot_table_of_probe, @@ -55,28 +54,7 @@ .of_match_table = coreboot_of_match, }, }; - -static int __init platform_coreboot_table_of_init(void) -{ - struct platform_device *pdev; - struct device_node *of_node; - - /* Limit device creation to the presence of /firmware/coreboot node */ - of_node = of_find_node_by_path("/firmware/coreboot"); - if (!of_node) - return -ENODEV; - - if (!of_match_node(coreboot_of_match, of_node)) - return -ENODEV; - - pdev = of_platform_device_create(of_node, "coreboot_table_of", NULL); - if (!pdev) - return -ENODEV; - - return platform_driver_register(&coreboot_table_of_driver); -} - -module_init(platform_coreboot_table_of_init); +module_platform_driver(coreboot_table_of_driver); MODULE_AUTHOR("Google, Inc."); MODULE_LICENSE("GPL"); diff -Nru linux-4.19.98/drivers/fsi/fsi-core.c linux-4.19.118/drivers/fsi/fsi-core.c --- linux-4.19.98/drivers/fsi/fsi-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/fsi/fsi-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -1060,6 +1060,14 @@ } + rc = fsi_slave_set_smode(slave); + if (rc) { + dev_warn(&master->dev, + "can't set smode on slave:%02x:%02x %d\n", + link, id, rc); + goto err_free; + } + /* Allocate a minor in the FSI space */ rc = __fsi_get_new_minor(slave, fsi_dev_cfam, &slave->dev.devt, &slave->cdev_idx); @@ -1071,17 +1079,14 @@ rc = cdev_device_add(&slave->cdev, &slave->dev); if (rc) { dev_err(&slave->dev, "Error %d creating slave device\n", rc); - goto err_free; + goto err_free_ida; } - rc = fsi_slave_set_smode(slave); - if (rc) { - dev_warn(&master->dev, - "can't set smode on slave:%02x:%02x %d\n", - link, id, rc); - kfree(slave); - return -ENODEV; - } + /* Now that we have the cdev registered with the core, any fatal + * failures beyond this point will need to clean up through + * cdev_device_del(). Fortunately though, nothing past here is fatal. + */ + if (master->link_config) master->link_config(master, link, slave->t_send_delay, @@ -1098,10 +1103,13 @@ dev_dbg(&master->dev, "failed during slave scan with: %d\n", rc); - return rc; + return 0; - err_free: - put_device(&slave->dev); +err_free_ida: + fsi_free_minor(slave->dev.devt); +err_free: + of_node_put(slave->dev.of_node); + kfree(slave); return rc; } diff -Nru linux-4.19.98/drivers/fsi/fsi-sbefifo.c linux-4.19.118/drivers/fsi/fsi-sbefifo.c --- linux-4.19.98/drivers/fsi/fsi-sbefifo.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/fsi/fsi-sbefifo.c 2020-04-23 08:30:24.000000000 +0000 @@ -289,11 +289,11 @@ switch ((sbm & CFAM_SBM_SBE_STATE_MASK) >> CFAM_SBM_SBE_STATE_SHIFT) { case SBE_STATE_UNKNOWN: return -ESHUTDOWN; + case SBE_STATE_DMT: + return -EBUSY; case SBE_STATE_IPLING: case SBE_STATE_ISTEP: case SBE_STATE_MPIPL: - case SBE_STATE_DMT: - return -EBUSY; case SBE_STATE_RUNTIME: case SBE_STATE_DUMP: /* Not sure about that one */ break; diff -Nru linux-4.19.98/drivers/gpio/Kconfig linux-4.19.118/drivers/gpio/Kconfig --- linux-4.19.98/drivers/gpio/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpio/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -1059,6 +1059,7 @@ config GPIO_MAX77620 tristate "GPIO support for PMIC MAX77620 and MAX20024" depends on MFD_MAX77620 + select GPIOLIB_IRQCHIP help GPIO driver for MAX77620 and MAX20024 PMIC from Maxim Semiconductor. MAX77620 PMIC has 8 pins that can be configured as GPIOs. The diff -Nru linux-4.19.98/drivers/gpio/gpio-aspeed.c linux-4.19.118/drivers/gpio/gpio-aspeed.c --- linux-4.19.98/drivers/gpio/gpio-aspeed.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpio/gpio-aspeed.c 2020-04-23 08:30:24.000000000 +0000 @@ -1199,7 +1199,7 @@ gpio->chip.irq.need_valid_mask = true; /* Allocate a cache of the output registers */ - banks = gpio->config->nr_gpios >> 5; + banks = DIV_ROUND_UP(gpio->config->nr_gpios, 32); gpio->dcache = devm_kcalloc(&pdev->dev, banks, sizeof(u32), GFP_KERNEL); if (!gpio->dcache) diff -Nru linux-4.19.98/drivers/gpio/gpio-grgpio.c linux-4.19.118/drivers/gpio/gpio-grgpio.c --- linux-4.19.98/drivers/gpio/gpio-grgpio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpio/gpio-grgpio.c 2020-04-23 08:30:24.000000000 +0000 @@ -258,17 +258,16 @@ lirq->irq = irq; uirq = &priv->uirqs[lirq->index]; if (uirq->refcnt == 0) { + spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); ret = request_irq(uirq->uirq, grgpio_irq_handler, 0, dev_name(priv->dev), priv); if (ret) { dev_err(priv->dev, "Could not request underlying irq %d\n", uirq->uirq); - - spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); - return ret; } + spin_lock_irqsave(&priv->gc.bgpio_lock, flags); } uirq->refcnt++; @@ -314,8 +313,11 @@ if (index >= 0) { uirq = &priv->uirqs[lirq->index]; uirq->refcnt--; - if (uirq->refcnt == 0) + if (uirq->refcnt == 0) { + spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); free_irq(uirq->uirq, priv); + return; + } } spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags); diff -Nru linux-4.19.98/drivers/gpio/gpio-zynq.c linux-4.19.118/drivers/gpio/gpio-zynq.c --- linux-4.19.98/drivers/gpio/gpio-zynq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpio/gpio-zynq.c 2020-04-23 08:30:24.000000000 +0000 @@ -358,6 +358,28 @@ } /** + * zynq_gpio_get_direction - Read the direction of the specified GPIO pin + * @chip: gpio_chip instance to be worked on + * @pin: gpio pin number within the device + * + * This function returns the direction of the specified GPIO. + * + * Return: 0 for output, 1 for input + */ +static int zynq_gpio_get_direction(struct gpio_chip *chip, unsigned int pin) +{ + u32 reg; + unsigned int bank_num, bank_pin_num; + struct zynq_gpio *gpio = gpiochip_get_data(chip); + + zynq_gpio_get_bank_pin(pin, &bank_num, &bank_pin_num, gpio); + + reg = readl_relaxed(gpio->base_addr + ZYNQ_GPIO_DIRM_OFFSET(bank_num)); + + return !(reg & BIT(bank_pin_num)); +} + +/** * zynq_gpio_irq_mask - Disable the interrupts for a gpio pin * @irq_data: per irq and chip data passed down to chip functions * @@ -829,6 +851,7 @@ chip->free = zynq_gpio_free; chip->direction_input = zynq_gpio_dir_in; chip->direction_output = zynq_gpio_dir_out; + chip->get_direction = zynq_gpio_get_direction; chip->base = of_alias_get_id(pdev->dev.of_node, "gpio"); chip->ngpio = gpio->p_data->ngpio; diff -Nru linux-4.19.98/drivers/gpio/gpiolib-acpi.c linux-4.19.118/drivers/gpio/gpiolib-acpi.c --- linux-4.19.98/drivers/gpio/gpiolib-acpi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpio/gpiolib-acpi.c 2020-04-23 08:30:24.000000000 +0000 @@ -24,18 +24,21 @@ #include "gpiolib.h" -#define QUIRK_NO_EDGE_EVENTS_ON_BOOT 0x01l -#define QUIRK_NO_WAKEUP 0x02l - static int run_edge_events_on_boot = -1; module_param(run_edge_events_on_boot, int, 0444); MODULE_PARM_DESC(run_edge_events_on_boot, "Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto"); -static int honor_wakeup = -1; -module_param(honor_wakeup, int, 0444); -MODULE_PARM_DESC(honor_wakeup, - "Honor the ACPI wake-capable flag: 0=no, 1=yes, -1=auto"); +static char *ignore_wake; +module_param(ignore_wake, charp, 0444); +MODULE_PARM_DESC(ignore_wake, + "controller@pin combos on which to ignore the ACPI wake flag " + "ignore_wake=controller@pin[,controller@pin[,...]]"); + +struct acpi_gpiolib_dmi_quirk { + bool no_edge_events_on_boot; + char *ignore_wake; +}; /** * struct acpi_gpio_event - ACPI GPIO event handler data @@ -205,6 +208,57 @@ acpi_gpiochip_request_irq(acpi_gpio, event); } +static bool acpi_gpio_in_ignore_list(const char *controller_in, int pin_in) +{ + const char *controller, *pin_str; + int len, pin; + char *endp; + + controller = ignore_wake; + while (controller) { + pin_str = strchr(controller, '@'); + if (!pin_str) + goto err; + + len = pin_str - controller; + if (len == strlen(controller_in) && + strncmp(controller, controller_in, len) == 0) { + pin = simple_strtoul(pin_str + 1, &endp, 10); + if (*endp != 0 && *endp != ',') + goto err; + + if (pin == pin_in) + return true; + } + + controller = strchr(controller, ','); + if (controller) + controller++; + } + + return false; +err: + pr_err_once("Error invalid value for gpiolib_acpi.ignore_wake: %s\n", + ignore_wake); + return false; +} + +static bool acpi_gpio_irq_is_wake(struct device *parent, + struct acpi_resource_gpio *agpio) +{ + int pin = agpio->pin_table[0]; + + if (agpio->wake_capable != ACPI_WAKE_CAPABLE) + return false; + + if (acpi_gpio_in_ignore_list(dev_name(parent), pin)) { + dev_info(parent, "Ignoring wakeup on pin %d\n", pin); + return false; + } + + return true; +} + static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, void *context) { @@ -286,7 +340,7 @@ event->handle = evt_handle; event->handler = handler; event->irq = irq; - event->irq_is_wake = honor_wakeup && agpio->wake_capable == ACPI_WAKE_CAPABLE; + event->irq_is_wake = acpi_gpio_irq_is_wake(chip->parent, agpio); event->pin = pin; event->desc = desc; @@ -1282,7 +1336,9 @@ DMI_MATCH(DMI_SYS_VENDOR, "MINIX"), DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"), }, - .driver_data = (void *)QUIRK_NO_EDGE_EVENTS_ON_BOOT, + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { + .no_edge_events_on_boot = true, + }, }, { /* @@ -1295,16 +1351,20 @@ DMI_MATCH(DMI_SYS_VENDOR, "Wortmann_AG"), DMI_MATCH(DMI_PRODUCT_NAME, "TERRA_PAD_1061"), }, - .driver_data = (void *)QUIRK_NO_EDGE_EVENTS_ON_BOOT, + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { + .no_edge_events_on_boot = true, + }, }, { /* - * Various HP X2 10 Cherry Trail models use an external - * embedded-controller connected via I2C + an ACPI GPIO - * event handler. The embedded controller generates various - * spurious wakeup events when suspended. So disable wakeup - * for its handler (it uses the only ACPI GPIO event handler). - * This breaks wakeup when opening the lid, the user needs + * HP X2 10 models with Cherry Trail SoC + TI PMIC use an + * external embedded-controller connected via I2C + an ACPI GPIO + * event handler on INT33FF:01 pin 0, causing spurious wakeups. + * When suspending by closing the LID, the power to the USB + * keyboard is turned off, causing INT0002 ACPI events to + * trigger once the XHCI controller notices the keyboard is + * gone. So INT0002 events cause spurious wakeups too. Ignoring + * EC wakes breaks wakeup when opening the lid, the user needs * to press the power-button to wakeup the system. The * alternative is suspend simply not working, which is worse. */ @@ -1312,33 +1372,61 @@ DMI_MATCH(DMI_SYS_VENDOR, "HP"), DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"), }, - .driver_data = (void *)QUIRK_NO_WAKEUP, + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { + .ignore_wake = "INT33FF:01@0,INT0002:00@2", + }, + }, + { + /* + * HP X2 10 models with Bay Trail SoC + AXP288 PMIC use an + * external embedded-controller connected via I2C + an ACPI GPIO + * event handler on INT33FC:02 pin 28, causing spurious wakeups. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"), + DMI_MATCH(DMI_BOARD_NAME, "815D"), + }, + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { + .ignore_wake = "INT33FC:02@28", + }, + }, + { + /* + * HP X2 10 models with Cherry Trail SoC + AXP288 PMIC use an + * external embedded-controller connected via I2C + an ACPI GPIO + * event handler on INT33FF:01 pin 0, causing spurious wakeups. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "HP"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"), + DMI_MATCH(DMI_BOARD_NAME, "813E"), + }, + .driver_data = &(struct acpi_gpiolib_dmi_quirk) { + .ignore_wake = "INT33FF:01@0", + }, }, {} /* Terminating entry */ }; static int acpi_gpio_setup_params(void) { + const struct acpi_gpiolib_dmi_quirk *quirk = NULL; const struct dmi_system_id *id; - long quirks = 0; id = dmi_first_match(gpiolib_acpi_quirks); if (id) - quirks = (long)id->driver_data; + quirk = id->driver_data; if (run_edge_events_on_boot < 0) { - if (quirks & QUIRK_NO_EDGE_EVENTS_ON_BOOT) + if (quirk && quirk->no_edge_events_on_boot) run_edge_events_on_boot = 0; else run_edge_events_on_boot = 1; } - if (honor_wakeup < 0) { - if (quirks & QUIRK_NO_WAKEUP) - honor_wakeup = 0; - else - honor_wakeup = 1; - } + if (ignore_wake == NULL && quirk && quirk->ignore_wake) + ignore_wake = quirk->ignore_wake; return 0; } diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c linux-4.19.118/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c --- linux-4.19.98/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c 2020-04-23 08:30:24.000000000 +0000 @@ -337,17 +337,9 @@ path_size += le16_to_cpu(path->usSize); if (device_support & le16_to_cpu(path->usDeviceTag)) { - uint8_t con_obj_id, con_obj_num, con_obj_type; - - con_obj_id = + uint8_t con_obj_id = (le16_to_cpu(path->usConnObjectId) & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; - con_obj_num = - (le16_to_cpu(path->usConnObjectId) & ENUM_ID_MASK) - >> ENUM_ID_SHIFT; - con_obj_type = - (le16_to_cpu(path->usConnObjectId) & - OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; /* Skip TV/CV support */ if ((le16_to_cpu(path->usDeviceTag) == @@ -372,15 +364,7 @@ router.ddc_valid = false; router.cd_valid = false; for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) { - uint8_t grph_obj_id, grph_obj_num, grph_obj_type; - - grph_obj_id = - (le16_to_cpu(path->usGraphicObjIds[j]) & - OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; - grph_obj_num = - (le16_to_cpu(path->usGraphicObjIds[j]) & - ENUM_ID_MASK) >> ENUM_ID_SHIFT; - grph_obj_type = + uint8_t grph_obj_type = (le16_to_cpu(path->usGraphicObjIds[j]) & OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c linux-4.19.118/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c --- linux-4.19.98/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -694,11 +694,11 @@ ssize_t result = 0; uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data; - if (size & 3 || *pos & 3) + if (size > 4096 || size & 3 || *pos & 3) return -EINVAL; /* decode offset */ - offset = *pos & GENMASK_ULL(11, 0); + offset = (*pos & GENMASK_ULL(11, 0)) >> 2; se = (*pos & GENMASK_ULL(19, 12)) >> 12; sh = (*pos & GENMASK_ULL(27, 20)) >> 20; cu = (*pos & GENMASK_ULL(35, 28)) >> 28; @@ -729,7 +729,7 @@ while (size) { uint32_t value; - value = data[offset++]; + value = data[result >> 2]; r = put_user(value, (uint32_t *)buf); if (r) { result = r; diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h linux-4.19.118/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h --- linux-4.19.98/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h 2020-04-23 08:30:24.000000000 +0000 @@ -97,6 +97,7 @@ uint32_t srbm_soft_reset; bool prt_warning; uint64_t stolen_size; + uint32_t sdpif_register; /* apertures */ u64 shared_aperture_start; u64 shared_aperture_end; diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c linux-4.19.118/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c --- linux-4.19.98/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c 2020-04-23 08:30:24.000000000 +0000 @@ -993,6 +993,19 @@ } /** + * gmc_v9_0_restore_registers - restores regs + * + * @adev: amdgpu_device pointer + * + * This restores register values, saved at suspend. + */ +static void gmc_v9_0_restore_registers(struct amdgpu_device *adev) +{ + if (adev->asic_type == CHIP_RAVEN) + WREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0, adev->gmc.sdpif_register); +} + +/** * gmc_v9_0_gart_enable - gart enable * * @adev: amdgpu_device pointer @@ -1081,6 +1094,20 @@ } /** + * gmc_v9_0_save_registers - saves regs + * + * @adev: amdgpu_device pointer + * + * This saves potential register values that should be + * restored upon resume + */ +static void gmc_v9_0_save_registers(struct amdgpu_device *adev) +{ + if (adev->asic_type == CHIP_RAVEN) + adev->gmc.sdpif_register = RREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0); +} + +/** * gmc_v9_0_gart_disable - gart disable * * @adev: amdgpu_device pointer @@ -1112,9 +1139,16 @@ static int gmc_v9_0_suspend(void *handle) { + int r; struct amdgpu_device *adev = (struct amdgpu_device *)handle; - return gmc_v9_0_hw_fini(adev); + r = gmc_v9_0_hw_fini(adev); + if (r) + return r; + + gmc_v9_0_save_registers(adev); + + return 0; } static int gmc_v9_0_resume(void *handle) @@ -1122,6 +1156,7 @@ int r; struct amdgpu_device *adev = (struct amdgpu_device *)handle; + gmc_v9_0_restore_registers(adev); r = gmc_v9_0_hw_init(adev); if (r) return r; diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdgpu/soc15.c linux-4.19.118/drivers/gpu/drm/amd/amdgpu/soc15.c --- linux-4.19.98/drivers/gpu/drm/amd/amdgpu/soc15.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdgpu/soc15.c 2020-04-23 08:30:24.000000000 +0000 @@ -205,7 +205,12 @@ static u32 soc15_get_xclk(struct amdgpu_device *adev) { - return adev->clock.spll.reference_freq; + u32 reference_clock = adev->clock.spll.reference_freq; + + if (adev->asic_type == CHIP_RAVEN) + return reference_clock / 4; + + return reference_clock; } diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdgpu/soc15_common.h linux-4.19.118/drivers/gpu/drm/amd/amdgpu/soc15_common.h --- linux-4.19.98/drivers/gpu/drm/amd/amdgpu/soc15_common.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdgpu/soc15_common.h 2020-04-23 08:30:24.000000000 +0000 @@ -51,6 +51,7 @@ do { \ uint32_t tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \ uint32_t loop = adev->usec_timeout; \ + ret = 0; \ while ((tmp_ & (mask)) != (expected_value)) { \ udelay(2); \ tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \ diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c linux-4.19.118/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c --- linux-4.19.98/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c 2020-04-23 08:30:24.000000000 +0000 @@ -857,7 +857,7 @@ if (enable) { /* wait for STATUS to clear */ - if (vcn_v1_0_is_idle(handle)) + if (!vcn_v1_0_is_idle(handle)) return -EBUSY; vcn_v1_0_enable_clock_gating(adev); } else { diff -Nru linux-4.19.98/drivers/gpu/drm/amd/amdkfd/kfd_device.c linux-4.19.118/drivers/gpu/drm/amd/amdkfd/kfd_device.c --- linux-4.19.98/drivers/gpu/drm/amd/amdkfd/kfd_device.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/amdkfd/kfd_device.c 2020-04-23 08:30:24.000000000 +0000 @@ -921,9 +921,9 @@ return 0; kfd_gtt_no_free_chunk: - pr_debug("Allocation failed with mem_obj = %p\n", mem_obj); + pr_debug("Allocation failed with mem_obj = %p\n", *mem_obj); mutex_unlock(&kfd->gtt_sa_lock); - kfree(mem_obj); + kfree(*mem_obj); return -ENOMEM; } diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c linux-4.19.118/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c --- linux-4.19.98/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c 2020-04-23 08:30:24.000000000 +0000 @@ -248,7 +248,8 @@ drm_dp_mst_reset_vcpi_slots(mst_mgr, mst_port); } - ret = drm_dp_update_payload_part1(mst_mgr); + /* It's OK for this to fail */ + drm_dp_update_payload_part1(mst_mgr); /* mst_mgr->->payloads are VC payload notify MST branch using DPCD or * AUX message. The sequence is slot 1-63 allocated sequence for each @@ -257,9 +258,6 @@ get_payload_table(aconnector, proposed_table); - if (ret) - return false; - return true; } @@ -310,7 +308,6 @@ struct amdgpu_dm_connector *aconnector; struct drm_dp_mst_topology_mgr *mst_mgr; struct drm_dp_mst_port *mst_port; - int ret; aconnector = stream->sink->priv; @@ -324,10 +321,8 @@ if (!mst_mgr->mst_state) return false; - ret = drm_dp_update_payload_part2(mst_mgr); - - if (ret) - return false; + /* It's OK for this to fail */ + drm_dp_update_payload_part2(mst_mgr); if (!enable) drm_dp_mst_deallocate_vcpi(mst_mgr, mst_port); diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c linux-4.19.118/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c --- linux-4.19.98/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c 2020-04-23 08:30:24.000000000 +0000 @@ -419,6 +419,7 @@ dc_link_remove_remote_sink(aconnector->dc_link, aconnector->dc_sink); dc_sink_release(aconnector->dc_sink); aconnector->dc_sink = NULL; + aconnector->dc_link->cur_link_settings.lane_count = 0; } drm_connector_unregister(connector); diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_math.h linux-4.19.118/drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_math.h --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_math.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_math.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - * Copyright 2017 Advanced Micro Devices, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: AMD - * - */ - -#ifndef _DCN_CALC_MATH_H_ -#define _DCN_CALC_MATH_H_ - -float dcn_bw_mod(const float arg1, const float arg2); -float dcn_bw_min2(const float arg1, const float arg2); -unsigned int dcn_bw_max(const unsigned int arg1, const unsigned int arg2); -float dcn_bw_max2(const float arg1, const float arg2); -float dcn_bw_floor2(const float arg, const float significance); -float dcn_bw_ceil2(const float arg, const float significance); -float dcn_bw_max3(float v1, float v2, float v3); -float dcn_bw_max5(float v1, float v2, float v3, float v4, float v5); -float dcn_bw_pow(float a, float exp); -float dcn_bw_log(float a, float b); - -#endif /* _DCN_CALC_MATH_H_ */ diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c linux-4.19.118/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c 2020-04-23 08:30:24.000000000 +0000 @@ -1346,6 +1346,7 @@ struct dc_context *ctx = dc->ctx; struct dm_pp_clock_levels_with_voltage fclks = {0}, dcfclks = {0}; bool res; + unsigned vmin0p65_idx, vmid0p72_idx, vnom0p8_idx, vmax0p9_idx; /* TODO: This is not the proper way to obtain fabric_and_dram_bandwidth, should be min(fclk, memclk) */ res = dm_pp_get_clock_levels_by_type_with_voltage( @@ -1357,17 +1358,28 @@ res = verify_clock_values(&fclks); if (res) { - ASSERT(fclks.num_levels >= 3); - dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 32 * (fclks.data[0].clocks_in_khz / 1000.0) / 1000.0; - dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc->number_of_channels * - (fclks.data[fclks.num_levels - (fclks.num_levels > 2 ? 3 : 2)].clocks_in_khz / 1000.0) - * ddr4_dram_factor_single_Channel / 1000.0; - dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = dc->dcn_soc->number_of_channels * - (fclks.data[fclks.num_levels - 2].clocks_in_khz / 1000.0) - * ddr4_dram_factor_single_Channel / 1000.0; - dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = dc->dcn_soc->number_of_channels * - (fclks.data[fclks.num_levels - 1].clocks_in_khz / 1000.0) - * ddr4_dram_factor_single_Channel / 1000.0; + ASSERT(fclks.num_levels); + + vmin0p65_idx = 0; + vmid0p72_idx = fclks.num_levels - + (fclks.num_levels > 2 ? 3 : (fclks.num_levels > 1 ? 2 : 1)); + vnom0p8_idx = fclks.num_levels - (fclks.num_levels > 1 ? 2 : 1); + vmax0p9_idx = fclks.num_levels - 1; + + dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = + 32 * (fclks.data[vmin0p65_idx].clocks_in_khz / 1000.0) / 1000.0; + dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = + dc->dcn_soc->number_of_channels * + (fclks.data[vmid0p72_idx].clocks_in_khz / 1000.0) + * ddr4_dram_factor_single_Channel / 1000.0; + dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = + dc->dcn_soc->number_of_channels * + (fclks.data[vnom0p8_idx].clocks_in_khz / 1000.0) + * ddr4_dram_factor_single_Channel / 1000.0; + dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = + dc->dcn_soc->number_of_channels * + (fclks.data[vmax0p9_idx].clocks_in_khz / 1000.0) + * ddr4_dram_factor_single_Channel / 1000.0; } else BREAK_TO_DEBUGGER(); diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/core/dc_link.c linux-4.19.118/drivers/gpu/drm/amd/display/dc/core/dc_link.c --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/core/dc_link.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/core/dc_link.c 2020-04-23 08:30:24.000000000 +0000 @@ -780,8 +780,7 @@ same_edid = is_same_edid(&prev_sink->dc_edid, &sink->dc_edid); if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && - sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX && - reason != DETECT_REASON_HPDRX) { + sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX) { /* * TODO debug why Dell 2413 doesn't like * two link trainings diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c linux-4.19.118/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c 2020-04-23 08:30:24.000000000 +0000 @@ -2440,6 +2440,17 @@ sink_id.ieee_device_id, sizeof(sink_id.ieee_device_id)); + /* Quirk Apple MBP 2017 15" Retina panel: Wrong DP_MAX_LINK_RATE */ + { + uint8_t str_mbp_2017[] = { 101, 68, 21, 101, 98, 97 }; + + if ((link->dpcd_caps.sink_dev_id == 0x0010fa) && + !memcmp(link->dpcd_caps.sink_dev_id_str, str_mbp_2017, + sizeof(str_mbp_2017))) { + link->reported_link_cap.link_rate = 0x0c; + } + } + core_link_read_dpcd( link, DP_SINK_HW_REVISION_START, diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c linux-4.19.118/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c 2020-04-23 08:30:24.000000000 +0000 @@ -684,8 +684,8 @@ hubbub1_get_blk256_size(&blk256_width, &blk256_height, bpe); - swath_bytes_horz_wc = height * blk256_height * bpe; - swath_bytes_vert_wc = width * blk256_width * bpe; + swath_bytes_horz_wc = width * blk256_height * bpe; + swath_bytes_vert_wc = height * blk256_width * bpe; *req128_horz_wc = (2 * swath_bytes_horz_wc <= detile_buf_size) ? false : /* full 256B request */ diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c linux-4.19.118/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/dml/dml_common_defs.c 2020-04-23 08:30:24.000000000 +0000 @@ -24,7 +24,7 @@ */ #include "dml_common_defs.h" -#include "../calcs/dcn_calc_math.h" +#include "dcn_calc_math.h" #include "dml_inline_defs.h" diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h linux-4.19.118/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/dml/dml_inline_defs.h 2020-04-23 08:30:24.000000000 +0000 @@ -27,7 +27,7 @@ #define __DML_INLINE_DEFS_H__ #include "dml_common_defs.h" -#include "../calcs/dcn_calc_math.h" +#include "dcn_calc_math.h" #include "dml_logger.h" static inline double dml_min(double a, double b) diff -Nru linux-4.19.98/drivers/gpu/drm/amd/display/dc/inc/dcn_calc_math.h linux-4.19.118/drivers/gpu/drm/amd/display/dc/inc/dcn_calc_math.h --- linux-4.19.98/drivers/gpu/drm/amd/display/dc/inc/dcn_calc_math.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/display/dc/inc/dcn_calc_math.h 2020-04-23 08:30:24.000000000 +0000 @@ -0,0 +1,40 @@ +/* + * Copyright 2017 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: AMD + * + */ + +#ifndef _DCN_CALC_MATH_H_ +#define _DCN_CALC_MATH_H_ + +float dcn_bw_mod(const float arg1, const float arg2); +float dcn_bw_min2(const float arg1, const float arg2); +unsigned int dcn_bw_max(const unsigned int arg1, const unsigned int arg2); +float dcn_bw_max2(const float arg1, const float arg2); +float dcn_bw_floor2(const float arg, const float significance); +float dcn_bw_ceil2(const float arg, const float significance); +float dcn_bw_max3(float v1, float v2, float v3); +float dcn_bw_max5(float v1, float v2, float v3, float v4, float v5); +float dcn_bw_pow(float a, float exp); +float dcn_bw_log(float a, float b); + +#endif /* _DCN_CALC_MATH_H_ */ diff -Nru linux-4.19.98/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h linux-4.19.118/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h --- linux-4.19.98/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/include/asic_reg/dce/dce_12_0_offset.h 2020-04-23 08:30:24.000000000 +0000 @@ -7376,6 +7376,8 @@ #define mmCRTC4_CRTC_DRR_CONTROL 0x0f3e #define mmCRTC4_CRTC_DRR_CONTROL_BASE_IDX 2 +#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0 0x395d +#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0_BASE_IDX 2 // addressBlock: dce_dc_fmt4_dispdec // base address: 0x2000 diff -Nru linux-4.19.98/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c linux-4.19.118/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c --- linux-4.19.98/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c 2020-04-23 08:30:24.000000000 +0000 @@ -994,12 +994,15 @@ clocks->num_levels = 0; for (i = 0; i < pclk_vol_table->count; i++) { - clocks->data[i].clocks_in_khz = pclk_vol_table->entries[i].clk * 10; - clocks->data[i].latency_in_us = latency_required ? - smu10_get_mem_latency(hwmgr, - pclk_vol_table->entries[i].clk) : - 0; - clocks->num_levels++; + if (pclk_vol_table->entries[i].clk) { + clocks->data[clocks->num_levels].clocks_in_khz = + pclk_vol_table->entries[i].clk * 10; + clocks->data[clocks->num_levels].latency_in_us = latency_required ? + smu10_get_mem_latency(hwmgr, + pclk_vol_table->entries[i].clk) : + 0; + clocks->num_levels++; + } } return 0; @@ -1045,9 +1048,11 @@ clocks->num_levels = 0; for (i = 0; i < pclk_vol_table->count; i++) { - clocks->data[i].clocks_in_khz = pclk_vol_table->entries[i].clk * 10; - clocks->data[i].voltage_in_mv = pclk_vol_table->entries[i].vol; - clocks->num_levels++; + if (pclk_vol_table->entries[i].clk) { + clocks->data[clocks->num_levels].clocks_in_khz = pclk_vol_table->entries[i].clk * 10; + clocks->data[clocks->num_levels].voltage_in_mv = pclk_vol_table->entries[i].vol; + clocks->num_levels++; + } } return 0; diff -Nru linux-4.19.98/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c linux-4.19.118/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c --- linux-4.19.98/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 2020-04-23 08:30:24.000000000 +0000 @@ -3788,9 +3788,12 @@ { uint32_t i; + /* force the trim if mclk_switching is disabled to prevent flicker */ + bool force_trim = (low_limit == high_limit); for (i = 0; i < dpm_table->count; i++) { /*skip the trim if od is enabled*/ - if (!hwmgr->od_enabled && (dpm_table->dpm_levels[i].value < low_limit + if ((!hwmgr->od_enabled || force_trim) + && (dpm_table->dpm_levels[i].value < low_limit || dpm_table->dpm_levels[i].value > high_limit)) dpm_table->dpm_levels[i].enabled = false; else diff -Nru linux-4.19.98/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c linux-4.19.118/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c --- linux-4.19.98/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c 2020-04-23 08:30:24.000000000 +0000 @@ -79,7 +79,11 @@ struct videomode vm; unsigned long prate; unsigned int cfg; - int div; + int div, ret; + + ret = clk_prepare_enable(crtc->dc->hlcdc->sys_clk); + if (ret) + return; vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; @@ -138,6 +142,8 @@ ATMEL_HLCDC_VSPSU | ATMEL_HLCDC_VSPHO | ATMEL_HLCDC_GUARDTIME_MASK | ATMEL_HLCDC_MODE_MASK, cfg); + + clk_disable_unprepare(crtc->dc->hlcdc->sys_clk); } static enum drm_mode_status diff -Nru linux-4.19.98/drivers/gpu/drm/bochs/bochs_hw.c linux-4.19.118/drivers/gpu/drm/bochs/bochs_hw.c --- linux-4.19.98/drivers/gpu/drm/bochs/bochs_hw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/bochs/bochs_hw.c 2020-04-23 08:30:24.000000000 +0000 @@ -97,10 +97,8 @@ size = min(size, mem); } - if (pci_request_region(pdev, 0, "bochs-drm") != 0) { - DRM_ERROR("Cannot request framebuffer\n"); - return -EBUSY; - } + if (pci_request_region(pdev, 0, "bochs-drm") != 0) + DRM_WARN("Cannot request framebuffer, boot fb still active?\n"); bochs->fb_map = ioremap(addr, size); if (bochs->fb_map == NULL) { diff -Nru linux-4.19.98/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c linux-4.19.118/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c --- linux-4.19.98/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -1364,28 +1364,34 @@ frame.colorspace = HDMI_COLORSPACE_RGB; /* Set up colorimetry */ - switch (hdmi->hdmi_data.enc_out_encoding) { - case V4L2_YCBCR_ENC_601: - if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) - frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; - else + if (!hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) { + switch (hdmi->hdmi_data.enc_out_encoding) { + case V4L2_YCBCR_ENC_601: + if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) + frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; + else + frame.colorimetry = HDMI_COLORIMETRY_ITU_601; + frame.extended_colorimetry = + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + break; + case V4L2_YCBCR_ENC_709: + if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709) + frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; + else + frame.colorimetry = HDMI_COLORIMETRY_ITU_709; + frame.extended_colorimetry = + HDMI_EXTENDED_COLORIMETRY_XV_YCC_709; + break; + default: /* Carries no data */ frame.colorimetry = HDMI_COLORIMETRY_ITU_601; + frame.extended_colorimetry = + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + break; + } + } else { + frame.colorimetry = HDMI_COLORIMETRY_NONE; frame.extended_colorimetry = - HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; - break; - case V4L2_YCBCR_ENC_709: - if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709) - frame.colorimetry = HDMI_COLORIMETRY_EXTENDED; - else - frame.colorimetry = HDMI_COLORIMETRY_ITU_709; - frame.extended_colorimetry = - HDMI_EXTENDED_COLORIMETRY_XV_YCC_709; - break; - default: /* Carries no data */ - frame.colorimetry = HDMI_COLORIMETRY_ITU_601; - frame.extended_colorimetry = - HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; - break; + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; } frame.scan_mode = HDMI_SCAN_MODE_NONE; diff -Nru linux-4.19.98/drivers/gpu/drm/drm_context.c linux-4.19.118/drivers/gpu/drm/drm_context.c --- linux-4.19.98/drivers/gpu/drm/drm_context.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/drm_context.c 2020-04-23 08:30:24.000000000 +0000 @@ -361,23 +361,26 @@ { struct drm_ctx_list *ctx_entry; struct drm_ctx *ctx = data; + int tmp_handle; if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) && !drm_core_check_feature(dev, DRIVER_LEGACY)) return -EINVAL; - ctx->handle = drm_legacy_ctxbitmap_next(dev); - if (ctx->handle == DRM_KERNEL_CONTEXT) { + tmp_handle = drm_legacy_ctxbitmap_next(dev); + if (tmp_handle == DRM_KERNEL_CONTEXT) { /* Skip kernel's context and get a new one. */ - ctx->handle = drm_legacy_ctxbitmap_next(dev); + tmp_handle = drm_legacy_ctxbitmap_next(dev); } - DRM_DEBUG("%d\n", ctx->handle); - if (ctx->handle < 0) { + DRM_DEBUG("%d\n", tmp_handle); + if (tmp_handle < 0) { DRM_DEBUG("Not enough free contexts.\n"); /* Should this return -EBUSY instead? */ - return -ENOMEM; + return tmp_handle; } + ctx->handle = tmp_handle; + ctx_entry = kmalloc(sizeof(*ctx_entry), GFP_KERNEL); if (!ctx_entry) { DRM_DEBUG("out of memory\n"); diff -Nru linux-4.19.98/drivers/gpu/drm/drm_debugfs_crc.c linux-4.19.118/drivers/gpu/drm/drm_debugfs_crc.c --- linux-4.19.98/drivers/gpu/drm/drm_debugfs_crc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/drm_debugfs_crc.c 2020-04-23 08:30:24.000000000 +0000 @@ -101,8 +101,8 @@ if (IS_ERR(source)) return PTR_ERR(source); - if (source[len] == '\n') - source[len] = '\0'; + if (source[len - 1] == '\n') + source[len - 1] = '\0'; spin_lock_irq(&crc->lock); diff -Nru linux-4.19.98/drivers/gpu/drm/drm_dp_mst_topology.c linux-4.19.118/drivers/gpu/drm/drm_dp_mst_topology.c --- linux-4.19.98/drivers/gpu/drm/drm_dp_mst_topology.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/drm_dp_mst_topology.c 2020-04-23 08:30:24.000000000 +0000 @@ -439,6 +439,7 @@ if (idx > raw->curlen) goto fail_len; repmsg->u.remote_dpcd_read_ack.num_bytes = raw->msg[idx]; + idx++; if (idx > raw->curlen) goto fail_len; @@ -2116,6 +2117,7 @@ int ret = 0; struct drm_dp_mst_branch *mstb = NULL; + mutex_lock(&mgr->payload_lock); mutex_lock(&mgr->lock); if (mst_state == mgr->mst_state) goto out_unlock; @@ -2174,7 +2176,10 @@ /* this can fail if the device is gone */ drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); ret = 0; - memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload)); + memset(mgr->payloads, 0, + mgr->max_payloads * sizeof(mgr->payloads[0])); + memset(mgr->proposed_vcpis, 0, + mgr->max_payloads * sizeof(mgr->proposed_vcpis[0])); mgr->payload_mask = 0; set_bit(0, &mgr->payload_mask); mgr->vcpi_mask = 0; @@ -2182,6 +2187,7 @@ out_unlock: mutex_unlock(&mgr->lock); + mutex_unlock(&mgr->payload_lock); if (mstb) drm_dp_put_mst_branch_device(mstb); return ret; diff -Nru linux-4.19.98/drivers/gpu/drm/drm_fb_helper.c linux-4.19.118/drivers/gpu/drm/drm_fb_helper.c --- linux-4.19.98/drivers/gpu/drm/drm_fb_helper.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/drm_fb_helper.c 2020-04-23 08:30:24.000000000 +0000 @@ -2979,18 +2979,16 @@ return 0; } -/* - * fb_ops.fb_destroy is called by the last put_fb_info() call at the end of - * unregister_framebuffer() or fb_release(). - */ -static void drm_fbdev_fb_destroy(struct fb_info *info) +static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper) { - struct drm_fb_helper *fb_helper = info->par; struct fb_info *fbi = fb_helper->fbdev; struct fb_ops *fbops = NULL; void *shadow = NULL; - if (fbi->fbdefio) { + if (!fb_helper->dev) + return; + + if (fbi && fbi->fbdefio) { fb_deferred_io_cleanup(fbi); shadow = fbi->screen_buffer; fbops = fbi->fbops; @@ -3004,6 +3002,12 @@ } drm_client_framebuffer_delete(fb_helper->buffer); +} + +static void drm_fbdev_release(struct drm_fb_helper *fb_helper) +{ + drm_fbdev_cleanup(fb_helper); + /* * FIXME: * Remove conditional when all CMA drivers have been moved over to using @@ -3015,6 +3019,15 @@ } } +/* + * fb_ops.fb_destroy is called by the last put_fb_info() call at the end of + * unregister_framebuffer() or fb_release(). + */ +static void drm_fbdev_fb_destroy(struct fb_info *info) +{ + drm_fbdev_release(info->par); +} + static int drm_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) { struct drm_fb_helper *fb_helper = info->par; @@ -3065,7 +3078,6 @@ struct drm_framebuffer *fb; struct fb_info *fbi; u32 format; - int ret; DRM_DEBUG_KMS("surface width(%d), height(%d) and bpp(%d)\n", sizes->surface_width, sizes->surface_height, @@ -3082,10 +3094,8 @@ fb = buffer->fb; fbi = drm_fb_helper_alloc_fbi(fb_helper); - if (IS_ERR(fbi)) { - ret = PTR_ERR(fbi); - goto err_free_buffer; - } + if (IS_ERR(fbi)) + return PTR_ERR(fbi); fbi->par = fb_helper; fbi->fbops = &drm_fbdev_fb_ops; @@ -3116,8 +3126,7 @@ if (!fbops || !shadow) { kfree(fbops); vfree(shadow); - ret = -ENOMEM; - goto err_fb_info_destroy; + return -ENOMEM; } *fbops = *fbi->fbops; @@ -3129,13 +3138,6 @@ } return 0; - -err_fb_info_destroy: - drm_fb_helper_fini(fb_helper); -err_free_buffer: - drm_client_framebuffer_delete(buffer); - - return ret; } EXPORT_SYMBOL(drm_fb_helper_generic_probe); @@ -3147,18 +3149,11 @@ { struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); - if (fb_helper->fbdev) { - drm_fb_helper_unregister_fbi(fb_helper); + if (fb_helper->fbdev) /* drm_fbdev_fb_destroy() takes care of cleanup */ - return; - } - - /* Did drm_fb_helper_fbdev_setup() run? */ - if (fb_helper->dev) - drm_fb_helper_fini(fb_helper); - - drm_client_release(client); - kfree(fb_helper); + drm_fb_helper_unregister_fbi(fb_helper); + else + drm_fbdev_release(fb_helper); } static int drm_fbdev_client_restore(struct drm_client_dev *client) @@ -3174,7 +3169,7 @@ struct drm_device *dev = client->dev; int ret; - /* If drm_fb_helper_fbdev_setup() failed, we only try once */ + /* Setup is not retried if it has failed */ if (!fb_helper->dev && fb_helper->funcs) return 0; @@ -3184,15 +3179,34 @@ if (!dev->mode_config.num_connector) return 0; - ret = drm_fb_helper_fbdev_setup(dev, fb_helper, &drm_fb_helper_generic_funcs, - fb_helper->preferred_bpp, 0); - if (ret) { - fb_helper->dev = NULL; - fb_helper->fbdev = NULL; - return ret; - } + drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs); + + ret = drm_fb_helper_init(dev, fb_helper, dev->mode_config.num_connector); + if (ret) + goto err; + + ret = drm_fb_helper_single_add_all_connectors(fb_helper); + if (ret) + goto err_cleanup; + + if (!drm_drv_uses_atomic_modeset(dev)) + drm_helper_disable_unused_functions(dev); + + ret = drm_fb_helper_initial_config(fb_helper, fb_helper->preferred_bpp); + if (ret) + goto err_cleanup; return 0; + +err_cleanup: + drm_fbdev_cleanup(fb_helper); +err: + fb_helper->dev = NULL; + fb_helper->fbdev = NULL; + + DRM_DEV_ERROR(dev->dev, "fbdev: Failed to setup generic emulation (ret=%d)\n", ret); + + return ret; } static const struct drm_client_funcs drm_fbdev_client_funcs = { @@ -3243,12 +3257,16 @@ return ret; } - drm_client_add(&fb_helper->client); - + if (!preferred_bpp) + preferred_bpp = dev->mode_config.preferred_depth; + if (!preferred_bpp) + preferred_bpp = 32; fb_helper->preferred_bpp = preferred_bpp; drm_fbdev_client_hotplug(&fb_helper->client); + drm_client_add(&fb_helper->client); + return 0; } EXPORT_SYMBOL(drm_fbdev_generic_setup); diff -Nru linux-4.19.98/drivers/gpu/drm/drm_lease.c linux-4.19.118/drivers/gpu/drm/drm_lease.c --- linux-4.19.98/drivers/gpu/drm/drm_lease.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/drm_lease.c 2020-04-23 08:30:24.000000000 +0000 @@ -545,10 +545,12 @@ } DRM_DEBUG_LEASE("Creating lease\n"); + /* lessee will take the ownership of leases */ lessee = drm_lease_create(lessor, &leases); if (IS_ERR(lessee)) { ret = PTR_ERR(lessee); + idr_destroy(&leases); goto out_leases; } @@ -583,7 +585,6 @@ out_leases: put_unused_fd(fd); - idr_destroy(&leases); DRM_DEBUG_LEASE("drm_mode_create_lease_ioctl failed: %d\n", ret); return ret; diff -Nru linux-4.19.98/drivers/gpu/drm/drm_pci.c linux-4.19.118/drivers/gpu/drm/drm_pci.c --- linux-4.19.98/drivers/gpu/drm/drm_pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/drm_pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -46,8 +46,6 @@ drm_dma_handle_t *drm_pci_alloc(struct drm_device * dev, size_t size, size_t align) { drm_dma_handle_t *dmah; - unsigned long addr; - size_t sz; /* pci_alloc_consistent only guarantees alignment to the smallest * PAGE_SIZE order which is greater than or equal to the requested size. @@ -61,22 +59,13 @@ return NULL; dmah->size = size; - dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size, &dmah->busaddr, GFP_KERNEL | __GFP_COMP); + dmah->vaddr = dma_alloc_coherent(&dev->pdev->dev, size, &dmah->busaddr, GFP_KERNEL); if (dmah->vaddr == NULL) { kfree(dmah); return NULL; } - memset(dmah->vaddr, 0, size); - - /* XXX - Is virt_to_page() legal for consistent mem? */ - /* Reserve */ - for (addr = (unsigned long)dmah->vaddr, sz = size; - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { - SetPageReserved(virt_to_page((void *)addr)); - } - return dmah; } @@ -89,19 +78,9 @@ */ void __drm_legacy_pci_free(struct drm_device * dev, drm_dma_handle_t * dmah) { - unsigned long addr; - size_t sz; - - if (dmah->vaddr) { - /* XXX - Is virt_to_page() legal for consistent mem? */ - /* Unreserve */ - for (addr = (unsigned long)dmah->vaddr, sz = dmah->size; - sz > 0; addr += PAGE_SIZE, sz -= PAGE_SIZE) { - ClearPageReserved(virt_to_page((void *)addr)); - } + if (dmah->vaddr) dma_free_coherent(&dev->pdev->dev, dmah->size, dmah->vaddr, dmah->busaddr); - } } /** diff -Nru linux-4.19.98/drivers/gpu/drm/drm_rect.c linux-4.19.118/drivers/gpu/drm/drm_rect.c --- linux-4.19.98/drivers/gpu/drm/drm_rect.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/drm_rect.c 2020-04-23 08:30:24.000000000 +0000 @@ -52,7 +52,12 @@ static u32 clip_scaled(u32 src, u32 dst, u32 clip) { - u64 tmp = mul_u32_u32(src, dst - clip); + u64 tmp; + + if (dst == 0) + return 0; + + tmp = mul_u32_u32(src, dst - clip); /* * Round toward 1.0 when clipping so that we don't accidentally diff -Nru linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_buffer.c linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_buffer.c --- linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_buffer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_buffer.c 2020-04-23 08:30:24.000000000 +0000 @@ -311,6 +311,8 @@ u32 return_target, return_dwords; u32 link_target, link_dwords; bool switch_context = gpu->exec_state != exec_state; + unsigned int new_flush_seq = READ_ONCE(gpu->mmu->flush_seq); + bool need_flush = gpu->flush_seq != new_flush_seq; lockdep_assert_held(&gpu->lock); @@ -325,14 +327,14 @@ * need to append a mmu flush load state, followed by a new * link to this buffer - a total of four additional words. */ - if (gpu->mmu->need_flush || switch_context) { + if (need_flush || switch_context) { u32 target, extra_dwords; /* link command */ extra_dwords = 1; /* flush command */ - if (gpu->mmu->need_flush) { + if (need_flush) { if (gpu->mmu->version == ETNAVIV_IOMMU_V1) extra_dwords += 1; else @@ -345,7 +347,7 @@ target = etnaviv_buffer_reserve(gpu, buffer, extra_dwords); - if (gpu->mmu->need_flush) { + if (need_flush) { /* Add the MMU flush */ if (gpu->mmu->version == ETNAVIV_IOMMU_V1) { CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_MMU, @@ -365,7 +367,7 @@ SYNC_RECIPIENT_PE); } - gpu->mmu->need_flush = false; + gpu->flush_seq = new_flush_seq; } if (switch_context) { diff -Nru linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_dump.c linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_dump.c --- linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_dump.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_dump.c 2020-04-23 08:30:24.000000000 +0000 @@ -217,7 +217,7 @@ mutex_lock(&obj->lock); pages = etnaviv_gem_get_pages(obj); mutex_unlock(&obj->lock); - if (pages) { + if (!IS_ERR(pages)) { int j; iter.hdr->data[0] = bomap - bomap_start; diff -Nru linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c --- linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c 2020-04-23 08:30:24.000000000 +0000 @@ -15,7 +15,7 @@ int npages = obj->size >> PAGE_SHIFT; if (WARN_ON(!etnaviv_obj->pages)) /* should have already pinned! */ - return NULL; + return ERR_PTR(-EINVAL); return drm_prime_pages_to_sg(etnaviv_obj->pages, npages); } diff -Nru linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_gpu.h linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_gpu.h --- linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_gpu.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_gpu.h 2020-04-23 08:30:24.000000000 +0000 @@ -139,6 +139,7 @@ struct etnaviv_iommu *mmu; struct etnaviv_cmdbuf_suballoc *cmdbuf_suballoc; + unsigned int flush_seq; /* Power Control: */ struct clk *clk_bus; diff -Nru linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_mmu.c linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_mmu.c --- linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_mmu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_mmu.c 2020-04-23 08:30:24.000000000 +0000 @@ -261,7 +261,7 @@ } list_add_tail(&mapping->mmu_node, &mmu->mappings); - mmu->need_flush = true; + mmu->flush_seq++; unlock: mutex_unlock(&mmu->lock); @@ -280,7 +280,7 @@ etnaviv_iommu_remove_mapping(mmu, mapping); list_del(&mapping->mmu_node); - mmu->need_flush = true; + mmu->flush_seq++; mutex_unlock(&mmu->lock); } @@ -357,7 +357,7 @@ mutex_unlock(&mmu->lock); return ret; } - gpu->mmu->need_flush = true; + mmu->flush_seq++; mutex_unlock(&mmu->lock); *iova = (u32)vram_node->start; diff -Nru linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_mmu.h linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_mmu.h --- linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_mmu.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_mmu.h 2020-04-23 08:30:24.000000000 +0000 @@ -48,7 +48,7 @@ struct mutex lock; struct list_head mappings; struct drm_mm mm; - bool need_flush; + unsigned int flush_seq; }; struct etnaviv_gem_object; diff -Nru linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c --- linux-4.19.98/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/etnaviv/etnaviv_perfmon.c 2020-04-23 08:30:24.000000000 +0000 @@ -4,6 +4,7 @@ * Copyright (C) 2017 Zodiac Inflight Innovations */ +#include "common.xml.h" #include "etnaviv_gpu.h" #include "etnaviv_perfmon.h" #include "state_hi.xml.h" @@ -31,17 +32,11 @@ }; struct etnaviv_pm_domain_meta { + unsigned int feature; const struct etnaviv_pm_domain *domains; u32 nr_domains; }; -static u32 simple_reg_read(struct etnaviv_gpu *gpu, - const struct etnaviv_pm_domain *domain, - const struct etnaviv_pm_signal *signal) -{ - return gpu_read(gpu, signal->data); -} - static u32 perf_reg_read(struct etnaviv_gpu *gpu, const struct etnaviv_pm_domain *domain, const struct etnaviv_pm_signal *signal) @@ -75,6 +70,34 @@ return value; } +static u32 hi_total_cycle_read(struct etnaviv_gpu *gpu, + const struct etnaviv_pm_domain *domain, + const struct etnaviv_pm_signal *signal) +{ + u32 reg = VIVS_HI_PROFILE_TOTAL_CYCLES; + + if (gpu->identity.model == chipModel_GC880 || + gpu->identity.model == chipModel_GC2000 || + gpu->identity.model == chipModel_GC2100) + reg = VIVS_MC_PROFILE_CYCLE_COUNTER; + + return gpu_read(gpu, reg); +} + +static u32 hi_total_idle_cycle_read(struct etnaviv_gpu *gpu, + const struct etnaviv_pm_domain *domain, + const struct etnaviv_pm_signal *signal) +{ + u32 reg = VIVS_HI_PROFILE_IDLE_CYCLES; + + if (gpu->identity.model == chipModel_GC880 || + gpu->identity.model == chipModel_GC2000 || + gpu->identity.model == chipModel_GC2100) + reg = VIVS_HI_PROFILE_TOTAL_CYCLES; + + return gpu_read(gpu, reg); +} + static const struct etnaviv_pm_domain doms_3d[] = { { .name = "HI", @@ -84,13 +107,13 @@ .signal = (const struct etnaviv_pm_signal[]) { { "TOTAL_CYCLES", - VIVS_HI_PROFILE_TOTAL_CYCLES, - &simple_reg_read + 0, + &hi_total_cycle_read }, { "IDLE_CYCLES", - VIVS_HI_PROFILE_IDLE_CYCLES, - &simple_reg_read + 0, + &hi_total_idle_cycle_read }, { "AXI_CYCLES_READ_REQUEST_STALLED", @@ -113,7 +136,7 @@ .name = "PE", .profile_read = VIVS_MC_PROFILE_PE_READ, .profile_config = VIVS_MC_PROFILE_CONFIG0, - .nr_signals = 5, + .nr_signals = 4, .signal = (const struct etnaviv_pm_signal[]) { { "PIXEL_COUNT_KILLED_BY_COLOR_PIPE", @@ -388,36 +411,78 @@ static const struct etnaviv_pm_domain_meta doms_meta[] = { { + .feature = chipFeatures_PIPE_3D, .nr_domains = ARRAY_SIZE(doms_3d), .domains = &doms_3d[0] }, { + .feature = chipFeatures_PIPE_2D, .nr_domains = ARRAY_SIZE(doms_2d), .domains = &doms_2d[0] }, { + .feature = chipFeatures_PIPE_VG, .nr_domains = ARRAY_SIZE(doms_vg), .domains = &doms_vg[0] } }; +static unsigned int num_pm_domains(const struct etnaviv_gpu *gpu) +{ + unsigned int num = 0, i; + + for (i = 0; i < ARRAY_SIZE(doms_meta); i++) { + const struct etnaviv_pm_domain_meta *meta = &doms_meta[i]; + + if (gpu->identity.features & meta->feature) + num += meta->nr_domains; + } + + return num; +} + +static const struct etnaviv_pm_domain *pm_domain(const struct etnaviv_gpu *gpu, + unsigned int index) +{ + const struct etnaviv_pm_domain *domain = NULL; + unsigned int offset = 0, i; + + for (i = 0; i < ARRAY_SIZE(doms_meta); i++) { + const struct etnaviv_pm_domain_meta *meta = &doms_meta[i]; + + if (!(gpu->identity.features & meta->feature)) + continue; + + if (meta->nr_domains < (index - offset)) { + offset += meta->nr_domains; + continue; + } + + domain = meta->domains + (index - offset); + } + + return domain; +} + int etnaviv_pm_query_dom(struct etnaviv_gpu *gpu, struct drm_etnaviv_pm_domain *domain) { - const struct etnaviv_pm_domain_meta *meta = &doms_meta[domain->pipe]; + const unsigned int nr_domains = num_pm_domains(gpu); const struct etnaviv_pm_domain *dom; - if (domain->iter >= meta->nr_domains) + if (domain->iter >= nr_domains) return -EINVAL; - dom = meta->domains + domain->iter; + dom = pm_domain(gpu, domain->iter); + if (!dom) + return -EINVAL; domain->id = domain->iter; domain->nr_signals = dom->nr_signals; strncpy(domain->name, dom->name, sizeof(domain->name)); domain->iter++; - if (domain->iter == meta->nr_domains) + if (domain->iter == nr_domains) domain->iter = 0xff; return 0; @@ -426,16 +491,18 @@ int etnaviv_pm_query_sig(struct etnaviv_gpu *gpu, struct drm_etnaviv_pm_signal *signal) { - const struct etnaviv_pm_domain_meta *meta = &doms_meta[signal->pipe]; + const unsigned int nr_domains = num_pm_domains(gpu); const struct etnaviv_pm_domain *dom; const struct etnaviv_pm_signal *sig; - if (signal->domain >= meta->nr_domains) + if (signal->domain >= nr_domains) return -EINVAL; - dom = meta->domains + signal->domain; + dom = pm_domain(gpu, signal->domain); + if (!dom) + return -EINVAL; - if (signal->iter > dom->nr_signals) + if (signal->iter >= dom->nr_signals) return -EINVAL; sig = &dom->signal[signal->iter]; @@ -461,7 +528,7 @@ dom = meta->domains + r->domain; - if (r->signal > dom->nr_signals) + if (r->signal >= dom->nr_signals) return -EINVAL; return 0; diff -Nru linux-4.19.98/drivers/gpu/drm/exynos/exynos_drm_dsi.c linux-4.19.118/drivers/gpu/drm/exynos/exynos_drm_dsi.c --- linux-4.19.98/drivers/gpu/drm/exynos/exynos_drm_dsi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/exynos/exynos_drm_dsi.c 2020-04-23 08:30:24.000000000 +0000 @@ -1722,8 +1722,9 @@ ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), dsi->supplies); if (ret) { - dev_info(dev, "failed to get regulators: %d\n", ret); - return -EPROBE_DEFER; + if (ret != -EPROBE_DEFER) + dev_info(dev, "failed to get regulators: %d\n", ret); + return ret; } dsi->clks = devm_kcalloc(dev, @@ -1736,9 +1737,10 @@ dsi->clks[i] = devm_clk_get(dev, clk_names[i]); if (IS_ERR(dsi->clks[i])) { if (strcmp(clk_names[i], "sclk_mipi") == 0) { - strcpy(clk_names[i], OLD_SCLK_MIPI_CLK_NAME); - i--; - continue; + dsi->clks[i] = devm_clk_get(dev, + OLD_SCLK_MIPI_CLK_NAME); + if (!IS_ERR(dsi->clks[i])) + continue; } dev_info(dev, "failed to get the clock: %s\n", diff -Nru linux-4.19.98/drivers/gpu/drm/gma500/framebuffer.c linux-4.19.118/drivers/gpu/drm/gma500/framebuffer.c --- linux-4.19.98/drivers/gpu/drm/gma500/framebuffer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/gma500/framebuffer.c 2020-04-23 08:30:24.000000000 +0000 @@ -480,6 +480,7 @@ container_of(helper, struct psb_fbdev, psb_fb_helper); struct drm_device *dev = psb_fbdev->psb_fb_helper.dev; struct drm_psb_private *dev_priv = dev->dev_private; + unsigned int fb_size; int bytespp; bytespp = sizes->surface_bpp / 8; @@ -489,8 +490,11 @@ /* If the mode will not fit in 32bit then switch to 16bit to get a console on full resolution. The X mode setting server will allocate its own 32bit GEM framebuffer */ - if (ALIGN(sizes->fb_width * bytespp, 64) * sizes->fb_height > - dev_priv->vram_stolen_size) { + fb_size = ALIGN(sizes->surface_width * bytespp, 64) * + sizes->surface_height; + fb_size = ALIGN(fb_size, PAGE_SIZE); + + if (fb_size > dev_priv->vram_stolen_size) { sizes->surface_bpp = 16; sizes->surface_depth = 16; } diff -Nru linux-4.19.98/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c linux-4.19.118/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c --- linux-4.19.98/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_fbdev.c 2020-04-23 08:30:24.000000000 +0000 @@ -71,7 +71,6 @@ DRM_DEBUG_DRIVER("surface width(%d), height(%d) and bpp(%d)\n", sizes->surface_width, sizes->surface_height, sizes->surface_bpp); - sizes->surface_depth = 32; bytes_per_pixel = DIV_ROUND_UP(sizes->surface_bpp, 8); diff -Nru linux-4.19.98/drivers/gpu/drm/i915/gvt/dmabuf.c linux-4.19.118/drivers/gpu/drm/i915/gvt/dmabuf.c --- linux-4.19.98/drivers/gpu/drm/i915/gvt/dmabuf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/i915/gvt/dmabuf.c 2020-04-23 08:30:24.000000000 +0000 @@ -95,12 +95,12 @@ dmabuf_obj = container_of(pos, struct intel_vgpu_dmabuf_obj, list); if (dmabuf_obj == obj) { + list_del(pos); intel_gvt_hypervisor_put_vfio_device(vgpu); idr_remove(&vgpu->object_idr, dmabuf_obj->dmabuf_id); kfree(dmabuf_obj->info); kfree(dmabuf_obj); - list_del(pos); break; } } diff -Nru linux-4.19.98/drivers/gpu/drm/i915/gvt/vgpu.c linux-4.19.118/drivers/gpu/drm/i915/gvt/vgpu.c --- linux-4.19.98/drivers/gpu/drm/i915/gvt/vgpu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/i915/gvt/vgpu.c 2020-04-23 08:30:24.000000000 +0000 @@ -272,10 +272,17 @@ { struct intel_gvt *gvt = vgpu->gvt; - mutex_lock(&vgpu->vgpu_lock); - WARN(vgpu->active, "vGPU is still active!\n"); + /* + * remove idr first so later clean can judge if need to stop + * service if no active vgpu. + */ + mutex_lock(&gvt->lock); + idr_remove(&gvt->vgpu_idr, vgpu->id); + mutex_unlock(&gvt->lock); + + mutex_lock(&vgpu->vgpu_lock); intel_gvt_debugfs_remove_vgpu(vgpu); intel_vgpu_clean_sched_policy(vgpu); intel_vgpu_clean_submission(vgpu); @@ -290,7 +297,6 @@ mutex_unlock(&vgpu->vgpu_lock); mutex_lock(&gvt->lock); - idr_remove(&gvt->vgpu_idr, vgpu->id); if (idr_is_empty(&gvt->vgpu_idr)) intel_gvt_clean_irq(gvt); intel_gvt_update_vgpu_types(gvt); @@ -556,9 +562,9 @@ intel_vgpu_reset_mmio(vgpu, dmlr); populate_pvinfo_page(vgpu); - intel_vgpu_reset_display(vgpu); if (dmlr) { + intel_vgpu_reset_display(vgpu); intel_vgpu_reset_cfg_space(vgpu); /* only reset the failsafe mode when dmlr reset */ vgpu->failsafe = false; diff -Nru linux-4.19.98/drivers/gpu/drm/mediatek/mtk_drm_crtc.c linux-4.19.118/drivers/gpu/drm/mediatek/mtk_drm_crtc.c --- linux-4.19.98/drivers/gpu/drm/mediatek/mtk_drm_crtc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/mediatek/mtk_drm_crtc.c 2020-04-23 08:30:24.000000000 +0000 @@ -308,6 +308,7 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc) { struct drm_device *drm = mtk_crtc->base.dev; + struct drm_crtc *crtc = &mtk_crtc->base; int i; DRM_DEBUG_DRIVER("%s\n", __func__); @@ -329,6 +330,13 @@ mtk_disp_mutex_unprepare(mtk_crtc->mutex); pm_runtime_put(drm->dev); + + if (crtc->state->event && !crtc->state->active) { + spin_lock_irq(&crtc->dev->event_lock); + drm_crtc_send_vblank_event(crtc, crtc->state->event); + crtc->state->event = NULL; + spin_unlock_irq(&crtc->dev->event_lock); + } } static void mtk_crtc_ddp_config(struct drm_crtc *crtc) @@ -498,10 +506,18 @@ static int mtk_drm_crtc_init(struct drm_device *drm, struct mtk_drm_crtc *mtk_crtc, - struct drm_plane *primary, - struct drm_plane *cursor, unsigned int pipe) + unsigned int pipe) { - int ret; + struct drm_plane *primary = NULL; + struct drm_plane *cursor = NULL; + int i, ret; + + for (i = 0; i < mtk_crtc->layer_nr; i++) { + if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_PRIMARY) + primary = &mtk_crtc->planes[i]; + else if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_CURSOR) + cursor = &mtk_crtc->planes[i]; + } ret = drm_crtc_init_with_planes(drm, &mtk_crtc->base, primary, cursor, &mtk_crtc_funcs, NULL); @@ -614,9 +630,7 @@ goto unprepare; } - ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0], - mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] : - NULL, pipe); + ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, pipe); if (ret < 0) goto unprepare; drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE); diff -Nru linux-4.19.98/drivers/gpu/drm/msm/adreno/a3xx_gpu.c linux-4.19.118/drivers/gpu/drm/msm/adreno/a3xx_gpu.c --- linux-4.19.98/drivers/gpu/drm/msm/adreno/a3xx_gpu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/adreno/a3xx_gpu.c 2020-04-23 08:30:24.000000000 +0000 @@ -395,19 +395,17 @@ 0x2200, 0x2212, 0x2214, 0x2217, 0x221a, 0x221a, 0x2240, 0x227e, 0x2280, 0x228b, 0x22c0, 0x22c0, 0x22c4, 0x22ce, 0x22d0, 0x22d8, 0x22df, 0x22e6, 0x22e8, 0x22e9, 0x22ec, 0x22ec, 0x22f0, 0x22f7, - 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2348, 0x2349, 0x2350, 0x2356, - 0x2360, 0x2360, 0x2440, 0x2440, 0x2444, 0x2444, 0x2448, 0x244d, - 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, 0x2472, 0x2472, - 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, 0x24e4, 0x24ef, - 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, 0x2510, 0x2511, - 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, 0x25ec, 0x25ed, - 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, 0x261a, 0x261a, - 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, 0x26c4, 0x26ce, - 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, 0x26ec, 0x26ec, - 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, 0x2748, 0x2749, - 0x2750, 0x2756, 0x2760, 0x2760, 0x300c, 0x300e, 0x301c, 0x301d, - 0x302a, 0x302a, 0x302c, 0x302d, 0x3030, 0x3031, 0x3034, 0x3036, - 0x303c, 0x303c, 0x305e, 0x305f, + 0x22ff, 0x22ff, 0x2340, 0x2343, 0x2440, 0x2440, 0x2444, 0x2444, + 0x2448, 0x244d, 0x2468, 0x2469, 0x246c, 0x246d, 0x2470, 0x2470, + 0x2472, 0x2472, 0x2474, 0x2475, 0x2479, 0x247a, 0x24c0, 0x24d3, + 0x24e4, 0x24ef, 0x2500, 0x2509, 0x250c, 0x250c, 0x250e, 0x250e, + 0x2510, 0x2511, 0x2514, 0x2515, 0x25e4, 0x25e4, 0x25ea, 0x25ea, + 0x25ec, 0x25ed, 0x25f0, 0x25f0, 0x2600, 0x2612, 0x2614, 0x2617, + 0x261a, 0x261a, 0x2640, 0x267e, 0x2680, 0x268b, 0x26c0, 0x26c0, + 0x26c4, 0x26ce, 0x26d0, 0x26d8, 0x26df, 0x26e6, 0x26e8, 0x26e9, + 0x26ec, 0x26ec, 0x26f0, 0x26f7, 0x26ff, 0x26ff, 0x2740, 0x2743, + 0x300c, 0x300e, 0x301c, 0x301d, 0x302a, 0x302a, 0x302c, 0x302d, + 0x3030, 0x3031, 0x3034, 0x3036, 0x303c, 0x303c, 0x305e, 0x305f, ~0 /* sentinel */ }; diff -Nru linux-4.19.98/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c linux-4.19.118/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c --- linux-4.19.98/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c 2020-04-23 08:30:24.000000000 +0000 @@ -310,7 +310,7 @@ u32 mixercfg = 0, mixercfg_ext = 0, mix, ext; u32 mixercfg_ext2 = 0, mixercfg_ext3 = 0; int i, j; - u8 stages; + int stages; int pipes_per_stage; stages = _mixer_stages(ctx->mixer_hw_caps, ctx->mixer_count, lm); diff -Nru linux-4.19.98/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c linux-4.19.118/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c --- linux-4.19.98/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c 2020-04-23 08:30:24.000000000 +0000 @@ -139,7 +139,7 @@ if (mdp4_dsi_encoder->enabled) return; - mdp4_crtc_set_config(encoder->crtc, + mdp4_crtc_set_config(encoder->crtc, MDP4_DMA_CONFIG_PACK_ALIGN_MSB | MDP4_DMA_CONFIG_DEFLKR_EN | MDP4_DMA_CONFIG_DITHER_EN | diff -Nru linux-4.19.98/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c linux-4.19.118/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c --- linux-4.19.98/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c 2020-04-23 08:30:24.000000000 +0000 @@ -635,7 +635,7 @@ if (cfg_handler) mdp5_cfg_destroy(cfg_handler); - return NULL; + return ERR_PTR(ret); } static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev) diff -Nru linux-4.19.98/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c linux-4.19.118/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c --- linux-4.19.98/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c 2020-04-23 08:30:24.000000000 +0000 @@ -1118,8 +1118,8 @@ ret = wait_for_completion_timeout(&mdp5_crtc->pp_completion, msecs_to_jiffies(50)); if (ret == 0) - dev_warn(dev->dev, "pp done time out, lm=%d\n", - mdp5_cstate->pipeline.mixer->lm); + dev_warn_ratelimited(dev->dev, "pp done time out, lm=%d\n", + mdp5_cstate->pipeline.mixer->lm); } static void mdp5_crtc_wait_for_flush_done(struct drm_crtc *crtc) diff -Nru linux-4.19.98/drivers/gpu/drm/msm/dsi/dsi_host.c linux-4.19.118/drivers/gpu/drm/msm/dsi/dsi_host.c --- linux-4.19.98/drivers/gpu/drm/msm/dsi/dsi_host.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/dsi/dsi_host.c 2020-04-23 08:30:24.000000000 +0000 @@ -34,6 +34,8 @@ #include "dsi_cfg.h" #include "msm_kms.h" +#define DSI_RESET_TOGGLE_DELAY_MS 20 + static int dsi_get_version(const void __iomem *base, u32 *major, u32 *minor) { u32 ver; @@ -994,7 +996,7 @@ wmb(); /* clocks need to be enabled before reset */ dsi_write(msm_host, REG_DSI_RESET, 1); - wmb(); /* make sure reset happen */ + msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ dsi_write(msm_host, REG_DSI_RESET, 0); } @@ -1402,7 +1404,7 @@ /* dsi controller can only be reset while clocks are running */ dsi_write(msm_host, REG_DSI_RESET, 1); - wmb(); /* make sure reset happen */ + msleep(DSI_RESET_TOGGLE_DELAY_MS); /* make sure reset happen */ dsi_write(msm_host, REG_DSI_RESET, 0); wmb(); /* controller out of reset */ dsi_write(msm_host, REG_DSI_CTRL, data0); diff -Nru linux-4.19.98/drivers/gpu/drm/msm/dsi/dsi_manager.c linux-4.19.118/drivers/gpu/drm/msm/dsi/dsi_manager.c --- linux-4.19.98/drivers/gpu/drm/msm/dsi/dsi_manager.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/dsi/dsi_manager.c 2020-04-23 08:30:24.000000000 +0000 @@ -328,7 +328,7 @@ return num; } -static int dsi_mgr_connector_mode_valid(struct drm_connector *connector, +static enum drm_mode_status dsi_mgr_connector_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) { int id = dsi_mgr_connector_get_id(connector); @@ -471,6 +471,7 @@ struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1); struct mipi_dsi_host *host = msm_dsi->host; struct drm_panel *panel = msm_dsi->panel; + struct msm_dsi_pll *src_pll; bool is_dual_dsi = IS_DUAL_DSI(); int ret; @@ -511,6 +512,10 @@ id, ret); } + /* Save PLL status if it is a clock source */ + src_pll = msm_dsi_phy_get_pll(msm_dsi->phy); + msm_dsi_pll_save_state(src_pll); + ret = msm_dsi_host_power_off(host); if (ret) pr_err("%s: host %d power off failed,%d\n", __func__, id, ret); diff -Nru linux-4.19.98/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c linux-4.19.118/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c --- linux-4.19.98/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c 2020-04-23 08:30:24.000000000 +0000 @@ -726,10 +726,6 @@ if (!phy || !phy->cfg->ops.disable) return; - /* Save PLL status if it is a clock source */ - if (phy->usecase != MSM_DSI_PHY_SLAVE) - msm_dsi_pll_save_state(phy->pll); - phy->cfg->ops.disable(phy); dsi_phy_regulator_disable(phy); diff -Nru linux-4.19.98/drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c linux-4.19.118/drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c --- linux-4.19.98/drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c 2020-04-23 08:30:24.000000000 +0000 @@ -406,6 +406,12 @@ if (pll_10nm->slave) dsi_pll_enable_pll_bias(pll_10nm->slave); + rc = dsi_pll_10nm_vco_set_rate(hw,pll_10nm->vco_current_rate, 0); + if (rc) { + pr_err("vco_set_rate failed, rc=%d\n", rc); + return rc; + } + /* Start PLL */ pll_write(pll_10nm->phy_cmn_mmio + REG_DSI_10nm_PHY_CMN_PLL_CNTRL, 0x01); diff -Nru linux-4.19.98/drivers/gpu/drm/msm/msm_drv.c linux-4.19.118/drivers/gpu/drm/msm/msm_drv.c --- linux-4.19.98/drivers/gpu/drm/msm/msm_drv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/msm_drv.c 2020-04-23 08:30:24.000000000 +0000 @@ -492,6 +492,14 @@ if (ret) goto err_msm_uninit; + if (!dev->dma_parms) { + dev->dma_parms = devm_kzalloc(dev, sizeof(*dev->dma_parms), + GFP_KERNEL); + if (!dev->dma_parms) + return -ENOMEM; + } + dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); + msm_gem_shrinker_init(ddev); switch (get_mdp_ver(pdev)) { diff -Nru linux-4.19.98/drivers/gpu/drm/msm/msm_gem.c linux-4.19.118/drivers/gpu/drm/msm/msm_gem.c --- linux-4.19.98/drivers/gpu/drm/msm/msm_gem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/msm/msm_gem.c 2020-04-23 08:30:24.000000000 +0000 @@ -43,6 +43,46 @@ return !msm_obj->vram_node; } +/* + * Cache sync.. this is a bit over-complicated, to fit dma-mapping + * API. Really GPU cache is out of scope here (handled on cmdstream) + * and all we need to do is invalidate newly allocated pages before + * mapping to CPU as uncached/writecombine. + * + * On top of this, we have the added headache, that depending on + * display generation, the display's iommu may be wired up to either + * the toplevel drm device (mdss), or to the mdp sub-node, meaning + * that here we either have dma-direct or iommu ops. + * + * Let this be a cautionary tail of abstraction gone wrong. + */ + +static void sync_for_device(struct msm_gem_object *msm_obj) +{ + struct device *dev = msm_obj->base.dev->dev; + + if (get_dma_ops(dev)) { + dma_sync_sg_for_device(dev, msm_obj->sgt->sgl, + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); + } else { + dma_map_sg(dev, msm_obj->sgt->sgl, + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); + } +} + +static void sync_for_cpu(struct msm_gem_object *msm_obj) +{ + struct device *dev = msm_obj->base.dev->dev; + + if (get_dma_ops(dev)) { + dma_sync_sg_for_cpu(dev, msm_obj->sgt->sgl, + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); + } else { + dma_unmap_sg(dev, msm_obj->sgt->sgl, + msm_obj->sgt->nents, DMA_BIDIRECTIONAL); + } +} + /* allocate pages from VRAM carveout, used when no IOMMU: */ static struct page **get_pages_vram(struct drm_gem_object *obj, int npages) { @@ -108,8 +148,7 @@ * because display controller, GPU, etc. are not coherent: */ if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) - dma_map_sg(dev->dev, msm_obj->sgt->sgl, - msm_obj->sgt->nents, DMA_BIDIRECTIONAL); + sync_for_device(msm_obj); } return msm_obj->pages; @@ -138,9 +177,7 @@ * GPU, etc. are not coherent: */ if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED)) - dma_unmap_sg(obj->dev->dev, msm_obj->sgt->sgl, - msm_obj->sgt->nents, - DMA_BIDIRECTIONAL); + sync_for_cpu(msm_obj); sg_free_table(msm_obj->sgt); kfree(msm_obj->sgt); diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/dispnv50/wndw.c linux-4.19.118/drivers/gpu/drm/nouveau/dispnv50/wndw.c --- linux-4.19.98/drivers/gpu/drm/nouveau/dispnv50/wndw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/dispnv50/wndw.c 2020-04-23 08:30:24.000000000 +0000 @@ -405,6 +405,8 @@ asyw->clr.ntfy = armw->ntfy.handle != 0; asyw->clr.sema = armw->sema.handle != 0; asyw->clr.xlut = armw->xlut.handle != 0; + if (asyw->clr.xlut && asyw->visible) + asyw->set.xlut = asyw->xlut.handle != 0; if (wndw->func->image_clr) asyw->clr.image = armw->image.handle[0] != 0; } diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nouveau_abi16.c linux-4.19.118/drivers/gpu/drm/nouveau/nouveau_abi16.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nouveau_abi16.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nouveau_abi16.c 2020-04-23 08:30:24.000000000 +0000 @@ -214,6 +214,7 @@ WARN_ON(1); break; } + break; case NOUVEAU_GETPARAM_FB_SIZE: getparam->value = drm->gem.vram_available; break; diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nouveau_fence.c linux-4.19.118/drivers/gpu/drm/nouveau/nouveau_fence.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nouveau_fence.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nouveau_fence.c 2020-04-23 08:30:24.000000000 +0000 @@ -157,7 +157,7 @@ fence = list_entry(fctx->pending.next, typeof(*fence), head); chan = rcu_dereference_protected(fence->channel, lockdep_is_held(&fctx->lock)); - if (nouveau_fence_update(fence->channel, fctx)) + if (nouveau_fence_update(chan, fctx)) ret = NVIF_NOTIFY_DROP; } spin_unlock_irqrestore(&fctx->lock, flags); diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nouveau_ttm.c linux-4.19.118/drivers/gpu/drm/nouveau/nouveau_ttm.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nouveau_ttm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nouveau_ttm.c 2020-04-23 08:30:24.000000000 +0000 @@ -63,14 +63,12 @@ { struct nouveau_bo *nvbo = nouveau_bo(bo); struct nouveau_drm *drm = nouveau_bdev(bo->bdev); - struct nouveau_mem *mem; int ret; if (drm->client.device.info.ram_size == 0) return -ENOMEM; ret = nouveau_mem_new(&drm->master, nvbo->kind, nvbo->comp, reg); - mem = nouveau_mem(reg); if (ret) return ret; @@ -103,11 +101,9 @@ { struct nouveau_bo *nvbo = nouveau_bo(bo); struct nouveau_drm *drm = nouveau_bdev(bo->bdev); - struct nouveau_mem *mem; int ret; ret = nouveau_mem_new(&drm->master, nvbo->kind, nvbo->comp, reg); - mem = nouveau_mem(reg); if (ret) return ret; diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/core/memory.c linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/core/memory.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/core/memory.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/core/memory.c 2020-04-23 08:30:24.000000000 +0000 @@ -91,8 +91,8 @@ } refcount_set(&tags->refcount, 1); + *ptags = memory->tags = tags; mutex_unlock(&fb->subdev.mutex); - *ptags = tags; return 0; } diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/engine/disp/channv50.c 2020-04-23 08:30:24.000000000 +0000 @@ -74,6 +74,8 @@ if (debug > subdev->debug) return; + if (!mthd) + return; for (i = 0; (list = mthd->data[i].mthd) != NULL; i++) { u32 base = chan->head * mthd->addr; diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/engine/gr/gk20a.c 2020-04-23 08:30:24.000000000 +0000 @@ -143,23 +143,24 @@ nent = (fuc.size / sizeof(struct gk20a_fw_av)); - pack = vzalloc((sizeof(*pack) * max_classes) + - (sizeof(*init) * (nent + 1))); + pack = vzalloc((sizeof(*pack) * (max_classes + 1)) + + (sizeof(*init) * (nent + max_classes + 1))); if (!pack) { ret = -ENOMEM; goto end; } - init = (void *)(pack + max_classes); + init = (void *)(pack + max_classes + 1); - for (i = 0; i < nent; i++) { - struct gf100_gr_init *ent = &init[i]; + for (i = 0; i < nent; i++, init++) { struct gk20a_fw_av *av = &((struct gk20a_fw_av *)fuc.data)[i]; u32 class = av->addr & 0xffff; u32 addr = (av->addr & 0xffff0000) >> 14; if (prevclass != class) { - pack[classidx].init = ent; + if (prevclass) /* Add terminator to the method list. */ + init++; + pack[classidx].init = init; pack[classidx].type = class; prevclass = class; if (++classidx >= max_classes) { @@ -169,10 +170,10 @@ } } - ent->addr = addr; - ent->data = av->data; - ent->count = 1; - ent->pitch = 1; + init->addr = addr; + init->data = av->data; + init->count = 1; + init->pitch = 1; } *ppack = pack; diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.c 2020-04-23 08:30:24.000000000 +0000 @@ -150,6 +150,7 @@ struct nvkm_fault *fault = nvkm_fault(subdev); int i; + nvkm_notify_fini(&fault->nrpfb); nvkm_event_fini(&fault->event); for (i = 0; i < fault->buffer_nr; i++) { diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.c 2020-04-23 08:30:24.000000000 +0000 @@ -87,7 +87,7 @@ WR = (ram->next->bios.timing[2] & 0x007f0000) >> 16; /* XXX: Get these values from the VBIOS instead */ DLL = !(ram->mr[1] & 0x1); - RON = !(ram->mr[1] & 0x300) >> 8; + RON = !((ram->mr[1] & 0x300) >> 8); break; default: return -ENOSYS; diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.c 2020-04-23 08:30:24.000000000 +0000 @@ -88,10 +88,10 @@ if (exec) { nvkm_pmu_send(pmu, reply, PROC_MEMX, MEMX_MSG_EXEC, memx->base, finish); + nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", + reply[0], reply[1]); } - nvkm_debug(subdev, "Exec took %uns, PMU_IN %08x\n", - reply[0], reply[1]); kfree(memx); return 0; } diff -Nru linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/gm20b.c linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/gm20b.c --- linux-4.19.98/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/gm20b.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/nouveau/nvkm/subdev/secboot/gm20b.c 2020-04-23 08:30:24.000000000 +0000 @@ -108,6 +108,7 @@ struct gm200_secboot *gsb; struct nvkm_acr *acr; + *psb = NULL; acr = acr_r352_new(BIT(NVKM_SECBOOT_FALCON_FECS) | BIT(NVKM_SECBOOT_FALCON_PMU)); if (IS_ERR(acr)) @@ -116,10 +117,8 @@ acr->optional_falcons = BIT(NVKM_SECBOOT_FALCON_PMU); gsb = kzalloc(sizeof(*gsb), GFP_KERNEL); - if (!gsb) { - psb = NULL; + if (!gsb) return -ENOMEM; - } *psb = &gsb->base; ret = nvkm_secboot_ctor(&gm20b_secboot, acr, device, index, &gsb->base); diff -Nru linux-4.19.98/drivers/gpu/drm/panel/panel-lvds.c linux-4.19.118/drivers/gpu/drm/panel/panel-lvds.c --- linux-4.19.98/drivers/gpu/drm/panel/panel-lvds.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/panel/panel-lvds.c 2020-04-23 08:30:24.000000000 +0000 @@ -199,7 +199,6 @@ static int panel_lvds_probe(struct platform_device *pdev) { struct panel_lvds *lvds; - struct device_node *np; int ret; lvds = devm_kzalloc(&pdev->dev, sizeof(*lvds), GFP_KERNEL); @@ -245,14 +244,9 @@ return ret; } - np = of_parse_phandle(lvds->dev->of_node, "backlight", 0); - if (np) { - lvds->backlight = of_find_backlight_by_node(np); - of_node_put(np); - - if (!lvds->backlight) - return -EPROBE_DEFER; - } + lvds->backlight = devm_of_find_backlight(lvds->dev); + if (IS_ERR(lvds->backlight)) + return PTR_ERR(lvds->backlight); /* * TODO: Handle all power supplies specified in the DT node in a generic @@ -268,14 +262,10 @@ ret = drm_panel_add(&lvds->panel); if (ret < 0) - goto error; + return ret; dev_set_drvdata(lvds->dev, lvds); return 0; - -error: - put_device(&lvds->backlight->dev); - return ret; } static int panel_lvds_remove(struct platform_device *pdev) @@ -286,9 +276,6 @@ panel_lvds_disable(&lvds->panel); - if (lvds->backlight) - put_device(&lvds->backlight->dev); - return 0; } diff -Nru linux-4.19.98/drivers/gpu/drm/radeon/cik.c linux-4.19.118/drivers/gpu/drm/radeon/cik.c --- linux-4.19.98/drivers/gpu/drm/radeon/cik.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/radeon/cik.c 2020-04-23 08:30:24.000000000 +0000 @@ -6965,8 +6965,8 @@ } /* setup interrupt control */ - /* XXX this should actually be a bus address, not an MC address. same on older asics */ - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); + /* set dummy read address to dummy page address */ + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); interrupt_cntl = RREG32(INTERRUPT_CNTL); /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN diff -Nru linux-4.19.98/drivers/gpu/drm/radeon/r600.c linux-4.19.118/drivers/gpu/drm/radeon/r600.c --- linux-4.19.98/drivers/gpu/drm/radeon/r600.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/radeon/r600.c 2020-04-23 08:30:24.000000000 +0000 @@ -3690,8 +3690,8 @@ } /* setup interrupt control */ - /* set dummy read address to ring address */ - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); + /* set dummy read address to dummy page address */ + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); interrupt_cntl = RREG32(INTERRUPT_CNTL); /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN diff -Nru linux-4.19.98/drivers/gpu/drm/radeon/radeon_display.c linux-4.19.118/drivers/gpu/drm/radeon/radeon_display.c --- linux-4.19.98/drivers/gpu/drm/radeon/radeon_display.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/radeon/radeon_display.c 2020-04-23 08:30:24.000000000 +0000 @@ -121,6 +121,8 @@ DRM_DEBUG_KMS("%d\n", radeon_crtc->crtc_id); + msleep(10); + WREG32(NI_INPUT_CSC_CONTROL + radeon_crtc->crtc_offset, (NI_INPUT_CSC_GRPH_MODE(NI_INPUT_CSC_BYPASS) | NI_INPUT_CSC_OVL_MODE(NI_INPUT_CSC_BYPASS))); diff -Nru linux-4.19.98/drivers/gpu/drm/radeon/si.c linux-4.19.118/drivers/gpu/drm/radeon/si.c --- linux-4.19.98/drivers/gpu/drm/radeon/si.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/radeon/si.c 2020-04-23 08:30:24.000000000 +0000 @@ -5993,8 +5993,8 @@ } /* setup interrupt control */ - /* set dummy read address to ring address */ - WREG32(INTERRUPT_CNTL2, rdev->ih.gpu_addr >> 8); + /* set dummy read address to dummy page address */ + WREG32(INTERRUPT_CNTL2, rdev->dummy_page.addr >> 8); interrupt_cntl = RREG32(INTERRUPT_CNTL); /* IH_DUMMY_RD_OVERRIDE=0 - dummy read disabled with msi, enabled without msi * IH_DUMMY_RD_OVERRIDE=1 - dummy read controlled by IH_DUMMY_RD_EN diff -Nru linux-4.19.98/drivers/gpu/drm/rcar-du/rcar_du_crtc.c linux-4.19.118/drivers/gpu/drm/rcar-du/rcar_du_crtc.c --- linux-4.19.98/drivers/gpu/drm/rcar-du/rcar_du_crtc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/rcar-du/rcar_du_crtc.c 2020-04-23 08:30:24.000000000 +0000 @@ -837,7 +837,7 @@ drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); - return 0; + return ret; } static const struct drm_crtc_funcs crtc_funcs_gen2 = { diff -Nru linux-4.19.98/drivers/gpu/drm/rcar-du/rcar_du_kms.c linux-4.19.118/drivers/gpu/drm/rcar-du/rcar_du_kms.c --- linux-4.19.98/drivers/gpu/drm/rcar-du/rcar_du_kms.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/rcar-du/rcar_du_kms.c 2020-04-23 08:30:24.000000000 +0000 @@ -544,7 +544,7 @@ * Initialize vertical blanking interrupts handling. Start with vblank * disabled for all CRTCs. */ - ret = drm_vblank_init(dev, (1 << rcdu->num_crtcs) - 1); + ret = drm_vblank_init(dev, rcdu->num_crtcs); if (ret < 0) return ret; diff -Nru linux-4.19.98/drivers/gpu/drm/rcar-du/rcar_lvds.c linux-4.19.118/drivers/gpu/drm/rcar-du/rcar_lvds.c --- linux-4.19.98/drivers/gpu/drm/rcar-du/rcar_lvds.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/rcar-du/rcar_lvds.c 2020-04-23 08:30:24.000000000 +0000 @@ -59,11 +59,11 @@ enum rcar_lvds_mode mode; }; -#define bridge_to_rcar_lvds(bridge) \ - container_of(bridge, struct rcar_lvds, bridge) +#define bridge_to_rcar_lvds(b) \ + container_of(b, struct rcar_lvds, bridge) -#define connector_to_rcar_lvds(connector) \ - container_of(connector, struct rcar_lvds, connector) +#define connector_to_rcar_lvds(c) \ + container_of(c, struct rcar_lvds, connector) static void rcar_lvds_write(struct rcar_lvds *lvds, u32 reg, u32 data) { diff -Nru linux-4.19.98/drivers/gpu/drm/shmobile/shmob_drm_drv.c linux-4.19.118/drivers/gpu/drm/shmobile/shmob_drm_drv.c --- linux-4.19.98/drivers/gpu/drm/shmobile/shmob_drm_drv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/shmobile/shmob_drm_drv.c 2020-04-23 08:30:24.000000000 +0000 @@ -233,8 +233,8 @@ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); sdev->mmio = devm_ioremap_resource(&pdev->dev, res); - if (sdev->mmio == NULL) - return -ENOMEM; + if (IS_ERR(sdev->mmio)) + return PTR_ERR(sdev->mmio); ret = shmob_drm_setup_clocks(sdev, pdata->clk_source); if (ret < 0) diff -Nru linux-4.19.98/drivers/gpu/drm/sti/sti_hda.c linux-4.19.118/drivers/gpu/drm/sti/sti_hda.c --- linux-4.19.98/drivers/gpu/drm/sti/sti_hda.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/sti/sti_hda.c 2020-04-23 08:30:24.000000000 +0000 @@ -721,7 +721,6 @@ return 0; err_sysfs: - drm_bridge_remove(bridge); return -EINVAL; } diff -Nru linux-4.19.98/drivers/gpu/drm/sti/sti_hdmi.c linux-4.19.118/drivers/gpu/drm/sti/sti_hdmi.c --- linux-4.19.98/drivers/gpu/drm/sti/sti_hdmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/sti/sti_hdmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -1315,7 +1315,6 @@ return 0; err_sysfs: - drm_bridge_remove(bridge); hdmi->drm_connector = NULL; return -EINVAL; } diff -Nru linux-4.19.98/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c linux-4.19.118/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c --- linux-4.19.98/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/sun4i/sun4i_hdmi_tmds_clk.c 2020-04-23 08:30:24.000000000 +0000 @@ -52,7 +52,7 @@ (rate - tmp_rate) < (rate - best_rate)) { best_rate = tmp_rate; best_m = m; - is_double = d; + is_double = (d == 2) ? true : false; } } } diff -Nru linux-4.19.98/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c linux-4.19.118/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c --- linux-4.19.98/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c 2020-04-23 08:30:24.000000000 +0000 @@ -357,8 +357,7 @@ static u16 sun6i_dsi_get_video_start_delay(struct sun6i_dsi *dsi, struct drm_display_mode *mode) { - u16 start = clamp(mode->vtotal - mode->vdisplay - 10, 8, 100); - u16 delay = mode->vtotal - (mode->vsync_end - mode->vdisplay) + start; + u16 delay = mode->vtotal - (mode->vsync_end - mode->vdisplay) + 1; if (delay > mode->vtotal) delay = delay % mode->vtotal; diff -Nru linux-4.19.98/drivers/gpu/drm/sun4i/sun8i_mixer.c linux-4.19.118/drivers/gpu/drm/sun4i/sun8i_mixer.c --- linux-4.19.98/drivers/gpu/drm/sun4i/sun8i_mixer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/sun4i/sun8i_mixer.c 2020-04-23 08:30:24.000000000 +0000 @@ -111,48 +111,104 @@ .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_XRGB4444, + .de2_fmt = SUN8I_MIXER_FBFMT_ARGB4444, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_ABGR4444, .de2_fmt = SUN8I_MIXER_FBFMT_ABGR4444, .rgb = true, .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_XBGR4444, + .de2_fmt = SUN8I_MIXER_FBFMT_ABGR4444, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_RGBA4444, .de2_fmt = SUN8I_MIXER_FBFMT_RGBA4444, .rgb = true, .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_RGBX4444, + .de2_fmt = SUN8I_MIXER_FBFMT_RGBA4444, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_BGRA4444, .de2_fmt = SUN8I_MIXER_FBFMT_BGRA4444, .rgb = true, .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_BGRX4444, + .de2_fmt = SUN8I_MIXER_FBFMT_BGRA4444, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_ARGB1555, .de2_fmt = SUN8I_MIXER_FBFMT_ARGB1555, .rgb = true, .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_XRGB1555, + .de2_fmt = SUN8I_MIXER_FBFMT_ARGB1555, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_ABGR1555, .de2_fmt = SUN8I_MIXER_FBFMT_ABGR1555, .rgb = true, .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_XBGR1555, + .de2_fmt = SUN8I_MIXER_FBFMT_ABGR1555, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_RGBA5551, .de2_fmt = SUN8I_MIXER_FBFMT_RGBA5551, .rgb = true, .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_RGBX5551, + .de2_fmt = SUN8I_MIXER_FBFMT_RGBA5551, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_BGRA5551, .de2_fmt = SUN8I_MIXER_FBFMT_BGRA5551, .rgb = true, .csc = SUN8I_CSC_MODE_OFF, }, { + /* for DE2 VI layer which ignores alpha */ + .drm_fmt = DRM_FORMAT_BGRX5551, + .de2_fmt = SUN8I_MIXER_FBFMT_BGRA5551, + .rgb = true, + .csc = SUN8I_CSC_MODE_OFF, + }, + { .drm_fmt = DRM_FORMAT_UYVY, .de2_fmt = SUN8I_MIXER_FBFMT_UYVY, .rgb = false, @@ -201,12 +257,6 @@ .csc = SUN8I_CSC_MODE_YUV2RGB, }, { - .drm_fmt = DRM_FORMAT_YUV444, - .de2_fmt = SUN8I_MIXER_FBFMT_RGB888, - .rgb = true, - .csc = SUN8I_CSC_MODE_YUV2RGB, - }, - { .drm_fmt = DRM_FORMAT_YUV422, .de2_fmt = SUN8I_MIXER_FBFMT_YUV422, .rgb = false, @@ -225,12 +275,6 @@ .csc = SUN8I_CSC_MODE_YUV2RGB, }, { - .drm_fmt = DRM_FORMAT_YVU444, - .de2_fmt = SUN8I_MIXER_FBFMT_RGB888, - .rgb = true, - .csc = SUN8I_CSC_MODE_YVU2RGB, - }, - { .drm_fmt = DRM_FORMAT_YVU422, .de2_fmt = SUN8I_MIXER_FBFMT_YUV422, .rgb = false, diff -Nru linux-4.19.98/drivers/gpu/drm/sun4i/sun8i_vi_layer.c linux-4.19.118/drivers/gpu/drm/sun4i/sun8i_vi_layer.c --- linux-4.19.98/drivers/gpu/drm/sun4i/sun8i_vi_layer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/sun4i/sun8i_vi_layer.c 2020-04-23 08:30:24.000000000 +0000 @@ -330,26 +330,26 @@ }; /* - * While all RGB formats are supported, VI planes don't support - * alpha blending, so there is no point having formats with alpha - * channel if their opaque analog exist. + * While DE2 VI layer supports same RGB formats as UI layer, alpha + * channel is ignored. This structure lists all unique variants + * where alpha channel is replaced with "don't care" (X) channel. */ static const u32 sun8i_vi_layer_formats[] = { - DRM_FORMAT_ABGR1555, - DRM_FORMAT_ABGR4444, - DRM_FORMAT_ARGB1555, - DRM_FORMAT_ARGB4444, DRM_FORMAT_BGR565, DRM_FORMAT_BGR888, - DRM_FORMAT_BGRA5551, - DRM_FORMAT_BGRA4444, + DRM_FORMAT_BGRX4444, + DRM_FORMAT_BGRX5551, DRM_FORMAT_BGRX8888, DRM_FORMAT_RGB565, DRM_FORMAT_RGB888, - DRM_FORMAT_RGBA4444, - DRM_FORMAT_RGBA5551, + DRM_FORMAT_RGBX4444, + DRM_FORMAT_RGBX5551, DRM_FORMAT_RGBX8888, + DRM_FORMAT_XBGR1555, + DRM_FORMAT_XBGR4444, DRM_FORMAT_XBGR8888, + DRM_FORMAT_XRGB1555, + DRM_FORMAT_XRGB4444, DRM_FORMAT_XRGB8888, DRM_FORMAT_NV16, @@ -363,11 +363,9 @@ DRM_FORMAT_YUV411, DRM_FORMAT_YUV420, DRM_FORMAT_YUV422, - DRM_FORMAT_YUV444, DRM_FORMAT_YVU411, DRM_FORMAT_YVU420, DRM_FORMAT_YVU422, - DRM_FORMAT_YVU444, }; struct sun8i_vi_layer *sun8i_vi_layer_init_one(struct drm_device *drm, diff -Nru linux-4.19.98/drivers/gpu/drm/vc4/vc4_hdmi.c linux-4.19.118/drivers/gpu/drm/vc4/vc4_hdmi.c --- linux-4.19.98/drivers/gpu/drm/vc4/vc4_hdmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/vc4/vc4_hdmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -698,11 +698,23 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *crtc, const struct drm_display_mode *mode) { - /* HSM clock must be 108% of the pixel clock. Additionally, - * the AXI clock needs to be at least 25% of pixel clock, but - * HSM ends up being the limiting factor. + /* + * As stated in RPi's vc4 firmware "HDMI state machine (HSM) clock must + * be faster than pixel clock, infinitesimally faster, tested in + * simulation. Otherwise, exact value is unimportant for HDMI + * operation." This conflicts with bcm2835's vc4 documentation, which + * states HSM's clock has to be at least 108% of the pixel clock. + * + * Real life tests reveal that vc4's firmware statement holds up, and + * users are able to use pixel clocks closer to HSM's, namely for + * 1920x1200@60Hz. So it was decided to have leave a 1% margin between + * both clocks. Which, for RPi0-3 implies a maximum pixel clock of + * 162MHz. + * + * Additionally, the AXI clock needs to be at least 25% of + * pixel clock, but HSM ends up being the limiting factor. */ - if (mode->clock > HSM_CLOCK_FREQ / (1000 * 108 / 100)) + if (mode->clock > HSM_CLOCK_FREQ / (1000 * 101 / 100)) return MODE_CLOCK_HIGH; return MODE_OK; diff -Nru linux-4.19.98/drivers/gpu/drm/virtio/virtgpu_vq.c linux-4.19.118/drivers/gpu/drm/virtio/virtgpu_vq.c --- linux-4.19.98/drivers/gpu/drm/virtio/virtgpu_vq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/virtio/virtgpu_vq.c 2020-04-23 08:30:24.000000000 +0000 @@ -650,11 +650,11 @@ { struct virtio_gpu_get_capset *cmd_p; struct virtio_gpu_vbuffer *vbuf; - int max_size = vgdev->capsets[idx].max_size; + int max_size; struct virtio_gpu_drv_cap_cache *cache_ent; void *resp_buf; - if (idx > vgdev->num_capsets) + if (idx >= vgdev->num_capsets) return -EINVAL; if (version > vgdev->capsets[idx].max_version) @@ -664,6 +664,7 @@ if (!cache_ent) return -ENOMEM; + max_size = vgdev->capsets[idx].max_size; cache_ent->caps_cache = kmalloc(max_size, GFP_KERNEL); if (!cache_ent->caps_cache) { kfree(cache_ent); diff -Nru linux-4.19.98/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c linux-4.19.118/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c --- linux-4.19.98/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c 2020-04-23 08:30:24.000000000 +0000 @@ -511,17 +511,14 @@ container_of(work, struct vmw_cmdbuf_man, work); struct vmw_cmdbuf_header *entry, *next; uint32_t dummy; - bool restart[SVGA_CB_CONTEXT_MAX]; bool send_fence = false; struct list_head restart_head[SVGA_CB_CONTEXT_MAX]; int i; struct vmw_cmdbuf_context *ctx; bool global_block = false; - for_each_cmdbuf_ctx(man, i, ctx) { + for_each_cmdbuf_ctx(man, i, ctx) INIT_LIST_HEAD(&restart_head[i]); - restart[i] = false; - } mutex_lock(&man->error_mutex); spin_lock(&man->lock); @@ -533,7 +530,6 @@ const char *cmd_name; list_del_init(&entry->list); - restart[entry->cb_context] = true; global_block = true; if (!vmw_cmd_describe(header, &error_cmd_size, &cmd_name)) { diff -Nru linux-4.19.98/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c linux-4.19.118/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c --- linux-4.19.98/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf_res.c 2020-04-23 08:30:24.000000000 +0000 @@ -210,8 +210,10 @@ cres->hash.key = user_key | (res_type << 24); ret = drm_ht_insert_item(&man->resources, &cres->hash); - if (unlikely(ret != 0)) + if (unlikely(ret != 0)) { + kfree(cres); goto out_invalid_key; + } cres->state = VMW_CMDBUF_RES_ADD; cres->res = vmw_resource_reference(res); diff -Nru linux-4.19.98/drivers/gpu/drm/xen/xen_drm_front_gem.c linux-4.19.118/drivers/gpu/drm/xen/xen_drm_front_gem.c --- linux-4.19.98/drivers/gpu/drm/xen/xen_drm_front_gem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/gpu/drm/xen/xen_drm_front_gem.c 2020-04-23 08:30:24.000000000 +0000 @@ -236,8 +236,14 @@ vma->vm_flags &= ~VM_PFNMAP; vma->vm_flags |= VM_MIXEDMAP; vma->vm_pgoff = 0; - vma->vm_page_prot = - pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); + /* + * According to Xen on ARM ABI (xen/include/public/arch-arm.h): + * all memory which is shared with other entities in the system + * (including the hypervisor and other guests) must reside in memory + * which is mapped as Normal Inner Write-Back Outer Write-Back + * Inner-Shareable. + */ + vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); /* * vm_operations_struct.fault handler will be called if CPU access @@ -283,8 +289,9 @@ if (!xen_obj->pages) return NULL; + /* Please see comment in gem_mmap_obj on mapping and attributes. */ return vmap(xen_obj->pages, xen_obj->num_pages, - VM_MAP, pgprot_writecombine(PAGE_KERNEL)); + VM_MAP, PAGE_KERNEL); } void xen_drm_front_gem_prime_vunmap(struct drm_gem_object *gem_obj, diff -Nru linux-4.19.98/drivers/hid/hid-alps.c linux-4.19.118/drivers/hid/hid-alps.c --- linux-4.19.98/drivers/hid/hid-alps.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-alps.c 2020-04-23 08:30:24.000000000 +0000 @@ -734,7 +734,7 @@ if (data->has_sp) { input2 = input_allocate_device(); if (!input2) { - input_free_device(input2); + ret = -ENOMEM; goto exit; } diff -Nru linux-4.19.98/drivers/hid/hid-apple.c linux-4.19.118/drivers/hid/hid-apple.c --- linux-4.19.98/drivers/hid/hid-apple.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-apple.c 2020-04-23 08:30:24.000000000 +0000 @@ -343,7 +343,8 @@ unsigned long **bit, int *max) { if (usage->hid == (HID_UP_CUSTOM | 0x0003) || - usage->hid == (HID_UP_MSVENDOR | 0x0003)) { + usage->hid == (HID_UP_MSVENDOR | 0x0003) || + usage->hid == (HID_UP_HPVENDOR2 | 0x0003)) { /* The fn key on Apple USB keyboards */ set_bit(EV_REP, hi->input->evbit); hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_FN); diff -Nru linux-4.19.98/drivers/hid/hid-core.c linux-4.19.118/drivers/hid/hid-core.c --- linux-4.19.98/drivers/hid/hid-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -1566,7 +1566,9 @@ rsize = ((report->size - 1) >> 3) + 1; - if (rsize > HID_MAX_BUFFER_SIZE) + if (report_enum->numbered && rsize >= HID_MAX_BUFFER_SIZE) + rsize = HID_MAX_BUFFER_SIZE - 1; + else if (rsize > HID_MAX_BUFFER_SIZE) rsize = HID_MAX_BUFFER_SIZE; if (csize < rsize) { diff -Nru linux-4.19.98/drivers/hid/hid-google-hammer.c linux-4.19.118/drivers/hid/hid-google-hammer.c --- linux-4.19.98/drivers/hid/hid-google-hammer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-google-hammer.c 2020-04-23 08:30:24.000000000 +0000 @@ -125,6 +125,8 @@ { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MASTERBALL) }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, + USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MOONBALL) }, + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_STAFF) }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_WAND) }, diff -Nru linux-4.19.98/drivers/hid/hid-ids.h linux-4.19.118/drivers/hid/hid-ids.h --- linux-4.19.98/drivers/hid/hid-ids.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-ids.h 2020-04-23 08:30:24.000000000 +0000 @@ -468,6 +468,7 @@ #define USB_DEVICE_ID_GOOGLE_WHISKERS 0x5030 #define USB_DEVICE_ID_GOOGLE_MASTERBALL 0x503c #define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d +#define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044 #define USB_VENDOR_ID_GOTOP 0x08f2 #define USB_DEVICE_ID_SUPER_Q2 0x007f @@ -620,6 +621,7 @@ #define USB_VENDOR_ID_ITE 0x048d #define USB_DEVICE_ID_ITE_LENOVO_YOGA 0x8386 #define USB_DEVICE_ID_ITE_LENOVO_YOGA2 0x8350 +#define I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720 0x837a #define USB_DEVICE_ID_ITE_LENOVO_YOGA900 0x8396 #define USB_DEVICE_ID_ITE8595 0x8595 @@ -717,6 +719,7 @@ #define USB_DEVICE_ID_LG_MULTITOUCH 0x0064 #define USB_DEVICE_ID_LG_MELFAS_MT 0x6007 #define I2C_DEVICE_ID_LG_8001 0x8001 +#define I2C_DEVICE_ID_LG_7010 0x7010 #define USB_VENDOR_ID_LOGITECH 0x046d #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e @@ -1074,6 +1077,7 @@ #define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10 #define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3 #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 +#define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968 #define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710 #define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047 diff -Nru linux-4.19.98/drivers/hid/hid-ite.c linux-4.19.118/drivers/hid/hid-ite.c --- linux-4.19.98/drivers/hid/hid-ite.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-ite.c 2020-04-23 08:30:24.000000000 +0000 @@ -43,6 +43,10 @@ static const struct hid_device_id ite_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, + /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, + USB_VENDOR_ID_SYNAPTICS, + USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, { } }; MODULE_DEVICE_TABLE(hid, ite_devices); diff -Nru linux-4.19.98/drivers/hid/hid-multitouch.c linux-4.19.118/drivers/hid/hid-multitouch.c --- linux-4.19.98/drivers/hid/hid-multitouch.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-multitouch.c 2020-04-23 08:30:24.000000000 +0000 @@ -1007,7 +1007,7 @@ tool = MT_TOOL_DIAL; else if (unlikely(!confidence_state)) { tool = MT_TOOL_PALM; - if (!active && + if (!active && mt && input_mt_is_active(&mt->slots[slotnum])) { /* * The non-confidence was reported for @@ -1972,6 +1972,9 @@ { .driver_data = MT_CLS_LG, HID_USB_DEVICE(USB_VENDOR_ID_LG, USB_DEVICE_ID_LG_MELFAS_MT) }, + { .driver_data = MT_CLS_LG, + HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC, + USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) }, /* MosArt panels */ { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, diff -Nru linux-4.19.98/drivers/hid/hid-quirks.c linux-4.19.118/drivers/hid/hid-quirks.c --- linux-4.19.98/drivers/hid/hid-quirks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-quirks.c 2020-04-23 08:30:24.000000000 +0000 @@ -175,6 +175,7 @@ { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET), HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD2, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE), HID_QUIRK_MULTI_INPUT }, { 0 } }; diff -Nru linux-4.19.98/drivers/hid/hid-steam.c linux-4.19.118/drivers/hid/hid-steam.c --- linux-4.19.98/drivers/hid/hid-steam.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/hid-steam.c 2020-04-23 08:30:24.000000000 +0000 @@ -768,8 +768,12 @@ if (steam->quirks & STEAM_QUIRK_WIRELESS) { hid_info(hdev, "Steam wireless receiver connected"); + /* If using a wireless adaptor ask for connection status */ + steam->connected = false; steam_request_conn_status(steam); } else { + /* A wired connection is always present */ + steam->connected = true; ret = steam_register(steam); if (ret) { hid_err(hdev, diff -Nru linux-4.19.98/drivers/hid/i2c-hid/i2c-hid-core.c linux-4.19.118/drivers/hid/i2c-hid/i2c-hid-core.c --- linux-4.19.98/drivers/hid/i2c-hid/i2c-hid-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/i2c-hid/i2c-hid-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -52,6 +52,8 @@ #define I2C_HID_QUIRK_DELAY_AFTER_SLEEP BIT(3) #define I2C_HID_QUIRK_BOGUS_IRQ BIT(4) #define I2C_HID_QUIRK_RESET_ON_RESUME BIT(5) +#define I2C_HID_QUIRK_BAD_INPUT_SIZE BIT(6) + /* flags */ #define I2C_HID_STARTED 0 @@ -185,6 +187,8 @@ I2C_HID_QUIRK_BOGUS_IRQ }, { USB_VENDOR_ID_ALPS_JP, HID_ANY_ID, I2C_HID_QUIRK_RESET_ON_RESUME }, + { USB_VENDOR_ID_ITE, I2C_DEVICE_ID_ITE_LENOVO_LEGION_Y720, + I2C_HID_QUIRK_BAD_INPUT_SIZE }, { 0, 0 } }; @@ -516,9 +520,15 @@ } if ((ret_size > size) || (ret_size < 2)) { - dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", - __func__, size, ret_size); - return; + if (ihid->quirks & I2C_HID_QUIRK_BAD_INPUT_SIZE) { + ihid->inbuf[0] = size & 0xff; + ihid->inbuf[1] = size >> 8; + ret_size = size; + } else { + dev_err(&ihid->client->dev, "%s: incomplete report (%d/%d)\n", + __func__, size, ret_size); + return; + } } i2c_hid_dbg(ihid, "input: %*ph\n", ret_size, ihid->inbuf); diff -Nru linux-4.19.98/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c linux-4.19.118/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c --- linux-4.19.98/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c 2020-04-23 08:30:24.000000000 +0000 @@ -342,6 +342,14 @@ .driver_data = (void *)&sipodev_desc }, { + .ident = "Trekstor SURFBOOK E11B", + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SURFBOOK E11B"), + }, + .driver_data = (void *)&sipodev_desc + }, + { .ident = "Direkt-Tek DTLAPY116-2", .matches = { DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Direkt-Tek"), diff -Nru linux-4.19.98/drivers/hid/usbhid/hiddev.c linux-4.19.118/drivers/hid/usbhid/hiddev.c --- linux-4.19.98/drivers/hid/usbhid/hiddev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hid/usbhid/hiddev.c 2020-04-23 08:30:24.000000000 +0000 @@ -954,9 +954,9 @@ hiddev->exist = 0; if (hiddev->open) { - mutex_unlock(&hiddev->existancelock); hid_hw_close(hiddev->hid); wake_up_interruptible(&hiddev->wait); + mutex_unlock(&hiddev->existancelock); } else { mutex_unlock(&hiddev->existancelock); kfree(hiddev); diff -Nru linux-4.19.98/drivers/hv/channel_mgmt.c linux-4.19.118/drivers/hv/channel_mgmt.c --- linux-4.19.98/drivers/hv/channel_mgmt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hv/channel_mgmt.c 2020-04-23 08:30:24.000000000 +0000 @@ -849,6 +849,9 @@ { struct vmbus_channel_message_header hdr; + if (xchg(&vmbus_connection.conn_state, DISCONNECTED) == DISCONNECTED) + return; + /* Pre-Win2012R2 hosts don't support reconnect */ if (vmbus_proto_version < VERSION_WIN8_1) return; diff -Nru linux-4.19.98/drivers/hv/hv_balloon.c linux-4.19.118/drivers/hv/hv_balloon.c --- linux-4.19.98/drivers/hv/hv_balloon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hv/hv_balloon.c 2020-04-23 08:30:24.000000000 +0000 @@ -1215,10 +1215,7 @@ unsigned int i = 0; struct page *pg; - if (num_pages < alloc_unit) - return 0; - - for (i = 0; (i * alloc_unit) < num_pages; i++) { + for (i = 0; i < num_pages / alloc_unit; i++) { if (bl_resp->hdr.size + sizeof(union dm_mem_page_range) > PAGE_SIZE) return i * alloc_unit; @@ -1252,7 +1249,7 @@ } - return num_pages; + return i * alloc_unit; } static void balloon_up(struct work_struct *dummy) @@ -1267,9 +1264,6 @@ long avail_pages; unsigned long floor; - /* The host balloons pages in 2M granularity. */ - WARN_ON_ONCE(num_pages % PAGES_IN_2M != 0); - /* * We will attempt 2M allocations. However, if we fail to * allocate 2M chunks, we will go back to 4k allocations. @@ -1279,14 +1273,13 @@ avail_pages = si_mem_available(); floor = compute_balloon_floor(); - /* Refuse to balloon below the floor, keep the 2M granularity. */ + /* Refuse to balloon below the floor. */ if (avail_pages < num_pages || avail_pages - num_pages < floor) { pr_warn("Balloon request will be partially fulfilled. %s\n", avail_pages < num_pages ? "Not enough memory." : "Balloon floor reached."); num_pages = avail_pages > floor ? (avail_pages - floor) : 0; - num_pages -= num_pages % PAGES_IN_2M; } while (!done) { diff -Nru linux-4.19.98/drivers/hv/vmbus_drv.c linux-4.19.118/drivers/hv/vmbus_drv.c --- linux-4.19.98/drivers/hv/vmbus_drv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hv/vmbus_drv.c 2020-04-23 08:30:24.000000000 +0000 @@ -43,6 +43,7 @@ #include #include #include +#include #include "hyperv_vmbus.h" struct vmbus_dynid { @@ -58,14 +59,35 @@ static void *hv_panic_page; +/* + * Boolean to control whether to report panic messages over Hyper-V. + * + * It can be set via /proc/sys/kernel/hyperv/record_panic_msg + */ +static int sysctl_record_panic_msg = 1; + +static int hyperv_report_reg(void) +{ + return !sysctl_record_panic_msg || !hv_panic_page; +} + static int hyperv_panic_event(struct notifier_block *nb, unsigned long val, void *args) { struct pt_regs *regs; - regs = current_pt_regs(); + vmbus_initiate_unload(true); - hyperv_report_panic(regs, val); + /* + * Hyper-V should be notified only once about a panic. If we will be + * doing hyperv_report_panic_msg() later with kmsg data, don't do + * the notification here. + */ + if (ms_hyperv.misc_features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE + && hyperv_report_reg()) { + regs = current_pt_regs(); + hyperv_report_panic(regs, val, false); + } return NOTIFY_DONE; } @@ -75,7 +97,13 @@ struct die_args *die = (struct die_args *)args; struct pt_regs *regs = die->regs; - hyperv_report_panic(regs, val); + /* + * Hyper-V should be notified only once about a panic. If we will be + * doing hyperv_report_panic_msg() later with kmsg data, don't do + * the notification here. + */ + if (hyperv_report_reg()) + hyperv_report_panic(regs, val, true); return NOTIFY_DONE; } @@ -1089,13 +1117,6 @@ } /* - * Boolean to control whether to report panic messages over Hyper-V. - * - * It can be set via /proc/sys/kernel/hyperv/record_panic_msg - */ -static int sysctl_record_panic_msg = 1; - -/* * Callback from kmsg_dump. Grab as much as possible from the end of the kmsg * buffer and call into Hyper-V to transfer the data. */ @@ -1219,19 +1240,29 @@ hv_panic_page = (void *)get_zeroed_page(GFP_KERNEL); if (hv_panic_page) { ret = kmsg_dump_register(&hv_kmsg_dumper); - if (ret) + if (ret) { pr_err("Hyper-V: kmsg dump register " "error 0x%x\n", ret); + free_page( + (unsigned long)hv_panic_page); + hv_panic_page = NULL; + } } else pr_err("Hyper-V: panic message page memory " "allocation failed"); } register_die_notifier(&hyperv_die_block); - atomic_notifier_chain_register(&panic_notifier_list, - &hyperv_panic_block); } + /* + * Always register the panic notifier because we need to unload + * the VMbus channel connection to prevent any VMbus + * activity after the VM panics. + */ + atomic_notifier_chain_register(&panic_notifier_list, + &hyperv_panic_block); + vmbus_request_offers(); return 0; @@ -1243,7 +1274,6 @@ hv_remove_vmbus_irq(); bus_unregister(&hv_bus); - free_page((unsigned long)hv_panic_page); unregister_sysctl_table(hv_ctl_table_hdr); hv_ctl_table_hdr = NULL; return ret; @@ -1875,7 +1905,6 @@ { hv_synic_clockevents_cleanup(); vmbus_initiate_unload(false); - vmbus_connection.conn_state = DISCONNECTED; /* Make sure conn_state is set as hv_synic_cleanup checks for it */ mb(); cpuhp_remove_state(hyperv_cpuhp_online); @@ -1890,7 +1919,6 @@ * doing the cleanup for current CPU only. This should be sufficient * for kdump. */ - vmbus_connection.conn_state = DISCONNECTED; hv_synic_cleanup(smp_processor_id()); hyperv_cleanup(); }; diff -Nru linux-4.19.98/drivers/hwmon/adt7462.c linux-4.19.118/drivers/hwmon/adt7462.c --- linux-4.19.98/drivers/hwmon/adt7462.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/adt7462.c 2020-04-23 08:30:24.000000000 +0000 @@ -426,7 +426,7 @@ return 0x95; break; } - return -ENODEV; + return 0; } /* Provide labels for sysfs */ diff -Nru linux-4.19.98/drivers/hwmon/adt7475.c linux-4.19.118/drivers/hwmon/adt7475.c --- linux-4.19.98/drivers/hwmon/adt7475.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/adt7475.c 2020-04-23 08:30:24.000000000 +0000 @@ -296,9 +296,10 @@ long reg; if (bypass_attn & (1 << channel)) - reg = (volt * 1024) / 2250; + reg = DIV_ROUND_CLOSEST(volt * 1024, 2250); else - reg = (volt * r[1] * 1024) / ((r[0] + r[1]) * 2250); + reg = DIV_ROUND_CLOSEST(volt * r[1] * 1024, + (r[0] + r[1]) * 2250); return clamp_val(reg, 0, 1023) & (0xff << 2); } diff -Nru linux-4.19.98/drivers/hwmon/hwmon.c linux-4.19.118/drivers/hwmon/hwmon.c --- linux-4.19.98/drivers/hwmon/hwmon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/hwmon.c 2020-04-23 08:30:24.000000000 +0000 @@ -51,6 +51,7 @@ #define to_hwmon_attr(d) \ container_of(d, struct hwmon_device_attribute, dev_attr) +#define to_dev_attr(a) container_of(a, struct device_attribute, attr) /* * Thermal zone information @@ -58,7 +59,7 @@ * also provides the sensor index. */ struct hwmon_thermal_data { - struct hwmon_device *hwdev; /* Reference to hwmon device */ + struct device *dev; /* Reference to hwmon device */ int index; /* sensor index */ }; @@ -95,9 +96,27 @@ NULL }; +static void hwmon_free_attrs(struct attribute **attrs) +{ + int i; + + for (i = 0; attrs[i]; i++) { + struct device_attribute *dattr = to_dev_attr(attrs[i]); + struct hwmon_device_attribute *hattr = to_hwmon_attr(dattr); + + kfree(hattr); + } + kfree(attrs); +} + static void hwmon_dev_release(struct device *dev) { - kfree(to_hwmon_device(dev)); + struct hwmon_device *hwdev = to_hwmon_device(dev); + + if (hwdev->group.attrs) + hwmon_free_attrs(hwdev->group.attrs); + kfree(hwdev->groups); + kfree(hwdev); } static struct class hwmon_class = { @@ -121,11 +140,11 @@ static int hwmon_thermal_get_temp(void *data, int *temp) { struct hwmon_thermal_data *tdata = data; - struct hwmon_device *hwdev = tdata->hwdev; + struct hwmon_device *hwdev = to_hwmon_device(tdata->dev); int ret; long t; - ret = hwdev->chip->ops->read(&hwdev->dev, hwmon_temp, hwmon_temp_input, + ret = hwdev->chip->ops->read(tdata->dev, hwmon_temp, hwmon_temp_input, tdata->index, &t); if (ret < 0) return ret; @@ -139,8 +158,7 @@ .get_temp = hwmon_thermal_get_temp, }; -static int hwmon_thermal_add_sensor(struct device *dev, - struct hwmon_device *hwdev, int index) +static int hwmon_thermal_add_sensor(struct device *dev, int index) { struct hwmon_thermal_data *tdata; struct thermal_zone_device *tzd; @@ -149,10 +167,10 @@ if (!tdata) return -ENOMEM; - tdata->hwdev = hwdev; + tdata->dev = dev; tdata->index = index; - tzd = devm_thermal_zone_of_sensor_register(&hwdev->dev, index, tdata, + tzd = devm_thermal_zone_of_sensor_register(dev, index, tdata, &hwmon_thermal_ops); /* * If CONFIG_THERMAL_OF is disabled, this returns -ENODEV, @@ -164,8 +182,7 @@ return 0; } #else -static int hwmon_thermal_add_sensor(struct device *dev, - struct hwmon_device *hwdev, int index) +static int hwmon_thermal_add_sensor(struct device *dev, int index) { return 0; } @@ -242,8 +259,7 @@ (type == hwmon_fan && attr == hwmon_fan_label); } -static struct attribute *hwmon_genattr(struct device *dev, - const void *drvdata, +static struct attribute *hwmon_genattr(const void *drvdata, enum hwmon_sensor_types type, u32 attr, int index, @@ -271,7 +287,7 @@ if ((mode & S_IWUGO) && !ops->write) return ERR_PTR(-EINVAL); - hattr = devm_kzalloc(dev, sizeof(*hattr), GFP_KERNEL); + hattr = kzalloc(sizeof(*hattr), GFP_KERNEL); if (!hattr) return ERR_PTR(-ENOMEM); @@ -478,8 +494,7 @@ return n; } -static int hwmon_genattrs(struct device *dev, - const void *drvdata, +static int hwmon_genattrs(const void *drvdata, struct attribute **attrs, const struct hwmon_ops *ops, const struct hwmon_channel_info *info) @@ -505,7 +520,7 @@ attr_mask &= ~BIT(attr); if (attr >= template_size) return -EINVAL; - a = hwmon_genattr(dev, drvdata, info->type, attr, i, + a = hwmon_genattr(drvdata, info->type, attr, i, templates[attr], ops); if (IS_ERR(a)) { if (PTR_ERR(a) != -ENOENT) @@ -519,8 +534,7 @@ } static struct attribute ** -__hwmon_create_attrs(struct device *dev, const void *drvdata, - const struct hwmon_chip_info *chip) +__hwmon_create_attrs(const void *drvdata, const struct hwmon_chip_info *chip) { int ret, i, aindex = 0, nattrs = 0; struct attribute **attrs; @@ -531,15 +545,17 @@ if (nattrs == 0) return ERR_PTR(-EINVAL); - attrs = devm_kcalloc(dev, nattrs + 1, sizeof(*attrs), GFP_KERNEL); + attrs = kcalloc(nattrs + 1, sizeof(*attrs), GFP_KERNEL); if (!attrs) return ERR_PTR(-ENOMEM); for (i = 0; chip->info[i]; i++) { - ret = hwmon_genattrs(dev, drvdata, &attrs[aindex], chip->ops, + ret = hwmon_genattrs(drvdata, &attrs[aindex], chip->ops, chip->info[i]); - if (ret < 0) + if (ret < 0) { + hwmon_free_attrs(attrs); return ERR_PTR(ret); + } aindex += ret; } @@ -581,14 +597,13 @@ for (i = 0; groups[i]; i++) ngroups++; - hwdev->groups = devm_kcalloc(dev, ngroups, sizeof(*groups), - GFP_KERNEL); + hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL); if (!hwdev->groups) { err = -ENOMEM; goto free_hwmon; } - attrs = __hwmon_create_attrs(dev, drvdata, chip); + attrs = __hwmon_create_attrs(drvdata, chip); if (IS_ERR(attrs)) { err = PTR_ERR(attrs); goto free_hwmon; @@ -633,8 +648,7 @@ hwmon_temp_input, j)) continue; if (info[i]->config[j] & HWMON_T_INPUT) { - err = hwmon_thermal_add_sensor(dev, - hwdev, j); + err = hwmon_thermal_add_sensor(hdev, j); if (err) { device_unregister(hdev); goto ida_remove; @@ -647,7 +661,7 @@ return hdev; free_hwmon: - kfree(hwdev); + hwmon_dev_release(hdev); ida_remove: ida_simple_remove(&hwmon_ida, id); return ERR_PTR(err); diff -Nru linux-4.19.98/drivers/hwmon/lm75.c linux-4.19.118/drivers/hwmon/lm75.c --- linux-4.19.98/drivers/hwmon/lm75.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/lm75.c 2020-04-23 08:30:24.000000000 +0000 @@ -165,7 +165,7 @@ temp = DIV_ROUND_CLOSEST(temp << (resolution - 8), 1000) << (16 - resolution); - return regmap_write(data->regmap, reg, temp); + return regmap_write(data->regmap, reg, (u16)temp); } static umode_t lm75_is_visible(const void *data, enum hwmon_sensor_types type, diff -Nru linux-4.19.98/drivers/hwmon/nct7802.c linux-4.19.118/drivers/hwmon/nct7802.c --- linux-4.19.98/drivers/hwmon/nct7802.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/nct7802.c 2020-04-23 08:30:24.000000000 +0000 @@ -32,8 +32,8 @@ static const u8 REG_VOLTAGE[5] = { 0x09, 0x0a, 0x0c, 0x0d, 0x0e }; static const u8 REG_VOLTAGE_LIMIT_LSB[2][5] = { - { 0x40, 0x00, 0x42, 0x44, 0x46 }, - { 0x3f, 0x00, 0x41, 0x43, 0x45 }, + { 0x46, 0x00, 0x40, 0x42, 0x44 }, + { 0x45, 0x00, 0x3f, 0x41, 0x43 }, }; static const u8 REG_VOLTAGE_LIMIT_MSB[5] = { 0x48, 0x00, 0x47, 0x47, 0x48 }; diff -Nru linux-4.19.98/drivers/hwmon/pmbus/ltc2978.c linux-4.19.118/drivers/hwmon/pmbus/ltc2978.c --- linux-4.19.98/drivers/hwmon/pmbus/ltc2978.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/pmbus/ltc2978.c 2020-04-23 08:30:24.000000000 +0000 @@ -89,8 +89,8 @@ #define LTC_POLL_TIMEOUT 100 /* in milli-seconds */ -#define LTC_NOT_BUSY BIT(5) -#define LTC_NOT_PENDING BIT(4) +#define LTC_NOT_BUSY BIT(6) +#define LTC_NOT_PENDING BIT(5) /* * LTC2978 clears peak data whenever the CLEAR_FAULTS command is executed, which diff -Nru linux-4.19.98/drivers/hwmon/pmbus/tps53679.c linux-4.19.118/drivers/hwmon/pmbus/tps53679.c --- linux-4.19.98/drivers/hwmon/pmbus/tps53679.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/pmbus/tps53679.c 2020-04-23 08:30:24.000000000 +0000 @@ -80,7 +80,14 @@ static int tps53679_probe(struct i2c_client *client, const struct i2c_device_id *id) { - return pmbus_do_probe(client, id, &tps53679_info); + struct pmbus_driver_info *info; + + info = devm_kmemdup(&client->dev, &tps53679_info, sizeof(*info), + GFP_KERNEL); + if (!info) + return -ENOMEM; + + return pmbus_do_probe(client, id, info); } static const struct i2c_device_id tps53679_id[] = { diff -Nru linux-4.19.98/drivers/hwmon/shtc1.c linux-4.19.118/drivers/hwmon/shtc1.c --- linux-4.19.98/drivers/hwmon/shtc1.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/shtc1.c 2020-04-23 08:30:24.000000000 +0000 @@ -38,7 +38,7 @@ /* constants for reading the ID register */ #define SHTC1_ID 0x07 -#define SHTC1_ID_REG_MASK 0x1f +#define SHTC1_ID_REG_MASK 0x3f /* delays for non-blocking i2c commands, both in us */ #define SHTC1_NONBLOCKING_WAIT_TIME_HPM 14400 diff -Nru linux-4.19.98/drivers/hwmon/w83627hf.c linux-4.19.118/drivers/hwmon/w83627hf.c --- linux-4.19.98/drivers/hwmon/w83627hf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwmon/w83627hf.c 2020-04-23 08:30:24.000000000 +0000 @@ -130,17 +130,23 @@ outb(ld, sio->sioaddr + 1); } -static inline void +static inline int superio_enter(struct w83627hf_sio_data *sio) { + if (!request_muxed_region(sio->sioaddr, 2, DRVNAME)) + return -EBUSY; + outb(0x87, sio->sioaddr); outb(0x87, sio->sioaddr); + + return 0; } static inline void superio_exit(struct w83627hf_sio_data *sio) { outb(0xAA, sio->sioaddr); + release_region(sio->sioaddr, 2); } #define W627_DEVID 0x52 @@ -1278,7 +1284,7 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, struct w83627hf_sio_data *sio_data) { - int err = -ENODEV; + int err; u16 val; static __initconst char *const names[] = { @@ -1290,7 +1296,11 @@ }; sio_data->sioaddr = sioaddr; - superio_enter(sio_data); + err = superio_enter(sio_data); + if (err) + return err; + + err = -ENODEV; val = force_id ? force_id : superio_inb(sio_data, DEVID); switch (val) { case W627_DEVID: @@ -1644,9 +1654,21 @@ struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); int res = 0xff, sel; - superio_enter(sio_data); + if (superio_enter(sio_data)) { + /* + * Some other driver reserved the address space for itself. + * We don't want to fail driver instantiation because of that, + * so display a warning and keep going. + */ + dev_warn(&pdev->dev, + "Can not read VID data: Failed to enable SuperIO access\n"); + return res; + } + superio_select(sio_data, W83627HF_LD_GPIO5); + res = 0xff; + /* Make sure these GPIO pins are enabled */ if (!(superio_inb(sio_data, W83627THF_GPIO5_EN) & (1<<3))) { dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n"); @@ -1677,7 +1699,17 @@ struct w83627hf_sio_data *sio_data = dev_get_platdata(&pdev->dev); int res = 0xff; - superio_enter(sio_data); + if (superio_enter(sio_data)) { + /* + * Some other driver reserved the address space for itself. + * We don't want to fail driver instantiation because of that, + * so display a warning and keep going. + */ + dev_warn(&pdev->dev, + "Can not read VID data: Failed to enable SuperIO access\n"); + return res; + } + superio_select(sio_data, W83627HF_LD_HWM); /* Make sure these GPIO pins are enabled */ diff -Nru linux-4.19.98/drivers/hwtracing/coresight/coresight-catu.h linux-4.19.118/drivers/hwtracing/coresight/coresight-catu.h --- linux-4.19.98/drivers/hwtracing/coresight/coresight-catu.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwtracing/coresight/coresight-catu.h 2020-04-23 08:30:24.000000000 +0000 @@ -109,11 +109,6 @@ return true; } -#ifdef CONFIG_CORESIGHT_CATU extern const struct etr_buf_operations etr_catu_buf_ops; -#else -/* Dummy declaration for the CATU ops */ -static const struct etr_buf_operations etr_catu_buf_ops; -#endif #endif diff -Nru linux-4.19.98/drivers/hwtracing/coresight/coresight-etb10.c linux-4.19.118/drivers/hwtracing/coresight/coresight-etb10.c --- linux-4.19.98/drivers/hwtracing/coresight/coresight-etb10.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwtracing/coresight/coresight-etb10.c 2020-04-23 08:30:24.000000000 +0000 @@ -275,9 +275,7 @@ int node; struct cs_buffers *buf; - if (cpu == -1) - cpu = smp_processor_id(); - node = cpu_to_node(cpu); + node = (cpu == -1) ? NUMA_NO_NODE : cpu_to_node(cpu); buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); if (!buf) diff -Nru linux-4.19.98/drivers/hwtracing/coresight/coresight-etm-perf.c linux-4.19.118/drivers/hwtracing/coresight/coresight-etm-perf.c --- linux-4.19.98/drivers/hwtracing/coresight/coresight-etm-perf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwtracing/coresight/coresight-etm-perf.c 2020-04-23 08:30:24.000000000 +0000 @@ -437,15 +437,16 @@ static void etm_addr_filters_sync(struct perf_event *event) { struct perf_addr_filters_head *head = perf_event_addr_filters(event); - unsigned long start, stop, *offs = event->addr_filters_offs; + unsigned long start, stop; + struct perf_addr_filter_range *fr = event->addr_filter_ranges; struct etm_filters *filters = event->hw.addr_filters; struct etm_filter *etm_filter; struct perf_addr_filter *filter; int i = 0; list_for_each_entry(filter, &head->list, entry) { - start = filter->offset + offs[i]; - stop = start + filter->size; + start = fr[i].start; + stop = start + fr[i].size; etm_filter = &filters->etm_filter[i]; switch (filter->action) { diff -Nru linux-4.19.98/drivers/hwtracing/coresight/coresight-tmc-etf.c linux-4.19.118/drivers/hwtracing/coresight/coresight-tmc-etf.c --- linux-4.19.98/drivers/hwtracing/coresight/coresight-tmc-etf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwtracing/coresight/coresight-tmc-etf.c 2020-04-23 08:30:24.000000000 +0000 @@ -304,9 +304,7 @@ int node; struct cs_buffers *buf; - if (cpu == -1) - cpu = smp_processor_id(); - node = cpu_to_node(cpu); + node = (cpu == -1) ? NUMA_NO_NODE : cpu_to_node(cpu); /* Allocate memory structure for interaction with Perf */ buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); diff -Nru linux-4.19.98/drivers/hwtracing/coresight/coresight-tmc-etr.c linux-4.19.118/drivers/hwtracing/coresight/coresight-tmc-etr.c --- linux-4.19.98/drivers/hwtracing/coresight/coresight-tmc-etr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwtracing/coresight/coresight-tmc-etr.c 2020-04-23 08:30:24.000000000 +0000 @@ -747,7 +747,8 @@ static const struct etr_buf_operations *etr_buf_ops[] = { [ETR_MODE_FLAT] = &etr_flat_buf_ops, [ETR_MODE_ETR_SG] = &etr_sg_buf_ops, - [ETR_MODE_CATU] = &etr_catu_buf_ops, + [ETR_MODE_CATU] = IS_ENABLED(CONFIG_CORESIGHT_CATU) + ? &etr_catu_buf_ops : NULL, }; static inline int tmc_etr_mode_alloc_buf(int mode, @@ -761,7 +762,7 @@ case ETR_MODE_FLAT: case ETR_MODE_ETR_SG: case ETR_MODE_CATU: - if (etr_buf_ops[mode]->alloc) + if (etr_buf_ops[mode] && etr_buf_ops[mode]->alloc) rc = etr_buf_ops[mode]->alloc(drvdata, etr_buf, node, pages); if (!rc) diff -Nru linux-4.19.98/drivers/hwtracing/intel_th/msu.c linux-4.19.118/drivers/hwtracing/intel_th/msu.c --- linux-4.19.98/drivers/hwtracing/intel_th/msu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwtracing/intel_th/msu.c 2020-04-23 08:30:24.000000000 +0000 @@ -491,7 +491,7 @@ lockdep_assert_held(&msc->buf_mutex); if (msc->mode > MSC_MODE_MULTI) - return -ENOTSUPP; + return -EINVAL; if (msc->mode == MSC_MODE_MULTI) msc_buffer_clear_hw_header(msc); @@ -942,7 +942,7 @@ } else if (msc->mode == MSC_MODE_MULTI) { ret = msc_buffer_multi_alloc(msc, nr_pages, nr_wins); } else { - ret = -ENOTSUPP; + ret = -EINVAL; } if (!ret) { @@ -1165,7 +1165,7 @@ if (ret >= 0) *ppos = iter->offset; } else { - ret = -ENOTSUPP; + ret = -EINVAL; } put_count: diff -Nru linux-4.19.98/drivers/hwtracing/intel_th/pci.c linux-4.19.118/drivers/hwtracing/intel_th/pci.c --- linux-4.19.98/drivers/hwtracing/intel_th/pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/hwtracing/intel_th/pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -211,6 +211,11 @@ .driver_data = (kernel_ulong_t)&intel_th_2x, }, { + /* Elkhart Lake CPU */ + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4529), + .driver_data = (kernel_ulong_t)&intel_th_2x, + }, + { /* Elkhart Lake */ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), .driver_data = (kernel_ulong_t)&intel_th_2x, diff -Nru linux-4.19.98/drivers/i2c/busses/i2c-altera.c linux-4.19.118/drivers/i2c/busses/i2c-altera.c --- linux-4.19.98/drivers/i2c/busses/i2c-altera.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/busses/i2c-altera.c 2020-04-23 08:30:24.000000000 +0000 @@ -182,7 +182,7 @@ /* SCL Low Time */ writel(t_low, idev->base + ALTR_I2C_SCL_LOW); /* SDA Hold Time, 300ns */ - writel(div_u64(300 * clk_mhz, 1000), idev->base + ALTR_I2C_SDA_HOLD); + writel(3 * clk_mhz / 10, idev->base + ALTR_I2C_SDA_HOLD); /* Mask all master interrupt bits */ altr_i2c_int_enable(idev, ALTR_I2C_ALL_IRQ, false); diff -Nru linux-4.19.98/drivers/i2c/busses/i2c-gpio.c linux-4.19.118/drivers/i2c/busses/i2c-gpio.c --- linux-4.19.98/drivers/i2c/busses/i2c-gpio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/busses/i2c-gpio.c 2020-04-23 08:30:24.000000000 +0000 @@ -248,7 +248,7 @@ if (ret == -ENOENT) retdesc = ERR_PTR(-EPROBE_DEFER); - if (ret != -EPROBE_DEFER) + if (PTR_ERR(retdesc) != -EPROBE_DEFER) dev_err(dev, "error trying to get descriptor: %d\n", ret); return retdesc; diff -Nru linux-4.19.98/drivers/i2c/busses/i2c-hix5hd2.c linux-4.19.118/drivers/i2c/busses/i2c-hix5hd2.c --- linux-4.19.98/drivers/i2c/busses/i2c-hix5hd2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/busses/i2c-hix5hd2.c 2020-04-23 08:30:24.000000000 +0000 @@ -482,6 +482,7 @@ i2c_del_adapter(&priv->adap); pm_runtime_disable(priv->dev); pm_runtime_set_suspended(priv->dev); + clk_disable_unprepare(priv->clk); return 0; } diff -Nru linux-4.19.98/drivers/i2c/busses/i2c-jz4780.c linux-4.19.118/drivers/i2c/busses/i2c-jz4780.c --- linux-4.19.98/drivers/i2c/busses/i2c-jz4780.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/busses/i2c-jz4780.c 2020-04-23 08:30:24.000000000 +0000 @@ -82,25 +82,6 @@ #define JZ4780_I2C_STA_TFNF BIT(1) #define JZ4780_I2C_STA_ACT BIT(0) -static const char * const jz4780_i2c_abrt_src[] = { - "ABRT_7B_ADDR_NOACK", - "ABRT_10ADDR1_NOACK", - "ABRT_10ADDR2_NOACK", - "ABRT_XDATA_NOACK", - "ABRT_GCALL_NOACK", - "ABRT_GCALL_READ", - "ABRT_HS_ACKD", - "SBYTE_ACKDET", - "ABRT_HS_NORSTRT", - "SBYTE_NORSTRT", - "ABRT_10B_RD_NORSTRT", - "ABRT_MASTER_DIS", - "ARB_LOST", - "SLVFLUSH_TXFIFO", - "SLV_ARBLOST", - "SLVRD_INTX", -}; - #define JZ4780_I2C_INTST_IGC BIT(11) #define JZ4780_I2C_INTST_ISTT BIT(10) #define JZ4780_I2C_INTST_ISTP BIT(9) @@ -538,21 +519,8 @@ static void jz4780_i2c_txabrt(struct jz4780_i2c *i2c, int src) { - int i; - - dev_err(&i2c->adap.dev, "txabrt: 0x%08x\n", src); - dev_err(&i2c->adap.dev, "device addr=%x\n", - jz4780_i2c_readw(i2c, JZ4780_I2C_TAR)); - dev_err(&i2c->adap.dev, "send cmd count:%d %d\n", - i2c->cmd, i2c->cmd_buf[i2c->cmd]); - dev_err(&i2c->adap.dev, "receive data count:%d %d\n", - i2c->cmd, i2c->data_buf[i2c->cmd]); - - for (i = 0; i < 16; i++) { - if (src & BIT(i)) - dev_dbg(&i2c->adap.dev, "I2C TXABRT[%d]=%s\n", - i, jz4780_i2c_abrt_src[i]); - } + dev_dbg(&i2c->adap.dev, "txabrt: 0x%08x, cmd: %d, send: %d, recv: %d\n", + src, i2c->cmd, i2c->cmd_buf[i2c->cmd], i2c->data_buf[i2c->cmd]); } static inline int jz4780_i2c_xfer_read(struct jz4780_i2c *i2c, diff -Nru linux-4.19.98/drivers/i2c/busses/i2c-st.c linux-4.19.118/drivers/i2c/busses/i2c-st.c --- linux-4.19.98/drivers/i2c/busses/i2c-st.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/busses/i2c-st.c 2020-04-23 08:30:24.000000000 +0000 @@ -437,6 +437,7 @@ /** * st_i2c_rd_fill_tx_fifo() - Fill the Tx FIFO in read mode * @i2c_dev: Controller's private data + * @max: Maximum amount of data to fill into the Tx FIFO * * This functions fills the Tx FIFO with fixed pattern when * in read mode to trigger clock. diff -Nru linux-4.19.98/drivers/i2c/busses/i2c-stm32.c linux-4.19.118/drivers/i2c/busses/i2c-stm32.c --- linux-4.19.98/drivers/i2c/busses/i2c-stm32.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/busses/i2c-stm32.c 2020-04-23 08:30:24.000000000 +0000 @@ -21,13 +21,13 @@ dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); if (!dma) - return NULL; + return ERR_PTR(-ENOMEM); /* Request and configure I2C TX dma channel */ - dma->chan_tx = dma_request_slave_channel(dev, "tx"); - if (!dma->chan_tx) { + dma->chan_tx = dma_request_chan(dev, "tx"); + if (IS_ERR(dma->chan_tx)) { dev_dbg(dev, "can't request DMA tx channel\n"); - ret = -EINVAL; + ret = PTR_ERR(dma->chan_tx); goto fail_al; } @@ -43,10 +43,10 @@ } /* Request and configure I2C RX dma channel */ - dma->chan_rx = dma_request_slave_channel(dev, "rx"); - if (!dma->chan_rx) { + dma->chan_rx = dma_request_chan(dev, "rx"); + if (IS_ERR(dma->chan_rx)) { dev_err(dev, "can't request DMA rx channel\n"); - ret = -EINVAL; + ret = PTR_ERR(dma->chan_rx); goto fail_tx; } @@ -76,7 +76,7 @@ devm_kfree(dev, dma); dev_info(dev, "can't use DMA\n"); - return NULL; + return ERR_PTR(ret); } void stm32_i2c_dma_free(struct stm32_i2c_dma *dma) diff -Nru linux-4.19.98/drivers/i2c/busses/i2c-stm32f7.c linux-4.19.118/drivers/i2c/busses/i2c-stm32f7.c --- linux-4.19.98/drivers/i2c/busses/i2c-stm32f7.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/busses/i2c-stm32f7.c 2020-04-23 08:30:24.000000000 +0000 @@ -1252,8 +1252,8 @@ * slave[0] supports 7-bit and 10-bit slave address * slave[1] supports 7-bit slave address only */ - for (i = 0; i < STM32F7_I2C_MAX_SLAVE; i++) { - if (i == 1 && (slave->flags & I2C_CLIENT_PEC)) + for (i = STM32F7_I2C_MAX_SLAVE - 1; i >= 0; i--) { + if (i == 1 && (slave->flags & I2C_CLIENT_TEN)) continue; if (!i2c_dev->slave[i]) { *id = i; @@ -1914,6 +1914,15 @@ i2c_dev->dma = stm32_i2c_dma_request(i2c_dev->dev, phy_addr, STM32F7_I2C_TXDR, STM32F7_I2C_RXDR); + if (PTR_ERR(i2c_dev->dma) == -ENODEV) + i2c_dev->dma = NULL; + else if (IS_ERR(i2c_dev->dma)) { + ret = PTR_ERR(i2c_dev->dma); + if (ret != -EPROBE_DEFER) + dev_err(&pdev->dev, + "Failed to request dma error %i\n", ret); + goto clk_free; + } ret = i2c_add_adapter(adap); if (ret) diff -Nru linux-4.19.98/drivers/i2c/i2c-core-acpi.c linux-4.19.118/drivers/i2c/i2c-core-acpi.c --- linux-4.19.98/drivers/i2c/i2c-core-acpi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/i2c/i2c-core-acpi.c 2020-04-23 08:30:24.000000000 +0000 @@ -352,10 +352,18 @@ static struct i2c_client *i2c_acpi_find_client_by_adev(struct acpi_device *adev) { struct device *dev; + struct i2c_client *client; dev = bus_find_device(&i2c_bus_type, NULL, adev, i2c_acpi_find_match_device); - return dev ? i2c_verify_client(dev) : NULL; + if (!dev) + return NULL; + + client = i2c_verify_client(dev); + if (!client) + put_device(dev); + + return client; } static int i2c_acpi_notify(struct notifier_block *nb, unsigned long value, diff -Nru linux-4.19.98/drivers/ide/cmd64x.c linux-4.19.118/drivers/ide/cmd64x.c --- linux-4.19.98/drivers/ide/cmd64x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ide/cmd64x.c 2020-04-23 08:30:24.000000000 +0000 @@ -65,6 +65,9 @@ struct ide_timing t; u8 arttim = 0; + if (drive->dn >= ARRAY_SIZE(drwtim_regs)) + return; + ide_timing_compute(drive, mode, &t, T, 0); /* diff -Nru linux-4.19.98/drivers/ide/serverworks.c linux-4.19.118/drivers/ide/serverworks.c --- linux-4.19.98/drivers/ide/serverworks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ide/serverworks.c 2020-04-23 08:30:24.000000000 +0000 @@ -114,6 +114,9 @@ struct pci_dev *dev = to_pci_dev(hwif->dev); const u8 pio = drive->pio_mode - XFER_PIO_0; + if (drive->dn >= ARRAY_SIZE(drive_pci)) + return; + pci_write_config_byte(dev, drive_pci[drive->dn], pio_modes[pio]); if (svwks_csb_check(dev)) { @@ -140,6 +143,9 @@ u8 ultra_enable = 0, ultra_timing = 0, dma_timing = 0; + if (drive->dn >= ARRAY_SIZE(drive_pci2)) + return; + pci_read_config_byte(dev, (0x56|hwif->channel), &ultra_timing); pci_read_config_byte(dev, 0x54, &ultra_enable); diff -Nru linux-4.19.98/drivers/iio/accel/st_accel_i2c.c linux-4.19.118/drivers/iio/accel/st_accel_i2c.c --- linux-4.19.98/drivers/iio/accel/st_accel_i2c.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/accel/st_accel_i2c.c 2020-04-23 08:30:24.000000000 +0000 @@ -107,7 +107,7 @@ #ifdef CONFIG_ACPI static const struct acpi_device_id st_accel_acpi_match[] = { - {"SMO8840", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME}, + {"SMO8840", (kernel_ulong_t)LIS2DH12_ACCEL_DEV_NAME}, {"SMO8A90", (kernel_ulong_t)LNG2DM_ACCEL_DEV_NAME}, { }, }; diff -Nru linux-4.19.98/drivers/iio/adc/at91-sama5d2_adc.c linux-4.19.118/drivers/iio/adc/at91-sama5d2_adc.c --- linux-4.19.98/drivers/iio/adc/at91-sama5d2_adc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/adc/at91-sama5d2_adc.c 2020-04-23 08:30:24.000000000 +0000 @@ -731,6 +731,7 @@ for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) { struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit); + u32 cor; if (!chan) continue; @@ -740,6 +741,20 @@ continue; if (state) { + cor = at91_adc_readl(st, AT91_SAMA5D2_COR); + + if (chan->differential) + cor |= (BIT(chan->channel) | + BIT(chan->channel2)) << + AT91_SAMA5D2_COR_DIFF_OFFSET; + else + cor &= ~(BIT(chan->channel) << + AT91_SAMA5D2_COR_DIFF_OFFSET); + + at91_adc_writel(st, AT91_SAMA5D2_COR, cor); + } + + if (state) { at91_adc_writel(st, AT91_SAMA5D2_CHER, BIT(chan->channel)); /* enable irq only if not using DMA */ diff -Nru linux-4.19.98/drivers/iio/dac/ad5380.c linux-4.19.118/drivers/iio/dac/ad5380.c --- linux-4.19.98/drivers/iio/dac/ad5380.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/dac/ad5380.c 2020-04-23 08:30:24.000000000 +0000 @@ -221,7 +221,7 @@ if (ret) return ret; *val >>= chan->scan_type.shift; - val -= (1 << chan->scan_type.realbits) / 2; + *val -= (1 << chan->scan_type.realbits) / 2; return IIO_VAL_INT; case IIO_CHAN_INFO_SCALE: *val = 2 * st->vref; diff -Nru linux-4.19.98/drivers/iio/gyro/st_gyro_core.c linux-4.19.118/drivers/iio/gyro/st_gyro_core.c --- linux-4.19.98/drivers/iio/gyro/st_gyro_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/gyro/st_gyro_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -141,7 +141,6 @@ [2] = LSM330DLC_GYRO_DEV_NAME, [3] = L3G4IS_GYRO_DEV_NAME, [4] = LSM330_GYRO_DEV_NAME, - [5] = LSM9DS0_GYRO_DEV_NAME, }, .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, .odr = { @@ -205,6 +204,80 @@ }, }, .sim = { + .addr = 0x23, + .value = BIT(0), + }, + .multi_read_bit = true, + .bootime = 2, + }, + { + .wai = 0xd4, + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, + .sensors_supported = { + [0] = LSM9DS0_GYRO_DEV_NAME, + }, + .ch = (struct iio_chan_spec *)st_gyro_16bit_channels, + .odr = { + .addr = 0x20, + .mask = GENMASK(7, 6), + .odr_avl = { + { .hz = 95, .value = 0x00, }, + { .hz = 190, .value = 0x01, }, + { .hz = 380, .value = 0x02, }, + { .hz = 760, .value = 0x03, }, + }, + }, + .pw = { + .addr = 0x20, + .mask = BIT(3), + .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE, + .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE, + }, + .enable_axis = { + .addr = ST_SENSORS_DEFAULT_AXIS_ADDR, + .mask = ST_SENSORS_DEFAULT_AXIS_MASK, + }, + .fs = { + .addr = 0x23, + .mask = GENMASK(5, 4), + .fs_avl = { + [0] = { + .num = ST_GYRO_FS_AVL_245DPS, + .value = 0x00, + .gain = IIO_DEGREE_TO_RAD(8750), + }, + [1] = { + .num = ST_GYRO_FS_AVL_500DPS, + .value = 0x01, + .gain = IIO_DEGREE_TO_RAD(17500), + }, + [2] = { + .num = ST_GYRO_FS_AVL_2000DPS, + .value = 0x02, + .gain = IIO_DEGREE_TO_RAD(70000), + }, + }, + }, + .bdu = { + .addr = 0x23, + .mask = BIT(7), + }, + .drdy_irq = { + .int2 = { + .addr = 0x22, + .mask = BIT(3), + }, + /* + * The sensor has IHL (active low) and open + * drain settings, but only for INT1 and not + * for the DRDY line on INT2. + */ + .stat_drdy = { + .addr = ST_SENSORS_DEFAULT_STAT_ADDR, + .mask = GENMASK(2, 0), + }, + }, + .sim = { .addr = 0x23, .value = BIT(0), }, diff -Nru linux-4.19.98/drivers/iio/light/si1133.c linux-4.19.118/drivers/iio/light/si1133.c --- linux-4.19.98/drivers/iio/light/si1133.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/light/si1133.c 2020-04-23 08:30:24.000000000 +0000 @@ -102,6 +102,9 @@ #define SI1133_INPUT_FRACTION_LOW 15 #define SI1133_LUX_OUTPUT_FRACTION 12 #define SI1133_LUX_BUFFER_SIZE 9 +#define SI1133_MEASURE_BUFFER_SIZE 3 + +#define SI1133_SIGN_BIT_INDEX 23 static const int si1133_scale_available[] = { 1, 2, 4, 8, 16, 32, 64, 128}; @@ -234,13 +237,13 @@ } }; -static int si1133_calculate_polynomial_inner(u32 input, u8 fraction, u16 mag, +static int si1133_calculate_polynomial_inner(s32 input, u8 fraction, u16 mag, s8 shift) { return ((input << fraction) / mag) << shift; } -static int si1133_calculate_output(u32 x, u32 y, u8 x_order, u8 y_order, +static int si1133_calculate_output(s32 x, s32 y, u8 x_order, u8 y_order, u8 input_fraction, s8 sign, const struct si1133_coeff *coeffs) { @@ -276,7 +279,7 @@ * The algorithm is from: * https://siliconlabs.github.io/Gecko_SDK_Doc/efm32zg/html/si1133_8c_source.html#l00716 */ -static int si1133_calc_polynomial(u32 x, u32 y, u8 input_fraction, u8 num_coeff, +static int si1133_calc_polynomial(s32 x, s32 y, u8 input_fraction, u8 num_coeff, const struct si1133_coeff *coeffs) { u8 x_order, y_order; @@ -614,7 +617,7 @@ { int err; - __be16 resp; + u8 buffer[SI1133_MEASURE_BUFFER_SIZE]; err = si1133_set_adcmux(data, 0, chan->channel); if (err) @@ -625,12 +628,13 @@ if (err) return err; - err = si1133_bulk_read(data, SI1133_REG_HOSTOUT(0), sizeof(resp), - (u8 *)&resp); + err = si1133_bulk_read(data, SI1133_REG_HOSTOUT(0), sizeof(buffer), + buffer); if (err) return err; - *val = be16_to_cpu(resp); + *val = sign_extend32((buffer[0] << 16) | (buffer[1] << 8) | buffer[2], + SI1133_SIGN_BIT_INDEX); return err; } @@ -704,9 +708,9 @@ { int err; int lux; - u32 high_vis; - u32 low_vis; - u32 ir; + s32 high_vis; + s32 low_vis; + s32 ir; u8 buffer[SI1133_LUX_BUFFER_SIZE]; /* Activate lux channels */ @@ -719,9 +723,16 @@ if (err) return err; - high_vis = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2]; - low_vis = (buffer[3] << 16) | (buffer[4] << 8) | buffer[5]; - ir = (buffer[6] << 16) | (buffer[7] << 8) | buffer[8]; + high_vis = + sign_extend32((buffer[0] << 16) | (buffer[1] << 8) | buffer[2], + SI1133_SIGN_BIT_INDEX); + + low_vis = + sign_extend32((buffer[3] << 16) | (buffer[4] << 8) | buffer[5], + SI1133_SIGN_BIT_INDEX); + + ir = sign_extend32((buffer[6] << 16) | (buffer[7] << 8) | buffer[8], + SI1133_SIGN_BIT_INDEX); if (high_vis > SI1133_ADC_THRESHOLD || ir > SI1133_ADC_THRESHOLD) lux = si1133_calc_polynomial(high_vis, ir, diff -Nru linux-4.19.98/drivers/iio/light/tsl2772.c linux-4.19.118/drivers/iio/light/tsl2772.c --- linux-4.19.98/drivers/iio/light/tsl2772.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/light/tsl2772.c 2020-04-23 08:30:24.000000000 +0000 @@ -716,6 +716,13 @@ return tsl2772_write_control_reg(chip, 0x00); } +static void tsl2772_chip_off_action(void *data) +{ + struct iio_dev *indio_dev = data; + + tsl2772_chip_off(indio_dev); +} + /** * tsl2772_invoke_change - power cycle the device to implement the user * parameters @@ -1711,9 +1718,14 @@ if (ret < 0) return ret; + ret = devm_add_action_or_reset(&clientp->dev, + tsl2772_chip_off_action, + indio_dev); + if (ret < 0) + return ret; + ret = iio_device_register(indio_dev); if (ret) { - tsl2772_chip_off(indio_dev); dev_err(&clientp->dev, "%s: iio registration failed\n", __func__); return ret; @@ -1740,8 +1752,6 @@ { struct iio_dev *indio_dev = i2c_get_clientdata(client); - tsl2772_chip_off(indio_dev); - iio_device_unregister(indio_dev); return 0; diff -Nru linux-4.19.98/drivers/iio/light/vcnl4000.c linux-4.19.118/drivers/iio/light/vcnl4000.c --- linux-4.19.98/drivers/iio/light/vcnl4000.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/light/vcnl4000.c 2020-04-23 08:30:24.000000000 +0000 @@ -150,9 +150,10 @@ data->al_scale = 24000; data->vcnl4200_al.reg = VCNL4200_AL_DATA; data->vcnl4200_ps.reg = VCNL4200_PS_DATA; - /* Integration time is 50ms, but the experiments show 54ms in total. */ - data->vcnl4200_al.sampling_rate = ktime_set(0, 54000 * 1000); - data->vcnl4200_ps.sampling_rate = ktime_set(0, 4200 * 1000); + /* Default wait time is 50ms, add 20% tolerance. */ + data->vcnl4200_al.sampling_rate = ktime_set(0, 60000 * 1000); + /* Default wait time is 4.8ms, add 20% tolerance. */ + data->vcnl4200_ps.sampling_rate = ktime_set(0, 5760 * 1000); data->vcnl4200_al.last_measurement = ktime_set(0, 0); data->vcnl4200_ps.last_measurement = ktime_set(0, 0); mutex_init(&data->vcnl4200_al.lock); diff -Nru linux-4.19.98/drivers/iio/magnetometer/ak8974.c linux-4.19.118/drivers/iio/magnetometer/ak8974.c --- linux-4.19.98/drivers/iio/magnetometer/ak8974.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/magnetometer/ak8974.c 2020-04-23 08:30:24.000000000 +0000 @@ -563,7 +563,7 @@ * We read all axes and discard all but one, for optimized * reading, use the triggered buffer. */ - *val = le16_to_cpu(hw_values[chan->address]); + *val = (s16)le16_to_cpu(hw_values[chan->address]); ret = IIO_VAL_INT; } diff -Nru linux-4.19.98/drivers/iio/trigger/stm32-timer-trigger.c linux-4.19.118/drivers/iio/trigger/stm32-timer-trigger.c --- linux-4.19.98/drivers/iio/trigger/stm32-timer-trigger.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iio/trigger/stm32-timer-trigger.c 2020-04-23 08:30:24.000000000 +0000 @@ -161,7 +161,8 @@ return 0; } -static void stm32_timer_stop(struct stm32_timer_trigger *priv) +static void stm32_timer_stop(struct stm32_timer_trigger *priv, + struct iio_trigger *trig) { u32 ccer, cr1; @@ -179,6 +180,12 @@ regmap_write(priv->regmap, TIM_PSC, 0); regmap_write(priv->regmap, TIM_ARR, 0); + /* Force disable master mode */ + if (stm32_timer_is_trgo2_name(trig->name)) + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 0); + else + regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 0); + /* Make sure that registers are updated */ regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); } @@ -197,7 +204,7 @@ return ret; if (freq == 0) { - stm32_timer_stop(priv); + stm32_timer_stop(priv, trig); } else { ret = stm32_timer_start(priv, trig, freq); if (ret) diff -Nru linux-4.19.98/drivers/infiniband/core/addr.c linux-4.19.118/drivers/infiniband/core/addr.c --- linux-4.19.98/drivers/infiniband/core/addr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/addr.c 2020-04-23 08:30:24.000000000 +0000 @@ -136,7 +136,7 @@ if (ib_nl_is_good_ip_resp(nlh)) ib_nl_process_good_ip_rsep(nlh); - return skb->len; + return 0; } static int ib_nl_ip_send_msg(struct rdma_dev_addr *dev_addr, diff -Nru linux-4.19.98/drivers/infiniband/core/cm.c linux-4.19.118/drivers/infiniband/core/cm.c --- linux-4.19.98/drivers/infiniband/core/cm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/cm.c 2020-04-23 08:30:24.000000000 +0000 @@ -1231,6 +1231,7 @@ /* Sharing an ib_cm_id with different handlers is not * supported */ spin_unlock_irqrestore(&cm.lock, flags); + ib_destroy_cm_id(cm_id); return ERR_PTR(-EINVAL); } atomic_inc(&cm_id_priv->refcount); diff -Nru linux-4.19.98/drivers/infiniband/core/cma.c linux-4.19.118/drivers/infiniband/core/cma.c --- linux-4.19.98/drivers/infiniband/core/cma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/cma.c 2020-04-23 08:30:24.000000000 +0000 @@ -2753,6 +2753,7 @@ err2: kfree(route->path_rec); route->path_rec = NULL; + route->num_paths = 0; err1: kfree(work); return ret; @@ -2889,7 +2890,7 @@ if (status) pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to acquire device. status %d\n", status); - } else { + } else if (status) { pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to resolve IP. status %d\n", status); } @@ -4635,6 +4636,19 @@ { int ret; + /* + * There is a rare lock ordering dependency in cma_netdev_callback() + * that only happens when bonding is enabled. Teach lockdep that rtnl + * must never be nested under lock so it can find these without having + * to test with bonding. + */ + if (IS_ENABLED(CONFIG_LOCKDEP)) { + rtnl_lock(); + mutex_lock(&lock); + mutex_unlock(&lock); + rtnl_unlock(); + } + cma_wq = alloc_ordered_workqueue("rdma_cm", WQ_MEM_RECLAIM); if (!cma_wq) return -ENOMEM; diff -Nru linux-4.19.98/drivers/infiniband/core/iwcm.c linux-4.19.118/drivers/infiniband/core/iwcm.c --- linux-4.19.98/drivers/infiniband/core/iwcm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/iwcm.c 2020-04-23 08:30:24.000000000 +0000 @@ -158,8 +158,10 @@ { struct list_head *e, *tmp; - list_for_each_safe(e, tmp, &cm_id_priv->work_free_list) + list_for_each_safe(e, tmp, &cm_id_priv->work_free_list) { + list_del(e); kfree(list_entry(e, struct iwcm_work, free_list)); + } } static int alloc_work_entries(struct iwcm_id_private *cm_id_priv, int count) diff -Nru linux-4.19.98/drivers/infiniband/core/sa_query.c linux-4.19.118/drivers/infiniband/core/sa_query.c --- linux-4.19.98/drivers/infiniband/core/sa_query.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/sa_query.c 2020-04-23 08:30:24.000000000 +0000 @@ -1078,7 +1078,7 @@ } settimeout_out: - return skb->len; + return 0; } static inline int ib_nl_is_good_resolve_resp(const struct nlmsghdr *nlh) @@ -1149,7 +1149,7 @@ } resp_out: - return skb->len; + return 0; } static void free_sm_ah(struct kref *kref) diff -Nru linux-4.19.98/drivers/infiniband/core/security.c linux-4.19.118/drivers/infiniband/core/security.c --- linux-4.19.98/drivers/infiniband/core/security.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/security.c 2020-04-23 08:30:24.000000000 +0000 @@ -336,27 +336,20 @@ if (!new_pps) return NULL; - if (qp_attr_mask & (IB_QP_PKEY_INDEX | IB_QP_PORT)) { - if (!qp_pps) { - new_pps->main.port_num = qp_attr->port_num; - new_pps->main.pkey_index = qp_attr->pkey_index; - } else { - new_pps->main.port_num = (qp_attr_mask & IB_QP_PORT) ? - qp_attr->port_num : - qp_pps->main.port_num; - - new_pps->main.pkey_index = - (qp_attr_mask & IB_QP_PKEY_INDEX) ? - qp_attr->pkey_index : - qp_pps->main.pkey_index; - } - new_pps->main.state = IB_PORT_PKEY_VALID; - } else if (qp_pps) { + if (qp_attr_mask & IB_QP_PORT) + new_pps->main.port_num = qp_attr->port_num; + else if (qp_pps) new_pps->main.port_num = qp_pps->main.port_num; + + if (qp_attr_mask & IB_QP_PKEY_INDEX) + new_pps->main.pkey_index = qp_attr->pkey_index; + else if (qp_pps) new_pps->main.pkey_index = qp_pps->main.pkey_index; - if (qp_pps->main.state != IB_PORT_PKEY_NOT_VALID) - new_pps->main.state = IB_PORT_PKEY_VALID; - } + + if (((qp_attr_mask & IB_QP_PKEY_INDEX) && + (qp_attr_mask & IB_QP_PORT)) || + (qp_pps && qp_pps->main.state != IB_PORT_PKEY_NOT_VALID)) + new_pps->main.state = IB_PORT_PKEY_VALID; if (qp_attr_mask & IB_QP_ALT_PATH) { new_pps->alt.port_num = qp_attr->alt_port_num; diff -Nru linux-4.19.98/drivers/infiniband/core/ucma.c linux-4.19.118/drivers/infiniband/core/ucma.c --- linux-4.19.98/drivers/infiniband/core/ucma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/ucma.c 2020-04-23 08:30:24.000000000 +0000 @@ -89,6 +89,7 @@ struct ucma_file *file; struct rdma_cm_id *cm_id; + struct mutex mutex; u64 uid; struct list_head list; @@ -215,6 +216,7 @@ init_completion(&ctx->comp); INIT_LIST_HEAD(&ctx->mc_list); ctx->file = file; + mutex_init(&ctx->mutex); mutex_lock(&mut); ctx->id = idr_alloc(&ctx_idr, ctx, 0, 0, GFP_KERNEL); @@ -596,6 +598,7 @@ } events_reported = ctx->events_reported; + mutex_destroy(&ctx->mutex); kfree(ctx); return events_reported; } @@ -665,7 +668,10 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); ret = rdma_bind_addr(ctx->cm_id, (struct sockaddr *) &cmd.addr); + mutex_unlock(&ctx->mutex); + ucma_put_ctx(ctx); return ret; } @@ -688,7 +694,9 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); ret = rdma_bind_addr(ctx->cm_id, (struct sockaddr *) &cmd.addr); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -712,8 +720,10 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); ret = rdma_resolve_addr(ctx->cm_id, (struct sockaddr *) &cmd.src_addr, (struct sockaddr *) &cmd.dst_addr, cmd.timeout_ms); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -738,8 +748,10 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); ret = rdma_resolve_addr(ctx->cm_id, (struct sockaddr *) &cmd.src_addr, (struct sockaddr *) &cmd.dst_addr, cmd.timeout_ms); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -759,7 +771,9 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); ret = rdma_resolve_route(ctx->cm_id, cmd.timeout_ms); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -848,6 +862,7 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); memset(&resp, 0, sizeof resp); addr = (struct sockaddr *) &ctx->cm_id->route.addr.src_addr; memcpy(&resp.src_addr, addr, addr->sa_family == AF_INET ? @@ -871,6 +886,7 @@ ucma_copy_iw_route(&resp, &ctx->cm_id->route); out: + mutex_unlock(&ctx->mutex); if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof(resp))) ret = -EFAULT; @@ -1022,6 +1038,7 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); switch (cmd.option) { case RDMA_USER_CM_QUERY_ADDR: ret = ucma_query_addr(ctx, response, out_len); @@ -1036,6 +1053,7 @@ ret = -ENOSYS; break; } + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; @@ -1076,7 +1094,9 @@ return PTR_ERR(ctx); ucma_copy_conn_param(ctx->cm_id, &conn_param, &cmd.conn_param); + mutex_lock(&ctx->mutex); ret = rdma_connect(ctx->cm_id, &conn_param); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -1097,7 +1117,9 @@ ctx->backlog = cmd.backlog > 0 && cmd.backlog < max_backlog ? cmd.backlog : max_backlog; + mutex_lock(&ctx->mutex); ret = rdma_listen(ctx->cm_id, ctx->backlog); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -1120,13 +1142,17 @@ if (cmd.conn_param.valid) { ucma_copy_conn_param(ctx->cm_id, &conn_param, &cmd.conn_param); mutex_lock(&file->mut); + mutex_lock(&ctx->mutex); ret = __rdma_accept(ctx->cm_id, &conn_param, NULL); + mutex_unlock(&ctx->mutex); if (!ret) ctx->uid = cmd.uid; mutex_unlock(&file->mut); - } else + } else { + mutex_lock(&ctx->mutex); ret = __rdma_accept(ctx->cm_id, NULL, NULL); - + mutex_unlock(&ctx->mutex); + } ucma_put_ctx(ctx); return ret; } @@ -1145,7 +1171,9 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); ret = rdma_reject(ctx->cm_id, cmd.private_data, cmd.private_data_len); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -1164,7 +1192,9 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); ret = rdma_disconnect(ctx->cm_id); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; } @@ -1195,7 +1225,9 @@ resp.qp_attr_mask = 0; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = cmd.qp_state; + mutex_lock(&ctx->mutex); ret = rdma_init_qp_attr(ctx->cm_id, &qp_attr, &resp.qp_attr_mask); + mutex_unlock(&ctx->mutex); if (ret) goto out; @@ -1274,9 +1306,13 @@ struct sa_path_rec opa; sa_convert_path_ib_to_opa(&opa, &sa_path); + mutex_lock(&ctx->mutex); ret = rdma_set_ib_path(ctx->cm_id, &opa); + mutex_unlock(&ctx->mutex); } else { + mutex_lock(&ctx->mutex); ret = rdma_set_ib_path(ctx->cm_id, &sa_path); + mutex_unlock(&ctx->mutex); } if (ret) return ret; @@ -1309,7 +1345,9 @@ switch (level) { case RDMA_OPTION_ID: + mutex_lock(&ctx->mutex); ret = ucma_set_option_id(ctx, optname, optval, optlen); + mutex_unlock(&ctx->mutex); break; case RDMA_OPTION_IB: ret = ucma_set_option_ib(ctx, optname, optval, optlen); @@ -1369,8 +1407,10 @@ if (IS_ERR(ctx)) return PTR_ERR(ctx); + mutex_lock(&ctx->mutex); if (ctx->cm_id->device) ret = rdma_notify(ctx->cm_id, (enum ib_event_type)cmd.event); + mutex_unlock(&ctx->mutex); ucma_put_ctx(ctx); return ret; @@ -1413,8 +1453,10 @@ mc->join_state = join_state; mc->uid = cmd->uid; memcpy(&mc->addr, addr, cmd->addr_size); + mutex_lock(&ctx->mutex); ret = rdma_join_multicast(ctx->cm_id, (struct sockaddr *)&mc->addr, join_state, mc); + mutex_unlock(&ctx->mutex); if (ret) goto err2; @@ -1518,7 +1560,10 @@ goto out; } + mutex_lock(&mc->ctx->mutex); rdma_leave_multicast(mc->ctx->cm_id, (struct sockaddr *) &mc->addr); + mutex_unlock(&mc->ctx->mutex); + mutex_lock(&mc->ctx->file->mut); ucma_cleanup_mc_events(mc); list_del(&mc->list); diff -Nru linux-4.19.98/drivers/infiniband/core/umem_odp.c linux-4.19.118/drivers/infiniband/core/umem_odp.c --- linux-4.19.98/drivers/infiniband/core/umem_odp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/umem_odp.c 2020-04-23 08:30:24.000000000 +0000 @@ -689,7 +689,7 @@ while (bcnt > 0) { const size_t gup_num_pages = min_t(size_t, - (bcnt + BIT(page_shift) - 1) >> page_shift, + ALIGN(bcnt, PAGE_SIZE) / PAGE_SIZE, PAGE_SIZE / sizeof(struct page *)); down_read(&owning_mm->mmap_sem); diff -Nru linux-4.19.98/drivers/infiniband/core/uverbs_cmd.c linux-4.19.118/drivers/infiniband/core/uverbs_cmd.c --- linux-4.19.98/drivers/infiniband/core/uverbs_cmd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/uverbs_cmd.c 2020-04-23 08:30:24.000000000 +0000 @@ -2914,12 +2914,6 @@ return 0; } -static size_t kern_spec_filter_sz(const struct ib_uverbs_flow_spec_hdr *spec) -{ - /* Returns user space filter size, includes padding */ - return (spec->size - sizeof(struct ib_uverbs_flow_spec_hdr)) / 2; -} - static ssize_t spec_filter_size(const void *kern_spec_filter, u16 kern_filter_size, u16 ib_real_filter_sz) { @@ -3063,11 +3057,16 @@ static int kern_spec_to_ib_spec_filter(struct ib_uverbs_flow_spec *kern_spec, union ib_flow_spec *ib_spec) { - ssize_t kern_filter_sz; + size_t kern_filter_sz; void *kern_spec_mask; void *kern_spec_val; - kern_filter_sz = kern_spec_filter_sz(&kern_spec->hdr); + if (check_sub_overflow((size_t)kern_spec->hdr.size, + sizeof(struct ib_uverbs_flow_spec_hdr), + &kern_filter_sz)) + return -EINVAL; + + kern_filter_sz /= 2; kern_spec_val = (void *)kern_spec + sizeof(struct ib_uverbs_flow_spec_hdr); diff -Nru linux-4.19.98/drivers/infiniband/core/uverbs_main.c linux-4.19.118/drivers/infiniband/core/uverbs_main.c --- linux-4.19.98/drivers/infiniband/core/uverbs_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/uverbs_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -273,7 +273,6 @@ } static ssize_t ib_uverbs_event_read(struct ib_uverbs_event_queue *ev_queue, - struct ib_uverbs_file *uverbs_file, struct file *filp, char __user *buf, size_t count, loff_t *pos, size_t eventsz) @@ -291,19 +290,16 @@ if (wait_event_interruptible(ev_queue->poll_wait, (!list_empty(&ev_queue->event_list) || - /* The barriers built into wait_event_interruptible() - * and wake_up() guarentee this will see the null set - * without using RCU - */ - !uverbs_file->device->ib_dev))) + ev_queue->is_closed))) return -ERESTARTSYS; + spin_lock_irq(&ev_queue->lock); + /* If device was disassociated and no event exists set an error */ - if (list_empty(&ev_queue->event_list) && - !uverbs_file->device->ib_dev) + if (list_empty(&ev_queue->event_list) && ev_queue->is_closed) { + spin_unlock_irq(&ev_queue->lock); return -EIO; - - spin_lock_irq(&ev_queue->lock); + } } event = list_entry(ev_queue->event_list.next, struct ib_uverbs_event, list); @@ -338,8 +334,7 @@ { struct ib_uverbs_async_event_file *file = filp->private_data; - return ib_uverbs_event_read(&file->ev_queue, file->uverbs_file, filp, - buf, count, pos, + return ib_uverbs_event_read(&file->ev_queue, filp, buf, count, pos, sizeof(struct ib_uverbs_async_event_desc)); } @@ -349,9 +344,8 @@ struct ib_uverbs_completion_event_file *comp_ev_file = filp->private_data; - return ib_uverbs_event_read(&comp_ev_file->ev_queue, - comp_ev_file->uobj.ufile, filp, - buf, count, pos, + return ib_uverbs_event_read(&comp_ev_file->ev_queue, filp, buf, count, + pos, sizeof(struct ib_uverbs_comp_event_desc)); } @@ -374,7 +368,9 @@ static __poll_t ib_uverbs_async_event_poll(struct file *filp, struct poll_table_struct *wait) { - return ib_uverbs_event_poll(filp->private_data, filp, wait); + struct ib_uverbs_async_event_file *file = filp->private_data; + + return ib_uverbs_event_poll(&file->ev_queue, filp, wait); } static __poll_t ib_uverbs_comp_event_poll(struct file *filp, @@ -388,9 +384,9 @@ static int ib_uverbs_async_event_fasync(int fd, struct file *filp, int on) { - struct ib_uverbs_event_queue *ev_queue = filp->private_data; + struct ib_uverbs_async_event_file *file = filp->private_data; - return fasync_helper(fd, filp, on, &ev_queue->async_queue); + return fasync_helper(fd, filp, on, &file->ev_queue.async_queue); } static int ib_uverbs_comp_event_fasync(int fd, struct file *filp, int on) diff -Nru linux-4.19.98/drivers/infiniband/core/uverbs_uapi.c linux-4.19.118/drivers/infiniband/core/uverbs_uapi.c --- linux-4.19.98/drivers/infiniband/core/uverbs_uapi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/core/uverbs_uapi.c 2020-04-23 08:30:24.000000000 +0000 @@ -17,6 +17,8 @@ return ERR_PTR(-EOVERFLOW); elm = kzalloc(alloc_size, GFP_KERNEL); + if (!elm) + return ERR_PTR(-ENOMEM); rc = radix_tree_insert(&uapi->radix, key, elm); if (rc) { kfree(elm); diff -Nru linux-4.19.98/drivers/infiniband/hw/bnxt_re/ib_verbs.c linux-4.19.118/drivers/infiniband/hw/bnxt_re/ib_verbs.c --- linux-4.19.98/drivers/infiniband/hw/bnxt_re/ib_verbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/bnxt_re/ib_verbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -2664,6 +2664,7 @@ nq->budget++; atomic_inc(&rdev->cq_count); + spin_lock_init(&cq->cq_lock); if (context) { struct bnxt_re_cq_resp resp; diff -Nru linux-4.19.98/drivers/infiniband/hw/bnxt_re/qplib_fp.c linux-4.19.118/drivers/infiniband/hw/bnxt_re/qplib_fp.c --- linux-4.19.98/drivers/infiniband/hw/bnxt_re/qplib_fp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/bnxt_re/qplib_fp.c 2020-04-23 08:30:24.000000000 +0000 @@ -1970,6 +1970,7 @@ INIT_LIST_HEAD(&cq->sqf_head); INIT_LIST_HEAD(&cq->rqf_head); spin_lock_init(&cq->compl_lock); + spin_lock_init(&cq->flush_lock); bnxt_qplib_arm_cq_enable(cq); return 0; diff -Nru linux-4.19.98/drivers/infiniband/hw/cxgb4/cm.c linux-4.19.118/drivers/infiniband/hw/cxgb4/cm.c --- linux-4.19.98/drivers/infiniband/hw/cxgb4/cm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/cxgb4/cm.c 2020-04-23 08:30:24.000000000 +0000 @@ -2076,7 +2076,7 @@ } else { pdev = get_real_dev(n->dev); ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t, - n, pdev, 0); + n, pdev, rt_tos2priority(tos)); if (!ep->l2t) goto out; ep->mtu = dst_mtu(dst); @@ -2166,7 +2166,8 @@ laddr6->sin6_addr.s6_addr, raddr6->sin6_addr.s6_addr, laddr6->sin6_port, - raddr6->sin6_port, 0, + raddr6->sin6_port, + ep->com.cm_id->tos, raddr6->sin6_scope_id); iptype = 6; ra = (__u8 *)&raddr6->sin6_addr; @@ -2947,15 +2948,18 @@ ep = get_ep_from_tid(dev, tid); - if (ep && ep->com.qp) { - pr_warn("TERM received tid %u qpid %u\n", - tid, ep->com.qp->wq.sq.qid); - attrs.next_state = C4IW_QP_STATE_TERMINATE; - c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, - C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); + if (ep) { + if (ep->com.qp) { + pr_warn("TERM received tid %u qpid %u\n", tid, + ep->com.qp->wq.sq.qid); + attrs.next_state = C4IW_QP_STATE_TERMINATE; + c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp, + C4IW_QP_ATTR_NEXT_STATE, &attrs, 1); + } + + c4iw_put_ep(&ep->com); } else pr_warn("TERM received tid %u no ep/qp\n", tid); - c4iw_put_ep(&ep->com); return 0; } @@ -3323,7 +3327,7 @@ laddr6->sin6_addr.s6_addr, raddr6->sin6_addr.s6_addr, laddr6->sin6_port, - raddr6->sin6_port, 0, + raddr6->sin6_port, cm_id->tos, raddr6->sin6_scope_id); } if (!ep->dst) { diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/affinity.c linux-4.19.118/drivers/infiniband/hw/hfi1/affinity.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/affinity.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/affinity.c 2020-04-23 08:30:24.000000000 +0000 @@ -478,6 +478,8 @@ rvt_get_ibdev_name(&(dd)->verbs_dev.rdi), i, cpu); } + free_cpumask_var(available_cpus); + free_cpumask_var(non_intr_cpus); return 0; fail: diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/chip.c linux-4.19.118/drivers/infiniband/hw/hfi1/chip.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/chip.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/chip.c 2020-04-23 08:30:24.000000000 +0000 @@ -1687,6 +1687,14 @@ return dd->verbs_dev.n_piodrain; } +static u64 access_sw_ctx0_seq_drop(const struct cntr_entry *entry, + void *context, int vl, int mode, u64 data) +{ + struct hfi1_devdata *dd = context; + + return dd->ctx0_seq_drop; +} + static u64 access_sw_vtx_wait(const struct cntr_entry *entry, void *context, int vl, int mode, u64 data) { @@ -4247,6 +4255,8 @@ access_sw_cpu_intr), [C_SW_CPU_RCV_LIM] = CNTR_ELEM("RcvLimit", 0, 0, CNTR_NORMAL, access_sw_cpu_rcv_limit), +[C_SW_CTX0_SEQ_DROP] = CNTR_ELEM("SeqDrop0", 0, 0, CNTR_NORMAL, + access_sw_ctx0_seq_drop), [C_SW_VTX_WAIT] = CNTR_ELEM("vTxWait", 0, 0, CNTR_NORMAL, access_sw_vtx_wait), [C_SW_PIO_WAIT] = CNTR_ELEM("PioWait", 0, 0, CNTR_NORMAL, @@ -10580,12 +10590,29 @@ } } -/* - * Verify if BCT for data VLs is non-zero. +/** + * data_vls_operational() - Verify if data VL BCT credits and MTU + * are both set. + * @ppd: pointer to hfi1_pportdata structure + * + * Return: true - Ok, false -otherwise. */ static inline bool data_vls_operational(struct hfi1_pportdata *ppd) { - return !!ppd->actual_vls_operational; + int i; + u64 reg; + + if (!ppd->actual_vls_operational) + return false; + + for (i = 0; i < ppd->vls_supported; i++) { + reg = read_csr(ppd->dd, SEND_CM_CREDIT_VL + (8 * i)); + if ((reg && !ppd->dd->vld[i].mtu) || + (!reg && ppd->dd->vld[i].mtu)) + return false; + } + + return true; } /* @@ -10698,7 +10725,8 @@ if (!data_vls_operational(ppd)) { dd_dev_err(dd, - "%s: data VLs not operational\n", __func__); + "%s: Invalid data VL credits or mtu\n", + __func__); ret = -EINVAL; break; } diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/chip.h linux-4.19.118/drivers/infiniband/hw/hfi1/chip.h --- linux-4.19.98/drivers/infiniband/hw/hfi1/chip.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/chip.h 2020-04-23 08:30:24.000000000 +0000 @@ -909,6 +909,7 @@ C_DC_PG_STS_TX_MBE_CNT, C_SW_CPU_INTR, C_SW_CPU_RCV_LIM, + C_SW_CTX0_SEQ_DROP, C_SW_VTX_WAIT, C_SW_PIO_WAIT, C_SW_PIO_DRAIN, diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/driver.c linux-4.19.118/drivers/infiniband/hw/hfi1/driver.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/driver.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/driver.c 2020-04-23 08:30:24.000000000 +0000 @@ -430,40 +430,60 @@ [HFI1_PKT_TYPE_16B] = &return_cnp_16B }; -void hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt, - bool do_cnp) +/** + * hfi1_process_ecn_slowpath - Process FECN or BECN bits + * @qp: The packet's destination QP + * @pkt: The packet itself. + * @prescan: Is the caller the RXQ prescan + * + * Process the packet's FECN or BECN bits. By now, the packet + * has already been evaluated whether processing of those bit should + * be done. + * The significance of the @prescan argument is that if the caller + * is the RXQ prescan, a CNP will be send out instead of waiting for the + * normal packet processing to send an ACK with BECN set (or a CNP). + */ +bool hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt, + bool prescan) { struct hfi1_ibport *ibp = to_iport(qp->ibqp.device, qp->port_num); struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); struct ib_other_headers *ohdr = pkt->ohdr; struct ib_grh *grh = pkt->grh; - u32 rqpn = 0, bth1; + u32 rqpn = 0; u16 pkey; u32 rlid, slid, dlid = 0; - u8 hdr_type, sc, svc_type; - bool is_mcast = false; + u8 hdr_type, sc, svc_type, opcode; + bool is_mcast = false, ignore_fecn = false, do_cnp = false, + fecn, becn; /* can be called from prescan */ if (pkt->etype == RHF_RCV_TYPE_BYPASS) { - is_mcast = hfi1_is_16B_mcast(dlid); pkey = hfi1_16B_get_pkey(pkt->hdr); sc = hfi1_16B_get_sc(pkt->hdr); dlid = hfi1_16B_get_dlid(pkt->hdr); slid = hfi1_16B_get_slid(pkt->hdr); + is_mcast = hfi1_is_16B_mcast(dlid); + opcode = ib_bth_get_opcode(ohdr); hdr_type = HFI1_PKT_TYPE_16B; + fecn = hfi1_16B_get_fecn(pkt->hdr); + becn = hfi1_16B_get_becn(pkt->hdr); } else { - is_mcast = (dlid > be16_to_cpu(IB_MULTICAST_LID_BASE)) && - (dlid != be16_to_cpu(IB_LID_PERMISSIVE)); pkey = ib_bth_get_pkey(ohdr); sc = hfi1_9B_get_sc5(pkt->hdr, pkt->rhf); - dlid = ib_get_dlid(pkt->hdr); + dlid = qp->ibqp.qp_type != IB_QPT_UD ? ib_get_dlid(pkt->hdr) : + ppd->lid; slid = ib_get_slid(pkt->hdr); + is_mcast = (dlid > be16_to_cpu(IB_MULTICAST_LID_BASE)) && + (dlid != be16_to_cpu(IB_LID_PERMISSIVE)); + opcode = ib_bth_get_opcode(ohdr); hdr_type = HFI1_PKT_TYPE_9B; + fecn = ib_bth_get_fecn(ohdr); + becn = ib_bth_get_becn(ohdr); } switch (qp->ibqp.qp_type) { case IB_QPT_UD: - dlid = ppd->lid; rlid = slid; rqpn = ib_get_sqpn(pkt->ohdr); svc_type = IB_CC_SVCTYPE_UD; @@ -485,22 +505,31 @@ svc_type = IB_CC_SVCTYPE_RC; break; default: - return; + return false; } - bth1 = be32_to_cpu(ohdr->bth[1]); + ignore_fecn = is_mcast || (opcode == IB_OPCODE_CNP) || + (opcode == IB_OPCODE_RC_ACKNOWLEDGE); + /* + * ACKNOWLEDGE packets do not get a CNP but this will be + * guarded by ignore_fecn above. + */ + do_cnp = prescan || + (opcode >= IB_OPCODE_RC_RDMA_READ_RESPONSE_FIRST && + opcode <= IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE); + /* Call appropriate CNP handler */ - if (do_cnp && (bth1 & IB_FECN_SMASK)) + if (!ignore_fecn && do_cnp && fecn) hfi1_handle_cnp_tbl[hdr_type](ibp, qp, rqpn, pkey, dlid, rlid, sc, grh); - if (!is_mcast && (bth1 & IB_BECN_SMASK)) { - u32 lqpn = bth1 & RVT_QPN_MASK; + if (becn) { + u32 lqpn = be32_to_cpu(ohdr->bth[1]) & RVT_QPN_MASK; u8 sl = ibp->sc_to_sl[sc]; process_becn(ppd, sl, rlid, lqpn, rqpn, svc_type); } - + return !ignore_fecn && fecn; } struct ps_mdata { @@ -599,7 +628,6 @@ struct rvt_dev_info *rdi = &rcd->dd->verbs_dev.rdi; u64 rhf = rhf_to_cpu(rhf_addr); u32 etype = rhf_rcv_type(rhf), qpn, bth1; - int is_ecn = 0; u8 lnh; if (ps_done(&mdata, rhf, rcd)) @@ -625,12 +653,10 @@ goto next; /* just in case */ } - bth1 = be32_to_cpu(packet->ohdr->bth[1]); - is_ecn = !!(bth1 & (IB_FECN_SMASK | IB_BECN_SMASK)); - - if (!is_ecn) + if (!hfi1_may_ecn(packet)) goto next; + bth1 = be32_to_cpu(packet->ohdr->bth[1]); qpn = bth1 & RVT_QPN_MASK; rcu_read_lock(); qp = rvt_lookup_qpn(rdi, &ibp->rvp, qpn); @@ -640,7 +666,7 @@ goto next; } - process_ecn(qp, packet, true); + hfi1_process_ecn_slowpath(qp, packet, true); rcu_read_unlock(); /* turn off BECN, FECN */ @@ -708,6 +734,7 @@ { int ret; + packet->rcd->dd->ctx0_seq_drop++; /* Set up for the next packet */ packet->rhqoff += packet->rsize; if (packet->rhqoff >= packet->maxcnt) diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/file_ops.c linux-4.19.118/drivers/infiniband/hw/hfi1/file_ops.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/file_ops.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/file_ops.c 2020-04-23 08:30:24.000000000 +0000 @@ -200,23 +200,24 @@ fd = kzalloc(sizeof(*fd), GFP_KERNEL); - if (fd) { - fd->rec_cpu_num = -1; /* no cpu affinity by default */ - fd->mm = current->mm; - mmgrab(fd->mm); - fd->dd = dd; - kobject_get(&fd->dd->kobj); - fp->private_data = fd; - } else { - fp->private_data = NULL; - - if (atomic_dec_and_test(&dd->user_refcount)) - complete(&dd->user_comp); - - return -ENOMEM; - } - + if (!fd || init_srcu_struct(&fd->pq_srcu)) + goto nomem; + spin_lock_init(&fd->pq_rcu_lock); + spin_lock_init(&fd->tid_lock); + spin_lock_init(&fd->invalid_lock); + fd->rec_cpu_num = -1; /* no cpu affinity by default */ + fd->mm = current->mm; + mmgrab(fd->mm); + fd->dd = dd; + kobject_get(&fd->dd->kobj); + fp->private_data = fd; return 0; +nomem: + kfree(fd); + fp->private_data = NULL; + if (atomic_dec_and_test(&dd->user_refcount)) + complete(&dd->user_comp); + return -ENOMEM; } static long hfi1_file_ioctl(struct file *fp, unsigned int cmd, @@ -301,21 +302,30 @@ static ssize_t hfi1_write_iter(struct kiocb *kiocb, struct iov_iter *from) { struct hfi1_filedata *fd = kiocb->ki_filp->private_data; - struct hfi1_user_sdma_pkt_q *pq = fd->pq; + struct hfi1_user_sdma_pkt_q *pq; struct hfi1_user_sdma_comp_q *cq = fd->cq; int done = 0, reqs = 0; unsigned long dim = from->nr_segs; + int idx; - if (!cq || !pq) + idx = srcu_read_lock(&fd->pq_srcu); + pq = srcu_dereference(fd->pq, &fd->pq_srcu); + if (!cq || !pq) { + srcu_read_unlock(&fd->pq_srcu, idx); return -EIO; + } - if (!iter_is_iovec(from) || !dim) + if (!iter_is_iovec(from) || !dim) { + srcu_read_unlock(&fd->pq_srcu, idx); return -EINVAL; + } trace_hfi1_sdma_request(fd->dd, fd->uctxt->ctxt, fd->subctxt, dim); - if (atomic_read(&pq->n_reqs) == pq->n_max_reqs) + if (atomic_read(&pq->n_reqs) == pq->n_max_reqs) { + srcu_read_unlock(&fd->pq_srcu, idx); return -ENOSPC; + } while (dim) { int ret; @@ -333,6 +343,7 @@ reqs++; } + srcu_read_unlock(&fd->pq_srcu, idx); return reqs; } @@ -706,6 +717,7 @@ if (atomic_dec_and_test(&dd->user_refcount)) complete(&dd->user_comp); + cleanup_srcu_struct(&fdata->pq_srcu); kfree(fdata); return 0; } diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/hfi.h linux-4.19.118/drivers/infiniband/hw/hfi1/hfi.h --- linux-4.19.98/drivers/infiniband/hw/hfi1/hfi.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/hfi.h 2020-04-23 08:30:24.000000000 +0000 @@ -1093,6 +1093,8 @@ char *boardname; /* human readable board info */ + u64 ctx0_seq_drop; + /* reset value */ u64 z_int_counter; u64 z_rcv_limit; @@ -1376,10 +1378,13 @@ /* Private data for file operations */ struct hfi1_filedata { + struct srcu_struct pq_srcu; struct hfi1_devdata *dd; struct hfi1_ctxtdata *uctxt; struct hfi1_user_sdma_comp_q *cq; - struct hfi1_user_sdma_pkt_q *pq; + /* update side lock for SRCU */ + spinlock_t pq_rcu_lock; + struct hfi1_user_sdma_pkt_q __rcu *pq; u16 subctxt; /* for cpu affinity; -1 if none */ int rec_cpu_num; @@ -1797,13 +1802,20 @@ return &rcd->ppd->ibport_data; } -void hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt, - bool do_cnp); -static inline bool process_ecn(struct rvt_qp *qp, struct hfi1_packet *pkt, - bool do_cnp) +/** + * hfi1_may_ecn - Check whether FECN or BECN processing should be done + * @pkt: the packet to be evaluated + * + * Check whether the FECN or BECN bits in the packet's header are + * enabled, depending on packet type. + * + * This function only checks for FECN and BECN bits. Additional checks + * are done in the slowpath (hfi1_process_ecn_slowpath()) in order to + * ensure correct handling. + */ +static inline bool hfi1_may_ecn(struct hfi1_packet *pkt) { - bool becn; - bool fecn; + bool fecn, becn; if (pkt->etype == RHF_RCV_TYPE_BYPASS) { fecn = hfi1_16B_get_fecn(pkt->hdr); @@ -1812,10 +1824,18 @@ fecn = ib_bth_get_fecn(pkt->ohdr); becn = ib_bth_get_becn(pkt->ohdr); } - if (unlikely(fecn || becn)) { - hfi1_process_ecn_slowpath(qp, pkt, do_cnp); - return fecn; - } + return fecn || becn; +} + +bool hfi1_process_ecn_slowpath(struct rvt_qp *qp, struct hfi1_packet *pkt, + bool prescan); +static inline bool process_ecn(struct rvt_qp *qp, struct hfi1_packet *pkt) +{ + bool do_work; + + do_work = hfi1_may_ecn(pkt); + if (unlikely(do_work)) + return hfi1_process_ecn_slowpath(qp, pkt, false); return false; } diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/pio.c linux-4.19.118/drivers/infiniband/hw/hfi1/pio.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/pio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/pio.c 2020-04-23 08:30:24.000000000 +0000 @@ -1434,7 +1434,8 @@ * @cb: optional callback to call when the buffer is finished sending * @arg: argument for cb * - * Return a pointer to a PIO buffer if successful, NULL if not enough room. + * Return a pointer to a PIO buffer, NULL if not enough room, -ECOMM + * when link is down. */ struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len, pio_release_cb cb, void *arg) @@ -1450,7 +1451,7 @@ spin_lock_irqsave(&sc->alloc_lock, flags); if (!(sc->flags & SCF_ENABLED)) { spin_unlock_irqrestore(&sc->alloc_lock, flags); - goto done; + return ERR_PTR(-ECOMM); } retry: diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/rc.c linux-4.19.118/drivers/infiniband/hw/hfi1/rc.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/rc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/rc.c 2020-04-23 08:30:24.000000000 +0000 @@ -914,7 +914,7 @@ pbc = create_pbc(ppd, pbc_flags, qp->srate_mbps, sc_to_vlt(ppd->dd, sc5), plen); pbuf = sc_buffer_alloc(rcd->sc, plen, NULL, NULL); - if (!pbuf) { + if (IS_ERR_OR_NULL(pbuf)) { /* * We have no room to send at the moment. Pass * responsibility for sending the ACK to the send engine @@ -2049,8 +2049,7 @@ struct ib_reth *reth; unsigned long flags; int ret; - bool is_fecn = false; - bool copy_last = false; + bool copy_last = false, fecn; u32 rkey; u8 extra_bytes = pad + packet->extra_byte + (SIZE_OF_CRC << 2); @@ -2059,7 +2058,7 @@ if (hfi1_ruc_check_hdr(ibp, packet)) return; - is_fecn = process_ecn(qp, packet, false); + fecn = process_ecn(qp, packet); /* * Process responses (ACKs) before anything else. Note that the @@ -2070,8 +2069,6 @@ if (opcode >= OP(RDMA_READ_RESPONSE_FIRST) && opcode <= OP(ATOMIC_ACKNOWLEDGE)) { rc_rcv_resp(packet); - if (is_fecn) - goto send_ack; return; } @@ -2347,11 +2344,11 @@ /* Schedule the send engine. */ qp->s_flags |= RVT_S_RESP_PENDING; + if (fecn) + qp->s_flags |= RVT_S_ECN; hfi1_schedule_send(qp); spin_unlock_irqrestore(&qp->s_lock, flags); - if (is_fecn) - goto send_ack; return; } @@ -2413,11 +2410,11 @@ /* Schedule the send engine. */ qp->s_flags |= RVT_S_RESP_PENDING; + if (fecn) + qp->s_flags |= RVT_S_ECN; hfi1_schedule_send(qp); spin_unlock_irqrestore(&qp->s_lock, flags); - if (is_fecn) - goto send_ack; return; } @@ -2430,16 +2427,9 @@ qp->r_ack_psn = psn; qp->r_nak_state = 0; /* Send an ACK if requested or required. */ - if (psn & IB_BTH_REQ_ACK) { - if (packet->numpkt == 0) { - rc_cancel_ack(qp); - goto send_ack; - } - if (qp->r_adefered >= HFI1_PSN_CREDIT) { - rc_cancel_ack(qp); - goto send_ack; - } - if (unlikely(is_fecn)) { + if (psn & IB_BTH_REQ_ACK || fecn) { + if (packet->numpkt == 0 || fecn || + qp->r_adefered >= HFI1_PSN_CREDIT) { rc_cancel_ack(qp); goto send_ack; } @@ -2480,7 +2470,7 @@ qp->r_nak_state = IB_NAK_REMOTE_ACCESS_ERROR; qp->r_ack_psn = qp->r_psn; send_ack: - hfi1_send_rc_ack(packet, is_fecn); + hfi1_send_rc_ack(packet, fecn); } void hfi1_rc_hdrerr( diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/sysfs.c linux-4.19.118/drivers/infiniband/hw/hfi1/sysfs.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -670,7 +670,11 @@ dd_dev_err(dd, "Skipping sc2vl sysfs info, (err %d) port %u\n", ret, port_num); - goto bail; + /* + * Based on the documentation for kobject_init_and_add(), the + * caller should call kobject_put even if this call fails. + */ + goto bail_sc2vl; } kobject_uevent(&ppd->sc2vl_kobj, KOBJ_ADD); @@ -680,7 +684,7 @@ dd_dev_err(dd, "Skipping sl2sc sysfs info, (err %d) port %u\n", ret, port_num); - goto bail_sc2vl; + goto bail_sl2sc; } kobject_uevent(&ppd->sl2sc_kobj, KOBJ_ADD); @@ -690,7 +694,7 @@ dd_dev_err(dd, "Skipping vl2mtu sysfs info, (err %d) port %u\n", ret, port_num); - goto bail_sl2sc; + goto bail_vl2mtu; } kobject_uevent(&ppd->vl2mtu_kobj, KOBJ_ADD); @@ -700,7 +704,7 @@ dd_dev_err(dd, "Skipping Congestion Control sysfs info, (err %d) port %u\n", ret, port_num); - goto bail_vl2mtu; + goto bail_cc; } kobject_uevent(&ppd->pport_cc_kobj, KOBJ_ADD); @@ -738,7 +742,6 @@ kobject_put(&ppd->sl2sc_kobj); bail_sc2vl: kobject_put(&ppd->sc2vl_kobj); -bail: return ret; } @@ -858,8 +861,13 @@ for (i = 0; i < ARRAY_SIZE(hfi1_attributes); ++i) device_remove_file(&dev->dev, hfi1_attributes[i]); - for (i = 0; i < dd->num_sdma; i++) - kobject_del(&dd->per_sdma[i].kobj); + /* + * The function kobject_put() will call kobject_del() if the kobject + * has been added successfully. The sysfs files created under the + * kobject directory will also be removed during the process. + */ + for (; i >= 0; i--) + kobject_put(&dd->per_sdma[i].kobj); return ret; } @@ -872,6 +880,10 @@ struct hfi1_pportdata *ppd; int i; + /* Unwind operations in hfi1_verbs_register_sysfs() */ + for (i = 0; i < dd->num_sdma; i++) + kobject_put(&dd->per_sdma[i].kobj); + for (i = 0; i < dd->num_pports; i++) { ppd = &dd->pport[i]; diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/uc.c linux-4.19.118/drivers/infiniband/hw/hfi1/uc.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/uc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/uc.c 2020-04-23 08:30:24.000000000 +0000 @@ -321,7 +321,7 @@ if (hfi1_ruc_check_hdr(ibp, packet)) return; - process_ecn(qp, packet, true); + process_ecn(qp, packet); psn = ib_bth_get_psn(ohdr); /* Compare the PSN verses the expected PSN. */ diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/ud.c linux-4.19.118/drivers/infiniband/hw/hfi1/ud.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/ud.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/ud.c 2020-04-23 08:30:24.000000000 +0000 @@ -51,6 +51,7 @@ #include "hfi.h" #include "mad.h" #include "verbs_txreq.h" +#include "trace_ibhdrs.h" #include "qp.h" /* We support only two types - 9B and 16B for now */ @@ -656,18 +657,19 @@ u32 bth0, plen, vl, hwords = 7; u16 len; u8 l4; - struct hfi1_16b_header hdr; + struct hfi1_opa_header hdr; struct ib_other_headers *ohdr; struct pio_buf *pbuf; struct send_context *ctxt = qp_to_send_context(qp, sc5); struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); u32 nwords; + hdr.hdr_type = HFI1_PKT_TYPE_16B; /* Populate length */ nwords = ((hfi1_get_16b_padding(hwords << 2, 0) + SIZE_OF_LT) >> 2) + SIZE_OF_CRC; if (old_grh) { - struct ib_grh *grh = &hdr.u.l.grh; + struct ib_grh *grh = &hdr.opah.u.l.grh; grh->version_tclass_flow = old_grh->version_tclass_flow; grh->paylen = cpu_to_be16( @@ -675,11 +677,11 @@ grh->hop_limit = 0xff; grh->sgid = old_grh->dgid; grh->dgid = old_grh->sgid; - ohdr = &hdr.u.l.oth; + ohdr = &hdr.opah.u.l.oth; l4 = OPA_16B_L4_IB_GLOBAL; hwords += sizeof(struct ib_grh) / sizeof(u32); } else { - ohdr = &hdr.u.oth; + ohdr = &hdr.opah.u.oth; l4 = OPA_16B_L4_IB_LOCAL; } @@ -693,7 +695,7 @@ /* Convert dwords to flits */ len = (hwords + nwords) >> 1; - hfi1_make_16b_hdr(&hdr, slid, dlid, len, pkey, 1, 0, l4, sc5); + hfi1_make_16b_hdr(&hdr.opah, slid, dlid, len, pkey, 1, 0, l4, sc5); plen = 2 /* PBC */ + hwords + nwords; pbc_flags |= PBC_PACKET_BYPASS | PBC_INSERT_BYPASS_ICRC; @@ -701,9 +703,11 @@ pbc = create_pbc(ppd, pbc_flags, qp->srate_mbps, vl, plen); if (ctxt) { pbuf = sc_buffer_alloc(ctxt, plen, NULL, NULL); - if (pbuf) + if (!IS_ERR_OR_NULL(pbuf)) { + trace_pio_output_ibhdr(ppd->dd, &hdr, sc5); ppd->dd->pio_inline_send(ppd->dd, pbuf, pbc, &hdr, hwords); + } } } @@ -715,14 +719,15 @@ u32 bth0, plen, vl, hwords = 5; u16 lrh0; u8 sl = ibp->sc_to_sl[sc5]; - struct ib_header hdr; + struct hfi1_opa_header hdr; struct ib_other_headers *ohdr; struct pio_buf *pbuf; struct send_context *ctxt = qp_to_send_context(qp, sc5); struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); + hdr.hdr_type = HFI1_PKT_TYPE_9B; if (old_grh) { - struct ib_grh *grh = &hdr.u.l.grh; + struct ib_grh *grh = &hdr.ibh.u.l.grh; grh->version_tclass_flow = old_grh->version_tclass_flow; grh->paylen = cpu_to_be16( @@ -730,11 +735,11 @@ grh->hop_limit = 0xff; grh->sgid = old_grh->dgid; grh->dgid = old_grh->sgid; - ohdr = &hdr.u.l.oth; + ohdr = &hdr.ibh.u.l.oth; lrh0 = HFI1_LRH_GRH; hwords += sizeof(struct ib_grh) / sizeof(u32); } else { - ohdr = &hdr.u.oth; + ohdr = &hdr.ibh.u.oth; lrh0 = HFI1_LRH_BTH; } @@ -746,16 +751,18 @@ ohdr->bth[1] = cpu_to_be32(remote_qpn | (1 << IB_BECN_SHIFT)); ohdr->bth[2] = 0; /* PSN 0 */ - hfi1_make_ib_hdr(&hdr, lrh0, hwords + SIZE_OF_CRC, dlid, slid); + hfi1_make_ib_hdr(&hdr.ibh, lrh0, hwords + SIZE_OF_CRC, dlid, slid); plen = 2 /* PBC */ + hwords; pbc_flags |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT); vl = sc_to_vlt(ppd->dd, sc5); pbc = create_pbc(ppd, pbc_flags, qp->srate_mbps, vl, plen); if (ctxt) { pbuf = sc_buffer_alloc(ctxt, plen, NULL, NULL); - if (pbuf) + if (!IS_ERR_OR_NULL(pbuf)) { + trace_pio_output_ibhdr(ppd->dd, &hdr, sc5); ppd->dd->pio_inline_send(ppd->dd, pbuf, pbc, &hdr, hwords); + } } } @@ -912,7 +919,7 @@ src_qp = hfi1_16B_get_src_qpn(packet->mgmt); } - process_ecn(qp, packet, (opcode != IB_OPCODE_CNP)); + process_ecn(qp, packet); /* * Get the number of bytes the message was padded by * and drop incomplete packets. diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/user_exp_rcv.c linux-4.19.118/drivers/infiniband/hw/hfi1/user_exp_rcv.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/user_exp_rcv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/user_exp_rcv.c 2020-04-23 08:30:24.000000000 +0000 @@ -90,9 +90,6 @@ struct hfi1_devdata *dd = uctxt->dd; int ret = 0; - spin_lock_init(&fd->tid_lock); - spin_lock_init(&fd->invalid_lock); - fd->entry_to_rb = kcalloc(uctxt->expected_count, sizeof(struct rb_node *), GFP_KERNEL); @@ -165,10 +162,12 @@ if (fd->handler) { hfi1_mmu_rb_unregister(fd->handler); } else { + mutex_lock(&uctxt->exp_mutex); if (!EXP_TID_SET_EMPTY(uctxt->tid_full_list)) unlock_exp_tids(uctxt, &uctxt->tid_full_list, fd); if (!EXP_TID_SET_EMPTY(uctxt->tid_used_list)) unlock_exp_tids(uctxt, &uctxt->tid_used_list, fd); + mutex_unlock(&uctxt->exp_mutex); } kfree(fd->invalid_tids); diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/user_sdma.c linux-4.19.118/drivers/infiniband/hw/hfi1/user_sdma.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/user_sdma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/user_sdma.c 2020-04-23 08:30:24.000000000 +0000 @@ -179,7 +179,6 @@ pq = kzalloc(sizeof(*pq), GFP_KERNEL); if (!pq) return -ENOMEM; - pq->dd = dd; pq->ctxt = uctxt->ctxt; pq->subctxt = fd->subctxt; @@ -236,7 +235,7 @@ goto pq_mmu_fail; } - fd->pq = pq; + rcu_assign_pointer(fd->pq, pq); fd->cq = cq; return 0; @@ -264,8 +263,14 @@ trace_hfi1_sdma_user_free_queues(uctxt->dd, uctxt->ctxt, fd->subctxt); - pq = fd->pq; + spin_lock(&fd->pq_rcu_lock); + pq = srcu_dereference_check(fd->pq, &fd->pq_srcu, + lockdep_is_held(&fd->pq_rcu_lock)); if (pq) { + rcu_assign_pointer(fd->pq, NULL); + spin_unlock(&fd->pq_rcu_lock); + synchronize_srcu(&fd->pq_srcu); + /* at this point there can be no more new requests */ if (pq->handler) hfi1_mmu_rb_unregister(pq->handler); iowait_sdma_drain(&pq->busy); @@ -277,7 +282,8 @@ kfree(pq->req_in_use); kmem_cache_destroy(pq->txreq_cache); kfree(pq); - fd->pq = NULL; + } else { + spin_unlock(&fd->pq_rcu_lock); } if (fd->cq) { vfree(fd->cq->comps); @@ -321,7 +327,8 @@ { int ret = 0, i; struct hfi1_ctxtdata *uctxt = fd->uctxt; - struct hfi1_user_sdma_pkt_q *pq = fd->pq; + struct hfi1_user_sdma_pkt_q *pq = + srcu_dereference(fd->pq, &fd->pq_srcu); struct hfi1_user_sdma_comp_q *cq = fd->cq; struct hfi1_devdata *dd = pq->dd; unsigned long idx = 0; diff -Nru linux-4.19.98/drivers/infiniband/hw/hfi1/verbs.c linux-4.19.118/drivers/infiniband/hw/hfi1/verbs.c --- linux-4.19.98/drivers/infiniband/hw/hfi1/verbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hfi1/verbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -595,10 +595,11 @@ opa_get_lid(packet->dlid, 9B)); if (!mcast) goto drop; + rcu_read_lock(); list_for_each_entry_rcu(p, &mcast->qp_list, list) { packet->qp = p->qp; if (hfi1_do_pkey_check(packet)) - goto drop; + goto unlock_drop; spin_lock_irqsave(&packet->qp->r_lock, flags); packet_handler = qp_ok(packet); if (likely(packet_handler)) @@ -607,6 +608,7 @@ ibp->rvp.n_pkt_drops++; spin_unlock_irqrestore(&packet->qp->r_lock, flags); } + rcu_read_unlock(); /* * Notify rvt_multicast_detach() if it is waiting for us * to finish. @@ -1096,10 +1098,10 @@ if (cb) iowait_pio_inc(&priv->s_iowait); pbuf = sc_buffer_alloc(sc, plen, cb, qp); - if (unlikely(!pbuf)) { + if (unlikely(IS_ERR_OR_NULL(pbuf))) { if (cb) verbs_pio_complete(qp, 0); - if (ppd->host_link_state != HLS_UP_ACTIVE) { + if (IS_ERR(pbuf)) { /* * If we have filled the PIO buffers to capacity and are * not in an active state this request is not going to diff -Nru linux-4.19.98/drivers/infiniband/hw/hns/hns_roce_hem.c linux-4.19.118/drivers/infiniband/hw/hns/hns_roce_hem.c --- linux-4.19.98/drivers/infiniband/hw/hns/hns_roce_hem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hns/hns_roce_hem.c 2020-04-23 08:30:24.000000000 +0000 @@ -54,12 +54,13 @@ EXPORT_SYMBOL_GPL(hns_roce_check_whether_mhop); static bool hns_roce_check_hem_null(struct hns_roce_hem **hem, u64 start_idx, - u32 bt_chunk_num) + u32 bt_chunk_num, u64 hem_max_num) { - int i; + u64 check_max_num = start_idx + bt_chunk_num; + u64 i; - for (i = 0; i < bt_chunk_num; i++) - if (hem[start_idx + i]) + for (i = start_idx; (i < check_max_num) && (i < hem_max_num); i++) + if (hem[i]) return false; return true; @@ -413,6 +414,12 @@ return -EINVAL; } + if (unlikely(hem_idx >= table->num_hem)) { + dev_err(dev, "Table %d exceed hem limt idx = %llu,max = %lu!\n", + table->type, hem_idx, table->num_hem); + return -EINVAL; + } + mutex_lock(&table->mutex); if (table->hem[hem_idx]) { @@ -649,7 +656,7 @@ if (check_whether_bt_num_2(table->type, hop_num)) { start_idx = mhop.l0_idx * chunk_ba_num; if (hns_roce_check_hem_null(table->hem, start_idx, - chunk_ba_num)) { + chunk_ba_num, table->num_hem)) { if (table->type < HEM_TYPE_MTT && hr_dev->hw->clear_hem(hr_dev, table, obj, 0)) dev_warn(dev, "Clear HEM base address failed.\n"); @@ -663,7 +670,7 @@ start_idx = mhop.l0_idx * chunk_ba_num * chunk_ba_num + mhop.l1_idx * chunk_ba_num; if (hns_roce_check_hem_null(table->hem, start_idx, - chunk_ba_num)) { + chunk_ba_num, table->num_hem)) { if (hr_dev->hw->clear_hem(hr_dev, table, obj, 1)) dev_warn(dev, "Clear HEM base address failed.\n"); diff -Nru linux-4.19.98/drivers/infiniband/hw/hns/hns_roce_hw_v2.c linux-4.19.118/drivers/infiniband/hw/hns/hns_roce_hw_v2.c --- linux-4.19.98/drivers/infiniband/hw/hns/hns_roce_hw_v2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hns/hns_roce_hw_v2.c 2020-04-23 08:30:24.000000000 +0000 @@ -4833,7 +4833,8 @@ break; } eq->cur_eqe_ba = eq->buf_dma[0]; - eq->nxt_eqe_ba = eq->buf_dma[1]; + if (ba_num > 1) + eq->nxt_eqe_ba = eq->buf_dma[1]; } else if (mhop_num == 2) { /* alloc L1 BT and buf */ @@ -4875,7 +4876,8 @@ break; } eq->cur_eqe_ba = eq->buf_dma[0]; - eq->nxt_eqe_ba = eq->buf_dma[1]; + if (ba_num > 1) + eq->nxt_eqe_ba = eq->buf_dma[1]; } eq->l0_last_num = i + 1; diff -Nru linux-4.19.98/drivers/infiniband/hw/hns/hns_roce_qp.c linux-4.19.118/drivers/infiniband/hw/hns/hns_roce_qp.c --- linux-4.19.98/drivers/infiniband/hw/hns/hns_roce_qp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/hns/hns_roce_qp.c 2020-04-23 08:30:24.000000000 +0000 @@ -262,7 +262,6 @@ hns_roce_table_put(hr_dev, &qp_table->trrl_table, hr_qp->qpn); hns_roce_table_put(hr_dev, &qp_table->irrl_table, hr_qp->qpn); - hns_roce_table_put(hr_dev, &qp_table->qp_table, hr_qp->qpn); } } EXPORT_SYMBOL_GPL(hns_roce_qp_free); diff -Nru linux-4.19.98/drivers/infiniband/hw/mlx4/main.c linux-4.19.118/drivers/infiniband/hw/mlx4/main.c --- linux-4.19.98/drivers/infiniband/hw/mlx4/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/mlx4/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -246,6 +246,13 @@ return mlx4_ib_update_gids_v1(gids, ibdev, port_num); } +static void free_gid_entry(struct gid_entry *entry) +{ + memset(&entry->gid, 0, sizeof(entry->gid)); + kfree(entry->ctx); + entry->ctx = NULL; +} + static int mlx4_ib_add_gid(const struct ib_gid_attr *attr, void **context) { struct mlx4_ib_dev *ibdev = to_mdev(attr->device); @@ -306,6 +313,8 @@ GFP_ATOMIC); if (!gids) { ret = -ENOMEM; + *context = NULL; + free_gid_entry(&port_gid_table->gids[free]); } else { for (i = 0; i < MLX4_MAX_PORT_GIDS; i++) { memcpy(&gids[i].gid, &port_gid_table->gids[i].gid, sizeof(union ib_gid)); @@ -317,6 +326,12 @@ if (!ret && hw_update) { ret = mlx4_ib_update_gids(gids, ibdev, attr->port_num); + if (ret) { + spin_lock_bh(&iboe->lock); + *context = NULL; + free_gid_entry(&port_gid_table->gids[free]); + spin_unlock_bh(&iboe->lock); + } kfree(gids); } @@ -346,10 +361,7 @@ if (!ctx->refcount) { unsigned int real_index = ctx->real_index; - memset(&port_gid_table->gids[real_index].gid, 0, - sizeof(port_gid_table->gids[real_index].gid)); - kfree(port_gid_table->gids[real_index].ctx); - port_gid_table->gids[real_index].ctx = NULL; + free_gid_entry(&port_gid_table->gids[real_index]); hw_update = 1; } } diff -Nru linux-4.19.98/drivers/infiniband/hw/mlx5/gsi.c linux-4.19.118/drivers/infiniband/hw/mlx5/gsi.c --- linux-4.19.98/drivers/infiniband/hw/mlx5/gsi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/mlx5/gsi.c 2020-04-23 08:30:24.000000000 +0000 @@ -507,8 +507,7 @@ ret = ib_post_send(tx_qp, &cur_wr.wr, bad_wr); if (ret) { /* Undo the effect of adding the outstanding wr */ - gsi->outstanding_pi = (gsi->outstanding_pi - 1) % - gsi->cap.max_send_wr; + gsi->outstanding_pi--; goto err; } spin_unlock_irqrestore(&gsi->lock, flags); diff -Nru linux-4.19.98/drivers/infiniband/hw/mlx5/ib_rep.c linux-4.19.118/drivers/infiniband/hw/mlx5/ib_rep.c --- linux-4.19.98/drivers/infiniband/hw/mlx5/ib_rep.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/mlx5/ib_rep.c 2020-04-23 08:30:24.000000000 +0000 @@ -69,8 +69,10 @@ ibdev->mdev = dev; ibdev->num_ports = max(MLX5_CAP_GEN(dev, num_ports), MLX5_CAP_GEN(dev, num_vhca_ports)); - if (!__mlx5_ib_add(ibdev, &rep_profile)) + if (!__mlx5_ib_add(ibdev, &rep_profile)) { + ib_dealloc_device(&ibdev->ib_dev); return -EINVAL; + } rep->rep_if[REP_IB].priv = ibdev; diff -Nru linux-4.19.98/drivers/infiniband/hw/mlx5/main.c linux-4.19.118/drivers/infiniband/hw/mlx5/main.c --- linux-4.19.98/drivers/infiniband/hw/mlx5/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/mlx5/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1070,12 +1070,10 @@ if (MLX5_CAP_ETH(mdev, tunnel_stateless_gre)) resp.tunnel_offloads_caps |= MLX5_IB_TUNNELED_OFFLOADS_GRE; - if (MLX5_CAP_GEN(mdev, flex_parser_protocols) & - MLX5_FLEX_PROTO_CW_MPLS_GRE) + if (MLX5_CAP_ETH(mdev, tunnel_stateless_mpls_over_gre)) resp.tunnel_offloads_caps |= MLX5_IB_TUNNELED_OFFLOADS_MPLS_GRE; - if (MLX5_CAP_GEN(mdev, flex_parser_protocols) & - MLX5_FLEX_PROTO_CW_MPLS_UDP) + if (MLX5_CAP_ETH(mdev, tunnel_stateless_mpls_over_udp)) resp.tunnel_offloads_caps |= MLX5_IB_TUNNELED_OFFLOADS_MPLS_UDP; } @@ -2390,10 +2388,29 @@ return match_criteria_enable; } -static void set_proto(void *outer_c, void *outer_v, u8 mask, u8 val) +static int set_proto(void *outer_c, void *outer_v, u8 mask, u8 val) { - MLX5_SET(fte_match_set_lyr_2_4, outer_c, ip_protocol, mask); - MLX5_SET(fte_match_set_lyr_2_4, outer_v, ip_protocol, val); + u8 entry_mask; + u8 entry_val; + int err = 0; + + if (!mask) + goto out; + + entry_mask = MLX5_GET(fte_match_set_lyr_2_4, outer_c, + ip_protocol); + entry_val = MLX5_GET(fte_match_set_lyr_2_4, outer_v, + ip_protocol); + if (!entry_mask) { + MLX5_SET(fte_match_set_lyr_2_4, outer_c, ip_protocol, mask); + MLX5_SET(fte_match_set_lyr_2_4, outer_v, ip_protocol, val); + goto out; + } + /* Don't override existing ip protocol */ + if (mask != entry_mask || val != entry_val) + err = -EINVAL; +out: + return err; } static void set_flow_label(void *misc_c, void *misc_v, u32 mask, u32 val, @@ -2597,8 +2614,10 @@ set_tos(headers_c, headers_v, ib_spec->ipv4.mask.tos, ib_spec->ipv4.val.tos); - set_proto(headers_c, headers_v, - ib_spec->ipv4.mask.proto, ib_spec->ipv4.val.proto); + if (set_proto(headers_c, headers_v, + ib_spec->ipv4.mask.proto, + ib_spec->ipv4.val.proto)) + return -EINVAL; break; case IB_FLOW_SPEC_IPV6: if (FIELDS_NOT_SUPPORTED(ib_spec->ipv6.mask, LAST_IPV6_FIELD)) @@ -2637,9 +2656,10 @@ ib_spec->ipv6.mask.traffic_class, ib_spec->ipv6.val.traffic_class); - set_proto(headers_c, headers_v, - ib_spec->ipv6.mask.next_hdr, - ib_spec->ipv6.val.next_hdr); + if (set_proto(headers_c, headers_v, + ib_spec->ipv6.mask.next_hdr, + ib_spec->ipv6.val.next_hdr)) + return -EINVAL; set_flow_label(misc_params_c, misc_params_v, ntohl(ib_spec->ipv6.mask.flow_label), @@ -2660,10 +2680,8 @@ LAST_TCP_UDP_FIELD)) return -EOPNOTSUPP; - MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_protocol, - 0xff); - MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol, - IPPROTO_TCP); + if (set_proto(headers_c, headers_v, 0xff, IPPROTO_TCP)) + return -EINVAL; MLX5_SET(fte_match_set_lyr_2_4, headers_c, tcp_sport, ntohs(ib_spec->tcp_udp.mask.src_port)); @@ -2680,10 +2698,8 @@ LAST_TCP_UDP_FIELD)) return -EOPNOTSUPP; - MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_protocol, - 0xff); - MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol, - IPPROTO_UDP); + if (set_proto(headers_c, headers_v, 0xff, IPPROTO_UDP)) + return -EINVAL; MLX5_SET(fte_match_set_lyr_2_4, headers_c, udp_sport, ntohs(ib_spec->tcp_udp.mask.src_port)); @@ -2699,6 +2715,9 @@ if (ib_spec->gre.mask.c_ks_res0_ver) return -EOPNOTSUPP; + if (set_proto(headers_c, headers_v, 0xff, IPPROTO_GRE)) + return -EINVAL; + MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_protocol, 0xff); MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol, diff -Nru linux-4.19.98/drivers/infiniband/hw/mlx5/qp.c linux-4.19.118/drivers/infiniband/hw/mlx5/qp.c --- linux-4.19.98/drivers/infiniband/hw/mlx5/qp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/mlx5/qp.c 2020-04-23 08:30:24.000000000 +0000 @@ -2598,6 +2598,11 @@ [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_PKEY_INDEX | MLX5_QP_OPTPAR_Q_KEY | MLX5_QP_OPTPAR_PRI_PORT, + [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_PKEY_INDEX | + MLX5_QP_OPTPAR_PRI_PORT, }, [MLX5_QP_STATE_RTR] = { [MLX5_QP_ST_RC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | @@ -2631,6 +2636,12 @@ MLX5_QP_OPTPAR_RWE | MLX5_QP_OPTPAR_PM_STATE, [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY, + [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH | + MLX5_QP_OPTPAR_RRE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_PM_STATE | + MLX5_QP_OPTPAR_RNR_TIMEOUT, }, }, [MLX5_QP_STATE_RTS] = { @@ -2647,6 +2658,12 @@ [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY | MLX5_QP_OPTPAR_SRQN | MLX5_QP_OPTPAR_CQN_RCV, + [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_RNR_TIMEOUT | + MLX5_QP_OPTPAR_PM_STATE | + MLX5_QP_OPTPAR_ALT_ADDR_PATH, }, }, [MLX5_QP_STATE_SQER] = { @@ -2658,6 +2675,10 @@ MLX5_QP_OPTPAR_RWE | MLX5_QP_OPTPAR_RAE | MLX5_QP_OPTPAR_RRE, + [MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RNR_TIMEOUT | + MLX5_QP_OPTPAR_RWE | + MLX5_QP_OPTPAR_RAE | + MLX5_QP_OPTPAR_RRE, }, }, }; @@ -5503,6 +5524,10 @@ if (udata->outlen && udata->outlen < min_resp_len) return ERR_PTR(-EINVAL); + if (!capable(CAP_SYS_RAWIO) && + init_attr->create_flags & IB_WQ_FLAGS_DELAY_DROP) + return ERR_PTR(-EPERM); + dev = to_mdev(pd->device); switch (init_attr->wq_type) { case IB_WQT_RQ: diff -Nru linux-4.19.98/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c linux-4.19.118/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c --- linux-4.19.98/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -55,7 +55,7 @@ int ocrdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) { - if (index > 1) + if (index > 0) return -EINVAL; *pkey = 0xffff; diff -Nru linux-4.19.98/drivers/infiniband/hw/qedr/verbs.c linux-4.19.118/drivers/infiniband/hw/qedr/verbs.c --- linux-4.19.98/drivers/infiniband/hw/qedr/verbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/qedr/verbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -67,7 +67,7 @@ int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) { - if (index > QEDR_ROCE_PKEY_TABLE_LEN) + if (index >= QEDR_ROCE_PKEY_TABLE_LEN) return -EINVAL; *pkey = QEDR_ROCE_PKEY_DEFAULT; @@ -158,54 +158,47 @@ return 0; } -#define QEDR_SPEED_SDR (1) -#define QEDR_SPEED_DDR (2) -#define QEDR_SPEED_QDR (4) -#define QEDR_SPEED_FDR10 (8) -#define QEDR_SPEED_FDR (16) -#define QEDR_SPEED_EDR (32) - static inline void get_link_speed_and_width(int speed, u8 *ib_speed, u8 *ib_width) { switch (speed) { case 1000: - *ib_speed = QEDR_SPEED_SDR; + *ib_speed = IB_SPEED_SDR; *ib_width = IB_WIDTH_1X; break; case 10000: - *ib_speed = QEDR_SPEED_QDR; + *ib_speed = IB_SPEED_QDR; *ib_width = IB_WIDTH_1X; break; case 20000: - *ib_speed = QEDR_SPEED_DDR; + *ib_speed = IB_SPEED_DDR; *ib_width = IB_WIDTH_4X; break; case 25000: - *ib_speed = QEDR_SPEED_EDR; + *ib_speed = IB_SPEED_EDR; *ib_width = IB_WIDTH_1X; break; case 40000: - *ib_speed = QEDR_SPEED_QDR; + *ib_speed = IB_SPEED_QDR; *ib_width = IB_WIDTH_4X; break; case 50000: - *ib_speed = QEDR_SPEED_QDR; - *ib_width = IB_WIDTH_4X; + *ib_speed = IB_SPEED_HDR; + *ib_width = IB_WIDTH_1X; break; case 100000: - *ib_speed = QEDR_SPEED_EDR; + *ib_speed = IB_SPEED_EDR; *ib_width = IB_WIDTH_4X; break; default: /* Unsupported */ - *ib_speed = QEDR_SPEED_SDR; + *ib_speed = IB_SPEED_SDR; *ib_width = IB_WIDTH_1X; } } diff -Nru linux-4.19.98/drivers/infiniband/hw/qib/qib_verbs.c linux-4.19.118/drivers/infiniband/hw/qib/qib_verbs.c --- linux-4.19.98/drivers/infiniband/hw/qib/qib_verbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/qib/qib_verbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -360,8 +360,10 @@ if (mcast == NULL) goto drop; this_cpu_inc(ibp->pmastats->n_multicast_rcv); + rcu_read_lock(); list_for_each_entry_rcu(p, &mcast->qp_list, list) qib_qp_rcv(rcd, hdr, 1, data, tlen, p->qp); + rcu_read_unlock(); /* * Notify rvt_multicast_detach() if it is waiting for us * to finish. diff -Nru linux-4.19.98/drivers/infiniband/hw/usnic/usnic_ib_verbs.c linux-4.19.118/drivers/infiniband/hw/usnic/usnic_ib_verbs.c --- linux-4.19.98/drivers/infiniband/hw/usnic/usnic_ib_verbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/hw/usnic/usnic_ib_verbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -447,7 +447,7 @@ int usnic_ib_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey) { - if (index > 1) + if (index > 0) return -EINVAL; *pkey = 0xffff; diff -Nru linux-4.19.98/drivers/infiniband/sw/rdmavt/qp.c linux-4.19.118/drivers/infiniband/sw/rdmavt/qp.c --- linux-4.19.98/drivers/infiniband/sw/rdmavt/qp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/sw/rdmavt/qp.c 2020-04-23 08:30:24.000000000 +0000 @@ -58,6 +58,8 @@ #include "trace.h" static void rvt_rc_timeout(struct timer_list *t); +static void rvt_reset_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, + enum ib_qp_type type); /* * Convert the AETH RNR timeout code into the number of microseconds. @@ -268,40 +270,41 @@ } /** - * free_all_qps - check for QPs still in use + * rvt_free_qp_cb - callback function to reset a qp + * @qp: the qp to reset + * @v: a 64-bit value + * + * This function resets the qp and removes it from the + * qp hash table. + */ +static void rvt_free_qp_cb(struct rvt_qp *qp, u64 v) +{ + unsigned int *qp_inuse = (unsigned int *)v; + struct rvt_dev_info *rdi = ib_to_rvt(qp->ibqp.device); + + /* Reset the qp and remove it from the qp hash list */ + rvt_reset_qp(rdi, qp, qp->ibqp.qp_type); + + /* Increment the qp_inuse count */ + (*qp_inuse)++; +} + +/** + * rvt_free_all_qps - check for QPs still in use * @rdi: rvt device info structure * * There should not be any QPs still in use. * Free memory for table. + * Return the number of QPs still in use. */ static unsigned rvt_free_all_qps(struct rvt_dev_info *rdi) { - unsigned long flags; - struct rvt_qp *qp; - unsigned n, qp_inuse = 0; - spinlock_t *ql; /* work around too long line below */ - - if (rdi->driver_f.free_all_qps) - qp_inuse = rdi->driver_f.free_all_qps(rdi); + unsigned int qp_inuse = 0; qp_inuse += rvt_mcast_tree_empty(rdi); - if (!rdi->qp_dev) - return qp_inuse; + rvt_qp_iter(rdi, (u64)&qp_inuse, rvt_free_qp_cb); - ql = &rdi->qp_dev->qpt_lock; - spin_lock_irqsave(ql, flags); - for (n = 0; n < rdi->qp_dev->qp_table_size; n++) { - qp = rcu_dereference_protected(rdi->qp_dev->qp_table[n], - lockdep_is_held(ql)); - RCU_INIT_POINTER(rdi->qp_dev->qp_table[n], NULL); - - for (; qp; qp = rcu_dereference_protected(qp->next, - lockdep_is_held(ql))) - qp_inuse++; - } - spin_unlock_irqrestore(ql, flags); - synchronize_rcu(); return qp_inuse; } @@ -684,14 +687,14 @@ } /** - * rvt_reset_qp - initialize the QP state to the reset state + * _rvt_reset_qp - initialize the QP state to the reset state * @qp: the QP to reset * @type: the QP type * * r_lock, s_hlock, and s_lock are required to be held by the caller */ -static void rvt_reset_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, - enum ib_qp_type type) +static void _rvt_reset_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, + enum ib_qp_type type) __must_hold(&qp->s_lock) __must_hold(&qp->s_hlock) __must_hold(&qp->r_lock) @@ -737,6 +740,27 @@ lockdep_assert_held(&qp->s_lock); } +/** + * rvt_reset_qp - initialize the QP state to the reset state + * @rdi: the device info + * @qp: the QP to reset + * @type: the QP type + * + * This is the wrapper function to acquire the r_lock, s_hlock, and s_lock + * before calling _rvt_reset_qp(). + */ +static void rvt_reset_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, + enum ib_qp_type type) +{ + spin_lock_irq(&qp->r_lock); + spin_lock(&qp->s_hlock); + spin_lock(&qp->s_lock); + _rvt_reset_qp(rdi, qp, type); + spin_unlock(&qp->s_lock); + spin_unlock(&qp->s_hlock); + spin_unlock_irq(&qp->r_lock); +} + /** rvt_free_qpn - Free a qpn from the bit map * @qpt: QP table * @qpn: queue pair number to free @@ -1285,7 +1309,7 @@ switch (new_state) { case IB_QPS_RESET: if (qp->state != IB_QPS_RESET) - rvt_reset_qp(rdi, qp, ibqp->qp_type); + _rvt_reset_qp(rdi, qp, ibqp->qp_type); break; case IB_QPS_RTR: @@ -1434,13 +1458,7 @@ struct rvt_qp *qp = ibqp_to_rvtqp(ibqp); struct rvt_dev_info *rdi = ib_to_rvt(ibqp->device); - spin_lock_irq(&qp->r_lock); - spin_lock(&qp->s_hlock); - spin_lock(&qp->s_lock); rvt_reset_qp(rdi, qp, ibqp->qp_type); - spin_unlock(&qp->s_lock); - spin_unlock(&qp->s_hlock); - spin_unlock_irq(&qp->r_lock); wait_event(qp->wait, !atomic_read(&qp->refcount)); /* qpn is now available for use again */ diff -Nru linux-4.19.98/drivers/infiniband/sw/rxe/rxe_comp.c linux-4.19.118/drivers/infiniband/sw/rxe/rxe_comp.c --- linux-4.19.98/drivers/infiniband/sw/rxe/rxe_comp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/sw/rxe/rxe_comp.c 2020-04-23 08:30:24.000000000 +0000 @@ -329,7 +329,7 @@ qp->comp.psn = pkt->psn; if (qp->req.wait_psn) { qp->req.wait_psn = 0; - rxe_run_task(&qp->req.task, 1); + rxe_run_task(&qp->req.task, 0); } } return COMPST_ERROR_RETRY; @@ -457,7 +457,7 @@ */ if (qp->req.wait_fence) { qp->req.wait_fence = 0; - rxe_run_task(&qp->req.task, 1); + rxe_run_task(&qp->req.task, 0); } } @@ -473,7 +473,7 @@ if (qp->req.need_rd_atomic) { qp->comp.timeout_retry = 0; qp->req.need_rd_atomic = 0; - rxe_run_task(&qp->req.task, 1); + rxe_run_task(&qp->req.task, 0); } } @@ -719,7 +719,7 @@ RXE_CNT_COMP_RETRY); qp->req.need_retry = 1; qp->comp.started_retry = 1; - rxe_run_task(&qp->req.task, 1); + rxe_run_task(&qp->req.task, 0); } if (pkt) { diff -Nru linux-4.19.98/drivers/infiniband/sw/rxe/rxe_cq.c linux-4.19.118/drivers/infiniband/sw/rxe/rxe_cq.c --- linux-4.19.98/drivers/infiniband/sw/rxe/rxe_cq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/sw/rxe/rxe_cq.c 2020-04-23 08:30:24.000000000 +0000 @@ -30,7 +30,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - +#include #include "rxe.h" #include "rxe_loc.h" #include "rxe_queue.h" @@ -97,7 +97,7 @@ err = do_mmap_info(rxe, uresp ? &uresp->mi : NULL, context, cq->queue->buf, cq->queue->buf_size, &cq->queue->ip); if (err) { - kvfree(cq->queue->buf); + vfree(cq->queue->buf); kfree(cq->queue); return err; } diff -Nru linux-4.19.98/drivers/infiniband/sw/rxe/rxe_net.c linux-4.19.118/drivers/infiniband/sw/rxe/rxe_net.c --- linux-4.19.98/drivers/infiniband/sw/rxe/rxe_net.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/sw/rxe/rxe_net.c 2020-04-23 08:30:24.000000000 +0000 @@ -533,8 +533,9 @@ if (unlikely(!skb)) goto out; - skb_reserve(skb, hdr_len + LL_RESERVED_SPACE(rxe->ndev)); + skb_reserve(skb, hdr_len + LL_RESERVED_SPACE(ndev)); + /* FIXME: hold reference to this netdev until life of this skb. */ skb->dev = ndev; if (av->network_type == RDMA_NETWORK_IPV4) skb->protocol = htons(ETH_P_IP); diff -Nru linux-4.19.98/drivers/infiniband/sw/rxe/rxe_pool.c linux-4.19.118/drivers/infiniband/sw/rxe/rxe_pool.c --- linux-4.19.98/drivers/infiniband/sw/rxe/rxe_pool.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/sw/rxe/rxe_pool.c 2020-04-23 08:30:24.000000000 +0000 @@ -112,6 +112,18 @@ return rxe_type_info[pool->type].cache; } +static void rxe_cache_clean(size_t cnt) +{ + int i; + struct rxe_type_info *type; + + for (i = 0; i < cnt; i++) { + type = &rxe_type_info[i]; + kmem_cache_destroy(type->cache); + type->cache = NULL; + } +} + int rxe_cache_init(void) { int err; @@ -136,24 +148,14 @@ return 0; err1: - while (--i >= 0) { - kmem_cache_destroy(type->cache); - type->cache = NULL; - } + rxe_cache_clean(i); return err; } void rxe_cache_exit(void) { - int i; - struct rxe_type_info *type; - - for (i = 0; i < RXE_NUM_TYPES; i++) { - type = &rxe_type_info[i]; - kmem_cache_destroy(type->cache); - type->cache = NULL; - } + rxe_cache_clean(RXE_NUM_TYPES); } static int rxe_pool_init_index(struct rxe_pool *pool, u32 max, u32 min) diff -Nru linux-4.19.98/drivers/infiniband/sw/rxe/rxe_qp.c linux-4.19.118/drivers/infiniband/sw/rxe/rxe_qp.c --- linux-4.19.98/drivers/infiniband/sw/rxe/rxe_qp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/sw/rxe/rxe_qp.c 2020-04-23 08:30:24.000000000 +0000 @@ -34,6 +34,7 @@ #include #include #include +#include #include "rxe.h" #include "rxe_loc.h" @@ -247,7 +248,7 @@ &qp->sq.queue->ip); if (err) { - kvfree(qp->sq.queue->buf); + vfree(qp->sq.queue->buf); kfree(qp->sq.queue); return err; } @@ -300,7 +301,7 @@ qp->rq.queue->buf, qp->rq.queue->buf_size, &qp->rq.queue->ip); if (err) { - kvfree(qp->rq.queue->buf); + vfree(qp->rq.queue->buf); kfree(qp->rq.queue); return err; } diff -Nru linux-4.19.98/drivers/infiniband/sw/rxe/rxe_verbs.h linux-4.19.118/drivers/infiniband/sw/rxe/rxe_verbs.h --- linux-4.19.98/drivers/infiniband/sw/rxe/rxe_verbs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/sw/rxe/rxe_verbs.h 2020-04-23 08:30:24.000000000 +0000 @@ -407,7 +407,7 @@ struct list_head pending_mmaps; spinlock_t mmap_offset_lock; /* guard mmap_offset */ - int mmap_offset; + u64 mmap_offset; atomic64_t stats_counters[RXE_NUM_OF_COUNTERS]; diff -Nru linux-4.19.98/drivers/infiniband/ulp/iser/iscsi_iser.h linux-4.19.118/drivers/infiniband/ulp/iser/iscsi_iser.h --- linux-4.19.98/drivers/infiniband/ulp/iser/iscsi_iser.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/ulp/iser/iscsi_iser.h 2020-04-23 08:30:24.000000000 +0000 @@ -197,7 +197,7 @@ struct scatterlist *sg; int size; unsigned long data_len; - unsigned int dma_nents; + int dma_nents; }; /* fwd declarations */ diff -Nru linux-4.19.98/drivers/infiniband/ulp/iser/iser_memory.c linux-4.19.118/drivers/infiniband/ulp/iser/iser_memory.c --- linux-4.19.98/drivers/infiniband/ulp/iser/iser_memory.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/infiniband/ulp/iser/iser_memory.c 2020-04-23 08:30:24.000000000 +0000 @@ -240,8 +240,8 @@ page_vec->npages = 0; page_vec->fake_mr.page_size = SIZE_4K; plen = ib_sg_to_pages(&page_vec->fake_mr, mem->sg, - mem->size, NULL, iser_set_page); - if (unlikely(plen < mem->size)) { + mem->dma_nents, NULL, iser_set_page); + if (unlikely(plen < mem->dma_nents)) { iser_err("page vec too short to hold this SG\n"); iser_data_buf_dump(mem, device->ib_device); iser_dump_page_vec(page_vec); @@ -451,10 +451,10 @@ ib_update_fast_reg_key(mr, ib_inc_rkey(mr->rkey)); - n = ib_map_mr_sg(mr, mem->sg, mem->size, NULL, SIZE_4K); - if (unlikely(n != mem->size)) { + n = ib_map_mr_sg(mr, mem->sg, mem->dma_nents, NULL, SIZE_4K); + if (unlikely(n != mem->dma_nents)) { iser_err("failed to map sg (%d/%d)\n", - n, mem->size); + n, mem->dma_nents); return n < 0 ? n : -EINVAL; } diff -Nru linux-4.19.98/drivers/input/keyboard/nomadik-ske-keypad.c linux-4.19.118/drivers/input/keyboard/nomadik-ske-keypad.c --- linux-4.19.98/drivers/input/keyboard/nomadik-ske-keypad.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/keyboard/nomadik-ske-keypad.c 2020-04-23 08:30:24.000000000 +0000 @@ -100,7 +100,7 @@ while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) cpu_relax(); - if (!timeout) + if (timeout == -1) return -EINVAL; /* diff -Nru linux-4.19.98/drivers/input/misc/keyspan_remote.c linux-4.19.118/drivers/input/misc/keyspan_remote.c --- linux-4.19.98/drivers/input/misc/keyspan_remote.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/misc/keyspan_remote.c 2020-04-23 08:30:24.000000000 +0000 @@ -339,7 +339,8 @@ int retval = 0; retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); + 0x11, 0x40, 0x5601, 0x0, NULL, 0, + USB_CTRL_SET_TIMEOUT); if (retval) { dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", __func__, retval); @@ -347,7 +348,8 @@ } retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); + 0x44, 0x40, 0x0, 0x0, NULL, 0, + USB_CTRL_SET_TIMEOUT); if (retval) { dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", __func__, retval); @@ -355,7 +357,8 @@ } retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); + 0x22, 0x40, 0x0, 0x0, NULL, 0, + USB_CTRL_SET_TIMEOUT); if (retval) { dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", __func__, retval); diff -Nru linux-4.19.98/drivers/input/misc/pm8xxx-vibrator.c linux-4.19.118/drivers/input/misc/pm8xxx-vibrator.c --- linux-4.19.98/drivers/input/misc/pm8xxx-vibrator.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/misc/pm8xxx-vibrator.c 2020-04-23 08:30:24.000000000 +0000 @@ -98,7 +98,7 @@ if (regs->enable_mask) rc = regmap_update_bits(vib->regmap, regs->enable_addr, - on ? regs->enable_mask : 0, val); + regs->enable_mask, on ? ~0 : 0); return rc; } diff -Nru linux-4.19.98/drivers/input/mouse/synaptics.c linux-4.19.118/drivers/input/mouse/synaptics.c --- linux-4.19.98/drivers/input/mouse/synaptics.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/mouse/synaptics.c 2020-04-23 08:30:24.000000000 +0000 @@ -149,7 +149,6 @@ "LEN0042", /* Yoga */ "LEN0045", "LEN0047", - "LEN0049", "LEN2000", /* S540 */ "LEN2001", /* Edge E431 */ "LEN2002", /* Edge E531 */ @@ -169,9 +168,11 @@ /* all of the topbuttonpad_pnp_ids are valid, we just add some extras */ "LEN0048", /* X1 Carbon 3 */ "LEN0046", /* X250 */ + "LEN0049", /* Yoga 11e */ "LEN004a", /* W541 */ "LEN005b", /* P50 */ "LEN005e", /* T560 */ + "LEN006c", /* T470s */ "LEN0071", /* T480 */ "LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */ "LEN0073", /* X1 Carbon G5 (Elantech) */ @@ -182,11 +183,13 @@ "LEN0097", /* X280 -> ALPS trackpoint */ "LEN009b", /* T580 */ "LEN200f", /* T450s */ + "LEN2044", /* L470 */ "LEN2054", /* E480 */ "LEN2055", /* E580 */ "SYN3052", /* HP EliteBook 840 G4 */ "SYN3221", /* HP 15-ay000 */ "SYN323d", /* HP Spectre X360 13-w013dx */ + "SYN3257", /* HP Envy 13-ad105ng */ NULL }; diff -Nru linux-4.19.98/drivers/input/rmi4/rmi_smbus.c linux-4.19.118/drivers/input/rmi4/rmi_smbus.c --- linux-4.19.98/drivers/input/rmi4/rmi_smbus.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/rmi4/rmi_smbus.c 2020-04-23 08:30:24.000000000 +0000 @@ -166,6 +166,7 @@ /* prepare to write next block of bytes */ cur_len -= SMB_MAX_COUNT; databuff += SMB_MAX_COUNT; + rmiaddr += SMB_MAX_COUNT; } exit: mutex_unlock(&rmi_smb->page_mutex); @@ -217,6 +218,7 @@ /* prepare to read next block of bytes */ cur_len -= SMB_MAX_COUNT; databuff += SMB_MAX_COUNT; + rmiaddr += SMB_MAX_COUNT; } retval = 0; diff -Nru linux-4.19.98/drivers/input/serio/i8042-x86ia64io.h linux-4.19.118/drivers/input/serio/i8042-x86ia64io.h --- linux-4.19.98/drivers/input/serio/i8042-x86ia64io.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/serio/i8042-x86ia64io.h 2020-04-23 08:30:24.000000000 +0000 @@ -534,6 +534,17 @@ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"), }, }, + { + /* + * Acer Aspire 5738z + * Touchpad stops working in mux mode when dis- + re-enabled + * with the touchpad enable/disable toggle hotkey + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"), + }, + }, { } }; diff -Nru linux-4.19.98/drivers/input/tablet/aiptek.c linux-4.19.118/drivers/input/tablet/aiptek.c --- linux-4.19.98/drivers/input/tablet/aiptek.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/tablet/aiptek.c 2020-04-23 08:30:24.000000000 +0000 @@ -1815,14 +1815,14 @@ input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0); /* Verify that a device really has an endpoint */ - if (intf->altsetting[0].desc.bNumEndpoints < 1) { + if (intf->cur_altsetting->desc.bNumEndpoints < 1) { dev_err(&intf->dev, "interface has %d endpoints, but must have minimum 1\n", - intf->altsetting[0].desc.bNumEndpoints); + intf->cur_altsetting->desc.bNumEndpoints); err = -EINVAL; goto fail3; } - endpoint = &intf->altsetting[0].endpoint[0].desc; + endpoint = &intf->cur_altsetting->endpoint[0].desc; /* Go set up our URB, which is called when the tablet receives * input. diff -Nru linux-4.19.98/drivers/input/tablet/gtco.c linux-4.19.118/drivers/input/tablet/gtco.c --- linux-4.19.98/drivers/input/tablet/gtco.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/tablet/gtco.c 2020-04-23 08:30:24.000000000 +0000 @@ -875,18 +875,14 @@ } /* Sanity check that a device has an endpoint */ - if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) { + if (usbinterface->cur_altsetting->desc.bNumEndpoints < 1) { dev_err(&usbinterface->dev, "Invalid number of endpoints\n"); error = -EINVAL; goto err_free_urb; } - /* - * The endpoint is always altsetting 0, we know this since we know - * this device only has one interrupt endpoint - */ - endpoint = &usbinterface->altsetting[0].endpoint[0].desc; + endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; /* Some debug */ dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting); @@ -973,7 +969,7 @@ input_dev->dev.parent = &usbinterface->dev; /* Setup the URB, it will be posted later on open of input device */ - endpoint = &usbinterface->altsetting[0].endpoint[0].desc; + endpoint = &usbinterface->cur_altsetting->endpoint[0].desc; usb_fill_int_urb(gtco->urbinfo, udev, diff -Nru linux-4.19.98/drivers/input/tablet/pegasus_notetaker.c linux-4.19.118/drivers/input/tablet/pegasus_notetaker.c --- linux-4.19.98/drivers/input/tablet/pegasus_notetaker.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/tablet/pegasus_notetaker.c 2020-04-23 08:30:24.000000000 +0000 @@ -274,7 +274,7 @@ return -ENODEV; /* Sanity check that the device has an endpoint */ - if (intf->altsetting[0].desc.bNumEndpoints < 1) { + if (intf->cur_altsetting->desc.bNumEndpoints < 1) { dev_err(&intf->dev, "Invalid number of endpoints\n"); return -EINVAL; } diff -Nru linux-4.19.98/drivers/input/touchscreen/edt-ft5x06.c linux-4.19.118/drivers/input/touchscreen/edt-ft5x06.c --- linux-4.19.98/drivers/input/touchscreen/edt-ft5x06.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/touchscreen/edt-ft5x06.c 2020-04-23 08:30:24.000000000 +0000 @@ -968,6 +968,7 @@ { const struct edt_i2c_chip_data *chip_data; struct edt_ft5x06_ts_data *tsdata; + u8 buf[2] = { 0xfc, 0x00 }; struct input_dev *input; unsigned long irq_flags; int error; @@ -1037,6 +1038,12 @@ return error; } + /* + * Dummy read access. EP0700MLP1 returns bogus data on the first + * register read access and ignores writes. + */ + edt_ft5x06_ts_readwrite(tsdata->client, 2, buf, 2, buf); + edt_ft5x06_ts_set_regs(tsdata); edt_ft5x06_ts_get_defaults(&client->dev, tsdata); edt_ft5x06_ts_get_parameters(tsdata); diff -Nru linux-4.19.98/drivers/input/touchscreen/raydium_i2c_ts.c linux-4.19.118/drivers/input/touchscreen/raydium_i2c_ts.c --- linux-4.19.98/drivers/input/touchscreen/raydium_i2c_ts.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/touchscreen/raydium_i2c_ts.c 2020-04-23 08:30:24.000000000 +0000 @@ -441,7 +441,7 @@ return 0; } -static bool raydium_i2c_boot_trigger(struct i2c_client *client) +static int raydium_i2c_boot_trigger(struct i2c_client *client) { static const u8 cmd[7][6] = { { 0x08, 0x0C, 0x09, 0x00, 0x50, 0xD7 }, @@ -466,10 +466,10 @@ } } - return false; + return 0; } -static bool raydium_i2c_fw_trigger(struct i2c_client *client) +static int raydium_i2c_fw_trigger(struct i2c_client *client) { static const u8 cmd[5][11] = { { 0, 0x09, 0x71, 0x0C, 0x09, 0x00, 0x50, 0xD7, 0, 0, 0 }, @@ -492,7 +492,7 @@ } } - return false; + return 0; } static int raydium_i2c_check_path(struct i2c_client *client) diff -Nru linux-4.19.98/drivers/input/touchscreen/sun4i-ts.c linux-4.19.118/drivers/input/touchscreen/sun4i-ts.c --- linux-4.19.98/drivers/input/touchscreen/sun4i-ts.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/touchscreen/sun4i-ts.c 2020-04-23 08:30:24.000000000 +0000 @@ -246,6 +246,7 @@ struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct device *hwmon; + struct thermal_zone_device *thermal; int error; u32 reg; bool ts_attached; @@ -365,7 +366,10 @@ if (IS_ERR(hwmon)) return PTR_ERR(hwmon); - devm_thermal_zone_of_sensor_register(ts->dev, 0, ts, &sun4i_ts_tz_ops); + thermal = devm_thermal_zone_of_sensor_register(ts->dev, 0, ts, + &sun4i_ts_tz_ops); + if (IS_ERR(thermal)) + return PTR_ERR(thermal); writel(TEMP_IRQ_EN(1), ts->base + TP_INT_FIFOC); diff -Nru linux-4.19.98/drivers/input/touchscreen/sur40.c linux-4.19.118/drivers/input/touchscreen/sur40.c --- linux-4.19.98/drivers/input/touchscreen/sur40.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/input/touchscreen/sur40.c 2020-04-23 08:30:24.000000000 +0000 @@ -657,7 +657,7 @@ int error; /* Check if we really have the right interface. */ - iface_desc = &interface->altsetting[0]; + iface_desc = interface->cur_altsetting; if (iface_desc->desc.bInterfaceClass != 0xFF) return -ENODEV; diff -Nru linux-4.19.98/drivers/iommu/amd_iommu.c linux-4.19.118/drivers/iommu/amd_iommu.c --- linux-4.19.98/drivers/iommu/amd_iommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/amd_iommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -2153,6 +2153,8 @@ */ domain_flush_tlb_pde(domain); + domain_flush_complete(domain); + return ret; } @@ -3707,7 +3709,20 @@ iommu_flush_dte(iommu, devid); } -static struct irq_remap_table *alloc_irq_table(u16 devid) +static int set_remap_table_entry_alias(struct pci_dev *pdev, u16 alias, + void *data) +{ + struct irq_remap_table *table = data; + + irq_lookup_table[alias] = table; + set_dte_irq_entry(alias, table); + + iommu_flush_dte(amd_iommu_rlookup_table[alias], alias); + + return 0; +} + +static struct irq_remap_table *alloc_irq_table(u16 devid, struct pci_dev *pdev) { struct irq_remap_table *table = NULL; struct irq_remap_table *new_table = NULL; @@ -3753,7 +3768,12 @@ table = new_table; new_table = NULL; - set_remap_table_entry(iommu, devid, table); + if (pdev) + pci_for_each_dma_alias(pdev, set_remap_table_entry_alias, + table); + else + set_remap_table_entry(iommu, devid, table); + if (devid != alias) set_remap_table_entry(iommu, alias, table); @@ -3770,7 +3790,8 @@ return table; } -static int alloc_irq_index(u16 devid, int count, bool align) +static int alloc_irq_index(u16 devid, int count, bool align, + struct pci_dev *pdev) { struct irq_remap_table *table; int index, c, alignment = 1; @@ -3780,7 +3801,7 @@ if (!iommu) return -ENODEV; - table = alloc_irq_table(devid); + table = alloc_irq_table(devid, pdev); if (!table) return -ENODEV; @@ -4213,7 +4234,7 @@ struct irq_remap_table *table; struct amd_iommu *iommu; - table = alloc_irq_table(devid); + table = alloc_irq_table(devid, NULL); if (table) { if (!table->min_index) { /* @@ -4230,11 +4251,15 @@ } else { index = -ENOMEM; } - } else { + } else if (info->type == X86_IRQ_ALLOC_TYPE_MSI || + info->type == X86_IRQ_ALLOC_TYPE_MSIX) { bool align = (info->type == X86_IRQ_ALLOC_TYPE_MSI); - index = alloc_irq_index(devid, nr_irqs, align); + index = alloc_irq_index(devid, nr_irqs, align, info->msi_dev); + } else { + index = alloc_irq_index(devid, nr_irqs, false, NULL); } + if (index < 0) { pr_warn("Failed to allocate IRTE\n"); ret = index; diff -Nru linux-4.19.98/drivers/iommu/amd_iommu_init.c linux-4.19.118/drivers/iommu/amd_iommu_init.c --- linux-4.19.98/drivers/iommu/amd_iommu_init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/amd_iommu_init.c 2020-04-23 08:30:24.000000000 +0000 @@ -422,6 +422,9 @@ static void iommu_disable(struct amd_iommu *iommu) { + if (!iommu->mmio_base) + return; + /* Disable command buffer */ iommu_feature_disable(iommu, CONTROL_CMDBUF_EN); diff -Nru linux-4.19.98/drivers/iommu/amd_iommu_types.h linux-4.19.118/drivers/iommu/amd_iommu_types.h --- linux-4.19.98/drivers/iommu/amd_iommu_types.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/amd_iommu_types.h 2020-04-23 08:30:24.000000000 +0000 @@ -352,7 +352,7 @@ #define DTE_GCR3_VAL_A(x) (((x) >> 12) & 0x00007ULL) #define DTE_GCR3_VAL_B(x) (((x) >> 15) & 0x0ffffULL) -#define DTE_GCR3_VAL_C(x) (((x) >> 31) & 0xfffffULL) +#define DTE_GCR3_VAL_C(x) (((x) >> 31) & 0x1fffffULL) #define DTE_GCR3_INDEX_A 0 #define DTE_GCR3_INDEX_B 1 diff -Nru linux-4.19.98/drivers/iommu/arm-smmu-v3.c linux-4.19.118/drivers/iommu/arm-smmu-v3.c --- linux-4.19.98/drivers/iommu/arm-smmu-v3.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/arm-smmu-v3.c 2020-04-23 08:30:24.000000000 +0000 @@ -810,6 +810,7 @@ cmd[1] |= FIELD_PREP(CMDQ_CFGI_1_RANGE, 31); break; case CMDQ_OP_TLBI_NH_VA: + cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_VMID, ent->tlbi.vmid); cmd[0] |= FIELD_PREP(CMDQ_TLBI_0_ASID, ent->tlbi.asid); cmd[1] |= FIELD_PREP(CMDQ_TLBI_1_LEAF, ent->tlbi.leaf); cmd[1] |= ent->tlbi.addr & CMDQ_TLBI_1_VA_MASK; @@ -1184,7 +1185,8 @@ } arm_smmu_sync_ste_for_sid(smmu, sid); - dst[0] = cpu_to_le64(val); + /* See comment in arm_smmu_write_ctx_desc() */ + WRITE_ONCE(dst[0], cpu_to_le64(val)); arm_smmu_sync_ste_for_sid(smmu, sid); /* It's likely that we'll want to use the new STE soon */ diff -Nru linux-4.19.98/drivers/iommu/dma-iommu.c linux-4.19.118/drivers/iommu/dma-iommu.c --- linux-4.19.98/drivers/iommu/dma-iommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/dma-iommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -190,15 +190,15 @@ start -= iova_offset(iovad, start); num_pages = iova_align(iovad, end - start) >> iova_shift(iovad); - msi_page = kcalloc(num_pages, sizeof(*msi_page), GFP_KERNEL); - if (!msi_page) - return -ENOMEM; - for (i = 0; i < num_pages; i++) { - msi_page[i].phys = start; - msi_page[i].iova = start; - INIT_LIST_HEAD(&msi_page[i].list); - list_add(&msi_page[i].list, &cookie->msi_page_list); + msi_page = kmalloc(sizeof(*msi_page), GFP_KERNEL); + if (!msi_page) + return -ENOMEM; + + msi_page->phys = start; + msi_page->iova = start; + INIT_LIST_HEAD(&msi_page->list); + list_add(&msi_page->list, &cookie->msi_page_list); start += iovad->granule; } diff -Nru linux-4.19.98/drivers/iommu/dmar.c linux-4.19.118/drivers/iommu/dmar.c --- linux-4.19.98/drivers/iommu/dmar.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/dmar.c 2020-04-23 08:30:24.000000000 +0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -139,6 +140,13 @@ BUG_ON(dev->is_virtfn); + /* + * Ignore devices that have a domain number higher than what can + * be looked up in DMAR, e.g. VMD subdevices with domain 0x10000 + */ + if (pci_domain_nr(dev->bus) > U16_MAX) + return NULL; + /* Only generate path[] for device addition event */ if (event == BUS_NOTIFY_ADD_DEVICE) for (tmp = dev; tmp; tmp = tmp->bus->self) @@ -451,12 +459,13 @@ /* Check for NUL termination within the designated length */ if (strnlen(andd->device_name, header->length - 8) == header->length - 8) { - WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND, + pr_warn(FW_BUG "Your BIOS is broken; ANDD object name is not NUL-terminated\n" "BIOS vendor: %s; Ver: %s; Product Version: %s\n", dmi_get_system_info(DMI_BIOS_VENDOR), dmi_get_system_info(DMI_BIOS_VERSION), dmi_get_system_info(DMI_PRODUCT_VERSION)); + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); return -EINVAL; } pr_info("ANDD device: %x name: %s\n", andd->device_number, @@ -482,14 +491,14 @@ return 0; } } - WARN_TAINT( - 1, TAINT_FIRMWARE_WORKAROUND, + pr_warn(FW_BUG "Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n" "BIOS vendor: %s; Ver: %s; Product Version: %s\n", - drhd->reg_base_addr, + rhsa->base_address, dmi_get_system_info(DMI_BIOS_VENDOR), dmi_get_system_info(DMI_BIOS_VERSION), dmi_get_system_info(DMI_PRODUCT_VERSION)); + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); return 0; } @@ -838,14 +847,14 @@ static void warn_invalid_dmar(u64 addr, const char *message) { - WARN_TAINT_ONCE( - 1, TAINT_FIRMWARE_WORKAROUND, + pr_warn_once(FW_BUG "Your BIOS is broken; DMAR reported at address %llx%s!\n" "BIOS vendor: %s; Ver: %s; Product Version: %s\n", addr, message, dmi_get_system_info(DMI_BIOS_VENDOR), dmi_get_system_info(DMI_BIOS_VERSION), dmi_get_system_info(DMI_PRODUCT_VERSION)); + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); } static int __ref @@ -1345,7 +1354,6 @@ struct qi_desc desc; if (mask) { - WARN_ON_ONCE(addr & ((1ULL << (VTD_PAGE_SHIFT + mask)) - 1)); addr |= (1ULL << (VTD_PAGE_SHIFT + mask - 1)) - 1; desc.high = QI_DEV_IOTLB_ADDR(addr) | QI_DEV_IOTLB_SIZE; } else diff -Nru linux-4.19.98/drivers/iommu/intel-iommu.c linux-4.19.118/drivers/iommu/intel-iommu.c --- linux-4.19.98/drivers/iommu/intel-iommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/intel-iommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -387,7 +387,6 @@ u64 end_address; /* reserved end address */ struct dmar_dev_scope *devices; /* target devices */ int devices_cnt; /* target device count */ - struct iommu_resv_region *resv; /* reserved region handle */ }; struct dmar_atsr_unit { @@ -3387,9 +3386,12 @@ iommu_identity_mapping |= IDENTMAP_ALL; #ifdef CONFIG_INTEL_IOMMU_BROKEN_GFX_WA - iommu_identity_mapping |= IDENTMAP_GFX; + dmar_map_gfx = 0; #endif + if (!dmar_map_gfx) + iommu_identity_mapping |= IDENTMAP_GFX; + check_tylersburg_isoch(); if (iommu_identity_mapping) { @@ -3996,10 +3998,11 @@ /* we know that the this iommu should be at offset 0xa000 from vtbar */ drhd = dmar_find_matched_drhd_unit(pdev); - if (WARN_TAINT_ONCE(!drhd || drhd->reg_base_addr - vtbar != 0xa000, - TAINT_FIRMWARE_WORKAROUND, - "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n")) + if (!drhd || drhd->reg_base_addr - vtbar != 0xa000) { + pr_warn_once(FW_BUG "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n"); + add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); pdev->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO; + } } DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB, quirk_ioat_snb_local_iommu); @@ -4182,7 +4185,6 @@ int __init dmar_parse_one_rmrr(struct acpi_dmar_header *header, void *arg) { struct acpi_dmar_reserved_memory *rmrr; - int prot = DMA_PTE_READ|DMA_PTE_WRITE; struct dmar_rmrr_unit *rmrru; size_t length; @@ -4196,22 +4198,16 @@ rmrru->end_address = rmrr->end_address; length = rmrr->end_address - rmrr->base_address + 1; - rmrru->resv = iommu_alloc_resv_region(rmrr->base_address, length, prot, - IOMMU_RESV_DIRECT); - if (!rmrru->resv) - goto free_rmrru; rmrru->devices = dmar_alloc_dev_scope((void *)(rmrr + 1), ((void *)rmrr) + rmrr->header.length, &rmrru->devices_cnt); if (rmrru->devices_cnt && rmrru->devices == NULL) - goto free_all; + goto free_rmrru; list_add(&rmrru->list, &dmar_rmrr_units); return 0; -free_all: - kfree(rmrru->resv); free_rmrru: kfree(rmrru); out: @@ -4429,7 +4425,6 @@ list_for_each_entry_safe(rmrru, rmrr_n, &dmar_rmrr_units, list) { list_del(&rmrru->list); dmar_free_dev_scope(&rmrru->devices, &rmrru->devices_cnt); - kfree(rmrru->resv); kfree(rmrru); } @@ -5149,8 +5144,10 @@ u64 phys = 0; pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level); - if (pte) - phys = dma_pte_addr(pte); + if (pte && dma_pte_present(pte)) + phys = dma_pte_addr(pte) + + (iova & (BIT_MASK(level_to_offset_bits(level) + + VTD_PAGE_SHIFT) - 1)); return phys; } @@ -5203,22 +5200,33 @@ static void intel_iommu_get_resv_regions(struct device *device, struct list_head *head) { + int prot = DMA_PTE_READ | DMA_PTE_WRITE; struct iommu_resv_region *reg; struct dmar_rmrr_unit *rmrr; struct device *i_dev; int i; - rcu_read_lock(); + down_read(&dmar_global_lock); for_each_rmrr_units(rmrr) { for_each_active_dev_scope(rmrr->devices, rmrr->devices_cnt, i, i_dev) { + struct iommu_resv_region *resv; + size_t length; + if (i_dev != device) continue; - list_add_tail(&rmrr->resv->list, head); + length = rmrr->end_address - rmrr->base_address + 1; + resv = iommu_alloc_resv_region(rmrr->base_address, + length, prot, + IOMMU_RESV_DIRECT); + if (!resv) + break; + + list_add_tail(&resv->list, head); } } - rcu_read_unlock(); + up_read(&dmar_global_lock); reg = iommu_alloc_resv_region(IOAPIC_RANGE_START, IOAPIC_RANGE_END - IOAPIC_RANGE_START + 1, @@ -5233,10 +5241,8 @@ { struct iommu_resv_region *entry, *next; - list_for_each_entry_safe(entry, next, head, list) { - if (entry->type == IOMMU_RESV_MSI) - kfree(entry); - } + list_for_each_entry_safe(entry, next, head, list) + kfree(entry); } #ifdef CONFIG_INTEL_IOMMU_SVM diff -Nru linux-4.19.98/drivers/iommu/intel-svm.c linux-4.19.118/drivers/iommu/intel-svm.c --- linux-4.19.98/drivers/iommu/intel-svm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/intel-svm.c 2020-04-23 08:30:24.000000000 +0000 @@ -293,7 +293,7 @@ int pasid_max; int ret; - if (!iommu) + if (!iommu || dmar_disabled) return -EINVAL; if (dev_is_pci(dev)) { @@ -377,7 +377,7 @@ /* Do not use PASID 0 in caching mode (virtualised IOMMU) */ ret = intel_pasid_alloc_id(svm, !!cap_caching_mode(iommu->cap), - pasid_max - 1, GFP_KERNEL); + pasid_max, GFP_KERNEL); if (ret < 0) { kfree(svm); kfree(sdev); @@ -620,14 +620,15 @@ * any faults on kernel addresses. */ if (!svm->mm) goto bad_req; - /* If the mm is already defunct, don't handle faults. */ - if (!mmget_not_zero(svm->mm)) - goto bad_req; /* If address is not canonical, return invalid response */ if (!is_canonical_address(address)) goto bad_req; + /* If the mm is already defunct, don't handle faults. */ + if (!mmget_not_zero(svm->mm)) + goto bad_req; + down_read(&svm->mm->mmap_sem); vma = find_extend_vma(svm->mm, address); if (!vma || address < vma->vm_start) diff -Nru linux-4.19.98/drivers/iommu/iommu-debugfs.c linux-4.19.118/drivers/iommu/iommu-debugfs.c --- linux-4.19.98/drivers/iommu/iommu-debugfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/iommu-debugfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -12,6 +12,7 @@ #include struct dentry *iommu_debugfs_dir; +EXPORT_SYMBOL_GPL(iommu_debugfs_dir); /** * iommu_debugfs_setup - create the top-level iommu directory in debugfs @@ -23,9 +24,9 @@ * Emit a strong warning at boot time to indicate that this feature is * enabled. * - * This function is called from iommu_init; drivers may then call - * iommu_debugfs_new_driver_dir() to instantiate a vendor-specific - * directory to be used to expose internal data. + * This function is called from iommu_init; drivers may then use + * iommu_debugfs_dir to instantiate a vendor-specific directory to be used + * to expose internal data. */ void iommu_debugfs_setup(void) { @@ -48,19 +49,3 @@ pr_warn("*************************************************************\n"); } } - -/** - * iommu_debugfs_new_driver_dir - create a vendor directory under debugfs/iommu - * @vendor: name of the vendor-specific subdirectory to create - * - * This function is called by an IOMMU driver to create the top-level debugfs - * directory for that driver. - * - * Return: upon success, a pointer to the dentry for the new directory. - * NULL in case of failure. - */ -struct dentry *iommu_debugfs_new_driver_dir(const char *vendor) -{ - return debugfs_create_dir(vendor, iommu_debugfs_dir); -} -EXPORT_SYMBOL_GPL(iommu_debugfs_new_driver_dir); diff -Nru linux-4.19.98/drivers/iommu/iommu.c linux-4.19.118/drivers/iommu/iommu.c --- linux-4.19.98/drivers/iommu/iommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/iommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -317,7 +317,7 @@ type = "unmanaged\n"; break; case IOMMU_DOMAIN_DMA: - type = "DMA"; + type = "DMA\n"; break; } } @@ -1900,9 +1900,9 @@ int ret; /* Device must already be in a group before calling this function */ - group = iommu_group_get_for_dev(dev); - if (IS_ERR(group)) - return PTR_ERR(group); + group = iommu_group_get(dev); + if (!group) + return -EINVAL; mutex_lock(&group->mutex); diff -Nru linux-4.19.98/drivers/iommu/mtk_iommu.c linux-4.19.118/drivers/iommu/mtk_iommu.c --- linux-4.19.98/drivers/iommu/mtk_iommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/mtk_iommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -115,6 +115,30 @@ static struct iommu_ops mtk_iommu_ops; +/* + * In M4U 4GB mode, the physical address is remapped as below: + * + * CPU Physical address: + * ==================== + * + * 0 1G 2G 3G 4G 5G + * |---A---|---B---|---C---|---D---|---E---| + * +--I/O--+------------Memory-------------+ + * + * IOMMU output physical address: + * ============================= + * + * 4G 5G 6G 7G 8G + * |---E---|---B---|---C---|---D---| + * +------------Memory-------------+ + * + * The Region 'A'(I/O) can NOT be mapped by M4U; For Region 'B'/'C'/'D', the + * bit32 of the CPU physical address always is needed to set, and for Region + * 'E', the CPU physical address keep as is. + * Additionally, The iommu consumers always use the CPU phyiscal address. + */ +#define MTK_IOMMU_4GB_MODE_REMAP_BASE 0x40000000 + static LIST_HEAD(m4ulist); /* List all the M4U HWs */ #define for_each_m4u(data) list_for_each_entry(data, &m4ulist, list) @@ -409,7 +433,7 @@ pa = dom->iop->iova_to_phys(dom->iop, iova); spin_unlock_irqrestore(&dom->pgtlock, flags); - if (data->enable_4GB) + if (data->enable_4GB && pa < MTK_IOMMU_4GB_MODE_REMAP_BASE) pa |= BIT_ULL(32); return pa; diff -Nru linux-4.19.98/drivers/iommu/qcom_iommu.c linux-4.19.118/drivers/iommu/qcom_iommu.c --- linux-4.19.98/drivers/iommu/qcom_iommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/iommu/qcom_iommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -333,21 +333,19 @@ { struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain); - if (WARN_ON(qcom_domain->iommu)) /* forgot to detach? */ - return; - iommu_put_dma_cookie(domain); - /* NOTE: unmap can be called after client device is powered off, - * for example, with GPUs or anything involving dma-buf. So we - * cannot rely on the device_link. Make sure the IOMMU is on to - * avoid unclocked accesses in the TLB inv path: - */ - pm_runtime_get_sync(qcom_domain->iommu->dev); - - free_io_pgtable_ops(qcom_domain->pgtbl_ops); - - pm_runtime_put_sync(qcom_domain->iommu->dev); + if (qcom_domain->iommu) { + /* + * NOTE: unmap can be called after client device is powered + * off, for example, with GPUs or anything involving dma-buf. + * So we cannot rely on the device_link. Make sure the IOMMU + * is on to avoid unclocked accesses in the TLB inv path: + */ + pm_runtime_get_sync(qcom_domain->iommu->dev); + free_io_pgtable_ops(qcom_domain->pgtbl_ops); + pm_runtime_put_sync(qcom_domain->iommu->dev); + } kfree(qcom_domain); } @@ -392,7 +390,7 @@ struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain); unsigned i; - if (!qcom_domain->iommu) + if (WARN_ON(!qcom_domain->iommu)) return; pm_runtime_get_sync(qcom_iommu->dev); @@ -405,8 +403,6 @@ ctx->domain = NULL; } pm_runtime_put_sync(qcom_iommu->dev); - - qcom_domain->iommu = NULL; } static int qcom_iommu_map(struct iommu_domain *domain, unsigned long iova, diff -Nru linux-4.19.98/drivers/irqchip/irq-gic-v3-its.c linux-4.19.118/drivers/irqchip/irq-gic-v3-its.c --- linux-4.19.98/drivers/irqchip/irq-gic-v3-its.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/irqchip/irq-gic-v3-its.c 2020-04-23 08:30:24.000000000 +0000 @@ -208,7 +208,7 @@ static struct its_collection *valid_col(struct its_collection *col) { - if (WARN_ON_ONCE(col->target_address & GENMASK_ULL(0, 15))) + if (WARN_ON_ONCE(col->target_address & GENMASK_ULL(15, 0))) return NULL; return col; @@ -578,7 +578,7 @@ struct its_cmd_desc *desc) { its_encode_cmd(cmd, GITS_CMD_INVALL); - its_encode_collection(cmd, desc->its_mapc_cmd.col->col_id); + its_encode_collection(cmd, desc->its_invall_cmd.col->col_id); its_fixup_cmd(cmd); @@ -2858,12 +2858,18 @@ return 0; } +static int its_vpe_retrigger(struct irq_data *d) +{ + return !its_vpe_set_irqchip_state(d, IRQCHIP_STATE_PENDING, true); +} + static struct irq_chip its_vpe_irq_chip = { .name = "GICv4-vpe", .irq_mask = its_vpe_mask_irq, .irq_unmask = its_vpe_unmask_irq, .irq_eoi = irq_chip_eoi_parent, .irq_set_affinity = its_vpe_set_affinity, + .irq_retrigger = its_vpe_retrigger, .irq_set_irqchip_state = its_vpe_set_irqchip_state, .irq_set_vcpu_affinity = its_vpe_set_vcpu_affinity, }; diff -Nru linux-4.19.98/drivers/irqchip/irq-gic-v3.c linux-4.19.118/drivers/irqchip/irq-gic-v3.c --- linux-4.19.98/drivers/irqchip/irq-gic-v3.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/irqchip/irq-gic-v3.c 2020-04-23 08:30:24.000000000 +0000 @@ -1347,6 +1347,7 @@ struct redist_region *redist_regs; u32 nr_redist_regions; bool single_redist; + int enabled_rdists; u32 maint_irq; int maint_irq_mode; phys_addr_t vcpu_base; @@ -1441,8 +1442,10 @@ * If GICC is enabled and has valid gicr base address, then it means * GICR base is presented via GICC */ - if ((gicc->flags & ACPI_MADT_ENABLED) && gicc->gicr_base_address) + if ((gicc->flags & ACPI_MADT_ENABLED) && gicc->gicr_base_address) { + acpi_data.enabled_rdists++; return 0; + } /* * It's perfectly valid firmware can pass disabled GICC entry, driver @@ -1472,8 +1475,10 @@ count = acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT, gic_acpi_match_gicc, 0); - if (count > 0) + if (count > 0) { acpi_data.single_redist = true; + count = acpi_data.enabled_rdists; + } return count; } diff -Nru linux-4.19.98/drivers/irqchip/irq-mbigen.c linux-4.19.118/drivers/irqchip/irq-mbigen.c --- linux-4.19.98/drivers/irqchip/irq-mbigen.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/irqchip/irq-mbigen.c 2020-04-23 08:30:24.000000000 +0000 @@ -231,10 +231,16 @@ return 0; } +static void mbigen_irq_domain_free(struct irq_domain *domain, unsigned int virq, + unsigned int nr_irqs) +{ + platform_msi_domain_free(domain, virq, nr_irqs); +} + static const struct irq_domain_ops mbigen_domain_ops = { .translate = mbigen_domain_translate, .alloc = mbigen_irq_domain_alloc, - .free = irq_domain_free_irqs_common, + .free = mbigen_irq_domain_free, }; static int mbigen_of_create_domain(struct platform_device *pdev, @@ -381,6 +387,7 @@ .name = "Hisilicon MBIGEN-V2", .of_match_table = mbigen_of_match, .acpi_match_table = ACPI_PTR(mbigen_acpi_match), + .suppress_bind_attrs = true, }, .probe = mbigen_device_probe, }; diff -Nru linux-4.19.98/drivers/irqchip/irq-versatile-fpga.c linux-4.19.118/drivers/irqchip/irq-versatile-fpga.c --- linux-4.19.98/drivers/irqchip/irq-versatile-fpga.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/irqchip/irq-versatile-fpga.c 2020-04-23 08:30:24.000000000 +0000 @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -68,12 +69,16 @@ static void fpga_irq_handle(struct irq_desc *desc) { + struct irq_chip *chip = irq_desc_get_chip(desc); struct fpga_irq_data *f = irq_desc_get_handler_data(desc); - u32 status = readl(f->base + IRQ_STATUS); + u32 status; + + chained_irq_enter(chip, desc); + status = readl(f->base + IRQ_STATUS); if (status == 0) { do_bad_IRQ(desc); - return; + goto out; } do { @@ -82,6 +87,9 @@ status &= ~(1 << irq); generic_handle_irq(irq_find_mapping(f->domain, irq)); } while (status); + +out: + chained_irq_exit(chip, desc); } /* @@ -204,6 +212,9 @@ if (of_property_read_u32(node, "valid-mask", &valid_mask)) valid_mask = 0; + writel(clear_mask, base + IRQ_ENABLE_CLEAR); + writel(clear_mask, base + FIQ_ENABLE_CLEAR); + /* Some chips are cascaded from a parent IRQ */ parent_irq = irq_of_parse_and_map(node, 0); if (!parent_irq) { @@ -213,9 +224,6 @@ fpga_irq_init(base, node->name, 0, parent_irq, valid_mask, node); - writel(clear_mask, base + IRQ_ENABLE_CLEAR); - writel(clear_mask, base + FIQ_ENABLE_CLEAR); - /* * On Versatile AB/PB, some secondary interrupts have a direct * pass-thru to the primary controller for IRQs 20 and 22-31 which need diff -Nru linux-4.19.98/drivers/leds/led-triggers.c linux-4.19.118/drivers/leds/led-triggers.c --- linux-4.19.98/drivers/leds/led-triggers.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/leds/led-triggers.c 2020-04-23 08:30:24.000000000 +0000 @@ -171,11 +171,11 @@ trig->deactivate(led_cdev); err_activate: - led_cdev->trigger = NULL; - led_cdev->trigger_data = NULL; write_lock_irqsave(&led_cdev->trigger->leddev_list_lock, flags); list_del(&led_cdev->trig_list); write_unlock_irqrestore(&led_cdev->trigger->leddev_list_lock, flags); + led_cdev->trigger = NULL; + led_cdev->trigger_data = NULL; led_set_brightness(led_cdev, LED_OFF); kfree(event); diff -Nru linux-4.19.98/drivers/leds/leds-pca963x.c linux-4.19.118/drivers/leds/leds-pca963x.c --- linux-4.19.98/drivers/leds/leds-pca963x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/leds/leds-pca963x.c 2020-04-23 08:30:24.000000000 +0000 @@ -43,6 +43,8 @@ #define PCA963X_LED_PWM 0x2 /* Controlled through PWM */ #define PCA963X_LED_GRP_PWM 0x3 /* Controlled through PWM/GRPPWM */ +#define PCA963X_MODE2_OUTDRV 0x04 /* Open-drain or totem pole */ +#define PCA963X_MODE2_INVRT 0x10 /* Normal or inverted direction */ #define PCA963X_MODE2_DMBLNK 0x20 /* Enable blinking */ #define PCA963X_MODE1 0x00 @@ -462,12 +464,12 @@ PCA963X_MODE2); /* Configure output: open-drain or totem pole (push-pull) */ if (pdata->outdrv == PCA963X_OPEN_DRAIN) - mode2 |= 0x01; + mode2 &= ~PCA963X_MODE2_OUTDRV; else - mode2 |= 0x05; + mode2 |= PCA963X_MODE2_OUTDRV; /* Configure direction: normal or inverted */ if (pdata->dir == PCA963X_INVERTED) - mode2 |= 0x10; + mode2 |= PCA963X_MODE2_INVRT; i2c_smbus_write_byte_data(pca963x->chip->client, PCA963X_MODE2, mode2); } diff -Nru linux-4.19.98/drivers/lightnvm/pblk-rb.c linux-4.19.118/drivers/lightnvm/pblk-rb.c --- linux-4.19.98/drivers/lightnvm/pblk-rb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/lightnvm/pblk-rb.c 2020-04-23 08:30:24.000000000 +0000 @@ -784,8 +784,8 @@ } out: - spin_unlock(&rb->w_lock); spin_unlock_irq(&rb->s_lock); + spin_unlock(&rb->w_lock); return ret; } diff -Nru linux-4.19.98/drivers/macintosh/therm_windtunnel.c linux-4.19.118/drivers/macintosh/therm_windtunnel.c --- linux-4.19.98/drivers/macintosh/therm_windtunnel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/macintosh/therm_windtunnel.c 2020-04-23 08:30:24.000000000 +0000 @@ -300,9 +300,11 @@ /* i2c probing and setup */ /************************************************************************/ -static int -do_attach( struct i2c_adapter *adapter ) +static void do_attach(struct i2c_adapter *adapter) { + struct i2c_board_info info = { }; + struct device_node *np; + /* scan 0x48-0x4f (DS1775) and 0x2c-2x2f (ADM1030) */ static const unsigned short scan_ds1775[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, @@ -313,25 +315,24 @@ I2C_CLIENT_END }; - if( strncmp(adapter->name, "uni-n", 5) ) - return 0; - - if( !x.running ) { - struct i2c_board_info info; + if (x.running || strncmp(adapter->name, "uni-n", 5)) + return; - memset(&info, 0, sizeof(struct i2c_board_info)); - strlcpy(info.type, "therm_ds1775", I2C_NAME_SIZE); + np = of_find_compatible_node(adapter->dev.of_node, NULL, "MAC,ds1775"); + if (np) { + of_node_put(np); + } else { + strlcpy(info.type, "MAC,ds1775", I2C_NAME_SIZE); i2c_new_probed_device(adapter, &info, scan_ds1775, NULL); + } - strlcpy(info.type, "therm_adm1030", I2C_NAME_SIZE); + np = of_find_compatible_node(adapter->dev.of_node, NULL, "MAC,adm1030"); + if (np) { + of_node_put(np); + } else { + strlcpy(info.type, "MAC,adm1030", I2C_NAME_SIZE); i2c_new_probed_device(adapter, &info, scan_adm1030, NULL); - - if( x.thermostat && x.fan ) { - x.running = 1; - x.poll_task = kthread_run(control_loop, NULL, "g4fand"); - } } - return 0; } static int @@ -404,8 +405,8 @@ enum chip { ds1775, adm1030 }; static const struct i2c_device_id therm_windtunnel_id[] = { - { "therm_ds1775", ds1775 }, - { "therm_adm1030", adm1030 }, + { "MAC,ds1775", ds1775 }, + { "MAC,adm1030", adm1030 }, { } }; MODULE_DEVICE_TABLE(i2c, therm_windtunnel_id); @@ -414,6 +415,7 @@ do_probe(struct i2c_client *cl, const struct i2c_device_id *id) { struct i2c_adapter *adapter = cl->adapter; + int ret = 0; if( !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_WRITE_BYTE) ) @@ -421,11 +423,19 @@ switch (id->driver_data) { case adm1030: - return attach_fan( cl ); + ret = attach_fan(cl); + break; case ds1775: - return attach_thermostat(cl); + ret = attach_thermostat(cl); + break; } - return 0; + + if (!x.running && x.thermostat && x.fan) { + x.running = 1; + x.poll_task = kthread_run(control_loop, NULL, "g4fand"); + } + + return ret; } static struct i2c_driver g4fan_driver = { diff -Nru linux-4.19.98/drivers/macintosh/windfarm_ad7417_sensor.c linux-4.19.118/drivers/macintosh/windfarm_ad7417_sensor.c --- linux-4.19.98/drivers/macintosh/windfarm_ad7417_sensor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/macintosh/windfarm_ad7417_sensor.c 2020-04-23 08:30:24.000000000 +0000 @@ -313,9 +313,16 @@ }; MODULE_DEVICE_TABLE(i2c, wf_ad7417_id); +static const struct of_device_id wf_ad7417_of_id[] = { + { .compatible = "ad7417", }, + { } +}; +MODULE_DEVICE_TABLE(of, wf_ad7417_of_id); + static struct i2c_driver wf_ad7417_driver = { .driver = { .name = "wf_ad7417", + .of_match_table = wf_ad7417_of_id, }, .probe = wf_ad7417_probe, .remove = wf_ad7417_remove, diff -Nru linux-4.19.98/drivers/macintosh/windfarm_fcu_controls.c linux-4.19.118/drivers/macintosh/windfarm_fcu_controls.c --- linux-4.19.98/drivers/macintosh/windfarm_fcu_controls.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/macintosh/windfarm_fcu_controls.c 2020-04-23 08:30:24.000000000 +0000 @@ -583,9 +583,16 @@ }; MODULE_DEVICE_TABLE(i2c, wf_fcu_id); +static const struct of_device_id wf_fcu_of_id[] = { + { .compatible = "fcu", }, + { } +}; +MODULE_DEVICE_TABLE(of, wf_fcu_of_id); + static struct i2c_driver wf_fcu_driver = { .driver = { .name = "wf_fcu", + .of_match_table = wf_fcu_of_id, }, .probe = wf_fcu_probe, .remove = wf_fcu_remove, diff -Nru linux-4.19.98/drivers/macintosh/windfarm_lm75_sensor.c linux-4.19.118/drivers/macintosh/windfarm_lm75_sensor.c --- linux-4.19.98/drivers/macintosh/windfarm_lm75_sensor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/macintosh/windfarm_lm75_sensor.c 2020-04-23 08:30:24.000000000 +0000 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -92,9 +93,14 @@ const struct i2c_device_id *id) { struct wf_lm75_sensor *lm; - int rc, ds1775 = id->driver_data; + int rc, ds1775; const char *name, *loc; + if (id) + ds1775 = id->driver_data; + else + ds1775 = !!of_device_get_match_data(&client->dev); + DBG("wf_lm75: creating %s device at address 0x%02x\n", ds1775 ? "ds1775" : "lm75", client->addr); @@ -165,9 +171,17 @@ }; MODULE_DEVICE_TABLE(i2c, wf_lm75_id); +static const struct of_device_id wf_lm75_of_id[] = { + { .compatible = "lm75", .data = (void *)0}, + { .compatible = "ds1775", .data = (void *)1 }, + { } +}; +MODULE_DEVICE_TABLE(of, wf_lm75_of_id); + static struct i2c_driver wf_lm75_driver = { .driver = { .name = "wf_lm75", + .of_match_table = wf_lm75_of_id, }, .probe = wf_lm75_probe, .remove = wf_lm75_remove, diff -Nru linux-4.19.98/drivers/macintosh/windfarm_lm87_sensor.c linux-4.19.118/drivers/macintosh/windfarm_lm87_sensor.c --- linux-4.19.98/drivers/macintosh/windfarm_lm87_sensor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/macintosh/windfarm_lm87_sensor.c 2020-04-23 08:30:24.000000000 +0000 @@ -168,9 +168,16 @@ }; MODULE_DEVICE_TABLE(i2c, wf_lm87_id); +static const struct of_device_id wf_lm87_of_id[] = { + { .compatible = "lm87cimt", }, + { } +}; +MODULE_DEVICE_TABLE(of, wf_lm87_of_id); + static struct i2c_driver wf_lm87_driver = { .driver = { .name = "wf_lm87", + .of_match_table = wf_lm87_of_id, }, .probe = wf_lm87_probe, .remove = wf_lm87_remove, diff -Nru linux-4.19.98/drivers/macintosh/windfarm_max6690_sensor.c linux-4.19.118/drivers/macintosh/windfarm_max6690_sensor.c --- linux-4.19.98/drivers/macintosh/windfarm_max6690_sensor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/macintosh/windfarm_max6690_sensor.c 2020-04-23 08:30:24.000000000 +0000 @@ -121,9 +121,16 @@ }; MODULE_DEVICE_TABLE(i2c, wf_max6690_id); +static const struct of_device_id wf_max6690_of_id[] = { + { .compatible = "max6690", }, + { } +}; +MODULE_DEVICE_TABLE(of, wf_max6690_of_id); + static struct i2c_driver wf_max6690_driver = { .driver = { .name = "wf_max6690", + .of_match_table = wf_max6690_of_id, }, .probe = wf_max6690_probe, .remove = wf_max6690_remove, diff -Nru linux-4.19.98/drivers/macintosh/windfarm_smu_sat.c linux-4.19.118/drivers/macintosh/windfarm_smu_sat.c --- linux-4.19.98/drivers/macintosh/windfarm_smu_sat.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/macintosh/windfarm_smu_sat.c 2020-04-23 08:30:24.000000000 +0000 @@ -343,9 +343,16 @@ }; MODULE_DEVICE_TABLE(i2c, wf_sat_id); +static const struct of_device_id wf_sat_of_id[] = { + { .compatible = "smu-sat", }, + { } +}; +MODULE_DEVICE_TABLE(of, wf_sat_of_id); + static struct i2c_driver wf_sat_driver = { .driver = { .name = "wf_smu_sat", + .of_match_table = wf_sat_of_id, }, .probe = wf_sat_probe, .remove = wf_sat_remove, diff -Nru linux-4.19.98/drivers/mailbox/mtk-cmdq-mailbox.c linux-4.19.118/drivers/mailbox/mtk-cmdq-mailbox.c --- linux-4.19.98/drivers/mailbox/mtk-cmdq-mailbox.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mailbox/mtk-cmdq-mailbox.c 2020-04-23 08:30:24.000000000 +0000 @@ -363,6 +363,9 @@ WARN_ON(cmdq->suspended); task = kzalloc(sizeof(*task), GFP_ATOMIC); + if (!task) + return -ENOMEM; + task->cmdq = cmdq; INIT_LIST_HEAD(&task->list_entry); task->pa_base = pkt->pa_base; diff -Nru linux-4.19.98/drivers/mailbox/qcom-apcs-ipc-mailbox.c linux-4.19.118/drivers/mailbox/qcom-apcs-ipc-mailbox.c --- linux-4.19.98/drivers/mailbox/qcom-apcs-ipc-mailbox.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mailbox/qcom-apcs-ipc-mailbox.c 2020-04-23 08:30:24.000000000 +0000 @@ -36,7 +36,7 @@ .reg_bits = 32, .reg_stride = 4, .val_bits = 32, - .max_register = 0x1000, + .max_register = 0xFFC, .fast_io = true, }; diff -Nru linux-4.19.98/drivers/mailbox/ti-msgmgr.c linux-4.19.118/drivers/mailbox/ti-msgmgr.c --- linux-4.19.98/drivers/mailbox/ti-msgmgr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mailbox/ti-msgmgr.c 2020-04-23 08:30:24.000000000 +0000 @@ -547,7 +547,7 @@ } if (d->is_sproxy) { - if (req_pid > d->num_valid_queues) + if (req_pid >= d->num_valid_queues) goto err; qinst = &inst->qinsts[req_pid]; return qinst->chan; diff -Nru linux-4.19.98/drivers/md/bcache/bcache.h linux-4.19.118/drivers/md/bcache/bcache.h --- linux-4.19.98/drivers/md/bcache/bcache.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/bcache/bcache.h 2020-04-23 08:30:24.000000000 +0000 @@ -329,6 +329,9 @@ */ atomic_t has_dirty; +#define BCH_CACHE_READA_ALL 0 +#define BCH_CACHE_READA_META_ONLY 1 + unsigned int cache_readahead_policy; struct bch_ratelimit writeback_rate; struct delayed_work writeback_rate_update; diff -Nru linux-4.19.98/drivers/md/bcache/bset.h linux-4.19.118/drivers/md/bcache/bset.h --- linux-4.19.98/drivers/md/bcache/bset.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/bcache/bset.h 2020-04-23 08:30:24.000000000 +0000 @@ -397,7 +397,8 @@ /* Bkey utility code */ -#define bset_bkey_last(i) bkey_idx((struct bkey *) (i)->d, (i)->keys) +#define bset_bkey_last(i) bkey_idx((struct bkey *) (i)->d, \ + (unsigned int)(i)->keys) static inline struct bkey *bset_bkey_idx(struct bset *i, unsigned int idx) { diff -Nru linux-4.19.98/drivers/md/bcache/debug.c linux-4.19.118/drivers/md/bcache/debug.c --- linux-4.19.98/drivers/md/bcache/debug.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/bcache/debug.c 2020-04-23 08:30:24.000000000 +0000 @@ -178,10 +178,9 @@ while (size) { struct keybuf_key *w; unsigned int bytes = min(i->bytes, size); - int err = copy_to_user(buf, i->buf, bytes); - if (err) - return err; + if (copy_to_user(buf, i->buf, bytes)) + return -EFAULT; ret += bytes; buf += bytes; diff -Nru linux-4.19.98/drivers/md/bcache/request.c linux-4.19.118/drivers/md/bcache/request.c --- linux-4.19.98/drivers/md/bcache/request.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/bcache/request.c 2020-04-23 08:30:24.000000000 +0000 @@ -391,13 +391,20 @@ goto skip; /* - * Flag for bypass if the IO is for read-ahead or background, - * unless the read-ahead request is for metadata + * If the bio is for read-ahead or background IO, bypass it or + * not depends on the following situations, + * - If the IO is for meta data, always cache it and no bypass + * - If the IO is not meta data, check dc->cache_reada_policy, + * BCH_CACHE_READA_ALL: cache it and not bypass + * BCH_CACHE_READA_META_ONLY: not cache it and bypass + * That is, read-ahead request for metadata always get cached * (eg, for gfs2 or xfs). */ - if (bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND) && - !(bio->bi_opf & (REQ_META|REQ_PRIO))) - goto skip; + if ((bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND))) { + if (!(bio->bi_opf & (REQ_META|REQ_PRIO)) && + (dc->cache_readahead_policy != BCH_CACHE_READA_ALL)) + goto skip; + } if (bio->bi_iter.bi_sector & (c->sb.block_size - 1) || bio_sectors(bio) & (c->sb.block_size - 1)) { diff -Nru linux-4.19.98/drivers/md/bcache/super.c linux-4.19.118/drivers/md/bcache/super.c --- linux-4.19.98/drivers/md/bcache/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/bcache/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -1226,6 +1226,9 @@ mutex_unlock(&bch_register_lock); + if (dc->sb_bio.bi_inline_vecs[0].bv_page) + put_page(bio_first_page_all(&dc->sb_bio)); + if (!IS_ERR_OR_NULL(dc->bdev)) blkdev_put(dc->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); diff -Nru linux-4.19.98/drivers/md/bcache/sysfs.c linux-4.19.118/drivers/md/bcache/sysfs.c --- linux-4.19.98/drivers/md/bcache/sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/bcache/sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -25,6 +25,12 @@ NULL }; +static const char * const bch_reada_cache_policies[] = { + "all", + "meta-only", + NULL +}; + /* Default is -1; we skip past it for stop_when_cache_set_failed */ static const char * const bch_stop_on_failure_modes[] = { "auto", @@ -94,6 +100,7 @@ rw_attribute(sequential_cutoff); rw_attribute(data_csum); rw_attribute(cache_mode); +rw_attribute(readahead_cache_policy); rw_attribute(stop_when_cache_set_failed); rw_attribute(writeback_metadata); rw_attribute(writeback_running); @@ -160,6 +167,11 @@ bch_cache_modes, BDEV_CACHE_MODE(&dc->sb)); + if (attr == &sysfs_readahead_cache_policy) + return bch_snprint_string_list(buf, PAGE_SIZE, + bch_reada_cache_policies, + dc->cache_readahead_policy); + if (attr == &sysfs_stop_when_cache_set_failed) return bch_snprint_string_list(buf, PAGE_SIZE, bch_stop_on_failure_modes, @@ -324,6 +336,15 @@ } } + if (attr == &sysfs_readahead_cache_policy) { + v = __sysfs_match_string(bch_reada_cache_policies, -1, buf); + if (v < 0) + return v; + + if ((unsigned int) v != dc->cache_readahead_policy) + dc->cache_readahead_policy = v; + } + if (attr == &sysfs_stop_when_cache_set_failed) { v = __sysfs_match_string(bch_stop_on_failure_modes, -1, buf); if (v < 0) @@ -417,6 +438,7 @@ &sysfs_data_csum, #endif &sysfs_cache_mode, + &sysfs_readahead_cache_policy, &sysfs_stop_when_cache_set_failed, &sysfs_writeback_metadata, &sysfs_writeback_running, diff -Nru linux-4.19.98/drivers/md/dm-bio-record.h linux-4.19.118/drivers/md/dm-bio-record.h --- linux-4.19.98/drivers/md/dm-bio-record.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm-bio-record.h 2020-04-23 08:30:24.000000000 +0000 @@ -20,8 +20,13 @@ struct dm_bio_details { struct gendisk *bi_disk; u8 bi_partno; + int __bi_remaining; unsigned long bi_flags; struct bvec_iter bi_iter; + bio_end_io_t *bi_end_io; +#if defined(CONFIG_BLK_DEV_INTEGRITY) + struct bio_integrity_payload *bi_integrity; +#endif }; static inline void dm_bio_record(struct dm_bio_details *bd, struct bio *bio) @@ -30,6 +35,11 @@ bd->bi_partno = bio->bi_partno; bd->bi_flags = bio->bi_flags; bd->bi_iter = bio->bi_iter; + bd->__bi_remaining = atomic_read(&bio->__bi_remaining); + bd->bi_end_io = bio->bi_end_io; +#if defined(CONFIG_BLK_DEV_INTEGRITY) + bd->bi_integrity = bio_integrity(bio); +#endif } static inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio) @@ -38,6 +48,11 @@ bio->bi_partno = bd->bi_partno; bio->bi_flags = bd->bi_flags; bio->bi_iter = bd->bi_iter; + atomic_set(&bio->__bi_remaining, bd->__bi_remaining); + bio->bi_end_io = bd->bi_end_io; +#if defined(CONFIG_BLK_DEV_INTEGRITY) + bio->bi_integrity = bd->bi_integrity; +#endif } #endif diff -Nru linux-4.19.98/drivers/md/dm-cache-target.c linux-4.19.118/drivers/md/dm-cache-target.c --- linux-4.19.98/drivers/md/dm-cache-target.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm-cache-target.c 2020-04-23 08:30:24.000000000 +0000 @@ -2859,8 +2859,8 @@ prevent_background_work(cache); BUG_ON(atomic_read(&cache->nr_io_migrations)); - cancel_delayed_work(&cache->waker); - flush_workqueue(cache->wq); + cancel_delayed_work_sync(&cache->waker); + drain_workqueue(cache->wq); WARN_ON(cache->tracker.in_flight); /* diff -Nru linux-4.19.98/drivers/md/dm-crypt.c linux-4.19.118/drivers/md/dm-crypt.c --- linux-4.19.98/drivers/md/dm-crypt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm-crypt.c 2020-04-23 08:30:24.000000000 +0000 @@ -482,8 +482,14 @@ static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti, const char *opts) { - unsigned bs = crypto_skcipher_blocksize(any_tfm(cc)); - int log = ilog2(bs); + unsigned bs; + int log; + + if (test_bit(CRYPT_MODE_INTEGRITY_AEAD, &cc->cipher_flags)) + bs = crypto_aead_blocksize(any_tfm_aead(cc)); + else + bs = crypto_skcipher_blocksize(any_tfm(cc)); + log = ilog2(bs); /* we need to calculate how far we must shift the sector count * to get the cipher block count, we use this shift in _gen */ diff -Nru linux-4.19.98/drivers/md/dm-integrity.c linux-4.19.118/drivers/md/dm-integrity.c --- linux-4.19.98/drivers/md/dm-integrity.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm-integrity.c 2020-04-23 08:30:24.000000000 +0000 @@ -6,6 +6,8 @@ * This file is released under the GPL. */ +#include "dm-bio-record.h" + #include #include #include @@ -186,17 +188,19 @@ __u8 sectors_per_block; unsigned char mode; - int suspending; int failed; struct crypto_shash *internal_hash; + struct dm_target *ti; + /* these variables are locked with endio_wait.lock */ struct rb_root in_progress; struct list_head wait_list; wait_queue_head_t endio_wait; struct workqueue_struct *wait_wq; + struct workqueue_struct *offload_wq; unsigned char commit_seq; commit_id_t commit_ids[N_COMMIT_IDS]; @@ -274,11 +278,7 @@ struct completion *completion; - struct gendisk *orig_bi_disk; - u8 orig_bi_partno; - bio_end_io_t *orig_bi_end_io; - struct bio_integrity_payload *orig_bi_integrity; - struct bvec_iter orig_bi_iter; + struct dm_bio_details bio_details; }; struct journal_completion { @@ -1236,7 +1236,7 @@ dio->range.logical_sector += dio->range.n_sectors; bio_advance(bio, dio->range.n_sectors << SECTOR_SHIFT); INIT_WORK(&dio->work, integrity_bio_wait); - queue_work(ic->wait_wq, &dio->work); + queue_work(ic->offload_wq, &dio->work); return; } do_endio_flush(ic, dio); @@ -1247,14 +1247,9 @@ { struct dm_integrity_io *dio = dm_per_bio_data(bio, sizeof(struct dm_integrity_io)); - bio->bi_iter = dio->orig_bi_iter; - bio->bi_disk = dio->orig_bi_disk; - bio->bi_partno = dio->orig_bi_partno; - if (dio->orig_bi_integrity) { - bio->bi_integrity = dio->orig_bi_integrity; + dm_bio_restore(&dio->bio_details, bio); + if (bio->bi_integrity) bio->bi_opf |= REQ_INTEGRITY; - } - bio->bi_end_io = dio->orig_bi_end_io; if (dio->completion) complete(dio->completion); @@ -1334,7 +1329,7 @@ if (!checksums) checksums = checksums_onstack; - __bio_for_each_segment(bv, bio, iter, dio->orig_bi_iter) { + __bio_for_each_segment(bv, bio, iter, dio->bio_details.bi_iter) { unsigned pos; char *mem, *checksums_ptr; @@ -1378,7 +1373,7 @@ if (likely(checksums != checksums_onstack)) kfree(checksums); } else { - struct bio_integrity_payload *bip = dio->orig_bi_integrity; + struct bio_integrity_payload *bip = dio->bio_details.bi_integrity; if (bip) { struct bio_vec biv; @@ -1656,7 +1651,7 @@ if (need_sync_io && from_map) { INIT_WORK(&dio->work, integrity_bio_wait); - queue_work(ic->metadata_wq, &dio->work); + queue_work(ic->offload_wq, &dio->work); return; } @@ -1782,20 +1777,13 @@ } else dio->completion = NULL; - dio->orig_bi_iter = bio->bi_iter; - - dio->orig_bi_disk = bio->bi_disk; - dio->orig_bi_partno = bio->bi_partno; + dm_bio_record(&dio->bio_details, bio); bio_set_dev(bio, ic->dev->bdev); - - dio->orig_bi_integrity = bio_integrity(bio); bio->bi_integrity = NULL; bio->bi_opf &= ~REQ_INTEGRITY; - - dio->orig_bi_end_io = bio->bi_end_io; bio->bi_end_io = integrity_end_io; - bio->bi_iter.bi_size = dio->range.n_sectors << SECTOR_SHIFT; + generic_make_request(bio); if (need_sync_io) { @@ -2080,7 +2068,7 @@ unsigned prev_free_sectors; /* the following test is not needed, but it tests the replay code */ - if (READ_ONCE(ic->suspending) && !ic->meta_dev) + if (unlikely(dm_suspended(ic->ti)) && !ic->meta_dev) return; spin_lock_irq(&ic->endio_wait.lock); @@ -2139,7 +2127,7 @@ next_chunk: - if (unlikely(READ_ONCE(ic->suspending))) + if (unlikely(dm_suspended(ic->ti))) goto unlock_ret; range.logical_sector = le64_to_cpu(ic->sb->recalc_sector); @@ -2411,8 +2399,6 @@ del_timer_sync(&ic->autocommit_timer); - WRITE_ONCE(ic->suspending, 1); - if (ic->recalc_wq) drain_workqueue(ic->recalc_wq); @@ -2426,8 +2412,6 @@ dm_integrity_flush_buffers(ic); } - WRITE_ONCE(ic->suspending, 0); - BUG_ON(!RB_EMPTY_ROOT(&ic->in_progress)); ic->journal_uptodate = true; @@ -3116,6 +3100,7 @@ } ti->private = ic; ti->per_io_data_size = sizeof(struct dm_integrity_io); + ic->ti = ti; ic->in_progress = RB_ROOT; INIT_LIST_HEAD(&ic->wait_list); @@ -3310,6 +3295,14 @@ goto bad; } + ic->offload_wq = alloc_workqueue("dm-integrity-offload", WQ_MEM_RECLAIM, + METADATA_WORKQUEUE_MAX_ACTIVE); + if (!ic->offload_wq) { + ti->error = "Cannot allocate workqueue"; + r = -ENOMEM; + goto bad; + } + ic->commit_wq = alloc_workqueue("dm-integrity-commit", WQ_MEM_RECLAIM, 1); if (!ic->commit_wq) { ti->error = "Cannot allocate workqueue"; @@ -3546,6 +3539,8 @@ destroy_workqueue(ic->metadata_wq); if (ic->wait_wq) destroy_workqueue(ic->wait_wq); + if (ic->offload_wq) + destroy_workqueue(ic->offload_wq); if (ic->commit_wq) destroy_workqueue(ic->commit_wq); if (ic->writer_wq) diff -Nru linux-4.19.98/drivers/md/dm-verity-fec.c linux-4.19.118/drivers/md/dm-verity-fec.c --- linux-4.19.98/drivers/md/dm-verity-fec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm-verity-fec.c 2020-04-23 08:30:24.000000000 +0000 @@ -552,6 +552,7 @@ mempool_exit(&f->rs_pool); mempool_exit(&f->prealloc_pool); mempool_exit(&f->extra_pool); + mempool_exit(&f->output_pool); kmem_cache_destroy(f->cache); if (f->data_bufio) diff -Nru linux-4.19.98/drivers/md/dm-writecache.c linux-4.19.118/drivers/md/dm-writecache.c --- linux-4.19.98/drivers/md/dm-writecache.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm-writecache.c 2020-04-23 08:30:24.000000000 +0000 @@ -447,7 +447,13 @@ complete(&endio->c); } -static void ssd_commit_flushed(struct dm_writecache *wc) +static void writecache_wait_for_ios(struct dm_writecache *wc, int direction) +{ + wait_event(wc->bio_in_progress_wait[direction], + !atomic_read(&wc->bio_in_progress[direction])); +} + +static void ssd_commit_flushed(struct dm_writecache *wc, bool wait_for_ios) { struct dm_io_region region; struct dm_io_request req; @@ -493,17 +499,20 @@ writecache_notify_io(0, &endio); wait_for_completion_io(&endio.c); + if (wait_for_ios) + writecache_wait_for_ios(wc, WRITE); + writecache_disk_flush(wc, wc->ssd_dev); memset(wc->dirty_bitmap, 0, wc->dirty_bitmap_size); } -static void writecache_commit_flushed(struct dm_writecache *wc) +static void writecache_commit_flushed(struct dm_writecache *wc, bool wait_for_ios) { if (WC_MODE_PMEM(wc)) wmb(); else - ssd_commit_flushed(wc); + ssd_commit_flushed(wc, wait_for_ios); } static void writecache_disk_flush(struct dm_writecache *wc, struct dm_dev *dev) @@ -527,12 +536,6 @@ writecache_error(wc, r, "error flushing metadata: %d", r); } -static void writecache_wait_for_ios(struct dm_writecache *wc, int direction) -{ - wait_event(wc->bio_in_progress_wait[direction], - !atomic_read(&wc->bio_in_progress[direction])); -} - #define WFE_RETURN_FOLLOWING 1 #define WFE_LOWEST_SEQ 2 @@ -628,6 +631,12 @@ wc->freelist_size++; } +static inline void writecache_verify_watermark(struct dm_writecache *wc) +{ + if (unlikely(wc->freelist_size + wc->writeback_size <= wc->freelist_high_watermark)) + queue_work(wc->writeback_wq, &wc->writeback_work); +} + static struct wc_entry *writecache_pop_from_freelist(struct dm_writecache *wc) { struct wc_entry *e; @@ -649,8 +658,8 @@ list_del(&e->lru); } wc->freelist_size--; - if (unlikely(wc->freelist_size + wc->writeback_size <= wc->freelist_high_watermark)) - queue_work(wc->writeback_wq, &wc->writeback_work); + + writecache_verify_watermark(wc); return e; } @@ -730,14 +739,12 @@ e = e2; cond_resched(); } - writecache_commit_flushed(wc); - - writecache_wait_for_ios(wc, WRITE); + writecache_commit_flushed(wc, true); wc->seq_count++; pmem_assign(sb(wc)->seq_count, cpu_to_le64(wc->seq_count)); writecache_flush_region(wc, &sb(wc)->seq_count, sizeof sb(wc)->seq_count); - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); wc->overwrote_committed = false; @@ -761,7 +768,7 @@ } if (need_flush_after_free) - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); } static void writecache_flush_work(struct work_struct *work) @@ -814,7 +821,7 @@ } if (discarded_something) - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); } static bool writecache_wait_for_writeback(struct dm_writecache *wc) @@ -843,7 +850,7 @@ } wc_unlock(wc); - flush_workqueue(wc->writeback_wq); + drain_workqueue(wc->writeback_wq); wc_lock(wc); if (flush_on_suspend) @@ -871,6 +878,7 @@ struct wc_entry *e = &wc->entries[b]; e->index = b; e->write_in_progress = false; + cond_resched(); } return 0; @@ -925,6 +933,7 @@ e->original_sector = le64_to_cpu(wme.original_sector); e->seq_count = le64_to_cpu(wme.seq_count); } + cond_resched(); } #endif for (b = 0; b < wc->n_blocks; b++) { @@ -963,9 +972,11 @@ if (need_flush) { writecache_flush_all_metadata(wc); - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); } + writecache_verify_watermark(wc); + wc_unlock(wc); } @@ -1347,7 +1358,7 @@ wc->writeback_size--; n_walked++; if (unlikely(n_walked >= ENDIO_LATENCY)) { - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); wc_unlock(wc); wc_lock(wc); n_walked = 0; @@ -1428,7 +1439,7 @@ writecache_wait_for_ios(wc, READ); } - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); wc_unlock(wc); } @@ -1755,14 +1766,16 @@ pmem_assign(sb(wc)->n_blocks, cpu_to_le64(wc->n_blocks)); pmem_assign(sb(wc)->seq_count, cpu_to_le64(0)); - for (b = 0; b < wc->n_blocks; b++) + for (b = 0; b < wc->n_blocks; b++) { write_original_sector_seq_count(wc, &wc->entries[b], -1, -1); + cond_resched(); + } writecache_flush_all_metadata(wc); - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); pmem_assign(sb(wc)->magic, cpu_to_le32(MEMORY_SUPERBLOCK_MAGIC)); writecache_flush_region(wc, &sb(wc)->magic, sizeof sb(wc)->magic); - writecache_commit_flushed(wc); + writecache_commit_flushed(wc, false); return 0; } diff -Nru linux-4.19.98/drivers/md/dm-zoned-metadata.c linux-4.19.118/drivers/md/dm-zoned-metadata.c --- linux-4.19.98/drivers/md/dm-zoned-metadata.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm-zoned-metadata.c 2020-04-23 08:30:24.000000000 +0000 @@ -132,6 +132,7 @@ sector_t zone_bitmap_size; unsigned int zone_nr_bitmap_blocks; + unsigned int zone_bits_per_mblk; unsigned int nr_bitmap_blocks; unsigned int nr_map_blocks; @@ -1104,7 +1105,6 @@ if (blkz->type == BLK_ZONE_TYPE_CONVENTIONAL) { set_bit(DMZ_RND, &zone->flags); - zmd->nr_rnd_zones++; } else if (blkz->type == BLK_ZONE_TYPE_SEQWRITE_REQ || blkz->type == BLK_ZONE_TYPE_SEQWRITE_PREF) { set_bit(DMZ_SEQ, &zone->flags); @@ -1165,7 +1165,10 @@ /* Init */ zmd->zone_bitmap_size = dev->zone_nr_blocks >> 3; - zmd->zone_nr_bitmap_blocks = zmd->zone_bitmap_size >> DMZ_BLOCK_SHIFT; + zmd->zone_nr_bitmap_blocks = + max_t(sector_t, 1, zmd->zone_bitmap_size >> DMZ_BLOCK_SHIFT); + zmd->zone_bits_per_mblk = min_t(sector_t, dev->zone_nr_blocks, + DMZ_BLOCK_SIZE_BITS); /* Allocate zone array */ zmd->zones = kcalloc(dev->nr_zones, sizeof(struct dm_zone), GFP_KERNEL); @@ -1982,7 +1985,7 @@ dmz_release_mblock(zmd, to_mblk); dmz_release_mblock(zmd, from_mblk); - chunk_block += DMZ_BLOCK_SIZE_BITS; + chunk_block += zmd->zone_bits_per_mblk; } to_zone->weight = from_zone->weight; @@ -2043,7 +2046,7 @@ /* Set bits */ bit = chunk_block & DMZ_BLOCK_MASK_BITS; - nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); + nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); count = dmz_set_bits((unsigned long *)mblk->data, bit, nr_bits); if (count) { @@ -2122,7 +2125,7 @@ /* Clear bits */ bit = chunk_block & DMZ_BLOCK_MASK_BITS; - nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); + nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); count = dmz_clear_bits((unsigned long *)mblk->data, bit, nr_bits); @@ -2182,6 +2185,7 @@ { struct dmz_mblock *mblk; unsigned int bit, set_bit, nr_bits; + unsigned int zone_bits = zmd->zone_bits_per_mblk; unsigned long *bitmap; int n = 0; @@ -2196,15 +2200,15 @@ /* Get offset */ bitmap = (unsigned long *) mblk->data; bit = chunk_block & DMZ_BLOCK_MASK_BITS; - nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); + nr_bits = min(nr_blocks, zone_bits - bit); if (set) - set_bit = find_next_bit(bitmap, DMZ_BLOCK_SIZE_BITS, bit); + set_bit = find_next_bit(bitmap, zone_bits, bit); else - set_bit = find_next_zero_bit(bitmap, DMZ_BLOCK_SIZE_BITS, bit); + set_bit = find_next_zero_bit(bitmap, zone_bits, bit); dmz_release_mblock(zmd, mblk); n += set_bit - bit; - if (set_bit < DMZ_BLOCK_SIZE_BITS) + if (set_bit < zone_bits) break; nr_blocks -= nr_bits; @@ -2307,7 +2311,7 @@ /* Count bits in this block */ bitmap = mblk->data; bit = chunk_block & DMZ_BLOCK_MASK_BITS; - nr_bits = min(nr_blocks, DMZ_BLOCK_SIZE_BITS - bit); + nr_bits = min(nr_blocks, zmd->zone_bits_per_mblk - bit); n += dmz_count_bits(bitmap, bit, nr_bits); dmz_release_mblock(zmd, mblk); diff -Nru linux-4.19.98/drivers/md/dm.c linux-4.19.118/drivers/md/dm.c --- linux-4.19.98/drivers/md/dm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/dm.c 2020-04-23 08:30:24.000000000 +0000 @@ -1819,6 +1819,7 @@ /* * Initialize aspects of queue that aren't relevant for blk-mq */ + md->queue->backing_dev_info->congested_data = md; md->queue->backing_dev_info->congested_fn = dm_any_congested; } @@ -1913,7 +1914,12 @@ if (!md->queue) goto bad; md->queue->queuedata = md; - md->queue->backing_dev_info->congested_data = md; + /* + * default to bio-based required ->make_request_fn until DM + * table is loaded and md->type established. If request-based + * table is loaded: blk-mq will override accordingly. + */ + blk_queue_make_request(md->queue, dm_make_request); md->disk = alloc_disk_node(1, md->numa_node_id); if (!md->disk) @@ -2242,7 +2248,6 @@ case DM_TYPE_BIO_BASED: case DM_TYPE_DAX_BIO_BASED: dm_init_normal_md_queue(md); - blk_queue_make_request(md->queue, dm_make_request); break; case DM_TYPE_NVME_BIO_BASED: dm_init_normal_md_queue(md); @@ -2348,6 +2353,7 @@ map = dm_get_live_table(md, &srcu_idx); if (!dm_suspended_md(md)) { dm_table_presuspend_targets(map); + set_bit(DMF_SUSPENDED, &md->flags); dm_table_postsuspend_targets(map); } /* dm_put_live_table must be before msleep, otherwise deadlock is possible */ diff -Nru linux-4.19.98/drivers/md/md.c linux-4.19.118/drivers/md/md.c --- linux-4.19.98/drivers/md/md.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/md.c 2020-04-23 08:30:24.000000000 +0000 @@ -5874,7 +5874,7 @@ static void mddev_detach(struct mddev *mddev) { md_bitmap_wait_behind_writes(mddev); - if (mddev->pers && mddev->pers->quiesce) { + if (mddev->pers && mddev->pers->quiesce && !mddev->suspended) { mddev->pers->quiesce(mddev, 1); mddev->pers->quiesce(mddev, 0); } diff -Nru linux-4.19.98/drivers/md/persistent-data/dm-space-map-common.c linux-4.19.118/drivers/md/persistent-data/dm-space-map-common.c --- linux-4.19.98/drivers/md/persistent-data/dm-space-map-common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/persistent-data/dm-space-map-common.c 2020-04-23 08:30:24.000000000 +0000 @@ -382,6 +382,33 @@ return -ENOSPC; } +int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll, + dm_block_t begin, dm_block_t end, dm_block_t *b) +{ + int r; + uint32_t count; + + do { + r = sm_ll_find_free_block(new_ll, begin, new_ll->nr_blocks, b); + if (r) + break; + + /* double check this block wasn't used in the old transaction */ + if (*b >= old_ll->nr_blocks) + count = 0; + else { + r = sm_ll_lookup(old_ll, *b, &count); + if (r) + break; + + if (count) + begin = *b + 1; + } + } while (count); + + return r; +} + static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, int (*mutator)(void *context, uint32_t old, uint32_t *new), void *context, enum allocation_event *ev) diff -Nru linux-4.19.98/drivers/md/persistent-data/dm-space-map-common.h linux-4.19.118/drivers/md/persistent-data/dm-space-map-common.h --- linux-4.19.98/drivers/md/persistent-data/dm-space-map-common.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/persistent-data/dm-space-map-common.h 2020-04-23 08:30:24.000000000 +0000 @@ -109,6 +109,8 @@ int sm_ll_lookup(struct ll_disk *ll, dm_block_t b, uint32_t *result); int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, dm_block_t end, dm_block_t *result); +int sm_ll_find_common_free_block(struct ll_disk *old_ll, struct ll_disk *new_ll, + dm_block_t begin, dm_block_t end, dm_block_t *result); int sm_ll_insert(struct ll_disk *ll, dm_block_t b, uint32_t ref_count, enum allocation_event *ev); int sm_ll_inc(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); int sm_ll_dec(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev); diff -Nru linux-4.19.98/drivers/md/persistent-data/dm-space-map-disk.c linux-4.19.118/drivers/md/persistent-data/dm-space-map-disk.c --- linux-4.19.98/drivers/md/persistent-data/dm-space-map-disk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/persistent-data/dm-space-map-disk.c 2020-04-23 08:30:24.000000000 +0000 @@ -167,8 +167,10 @@ enum allocation_event ev; struct sm_disk *smd = container_of(sm, struct sm_disk, sm); - /* FIXME: we should loop round a couple of times */ - r = sm_ll_find_free_block(&smd->old_ll, smd->begin, smd->old_ll.nr_blocks, b); + /* + * Any block we allocate has to be free in both the old and current ll. + */ + r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, smd->begin, smd->ll.nr_blocks, b); if (r) return r; diff -Nru linux-4.19.98/drivers/md/persistent-data/dm-space-map-metadata.c linux-4.19.118/drivers/md/persistent-data/dm-space-map-metadata.c --- linux-4.19.98/drivers/md/persistent-data/dm-space-map-metadata.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/md/persistent-data/dm-space-map-metadata.c 2020-04-23 08:30:24.000000000 +0000 @@ -448,7 +448,10 @@ enum allocation_event ev; struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); - r = sm_ll_find_free_block(&smm->old_ll, smm->begin, smm->old_ll.nr_blocks, b); + /* + * Any block we allocate has to be free in both the old and current ll. + */ + r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, smm->begin, smm->ll.nr_blocks, b); if (r) return r; diff -Nru linux-4.19.98/drivers/media/i2c/adv748x/adv748x.h linux-4.19.118/drivers/media/i2c/adv748x/adv748x.h --- linux-4.19.98/drivers/media/i2c/adv748x/adv748x.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/i2c/adv748x/adv748x.h 2020-04-23 08:30:24.000000000 +0000 @@ -361,10 +361,10 @@ #define io_read(s, r) adv748x_read(s, ADV748X_PAGE_IO, r) #define io_write(s, r, v) adv748x_write(s, ADV748X_PAGE_IO, r, v) -#define io_clrset(s, r, m, v) io_write(s, r, (io_read(s, r) & ~m) | v) +#define io_clrset(s, r, m, v) io_write(s, r, (io_read(s, r) & ~(m)) | (v)) #define hdmi_read(s, r) adv748x_read(s, ADV748X_PAGE_HDMI, r) -#define hdmi_read16(s, r, m) (((hdmi_read(s, r) << 8) | hdmi_read(s, r+1)) & m) +#define hdmi_read16(s, r, m) (((hdmi_read(s, r) << 8) | hdmi_read(s, (r)+1)) & (m)) #define hdmi_write(s, r, v) adv748x_write(s, ADV748X_PAGE_HDMI, r, v) #define repeater_read(s, r) adv748x_read(s, ADV748X_PAGE_REPEATER, r) @@ -372,11 +372,11 @@ #define sdp_read(s, r) adv748x_read(s, ADV748X_PAGE_SDP, r) #define sdp_write(s, r, v) adv748x_write(s, ADV748X_PAGE_SDP, r, v) -#define sdp_clrset(s, r, m, v) sdp_write(s, r, (sdp_read(s, r) & ~m) | v) +#define sdp_clrset(s, r, m, v) sdp_write(s, r, (sdp_read(s, r) & ~(m)) | (v)) #define cp_read(s, r) adv748x_read(s, ADV748X_PAGE_CP, r) #define cp_write(s, r, v) adv748x_write(s, ADV748X_PAGE_CP, r, v) -#define cp_clrset(s, r, m, v) cp_write(s, r, (cp_read(s, r) & ~m) | v) +#define cp_clrset(s, r, m, v) cp_write(s, r, (cp_read(s, r) & ~(m)) | (v)) #define txa_read(s, r) adv748x_read(s, ADV748X_PAGE_TXA, r) #define txb_read(s, r) adv748x_read(s, ADV748X_PAGE_TXB, r) diff -Nru linux-4.19.98/drivers/media/i2c/mt9v032.c linux-4.19.118/drivers/media/i2c/mt9v032.c --- linux-4.19.98/drivers/media/i2c/mt9v032.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/i2c/mt9v032.c 2020-04-23 08:30:24.000000000 +0000 @@ -431,10 +431,12 @@ struct v4l2_subdev_pad_config *cfg, struct v4l2_subdev_mbus_code_enum *code) { + struct mt9v032 *mt9v032 = to_mt9v032(subdev); + if (code->index > 0) return -EINVAL; - code->code = MEDIA_BUS_FMT_SGRBG10_1X10; + code->code = mt9v032->format.code; return 0; } @@ -442,7 +444,11 @@ struct v4l2_subdev_pad_config *cfg, struct v4l2_subdev_frame_size_enum *fse) { - if (fse->index >= 3 || fse->code != MEDIA_BUS_FMT_SGRBG10_1X10) + struct mt9v032 *mt9v032 = to_mt9v032(subdev); + + if (fse->index >= 3) + return -EINVAL; + if (mt9v032->format.code != fse->code) return -EINVAL; fse->min_width = MT9V032_WINDOW_WIDTH_DEF / (1 << fse->index); diff -Nru linux-4.19.98/drivers/media/i2c/ov2659.c linux-4.19.118/drivers/media/i2c/ov2659.c --- linux-4.19.98/drivers/media/i2c/ov2659.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/i2c/ov2659.c 2020-04-23 08:30:24.000000000 +0000 @@ -1136,7 +1136,7 @@ mf = v4l2_subdev_get_try_format(sd, cfg, fmt->pad); *mf = fmt->format; #else - return -ENOTTY; + ret = -ENOTTY; #endif } else { s64 val; diff -Nru linux-4.19.98/drivers/media/i2c/ov5695.c linux-4.19.118/drivers/media/i2c/ov5695.c --- linux-4.19.98/drivers/media/i2c/ov5695.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/i2c/ov5695.c 2020-04-23 08:30:24.000000000 +0000 @@ -974,16 +974,9 @@ return ret; } -/* Calculate the delay in us by clock rate and clock cycles */ -static inline u32 ov5695_cal_delay(u32 cycles) -{ - return DIV_ROUND_UP(cycles, OV5695_XVCLK_FREQ / 1000 / 1000); -} - static int __ov5695_power_on(struct ov5695 *ov5695) { - int ret; - u32 delay_us; + int i, ret; struct device *dev = &ov5695->client->dev; ret = clk_prepare_enable(ov5695->xvclk); @@ -994,21 +987,28 @@ gpiod_set_value_cansleep(ov5695->reset_gpio, 1); - ret = regulator_bulk_enable(OV5695_NUM_SUPPLIES, ov5695->supplies); - if (ret < 0) { - dev_err(dev, "Failed to enable regulators\n"); - goto disable_clk; + /* + * The hardware requires the regulators to be powered on in order, + * so enable them one by one. + */ + for (i = 0; i < OV5695_NUM_SUPPLIES; i++) { + ret = regulator_enable(ov5695->supplies[i].consumer); + if (ret) { + dev_err(dev, "Failed to enable %s: %d\n", + ov5695->supplies[i].supply, ret); + goto disable_reg_clk; + } } gpiod_set_value_cansleep(ov5695->reset_gpio, 0); - /* 8192 cycles prior to first SCCB transaction */ - delay_us = ov5695_cal_delay(8192); - usleep_range(delay_us, delay_us * 2); + usleep_range(1000, 1200); return 0; -disable_clk: +disable_reg_clk: + for (--i; i >= 0; i--) + regulator_disable(ov5695->supplies[i].consumer); clk_disable_unprepare(ov5695->xvclk); return ret; @@ -1016,9 +1016,22 @@ static void __ov5695_power_off(struct ov5695 *ov5695) { + struct device *dev = &ov5695->client->dev; + int i, ret; + clk_disable_unprepare(ov5695->xvclk); gpiod_set_value_cansleep(ov5695->reset_gpio, 1); - regulator_bulk_disable(OV5695_NUM_SUPPLIES, ov5695->supplies); + + /* + * The hardware requires the regulators to be powered off in order, + * so disable them one by one. + */ + for (i = OV5695_NUM_SUPPLIES - 1; i >= 0; i--) { + ret = regulator_disable(ov5695->supplies[i].consumer); + if (ret) + dev_err(dev, "Failed to disable %s: %d\n", + ov5695->supplies[i].supply, ret); + } } static int __maybe_unused ov5695_runtime_resume(struct device *dev) @@ -1288,7 +1301,7 @@ if (clk_get_rate(ov5695->xvclk) != OV5695_XVCLK_FREQ) dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n"); - ov5695->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); + ov5695->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); if (IS_ERR(ov5695->reset_gpio)) { dev_err(dev, "Failed to get reset-gpios\n"); return -EINVAL; diff -Nru linux-4.19.98/drivers/media/i2c/tw9910.c linux-4.19.118/drivers/media/i2c/tw9910.c --- linux-4.19.98/drivers/media/i2c/tw9910.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/i2c/tw9910.c 2020-04-23 08:30:24.000000000 +0000 @@ -1000,7 +1000,7 @@ if (priv->pdn_gpio) gpiod_put(priv->pdn_gpio); clk_put(priv->clk); - v4l2_device_unregister_subdev(&priv->subdev); + v4l2_async_unregister_subdev(&priv->subdev); return 0; } diff -Nru linux-4.19.98/drivers/media/i2c/video-i2c.c linux-4.19.118/drivers/media/i2c/video-i2c.c --- linux-4.19.98/drivers/media/i2c/video-i2c.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/i2c/video-i2c.c 2020-04-23 08:30:24.000000000 +0000 @@ -105,7 +105,7 @@ return (ret == 2) ? 0 : -EIO; } -#if IS_ENABLED(CONFIG_HWMON) +#if IS_REACHABLE(CONFIG_HWMON) static const u32 amg88xx_temp_config[] = { HWMON_T_INPUT, diff -Nru linux-4.19.98/drivers/media/pci/cx18/cx18-fileops.c linux-4.19.118/drivers/media/pci/cx18/cx18-fileops.c --- linux-4.19.98/drivers/media/pci/cx18/cx18-fileops.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/cx18/cx18-fileops.c 2020-04-23 08:30:24.000000000 +0000 @@ -484,7 +484,7 @@ CX18_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); if (rc > 0) - pos += rc; + *pos += rc; return rc; } diff -Nru linux-4.19.98/drivers/media/pci/cx23885/cx23885-cards.c linux-4.19.118/drivers/media/pci/cx23885/cx23885-cards.c --- linux-4.19.98/drivers/media/pci/cx23885/cx23885-cards.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/cx23885/cx23885-cards.c 2020-04-23 08:30:24.000000000 +0000 @@ -811,6 +811,25 @@ .name = "Hauppauge WinTV-Starburst2", .portb = CX23885_MPEG_DVB, }, + [CX23885_BOARD_AVERMEDIA_CE310B] = { + .name = "AVerMedia CE310B", + .porta = CX23885_ANALOG_VIDEO, + .force_bff = 1, + .input = {{ + .type = CX23885_VMUX_COMPOSITE1, + .vmux = CX25840_VIN1_CH1 | + CX25840_NONE_CH2 | + CX25840_NONE0_CH3, + .amux = CX25840_AUDIO7, + }, { + .type = CX23885_VMUX_SVIDEO, + .vmux = CX25840_VIN8_CH1 | + CX25840_NONE_CH2 | + CX25840_VIN7_CH3 | + CX25840_SVIDEO_ON, + .amux = CX25840_AUDIO7, + } }, + }, }; const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards); @@ -1134,6 +1153,10 @@ .subvendor = 0x0070, .subdevice = 0xf02a, .card = CX23885_BOARD_HAUPPAUGE_STARBURST2, + }, { + .subvendor = 0x1461, + .subdevice = 0x3100, + .card = CX23885_BOARD_AVERMEDIA_CE310B, }, }; const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids); @@ -2358,6 +2381,7 @@ case CX23885_BOARD_DVBSKY_T982: case CX23885_BOARD_VIEWCAST_260E: case CX23885_BOARD_VIEWCAST_460E: + case CX23885_BOARD_AVERMEDIA_CE310B: dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_bus[2].i2c_adap, "cx25840", 0x88 >> 1, NULL); diff -Nru linux-4.19.98/drivers/media/pci/cx23885/cx23885-dvb.c linux-4.19.118/drivers/media/pci/cx23885/cx23885-dvb.c --- linux-4.19.98/drivers/media/pci/cx23885/cx23885-dvb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/cx23885/cx23885-dvb.c 2020-04-23 08:30:24.000000000 +0000 @@ -1474,8 +1474,9 @@ if (fe0->dvb.frontend != NULL) { struct i2c_adapter *tun_i2c; - fe0->dvb.frontend->sec_priv = kmalloc(sizeof(dib7000p_ops), GFP_KERNEL); - memcpy(fe0->dvb.frontend->sec_priv, &dib7000p_ops, sizeof(dib7000p_ops)); + fe0->dvb.frontend->sec_priv = kmemdup(&dib7000p_ops, sizeof(dib7000p_ops), GFP_KERNEL); + if (!fe0->dvb.frontend->sec_priv) + return -ENOMEM; tun_i2c = dib7000p_ops.get_i2c_master(fe0->dvb.frontend, DIBX000_I2C_INTERFACE_TUNER, 1); if (!dvb_attach(dib0070_attach, fe0->dvb.frontend, tun_i2c, &dib7070p_dib0070_config)) return -ENODEV; diff -Nru linux-4.19.98/drivers/media/pci/cx23885/cx23885-video.c linux-4.19.118/drivers/media/pci/cx23885/cx23885-video.c --- linux-4.19.98/drivers/media/pci/cx23885/cx23885-video.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/cx23885/cx23885-video.c 2020-04-23 08:30:24.000000000 +0000 @@ -268,7 +268,8 @@ (dev->board == CX23885_BOARD_MYGICA_X8507) || (dev->board == CX23885_BOARD_AVERMEDIA_HC81R) || (dev->board == CX23885_BOARD_VIEWCAST_260E) || - (dev->board == CX23885_BOARD_VIEWCAST_460E)) { + (dev->board == CX23885_BOARD_VIEWCAST_460E) || + (dev->board == CX23885_BOARD_AVERMEDIA_CE310B)) { /* Configure audio routing */ v4l2_subdev_call(dev->sd_cx25840, audio, s_routing, INPUT(input)->amux, 0, 0); diff -Nru linux-4.19.98/drivers/media/pci/cx23885/cx23885.h linux-4.19.118/drivers/media/pci/cx23885/cx23885.h --- linux-4.19.98/drivers/media/pci/cx23885/cx23885.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/cx23885/cx23885.h 2020-04-23 08:30:24.000000000 +0000 @@ -111,6 +111,7 @@ #define CX23885_BOARD_HAUPPAUGE_STARBURST2 59 #define CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885 60 #define CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885 61 +#define CX23885_BOARD_AVERMEDIA_CE310B 62 #define GPIO_0 0x00000001 #define GPIO_1 0x00000002 diff -Nru linux-4.19.98/drivers/media/pci/ivtv/ivtv-fileops.c linux-4.19.118/drivers/media/pci/ivtv/ivtv-fileops.c --- linux-4.19.98/drivers/media/pci/ivtv/ivtv-fileops.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/ivtv/ivtv-fileops.c 2020-04-23 08:30:24.000000000 +0000 @@ -420,7 +420,7 @@ IVTV_DEBUG_HI_FILE("read %zd from %s, got %zd\n", count, s->name, rc); if (rc > 0) - pos += rc; + *pos += rc; return rc; } diff -Nru linux-4.19.98/drivers/media/pci/pt1/pt1.c linux-4.19.118/drivers/media/pci/pt1/pt1.c --- linux-4.19.98/drivers/media/pci/pt1/pt1.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/pt1/pt1.c 2020-04-23 08:30:24.000000000 +0000 @@ -200,16 +200,10 @@ static int config_demod(struct i2c_client *cl, enum pt1_fe_clk clk) { int ret; - u8 buf[2] = {0x01, 0x80}; bool is_sat; const u8 (*cfg_data)[2]; int i, len; - ret = i2c_master_send(cl, buf, 2); - if (ret < 0) - return ret; - usleep_range(30000, 50000); - is_sat = !strncmp(cl->name, TC90522_I2C_DEV_SAT, strlen(TC90522_I2C_DEV_SAT)); if (is_sat) { @@ -260,6 +254,46 @@ return 0; } +/* + * Init registers for (each pair of) terrestrial/satellite block in demod. + * Note that resetting terr. block also resets its peer sat. block as well. + * This function must be called before configuring any demod block + * (before pt1_wakeup(), fe->ops.init()). + */ +static int pt1_demod_block_init(struct pt1 *pt1) +{ + struct i2c_client *cl; + u8 buf[2] = {0x01, 0x80}; + int ret; + int i; + + /* reset all terr. & sat. pairs first */ + for (i = 0; i < PT1_NR_ADAPS; i++) { + cl = pt1->adaps[i]->demod_i2c_client; + if (strncmp(cl->name, TC90522_I2C_DEV_TER, + strlen(TC90522_I2C_DEV_TER))) + continue; + + ret = i2c_master_send(cl, buf, 2); + if (ret < 0) + return ret; + usleep_range(30000, 50000); + } + + for (i = 0; i < PT1_NR_ADAPS; i++) { + cl = pt1->adaps[i]->demod_i2c_client; + if (strncmp(cl->name, TC90522_I2C_DEV_SAT, + strlen(TC90522_I2C_DEV_SAT))) + continue; + + ret = i2c_master_send(cl, buf, 2); + if (ret < 0) + return ret; + usleep_range(30000, 50000); + } + return 0; +} + static void pt1_write_reg(struct pt1 *pt1, int reg, u32 data) { writel(data, pt1->regs + reg * 4); @@ -987,6 +1021,10 @@ goto tuner_release; } + ret = pt1_demod_block_init(pt1); + if (ret < 0) + goto fe_unregister; + return 0; tuner_release: @@ -1245,6 +1283,10 @@ pt1_update_power(pt1); usleep_range(1000, 2000); + ret = pt1_demod_block_init(pt1); + if (ret < 0) + goto resume_err; + for (i = 0; i < PT1_NR_ADAPS; i++) dvb_frontend_reinitialise(pt1->adaps[i]->fe); diff -Nru linux-4.19.98/drivers/media/pci/tw5864/tw5864-video.c linux-4.19.118/drivers/media/pci/tw5864/tw5864-video.c --- linux-4.19.98/drivers/media/pci/tw5864/tw5864-video.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/pci/tw5864/tw5864-video.c 2020-04-23 08:30:24.000000000 +0000 @@ -1395,13 +1395,13 @@ input->vb = NULL; spin_unlock_irqrestore(&input->slock, flags); - v4l2_buf = to_vb2_v4l2_buffer(&vb->vb.vb2_buf); - if (!vb) { /* Gone because of disabling */ dev_dbg(&dev->pci->dev, "vb is empty, dropping frame\n"); return; } + v4l2_buf = to_vb2_v4l2_buffer(&vb->vb.vb2_buf); + /* * Check for space. * Mind the overhead of startcode emulation prevention. diff -Nru linux-4.19.98/drivers/media/platform/atmel/atmel-isi.c linux-4.19.118/drivers/media/platform/atmel/atmel-isi.c --- linux-4.19.98/drivers/media/platform/atmel/atmel-isi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/atmel/atmel-isi.c 2020-04-23 08:30:24.000000000 +0000 @@ -496,7 +496,7 @@ spin_unlock_irq(&isi->irqlock); if (!isi->enable_preview_path) { - timeout = jiffies + FRAME_INTERVAL_MILLI_SEC * HZ; + timeout = jiffies + (FRAME_INTERVAL_MILLI_SEC * HZ) / 1000; /* Wait until the end of the current frame. */ while ((isi_readl(isi, ISI_STATUS) & ISI_CTRL_CDC) && time_before(jiffies, timeout)) diff -Nru linux-4.19.98/drivers/media/platform/davinci/isif.c linux-4.19.118/drivers/media/platform/davinci/isif.c --- linux-4.19.98/drivers/media/platform/davinci/isif.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/davinci/isif.c 2020-04-23 08:30:24.000000000 +0000 @@ -884,9 +884,7 @@ static int isif_config_ycbcr(void) { struct isif_ycbcr_config *params = &isif_cfg.ycbcr; - struct vpss_pg_frame_size frame_size; u32 modeset = 0, ccdcfg = 0; - struct vpss_sync_pol sync; dev_dbg(isif_cfg.dev, "\nStarting isif_config_ycbcr..."); @@ -974,13 +972,6 @@ /* two fields are interleaved in memory */ regw(0x00000249, SDOFST); - /* Setup test pattern if enabled */ - if (isif_cfg.bayer.config_params.test_pat_gen) { - sync.ccdpg_hdpol = params->hd_pol; - sync.ccdpg_vdpol = params->vd_pol; - dm365_vpss_set_sync_pol(sync); - dm365_vpss_set_pg_frame_size(frame_size); - } return 0; } diff -Nru linux-4.19.98/drivers/media/platform/davinci/vpbe.c linux-4.19.118/drivers/media/platform/davinci/vpbe.c --- linux-4.19.98/drivers/media/platform/davinci/vpbe.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/davinci/vpbe.c 2020-04-23 08:30:24.000000000 +0000 @@ -126,7 +126,7 @@ struct v4l2_output *output) { struct vpbe_config *cfg = vpbe_dev->cfg; - int temp_index = output->index; + unsigned int temp_index = output->index; if (temp_index >= cfg->num_outputs) return -EINVAL; diff -Nru linux-4.19.98/drivers/media/platform/omap/omap_vout.c linux-4.19.118/drivers/media/platform/omap/omap_vout.c --- linux-4.19.98/drivers/media/platform/omap/omap_vout.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/omap/omap_vout.c 2020-04-23 08:30:24.000000000 +0000 @@ -1527,23 +1527,20 @@ unsigned long size; struct videobuf_buffer *vb; - vb = q->bufs[b->index]; - if (!vout->streaming) return -EINVAL; - if (file->f_flags & O_NONBLOCK) - /* Call videobuf_dqbuf for non blocking mode */ - ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 1); - else - /* Call videobuf_dqbuf for blocking mode */ - ret = videobuf_dqbuf(q, (struct v4l2_buffer *)b, 0); + ret = videobuf_dqbuf(q, b, !!(file->f_flags & O_NONBLOCK)); + if (ret) + return ret; + + vb = q->bufs[b->index]; addr = (unsigned long) vout->buf_phy_addr[vb->i]; size = (unsigned long) vb->size; dma_unmap_single(vout->vid_dev->v4l2_dev.dev, addr, size, DMA_TO_DEVICE); - return ret; + return 0; } static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i) diff -Nru linux-4.19.98/drivers/media/platform/qcom/venus/hfi_parser.c linux-4.19.118/drivers/media/platform/qcom/venus/hfi_parser.c --- linux-4.19.98/drivers/media/platform/qcom/venus/hfi_parser.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/qcom/venus/hfi_parser.c 2020-04-23 08:30:24.000000000 +0000 @@ -181,6 +181,7 @@ if (IS_V1(core)) { core->dec_codecs &= ~HFI_VIDEO_CODEC_HEVC; core->dec_codecs &= ~HFI_VIDEO_CODEC_SPARK; + core->enc_codecs &= ~HFI_VIDEO_CODEC_HEVC; } } diff -Nru linux-4.19.98/drivers/media/platform/rcar-vin/rcar-core.c linux-4.19.118/drivers/media/platform/rcar-vin/rcar-core.c --- linux-4.19.98/drivers/media/platform/rcar-vin/rcar-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/rcar-vin/rcar-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -631,7 +631,7 @@ ret = v4l2_async_notifier_register(&vin->v4l2_dev, &vin->notifier); if (ret < 0) { vin_err(vin, "Notifier registration failed\n"); - v4l2_async_notifier_cleanup(&vin->group->notifier); + v4l2_async_notifier_cleanup(&vin->notifier); return ret; } diff -Nru linux-4.19.98/drivers/media/platform/s5p-jpeg/jpeg-core.c linux-4.19.118/drivers/media/platform/s5p-jpeg/jpeg-core.c --- linux-4.19.98/drivers/media/platform/s5p-jpeg/jpeg-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/s5p-jpeg/jpeg-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -2005,7 +2005,7 @@ v4l2_ctrl_new_std(&ctx->ctrl_handler, &s5p_jpeg_ctrl_ops, V4L2_CID_JPEG_RESTART_INTERVAL, - 0, 3, 0xffff, 0); + 0, 0xffff, 1, 0); if (ctx->jpeg->variant->version == SJPEG_S5P) mask = ~0x06; /* 422, 420 */ } diff -Nru linux-4.19.98/drivers/media/platform/sti/bdisp/bdisp-hw.c linux-4.19.118/drivers/media/platform/sti/bdisp/bdisp-hw.c --- linux-4.19.98/drivers/media/platform/sti/bdisp/bdisp-hw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/sti/bdisp/bdisp-hw.c 2020-04-23 08:30:24.000000000 +0000 @@ -14,8 +14,8 @@ #define MAX_SRC_WIDTH 2048 /* Reset & boot poll config */ -#define POLL_RST_MAX 50 -#define POLL_RST_DELAY_MS 20 +#define POLL_RST_MAX 500 +#define POLL_RST_DELAY_MS 2 enum bdisp_target_plan { BDISP_RGB, @@ -382,7 +382,7 @@ for (i = 0; i < POLL_RST_MAX; i++) { if (readl(bdisp->regs + BLT_STA1) & BLT_STA1_IDLE) break; - msleep(POLL_RST_DELAY_MS); + udelay(POLL_RST_DELAY_MS * 1000); } if (i == POLL_RST_MAX) dev_err(bdisp->dev, "Reset timeout\n"); diff -Nru linux-4.19.98/drivers/media/platform/ti-vpe/cal.c linux-4.19.118/drivers/media/platform/ti-vpe/cal.c --- linux-4.19.98/drivers/media/platform/ti-vpe/cal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/ti-vpe/cal.c 2020-04-23 08:30:24.000000000 +0000 @@ -541,16 +541,16 @@ static void disable_irqs(struct cal_ctx *ctx) { + u32 val; + /* Disable IRQ_WDMA_END 0/1 */ - reg_write_field(ctx->dev, - CAL_HL_IRQENABLE_CLR(2), - CAL_HL_IRQ_CLEAR, - CAL_HL_IRQ_MASK(ctx->csi2_port)); + val = 0; + set_field(&val, CAL_HL_IRQ_CLEAR, CAL_HL_IRQ_MASK(ctx->csi2_port)); + reg_write(ctx->dev, CAL_HL_IRQENABLE_CLR(2), val); /* Disable IRQ_WDMA_START 0/1 */ - reg_write_field(ctx->dev, - CAL_HL_IRQENABLE_CLR(3), - CAL_HL_IRQ_CLEAR, - CAL_HL_IRQ_MASK(ctx->csi2_port)); + val = 0; + set_field(&val, CAL_HL_IRQ_CLEAR, CAL_HL_IRQ_MASK(ctx->csi2_port)); + reg_write(ctx->dev, CAL_HL_IRQENABLE_CLR(3), val); /* Todo: Add VC_IRQ and CSI2_COMPLEXIO_IRQ handling */ reg_write(ctx->dev, CAL_CSI2_VC_IRQENABLE(1), 0); } diff -Nru linux-4.19.98/drivers/media/platform/vivid/vivid-osd.c linux-4.19.118/drivers/media/platform/vivid/vivid-osd.c --- linux-4.19.98/drivers/media/platform/vivid/vivid-osd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/platform/vivid/vivid-osd.c 2020-04-23 08:30:24.000000000 +0000 @@ -155,7 +155,7 @@ var->nonstd = 0; var->vmode &= ~FB_VMODE_MASK; - var->vmode = FB_VMODE_NONINTERLACED; + var->vmode |= FB_VMODE_NONINTERLACED; /* Dummy values */ var->hsync_len = 24; diff -Nru linux-4.19.98/drivers/media/radio/si470x/radio-si470x-i2c.c linux-4.19.118/drivers/media/radio/si470x/radio-si470x-i2c.c --- linux-4.19.98/drivers/media/radio/si470x/radio-si470x-i2c.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/radio/si470x/radio-si470x-i2c.c 2020-04-23 08:30:24.000000000 +0000 @@ -483,10 +483,10 @@ free_irq(client->irq, radio); video_unregister_device(&radio->videodev); - kfree(radio); v4l2_ctrl_handler_free(&radio->hdl); v4l2_device_unregister(&radio->v4l2_dev); + kfree(radio); return 0; } diff -Nru linux-4.19.98/drivers/media/radio/wl128x/fmdrv_common.c linux-4.19.118/drivers/media/radio/wl128x/fmdrv_common.c --- linux-4.19.98/drivers/media/radio/wl128x/fmdrv_common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/radio/wl128x/fmdrv_common.c 2020-04-23 08:30:24.000000000 +0000 @@ -1271,8 +1271,9 @@ switch (action->type) { case ACTION_SEND_COMMAND: /* Send */ - if (fmc_send_cmd(fmdev, 0, 0, action->data, - action->size, NULL, NULL)) + ret = fmc_send_cmd(fmdev, 0, 0, action->data, + action->size, NULL, NULL); + if (ret) goto rel_fw; cmd_cnt++; diff -Nru linux-4.19.98/drivers/media/rc/iguanair.c linux-4.19.118/drivers/media/rc/iguanair.c --- linux-4.19.98/drivers/media/rc/iguanair.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/rc/iguanair.c 2020-04-23 08:30:24.000000000 +0000 @@ -424,7 +424,7 @@ int ret, pipein, pipeout; struct usb_host_interface *idesc; - idesc = intf->altsetting; + idesc = intf->cur_altsetting; if (idesc->desc.bNumEndpoints < 2) return -ENODEV; diff -Nru linux-4.19.98/drivers/media/rc/lirc_dev.c linux-4.19.118/drivers/media/rc/lirc_dev.c --- linux-4.19.98/drivers/media/rc/lirc_dev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/rc/lirc_dev.c 2020-04-23 08:30:24.000000000 +0000 @@ -29,7 +29,7 @@ #include "rc-core-priv.h" #include -#define LIRCBUF_SIZE 256 +#define LIRCBUF_SIZE 1024 static dev_t lirc_base_dev; diff -Nru linux-4.19.98/drivers/media/rc/rc-main.c linux-4.19.118/drivers/media/rc/rc-main.c --- linux-4.19.98/drivers/media/rc/rc-main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/rc/rc-main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1874,23 +1874,28 @@ dev->registered = true; - if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { - rc = rc_setup_rx_device(dev); - if (rc) - goto out_dev; - } - - /* Ensure that the lirc kfifo is setup before we start the thread */ + /* + * once the the input device is registered in rc_setup_rx_device, + * userspace can open the input device and rc_open() will be called + * as a result. This results in driver code being allowed to submit + * keycodes with rc_keydown, so lirc must be registered first. + */ if (dev->allowed_protocols != RC_PROTO_BIT_CEC) { rc = ir_lirc_register(dev); if (rc < 0) - goto out_rx; + goto out_dev; + } + + if (dev->driver_type != RC_DRIVER_IR_RAW_TX) { + rc = rc_setup_rx_device(dev); + if (rc) + goto out_lirc; } if (dev->driver_type == RC_DRIVER_IR_RAW) { rc = ir_raw_event_register(dev); if (rc < 0) - goto out_lirc; + goto out_rx; } dev_dbg(&dev->dev, "Registered rc%u (driver: %s)\n", dev->minor, @@ -1898,11 +1903,11 @@ return 0; +out_rx: + rc_free_rx_device(dev); out_lirc: if (dev->allowed_protocols != RC_PROTO_BIT_CEC) ir_lirc_unregister(dev); -out_rx: - rc_free_rx_device(dev); out_dev: device_del(&dev->dev); out_rx_free: diff -Nru linux-4.19.98/drivers/media/usb/b2c2/flexcop-usb.c linux-4.19.118/drivers/media/usb/b2c2/flexcop-usb.c --- linux-4.19.98/drivers/media/usb/b2c2/flexcop-usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/b2c2/flexcop-usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -510,6 +510,9 @@ return ret; } + if (fc_usb->uintf->cur_altsetting->desc.bNumEndpoints < 1) + return -ENODEV; + switch (fc_usb->udev->speed) { case USB_SPEED_LOW: err("cannot handle USB speed because it is too slow."); @@ -543,9 +546,6 @@ struct flexcop_device *fc = NULL; int ret; - if (intf->cur_altsetting->desc.bNumEndpoints < 1) - return -ENODEV; - if ((fc = flexcop_device_kmalloc(sizeof(struct flexcop_usb))) == NULL) { err("out of memory\n"); return -ENOMEM; diff -Nru linux-4.19.98/drivers/media/usb/dvb-usb/af9005.c linux-4.19.118/drivers/media/usb/dvb-usb/af9005.c --- linux-4.19.98/drivers/media/usb/dvb-usb/af9005.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/dvb-usb/af9005.c 2020-04-23 08:30:24.000000000 +0000 @@ -563,7 +563,7 @@ u8 *buf, int size) { u16 checksum; - int act_len, i, ret; + int act_len = 0, i, ret; memset(buf, 0, size); buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff); diff -Nru linux-4.19.98/drivers/media/usb/dvb-usb/dib0700_core.c linux-4.19.118/drivers/media/usb/dvb-usb/dib0700_core.c --- linux-4.19.98/drivers/media/usb/dvb-usb/dib0700_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/dvb-usb/dib0700_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -821,7 +821,7 @@ /* Starting in firmware 1.20, the RC info is provided on a bulk pipe */ - if (intf->altsetting[0].desc.bNumEndpoints < rc_ep + 1) + if (intf->cur_altsetting->desc.bNumEndpoints < rc_ep + 1) return -ENODEV; purb = usb_alloc_urb(0, GFP_KERNEL); @@ -841,7 +841,7 @@ * Some devices like the Hauppauge NovaTD model 52009 use an interrupt * endpoint, while others use a bulk one. */ - e = &intf->altsetting[0].endpoint[rc_ep].desc; + e = &intf->cur_altsetting->endpoint[rc_ep].desc; if (usb_endpoint_dir_in(e)) { if (usb_endpoint_xfer_bulk(e)) { pipe = usb_rcvbulkpipe(d->udev, rc_ep); diff -Nru linux-4.19.98/drivers/media/usb/dvb-usb/digitv.c linux-4.19.118/drivers/media/usb/dvb-usb/digitv.c --- linux-4.19.98/drivers/media/usb/dvb-usb/digitv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/dvb-usb/digitv.c 2020-04-23 08:30:24.000000000 +0000 @@ -233,18 +233,22 @@ static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state) { - int i; + int ret, i; u8 key[5]; u8 b[4] = { 0 }; *event = 0; *state = REMOTE_NO_KEY_PRESSED; - digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4); + ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4); + if (ret) + return ret; /* Tell the device we've read the remote. Not sure how necessary this is, but the Nebula SDK does it. */ - digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0); + ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0); + if (ret) + return ret; /* if something is inside the buffer, simulate key press */ if (key[1] != 0) diff -Nru linux-4.19.98/drivers/media/usb/dvb-usb/dvb-usb-urb.c linux-4.19.118/drivers/media/usb/dvb-usb/dvb-usb-urb.c --- linux-4.19.98/drivers/media/usb/dvb-usb/dvb-usb-urb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/dvb-usb/dvb-usb-urb.c 2020-04-23 08:30:24.000000000 +0000 @@ -12,7 +12,7 @@ int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen, int delay_ms) { - int actlen,ret = -ENOMEM; + int actlen = 0, ret = -ENOMEM; if (!d || wbuf == NULL || wlen == 0) return -EINVAL; diff -Nru linux-4.19.98/drivers/media/usb/dvb-usb/vp7045.c linux-4.19.118/drivers/media/usb/dvb-usb/vp7045.c --- linux-4.19.98/drivers/media/usb/dvb-usb/vp7045.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/dvb-usb/vp7045.c 2020-04-23 08:30:24.000000000 +0000 @@ -99,10 +99,14 @@ static int vp7045_rc_query(struct dvb_usb_device *d) { + int ret; u8 key; - vp7045_usb_op(d,RC_VAL_READ,NULL,0,&key,1,20); - deb_rc("remote query key: %x %d\n",key,key); + ret = vp7045_usb_op(d, RC_VAL_READ, NULL, 0, &key, 1, 20); + if (ret) + return ret; + + deb_rc("remote query key: %x\n", key); if (key != 0x44) { /* @@ -118,15 +122,18 @@ static int vp7045_read_eeprom(struct dvb_usb_device *d,u8 *buf, int len, int offset) { - int i = 0; - u8 v,br[2]; + int i, ret; + u8 v, br[2]; for (i=0; i < len; i++) { v = offset + i; - vp7045_usb_op(d,GET_EE_VALUE,&v,1,br,2,5); + ret = vp7045_usb_op(d, GET_EE_VALUE, &v, 1, br, 2, 5); + if (ret) + return ret; + buf[i] = br[1]; } - deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ",offset, i); - debug_dump(buf,i,deb_info); + deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ", offset, i); + debug_dump(buf, i, deb_info); return 0; } diff -Nru linux-4.19.98/drivers/media/usb/em28xx/em28xx-core.c linux-4.19.118/drivers/media/usb/em28xx/em28xx-core.c --- linux-4.19.98/drivers/media/usb/em28xx/em28xx-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/em28xx/em28xx-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -930,7 +930,7 @@ usb_bufs->buf = kcalloc(num_bufs, sizeof(void *), GFP_KERNEL); if (!usb_bufs->buf) { - kfree(usb_bufs->buf); + kfree(usb_bufs->urb); return -ENOMEM; } diff -Nru linux-4.19.98/drivers/media/usb/gspca/gspca.c linux-4.19.118/drivers/media/usb/gspca/gspca.c --- linux-4.19.98/drivers/media/usb/gspca/gspca.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/gspca/gspca.c 2020-04-23 08:30:24.000000000 +0000 @@ -1473,7 +1473,7 @@ pr_err("couldn't kzalloc gspca struct\n"); return -ENOMEM; } - gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL); + gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL); if (!gspca_dev->usb_buf) { pr_err("out of memory\n"); ret = -ENOMEM; diff -Nru linux-4.19.98/drivers/media/usb/gspca/ov519.c linux-4.19.118/drivers/media/usb/gspca/ov519.c --- linux-4.19.98/drivers/media/usb/gspca/ov519.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/gspca/ov519.c 2020-04-23 08:30:24.000000000 +0000 @@ -3487,6 +3487,11 @@ return; } + if (alt->desc.bNumEndpoints < 1) { + sd->gspca_dev.usb_err = -ENODEV; + return; + } + packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); reg_w(sd, R51x_FIFO_PSIZE, packet_size >> 5); @@ -3613,6 +3618,11 @@ return; } + if (alt->desc.bNumEndpoints < 1) { + sd->gspca_dev.usb_err = -ENODEV; + return; + } + packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); ov518_reg_w32(sd, R51x_FIFO_PSIZE, packet_size & ~7, 2); diff -Nru linux-4.19.98/drivers/media/usb/gspca/stv06xx/stv06xx.c linux-4.19.118/drivers/media/usb/gspca/stv06xx/stv06xx.c --- linux-4.19.98/drivers/media/usb/gspca/stv06xx/stv06xx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/gspca/stv06xx/stv06xx.c 2020-04-23 08:30:24.000000000 +0000 @@ -291,6 +291,9 @@ return -EIO; } + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); err = stv06xx_write_bridge(sd, STV_ISO_SIZE_L, packet_size); if (err < 0) @@ -315,11 +318,21 @@ static int stv06xx_isoc_init(struct gspca_dev *gspca_dev) { + struct usb_interface_cache *intfc; struct usb_host_interface *alt; struct sd *sd = (struct sd *) gspca_dev; + intfc = gspca_dev->dev->actconfig->intf_cache[0]; + + if (intfc->num_altsetting < 2) + return -ENODEV; + + alt = &intfc->altsetting[1]; + + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + /* Start isoc bandwidth "negotiation" at max isoc bandwidth */ - alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1]; alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(sd->sensor->max_packet_size[gspca_dev->curr_mode]); @@ -332,6 +345,10 @@ struct usb_host_interface *alt; struct sd *sd = (struct sd *) gspca_dev; + /* + * Existence of altsetting and endpoint was verified in + * stv06xx_isoc_init() + */ alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1]; packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); min_packet_size = sd->sensor->min_packet_size[gspca_dev->curr_mode]; diff -Nru linux-4.19.98/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c linux-4.19.118/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c --- linux-4.19.98/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/gspca/stv06xx/stv06xx_pb0100.c 2020-04-23 08:30:24.000000000 +0000 @@ -194,6 +194,10 @@ alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt); if (!alt) return -ENODEV; + + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); /* If we don't have enough bandwidth use a lower framerate */ diff -Nru linux-4.19.98/drivers/media/usb/gspca/xirlink_cit.c linux-4.19.118/drivers/media/usb/gspca/xirlink_cit.c --- linux-4.19.98/drivers/media/usb/gspca/xirlink_cit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/gspca/xirlink_cit.c 2020-04-23 08:30:24.000000000 +0000 @@ -1452,6 +1452,9 @@ return -EIO; } + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + return le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); } @@ -2636,6 +2639,7 @@ static int sd_isoc_init(struct gspca_dev *gspca_dev) { + struct usb_interface_cache *intfc; struct usb_host_interface *alt; int max_packet_size; @@ -2651,8 +2655,17 @@ break; } + intfc = gspca_dev->dev->actconfig->intf_cache[0]; + + if (intfc->num_altsetting < 2) + return -ENODEV; + + alt = &intfc->altsetting[1]; + + if (alt->desc.bNumEndpoints < 1) + return -ENODEV; + /* Start isoc bandwidth "negotiation" at max isoc bandwidth */ - alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1]; alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(max_packet_size); return 0; @@ -2675,6 +2688,9 @@ break; } + /* + * Existence of altsetting and endpoint was verified in sd_isoc_init() + */ alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1]; packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); if (packet_size <= min_packet_size) diff -Nru linux-4.19.98/drivers/media/usb/usbtv/usbtv-core.c linux-4.19.118/drivers/media/usb/usbtv/usbtv-core.c --- linux-4.19.98/drivers/media/usb/usbtv/usbtv-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/usbtv/usbtv-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -56,7 +56,7 @@ ret = usb_control_msg(usbtv->udev, pipe, USBTV_REQUEST_REG, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, - value, index, NULL, 0, 0); + value, index, NULL, 0, USB_CTRL_GET_TIMEOUT); if (ret < 0) return ret; } diff -Nru linux-4.19.98/drivers/media/usb/usbtv/usbtv-video.c linux-4.19.118/drivers/media/usb/usbtv/usbtv-video.c --- linux-4.19.98/drivers/media/usb/usbtv/usbtv-video.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/usbtv/usbtv-video.c 2020-04-23 08:30:24.000000000 +0000 @@ -805,7 +805,8 @@ ret = usb_control_msg(usbtv->udev, usb_rcvctrlpipe(usbtv->udev, 0), USBTV_CONTROL_REG, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, - 0, USBTV_BASE + 0x0244, (void *)data, 3, 0); + 0, USBTV_BASE + 0x0244, (void *)data, 3, + USB_CTRL_GET_TIMEOUT); if (ret < 0) goto error; } @@ -856,7 +857,7 @@ ret = usb_control_msg(usbtv->udev, usb_sndctrlpipe(usbtv->udev, 0), USBTV_CONTROL_REG, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, - 0, index, (void *)data, size, 0); + 0, index, (void *)data, size, USB_CTRL_SET_TIMEOUT); error: if (ret < 0) diff -Nru linux-4.19.98/drivers/media/usb/uvc/uvc_driver.c linux-4.19.118/drivers/media/usb/uvc/uvc_driver.c --- linux-4.19.98/drivers/media/usb/uvc/uvc_driver.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/usb/uvc/uvc_driver.c 2020-04-23 08:30:24.000000000 +0000 @@ -1482,6 +1482,11 @@ break; if (forward == prev) continue; + if (forward->chain.next || forward->chain.prev) { + uvc_trace(UVC_TRACE_DESCR, "Found reference to " + "entity %d already in chain.\n", forward->id); + return -EINVAL; + } switch (UVC_ENTITY_TYPE(forward)) { case UVC_VC_EXTENSION_UNIT: @@ -1563,6 +1568,13 @@ return -1; } + if (term->chain.next || term->chain.prev) { + uvc_trace(UVC_TRACE_DESCR, "Found reference to " + "entity %d already in chain.\n", + term->id); + return -EINVAL; + } + if (uvc_trace_param & UVC_TRACE_PROBE) printk(KERN_CONT " %d", term->id); diff -Nru linux-4.19.98/drivers/media/v4l2-core/v4l2-compat-ioctl32.c linux-4.19.118/drivers/media/v4l2-core/v4l2-compat-ioctl32.c --- linux-4.19.98/drivers/media/v4l2-core/v4l2-compat-ioctl32.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/v4l2-core/v4l2-compat-ioctl32.c 2020-04-23 08:30:24.000000000 +0000 @@ -1171,36 +1171,38 @@ u32 aux_space; int compatible_arg = 1; long err = 0; + unsigned int ncmd; /* * 1. When struct size is different, converts the command. */ switch (cmd) { - case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break; - case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break; - case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break; - case VIDIOC_G_FBUF32: cmd = VIDIOC_G_FBUF; break; - case VIDIOC_S_FBUF32: cmd = VIDIOC_S_FBUF; break; - case VIDIOC_QBUF32: cmd = VIDIOC_QBUF; break; - case VIDIOC_DQBUF32: cmd = VIDIOC_DQBUF; break; - case VIDIOC_ENUMSTD32: cmd = VIDIOC_ENUMSTD; break; - case VIDIOC_ENUMINPUT32: cmd = VIDIOC_ENUMINPUT; break; - case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; - case VIDIOC_G_EXT_CTRLS32: cmd = VIDIOC_G_EXT_CTRLS; break; - case VIDIOC_S_EXT_CTRLS32: cmd = VIDIOC_S_EXT_CTRLS; break; - case VIDIOC_TRY_EXT_CTRLS32: cmd = VIDIOC_TRY_EXT_CTRLS; break; - case VIDIOC_DQEVENT32: cmd = VIDIOC_DQEVENT; break; - case VIDIOC_OVERLAY32: cmd = VIDIOC_OVERLAY; break; - case VIDIOC_STREAMON32: cmd = VIDIOC_STREAMON; break; - case VIDIOC_STREAMOFF32: cmd = VIDIOC_STREAMOFF; break; - case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; - case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; - case VIDIOC_G_OUTPUT32: cmd = VIDIOC_G_OUTPUT; break; - case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break; - case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break; - case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break; - case VIDIOC_G_EDID32: cmd = VIDIOC_G_EDID; break; - case VIDIOC_S_EDID32: cmd = VIDIOC_S_EDID; break; + case VIDIOC_G_FMT32: ncmd = VIDIOC_G_FMT; break; + case VIDIOC_S_FMT32: ncmd = VIDIOC_S_FMT; break; + case VIDIOC_QUERYBUF32: ncmd = VIDIOC_QUERYBUF; break; + case VIDIOC_G_FBUF32: ncmd = VIDIOC_G_FBUF; break; + case VIDIOC_S_FBUF32: ncmd = VIDIOC_S_FBUF; break; + case VIDIOC_QBUF32: ncmd = VIDIOC_QBUF; break; + case VIDIOC_DQBUF32: ncmd = VIDIOC_DQBUF; break; + case VIDIOC_ENUMSTD32: ncmd = VIDIOC_ENUMSTD; break; + case VIDIOC_ENUMINPUT32: ncmd = VIDIOC_ENUMINPUT; break; + case VIDIOC_TRY_FMT32: ncmd = VIDIOC_TRY_FMT; break; + case VIDIOC_G_EXT_CTRLS32: ncmd = VIDIOC_G_EXT_CTRLS; break; + case VIDIOC_S_EXT_CTRLS32: ncmd = VIDIOC_S_EXT_CTRLS; break; + case VIDIOC_TRY_EXT_CTRLS32: ncmd = VIDIOC_TRY_EXT_CTRLS; break; + case VIDIOC_DQEVENT32: ncmd = VIDIOC_DQEVENT; break; + case VIDIOC_OVERLAY32: ncmd = VIDIOC_OVERLAY; break; + case VIDIOC_STREAMON32: ncmd = VIDIOC_STREAMON; break; + case VIDIOC_STREAMOFF32: ncmd = VIDIOC_STREAMOFF; break; + case VIDIOC_G_INPUT32: ncmd = VIDIOC_G_INPUT; break; + case VIDIOC_S_INPUT32: ncmd = VIDIOC_S_INPUT; break; + case VIDIOC_G_OUTPUT32: ncmd = VIDIOC_G_OUTPUT; break; + case VIDIOC_S_OUTPUT32: ncmd = VIDIOC_S_OUTPUT; break; + case VIDIOC_CREATE_BUFS32: ncmd = VIDIOC_CREATE_BUFS; break; + case VIDIOC_PREPARE_BUF32: ncmd = VIDIOC_PREPARE_BUF; break; + case VIDIOC_G_EDID32: ncmd = VIDIOC_G_EDID; break; + case VIDIOC_S_EDID32: ncmd = VIDIOC_S_EDID; break; + default: ncmd = cmd; break; } /* @@ -1209,11 +1211,11 @@ * argument into it. */ switch (cmd) { - case VIDIOC_OVERLAY: - case VIDIOC_STREAMON: - case VIDIOC_STREAMOFF: - case VIDIOC_S_INPUT: - case VIDIOC_S_OUTPUT: + case VIDIOC_OVERLAY32: + case VIDIOC_STREAMON32: + case VIDIOC_STREAMOFF32: + case VIDIOC_S_INPUT32: + case VIDIOC_S_OUTPUT32: err = alloc_userspace(sizeof(unsigned int), 0, &new_p64); if (!err && assign_in_user((unsigned int __user *)new_p64, (compat_uint_t __user *)p32)) @@ -1221,23 +1223,23 @@ compatible_arg = 0; break; - case VIDIOC_G_INPUT: - case VIDIOC_G_OUTPUT: + case VIDIOC_G_INPUT32: + case VIDIOC_G_OUTPUT32: err = alloc_userspace(sizeof(unsigned int), 0, &new_p64); compatible_arg = 0; break; - case VIDIOC_G_EDID: - case VIDIOC_S_EDID: + case VIDIOC_G_EDID32: + case VIDIOC_S_EDID32: err = alloc_userspace(sizeof(struct v4l2_edid), 0, &new_p64); if (!err) err = get_v4l2_edid32(new_p64, p32); compatible_arg = 0; break; - case VIDIOC_G_FMT: - case VIDIOC_S_FMT: - case VIDIOC_TRY_FMT: + case VIDIOC_G_FMT32: + case VIDIOC_S_FMT32: + case VIDIOC_TRY_FMT32: err = bufsize_v4l2_format(p32, &aux_space); if (!err) err = alloc_userspace(sizeof(struct v4l2_format), @@ -1250,7 +1252,7 @@ compatible_arg = 0; break; - case VIDIOC_CREATE_BUFS: + case VIDIOC_CREATE_BUFS32: err = bufsize_v4l2_create(p32, &aux_space); if (!err) err = alloc_userspace(sizeof(struct v4l2_create_buffers), @@ -1263,10 +1265,10 @@ compatible_arg = 0; break; - case VIDIOC_PREPARE_BUF: - case VIDIOC_QUERYBUF: - case VIDIOC_QBUF: - case VIDIOC_DQBUF: + case VIDIOC_PREPARE_BUF32: + case VIDIOC_QUERYBUF32: + case VIDIOC_QBUF32: + case VIDIOC_DQBUF32: err = bufsize_v4l2_buffer(p32, &aux_space); if (!err) err = alloc_userspace(sizeof(struct v4l2_buffer), @@ -1279,7 +1281,7 @@ compatible_arg = 0; break; - case VIDIOC_S_FBUF: + case VIDIOC_S_FBUF32: err = alloc_userspace(sizeof(struct v4l2_framebuffer), 0, &new_p64); if (!err) @@ -1287,13 +1289,13 @@ compatible_arg = 0; break; - case VIDIOC_G_FBUF: + case VIDIOC_G_FBUF32: err = alloc_userspace(sizeof(struct v4l2_framebuffer), 0, &new_p64); compatible_arg = 0; break; - case VIDIOC_ENUMSTD: + case VIDIOC_ENUMSTD32: err = alloc_userspace(sizeof(struct v4l2_standard), 0, &new_p64); if (!err) @@ -1301,16 +1303,16 @@ compatible_arg = 0; break; - case VIDIOC_ENUMINPUT: + case VIDIOC_ENUMINPUT32: err = alloc_userspace(sizeof(struct v4l2_input), 0, &new_p64); if (!err) err = get_v4l2_input32(new_p64, p32); compatible_arg = 0; break; - case VIDIOC_G_EXT_CTRLS: - case VIDIOC_S_EXT_CTRLS: - case VIDIOC_TRY_EXT_CTRLS: + case VIDIOC_G_EXT_CTRLS32: + case VIDIOC_S_EXT_CTRLS32: + case VIDIOC_TRY_EXT_CTRLS32: err = bufsize_v4l2_ext_controls(p32, &aux_space); if (!err) err = alloc_userspace(sizeof(struct v4l2_ext_controls), @@ -1322,7 +1324,7 @@ } compatible_arg = 0; break; - case VIDIOC_DQEVENT: + case VIDIOC_DQEVENT32: err = alloc_userspace(sizeof(struct v4l2_event), 0, &new_p64); compatible_arg = 0; break; @@ -1340,9 +1342,9 @@ * Otherwise, it will pass the newly allocated @new_p64 argument. */ if (compatible_arg) - err = native_ioctl(file, cmd, (unsigned long)p32); + err = native_ioctl(file, ncmd, (unsigned long)p32); else - err = native_ioctl(file, cmd, (unsigned long)new_p64); + err = native_ioctl(file, ncmd, (unsigned long)new_p64); if (err == -ENOTTY) return err; @@ -1358,13 +1360,13 @@ * the blocks to maximum allowed value. */ switch (cmd) { - case VIDIOC_G_EXT_CTRLS: - case VIDIOC_S_EXT_CTRLS: - case VIDIOC_TRY_EXT_CTRLS: + case VIDIOC_G_EXT_CTRLS32: + case VIDIOC_S_EXT_CTRLS32: + case VIDIOC_TRY_EXT_CTRLS32: if (put_v4l2_ext_controls32(file, new_p64, p32)) err = -EFAULT; break; - case VIDIOC_S_EDID: + case VIDIOC_S_EDID32: if (put_v4l2_edid32(new_p64, p32)) err = -EFAULT; break; @@ -1377,49 +1379,49 @@ * the original 32 bits structure. */ switch (cmd) { - case VIDIOC_S_INPUT: - case VIDIOC_S_OUTPUT: - case VIDIOC_G_INPUT: - case VIDIOC_G_OUTPUT: + case VIDIOC_S_INPUT32: + case VIDIOC_S_OUTPUT32: + case VIDIOC_G_INPUT32: + case VIDIOC_G_OUTPUT32: if (assign_in_user((compat_uint_t __user *)p32, ((unsigned int __user *)new_p64))) err = -EFAULT; break; - case VIDIOC_G_FBUF: + case VIDIOC_G_FBUF32: err = put_v4l2_framebuffer32(new_p64, p32); break; - case VIDIOC_DQEVENT: + case VIDIOC_DQEVENT32: err = put_v4l2_event32(new_p64, p32); break; - case VIDIOC_G_EDID: + case VIDIOC_G_EDID32: err = put_v4l2_edid32(new_p64, p32); break; - case VIDIOC_G_FMT: - case VIDIOC_S_FMT: - case VIDIOC_TRY_FMT: + case VIDIOC_G_FMT32: + case VIDIOC_S_FMT32: + case VIDIOC_TRY_FMT32: err = put_v4l2_format32(new_p64, p32); break; - case VIDIOC_CREATE_BUFS: + case VIDIOC_CREATE_BUFS32: err = put_v4l2_create32(new_p64, p32); break; - case VIDIOC_PREPARE_BUF: - case VIDIOC_QUERYBUF: - case VIDIOC_QBUF: - case VIDIOC_DQBUF: + case VIDIOC_PREPARE_BUF32: + case VIDIOC_QUERYBUF32: + case VIDIOC_QBUF32: + case VIDIOC_DQBUF32: err = put_v4l2_buffer32(new_p64, p32); break; - case VIDIOC_ENUMSTD: + case VIDIOC_ENUMSTD32: err = put_v4l2_standard32(new_p64, p32); break; - case VIDIOC_ENUMINPUT: + case VIDIOC_ENUMINPUT32: err = put_v4l2_input32(new_p64, p32); break; } diff -Nru linux-4.19.98/drivers/media/v4l2-core/v4l2-ioctl.c linux-4.19.118/drivers/media/v4l2-core/v4l2-ioctl.c --- linux-4.19.98/drivers/media/v4l2-core/v4l2-ioctl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/v4l2-core/v4l2-ioctl.c 2020-04-23 08:30:24.000000000 +0000 @@ -1548,12 +1548,12 @@ case V4L2_BUF_TYPE_VBI_CAPTURE: if (unlikely(!ops->vidioc_s_fmt_vbi_cap)) break; - CLEAR_AFTER_FIELD(p, fmt.vbi); + CLEAR_AFTER_FIELD(p, fmt.vbi.flags); return ops->vidioc_s_fmt_vbi_cap(file, fh, arg); case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_cap)) break; - CLEAR_AFTER_FIELD(p, fmt.sliced); + CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); return ops->vidioc_s_fmt_sliced_vbi_cap(file, fh, arg); case V4L2_BUF_TYPE_VIDEO_OUTPUT: if (unlikely(!ops->vidioc_s_fmt_vid_out)) @@ -1576,22 +1576,22 @@ case V4L2_BUF_TYPE_VBI_OUTPUT: if (unlikely(!ops->vidioc_s_fmt_vbi_out)) break; - CLEAR_AFTER_FIELD(p, fmt.vbi); + CLEAR_AFTER_FIELD(p, fmt.vbi.flags); return ops->vidioc_s_fmt_vbi_out(file, fh, arg); case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_out)) break; - CLEAR_AFTER_FIELD(p, fmt.sliced); + CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); return ops->vidioc_s_fmt_sliced_vbi_out(file, fh, arg); case V4L2_BUF_TYPE_SDR_CAPTURE: if (unlikely(!ops->vidioc_s_fmt_sdr_cap)) break; - CLEAR_AFTER_FIELD(p, fmt.sdr); + CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); return ops->vidioc_s_fmt_sdr_cap(file, fh, arg); case V4L2_BUF_TYPE_SDR_OUTPUT: if (unlikely(!ops->vidioc_s_fmt_sdr_out)) break; - CLEAR_AFTER_FIELD(p, fmt.sdr); + CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); return ops->vidioc_s_fmt_sdr_out(file, fh, arg); case V4L2_BUF_TYPE_META_CAPTURE: if (unlikely(!ops->vidioc_s_fmt_meta_cap)) @@ -1635,12 +1635,12 @@ case V4L2_BUF_TYPE_VBI_CAPTURE: if (unlikely(!ops->vidioc_try_fmt_vbi_cap)) break; - CLEAR_AFTER_FIELD(p, fmt.vbi); + CLEAR_AFTER_FIELD(p, fmt.vbi.flags); return ops->vidioc_try_fmt_vbi_cap(file, fh, arg); case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE: if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_cap)) break; - CLEAR_AFTER_FIELD(p, fmt.sliced); + CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); return ops->vidioc_try_fmt_sliced_vbi_cap(file, fh, arg); case V4L2_BUF_TYPE_VIDEO_OUTPUT: if (unlikely(!ops->vidioc_try_fmt_vid_out)) @@ -1663,22 +1663,22 @@ case V4L2_BUF_TYPE_VBI_OUTPUT: if (unlikely(!ops->vidioc_try_fmt_vbi_out)) break; - CLEAR_AFTER_FIELD(p, fmt.vbi); + CLEAR_AFTER_FIELD(p, fmt.vbi.flags); return ops->vidioc_try_fmt_vbi_out(file, fh, arg); case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_out)) break; - CLEAR_AFTER_FIELD(p, fmt.sliced); + CLEAR_AFTER_FIELD(p, fmt.sliced.io_size); return ops->vidioc_try_fmt_sliced_vbi_out(file, fh, arg); case V4L2_BUF_TYPE_SDR_CAPTURE: if (unlikely(!ops->vidioc_try_fmt_sdr_cap)) break; - CLEAR_AFTER_FIELD(p, fmt.sdr); + CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); return ops->vidioc_try_fmt_sdr_cap(file, fh, arg); case V4L2_BUF_TYPE_SDR_OUTPUT: if (unlikely(!ops->vidioc_try_fmt_sdr_out)) break; - CLEAR_AFTER_FIELD(p, fmt.sdr); + CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize); return ops->vidioc_try_fmt_sdr_out(file, fh, arg); case V4L2_BUF_TYPE_META_CAPTURE: if (unlikely(!ops->vidioc_try_fmt_meta_cap)) diff -Nru linux-4.19.98/drivers/media/v4l2-core/v4l2-mem2mem.c linux-4.19.118/drivers/media/v4l2-core/v4l2-mem2mem.c --- linux-4.19.98/drivers/media/v4l2-core/v4l2-mem2mem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/v4l2-core/v4l2-mem2mem.c 2020-04-23 08:30:24.000000000 +0000 @@ -787,12 +787,12 @@ goto err_rel_entity1; /* Connect the three entities */ - ret = media_create_pad_link(m2m_dev->source, 0, &m2m_dev->proc, 1, + ret = media_create_pad_link(m2m_dev->source, 0, &m2m_dev->proc, 0, MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED); if (ret) goto err_rel_entity2; - ret = media_create_pad_link(&m2m_dev->proc, 0, &m2m_dev->sink, 0, + ret = media_create_pad_link(&m2m_dev->proc, 1, &m2m_dev->sink, 0, MEDIA_LNK_FL_IMMUTABLE | MEDIA_LNK_FL_ENABLED); if (ret) goto err_rm_links0; diff -Nru linux-4.19.98/drivers/media/v4l2-core/videobuf-dma-sg.c linux-4.19.118/drivers/media/v4l2-core/videobuf-dma-sg.c --- linux-4.19.98/drivers/media/v4l2-core/videobuf-dma-sg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/media/v4l2-core/videobuf-dma-sg.c 2020-04-23 08:30:24.000000000 +0000 @@ -352,8 +352,11 @@ BUG_ON(dma->sglen); if (dma->pages) { - for (i = 0; i < dma->nr_pages; i++) + for (i = 0; i < dma->nr_pages; i++) { + if (dma->direction == DMA_FROM_DEVICE) + set_page_dirty_lock(dma->pages[i]); put_page(dma->pages[i]); + } kfree(dma->pages); dma->pages = NULL; } diff -Nru linux-4.19.98/drivers/memory/tegra/mc.c linux-4.19.118/drivers/memory/tegra/mc.c --- linux-4.19.98/drivers/memory/tegra/mc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/memory/tegra/mc.c 2020-04-23 08:30:24.000000000 +0000 @@ -664,12 +664,13 @@ } isr = tegra_mc_irq; - } - err = tegra_mc_setup_timings(mc); - if (err < 0) { - dev_err(&pdev->dev, "failed to setup timings: %d\n", err); - return err; + err = tegra_mc_setup_timings(mc); + if (err < 0) { + dev_err(&pdev->dev, "failed to setup timings: %d\n", + err); + return err; + } } mc->irq = platform_get_irq(pdev, 0); diff -Nru linux-4.19.98/drivers/mfd/axp20x.c linux-4.19.118/drivers/mfd/axp20x.c --- linux-4.19.98/drivers/mfd/axp20x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mfd/axp20x.c 2020-04-23 08:30:24.000000000 +0000 @@ -128,7 +128,7 @@ static const struct regmap_range axp288_volatile_ranges[] = { regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP288_POWER_REASON), regmap_reg_range(AXP288_BC_GLOBAL, AXP288_BC_GLOBAL), - regmap_reg_range(AXP288_BC_DET_STAT, AXP288_BC_DET_STAT), + regmap_reg_range(AXP288_BC_DET_STAT, AXP20X_VBUS_IPSOUT_MGMT), regmap_reg_range(AXP20X_CHRG_BAK_CTRL, AXP20X_CHRG_BAK_CTRL), regmap_reg_range(AXP20X_IRQ1_EN, AXP20X_IPSOUT_V_HIGH_L), regmap_reg_range(AXP20X_TIMER_CTRL, AXP20X_TIMER_CTRL), diff -Nru linux-4.19.98/drivers/mfd/da9062-core.c linux-4.19.118/drivers/mfd/da9062-core.c --- linux-4.19.98/drivers/mfd/da9062-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mfd/da9062-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -257,7 +257,7 @@ .name = "da9062-watchdog", .num_resources = ARRAY_SIZE(da9062_wdt_resources), .resources = da9062_wdt_resources, - .of_compatible = "dlg,da9062-wdt", + .of_compatible = "dlg,da9062-watchdog", }, { .name = "da9062-thermal", diff -Nru linux-4.19.98/drivers/mfd/dln2.c linux-4.19.118/drivers/mfd/dln2.c --- linux-4.19.98/drivers/mfd/dln2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mfd/dln2.c 2020-04-23 08:30:24.000000000 +0000 @@ -93,6 +93,11 @@ spinlock_t lock; }; +enum dln2_endpoint { + DLN2_EP_OUT = 0, + DLN2_EP_IN = 1, +}; + struct dln2_dev { struct usb_device *usb_dev; struct usb_interface *interface; @@ -725,6 +730,8 @@ const struct usb_device_id *usb_id) { struct usb_host_interface *hostif = interface->cur_altsetting; + struct usb_endpoint_descriptor *epin; + struct usb_endpoint_descriptor *epout; struct device *dev = &interface->dev; struct dln2_dev *dln2; int ret; @@ -734,12 +741,19 @@ hostif->desc.bNumEndpoints < 2) return -ENODEV; + epout = &hostif->endpoint[DLN2_EP_OUT].desc; + if (!usb_endpoint_is_bulk_out(epout)) + return -ENODEV; + epin = &hostif->endpoint[DLN2_EP_IN].desc; + if (!usb_endpoint_is_bulk_in(epin)) + return -ENODEV; + dln2 = kzalloc(sizeof(*dln2), GFP_KERNEL); if (!dln2) return -ENOMEM; - dln2->ep_out = hostif->endpoint[0].desc.bEndpointAddress; - dln2->ep_in = hostif->endpoint[1].desc.bEndpointAddress; + dln2->ep_out = epout->bEndpointAddress; + dln2->ep_in = epin->bEndpointAddress; dln2->usb_dev = usb_get_dev(interface_to_usbdev(interface)); dln2->interface = interface; usb_set_intfdata(interface, dln2); diff -Nru linux-4.19.98/drivers/mfd/intel-lpss-pci.c linux-4.19.118/drivers/mfd/intel-lpss-pci.c --- linux-4.19.98/drivers/mfd/intel-lpss-pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mfd/intel-lpss-pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -126,6 +126,18 @@ .properties = apl_i2c_properties, }; +static struct property_entry glk_i2c_properties[] = { + PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 313), + PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171), + PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 290), + { }, +}; + +static const struct intel_lpss_platform_info glk_i2c_info = { + .clk_rate = 133000000, + .properties = glk_i2c_properties, +}; + static const struct intel_lpss_platform_info cnl_i2c_info = { .clk_rate = 216000000, .properties = spt_i2c_properties, @@ -165,14 +177,14 @@ { PCI_VDEVICE(INTEL, 0x1ac6), (kernel_ulong_t)&bxt_info }, { PCI_VDEVICE(INTEL, 0x1aee), (kernel_ulong_t)&bxt_uart_info }, /* GLK */ - { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&bxt_i2c_info }, - { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&bxt_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31ac), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31ae), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31b0), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31b2), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31b4), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31b6), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31b8), (kernel_ulong_t)&glk_i2c_info }, + { PCI_VDEVICE(INTEL, 0x31ba), (kernel_ulong_t)&glk_i2c_info }, { PCI_VDEVICE(INTEL, 0x31bc), (kernel_ulong_t)&bxt_uart_info }, { PCI_VDEVICE(INTEL, 0x31be), (kernel_ulong_t)&bxt_uart_info }, { PCI_VDEVICE(INTEL, 0x31c0), (kernel_ulong_t)&bxt_uart_info }, diff -Nru linux-4.19.98/drivers/mfd/intel-lpss.c linux-4.19.118/drivers/mfd/intel-lpss.c --- linux-4.19.98/drivers/mfd/intel-lpss.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mfd/intel-lpss.c 2020-04-23 08:30:24.000000000 +0000 @@ -545,6 +545,7 @@ static void __exit intel_lpss_exit(void) { + ida_destroy(&intel_lpss_devid_ida); debugfs_remove(intel_lpss_debugfs); } module_exit(intel_lpss_exit); diff -Nru linux-4.19.98/drivers/mfd/rn5t618.c linux-4.19.118/drivers/mfd/rn5t618.c --- linux-4.19.98/drivers/mfd/rn5t618.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mfd/rn5t618.c 2020-04-23 08:30:24.000000000 +0000 @@ -32,6 +32,7 @@ case RN5T618_WATCHDOGCNT: case RN5T618_DCIRQ: case RN5T618_ILIMDATAH ... RN5T618_AIN0DATAL: + case RN5T618_ADCCNT3: case RN5T618_IR_ADC1 ... RN5T618_IR_ADC3: case RN5T618_IR_GPR: case RN5T618_IR_GPF: diff -Nru linux-4.19.98/drivers/misc/altera-stapl/altera.c linux-4.19.118/drivers/misc/altera-stapl/altera.c --- linux-4.19.98/drivers/misc/altera-stapl/altera.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/altera-stapl/altera.c 2020-04-23 08:30:24.000000000 +0000 @@ -2126,8 +2126,8 @@ return status; } -static int altera_get_note(u8 *p, s32 program_size, - s32 *offset, char *key, char *value, int length) +static int altera_get_note(u8 *p, s32 program_size, s32 *offset, + char *key, char *value, int keylen, int vallen) /* * Gets key and value of NOTE fields in the JBC file. * Can be called in two modes: if offset pointer is NULL, @@ -2184,7 +2184,7 @@ &p[note_table + (8 * i) + 4])]; if (value != NULL) - strlcpy(value, value_ptr, length); + strlcpy(value, value_ptr, vallen); } } @@ -2203,13 +2203,13 @@ strlcpy(key, &p[note_strings + get_unaligned_be32( &p[note_table + (8 * i)])], - length); + keylen); if (value != NULL) strlcpy(value, &p[note_strings + get_unaligned_be32( &p[note_table + (8 * i) + 4])], - length); + vallen); *offset = i + 1; } @@ -2463,7 +2463,7 @@ __func__, (format_version == 2) ? "Jam STAPL" : "pre-standardized Jam 1.1"); while (altera_get_note((u8 *)fw->data, fw->size, - &offset, key, value, 256) == 0) + &offset, key, value, 32, 256) == 0) printk(KERN_INFO "%s: NOTE \"%s\" = \"%s\"\n", __func__, key, value); } diff -Nru linux-4.19.98/drivers/misc/aspeed-lpc-snoop.c linux-4.19.118/drivers/misc/aspeed-lpc-snoop.c --- linux-4.19.98/drivers/misc/aspeed-lpc-snoop.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/aspeed-lpc-snoop.c 2020-04-23 08:30:24.000000000 +0000 @@ -101,13 +101,13 @@ return ret ? ret : copied; } -static unsigned int snoop_file_poll(struct file *file, +static __poll_t snoop_file_poll(struct file *file, struct poll_table_struct *pt) { struct aspeed_lpc_snoop_channel *chan = snoop_file_to_chan(file); poll_wait(file, &chan->wq, pt); - return !kfifo_is_empty(&chan->fifo) ? POLLIN : 0; + return !kfifo_is_empty(&chan->fifo) ? EPOLLIN : 0; } static const struct file_operations snoop_fops = { diff -Nru linux-4.19.98/drivers/misc/cardreader/rts5227.c linux-4.19.118/drivers/misc/cardreader/rts5227.c --- linux-4.19.98/drivers/misc/cardreader/rts5227.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/cardreader/rts5227.c 2020-04-23 08:30:24.000000000 +0000 @@ -369,6 +369,7 @@ void rts522a_init_params(struct rtsx_pcr *pcr) { rts5227_init_params(pcr); - + pcr->ops = &rts522a_pcr_ops; + pcr->tx_initial_phase = SET_CLOCK_PHASE(20, 20, 11); pcr->reg_pm_ctrl3 = RTS522A_PM_CTRL3; } diff -Nru linux-4.19.98/drivers/misc/cardreader/rts5249.c linux-4.19.118/drivers/misc/cardreader/rts5249.c --- linux-4.19.98/drivers/misc/cardreader/rts5249.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/cardreader/rts5249.c 2020-04-23 08:30:24.000000000 +0000 @@ -623,6 +623,7 @@ void rts524a_init_params(struct rtsx_pcr *pcr) { rts5249_init_params(pcr); + pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11); pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; pcr->option.ltr_l1off_snooze_sspwrgate = LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; @@ -731,6 +732,7 @@ void rts525a_init_params(struct rtsx_pcr *pcr) { rts5249_init_params(pcr); + pcr->tx_initial_phase = SET_CLOCK_PHASE(25, 29, 11); pcr->option.ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5250_DEF; pcr->option.ltr_l1off_snooze_sspwrgate = LTR_L1OFF_SNOOZE_SSPWRGATE_5250_DEF; diff -Nru linux-4.19.98/drivers/misc/cardreader/rts5260.c linux-4.19.118/drivers/misc/cardreader/rts5260.c --- linux-4.19.98/drivers/misc/cardreader/rts5260.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/cardreader/rts5260.c 2020-04-23 08:30:24.000000000 +0000 @@ -712,7 +712,7 @@ pcr->sd30_drive_sel_1v8 = CFG_DRIVER_TYPE_B; pcr->sd30_drive_sel_3v3 = CFG_DRIVER_TYPE_B; pcr->aspm_en = ASPM_L1_EN; - pcr->tx_initial_phase = SET_CLOCK_PHASE(1, 29, 16); + pcr->tx_initial_phase = SET_CLOCK_PHASE(27, 29, 11); pcr->rx_initial_phase = SET_CLOCK_PHASE(24, 6, 5); pcr->ic_version = rts5260_get_ic_version(pcr); diff -Nru linux-4.19.98/drivers/misc/echo/echo.c linux-4.19.118/drivers/misc/echo/echo.c --- linux-4.19.98/drivers/misc/echo/echo.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/echo/echo.c 2020-04-23 08:30:24.000000000 +0000 @@ -381,7 +381,7 @@ */ ec->factor = 0; ec->shift = 0; - if ((ec->nonupdate_dwell == 0)) { + if (!ec->nonupdate_dwell) { int p, logp, shift; /* Determine: diff -Nru linux-4.19.98/drivers/misc/mei/hw-me-regs.h linux-4.19.118/drivers/misc/mei/hw-me-regs.h --- linux-4.19.98/drivers/misc/mei/hw-me-regs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/mei/hw-me-regs.h 2020-04-23 08:30:24.000000000 +0000 @@ -141,8 +141,14 @@ #define MEI_DEV_ID_CMP_LP 0x02e0 /* Comet Point LP */ #define MEI_DEV_ID_CMP_LP_3 0x02e4 /* Comet Point LP 3 (iTouch) */ + #define MEI_DEV_ID_CMP_V 0xA3BA /* Comet Point Lake V */ +#define MEI_DEV_ID_CMP_H 0x06e0 /* Comet Lake H */ +#define MEI_DEV_ID_CMP_H_3 0x06e4 /* Comet Lake H 3 (iTouch) */ + +#define MEI_DEV_ID_CDF 0x18D3 /* Cedar Fork */ + #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ #define MEI_DEV_ID_TGP_LP 0xA0E0 /* Tiger Lake Point LP */ diff -Nru linux-4.19.98/drivers/misc/mei/main.c linux-4.19.118/drivers/misc/mei/main.c --- linux-4.19.98/drivers/misc/mei/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/mei/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -599,10 +599,10 @@ mei_cl_read_start(cl, mei_cl_mtu(cl), file); } - if (req_events & (POLLOUT | POLLWRNORM)) { + if (req_events & (EPOLLOUT | EPOLLWRNORM)) { poll_wait(file, &cl->tx_wait, wait); if (cl->tx_cb_queued < dev->tx_queue_limit) - mask |= POLLOUT | POLLWRNORM; + mask |= EPOLLOUT | EPOLLWRNORM; } out: diff -Nru linux-4.19.98/drivers/misc/mei/pci-me.c linux-4.19.118/drivers/misc/mei/pci-me.c --- linux-4.19.98/drivers/misc/mei/pci-me.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/mei/pci-me.c 2020-04-23 08:30:24.000000000 +0000 @@ -108,6 +108,8 @@ {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP, MEI_ME_PCH12_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP_3, MEI_ME_PCH8_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_V, MEI_ME_PCH12_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H, MEI_ME_PCH12_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H_3, MEI_ME_PCH8_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)}, @@ -116,6 +118,8 @@ {MEI_PCI_DEVICE(MEI_DEV_ID_MCC, MEI_ME_PCH12_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_MCC_4, MEI_ME_PCH8_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CDF, MEI_ME_PCH8_CFG)}, + /* required last entry */ {0, } }; diff -Nru linux-4.19.98/drivers/misc/mic/card/mic_x100.c linux-4.19.118/drivers/misc/mic/card/mic_x100.c --- linux-4.19.98/drivers/misc/mic/card/mic_x100.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/mic/card/mic_x100.c 2020-04-23 08:30:24.000000000 +0000 @@ -249,6 +249,9 @@ mdrv->dev = &pdev->dev; snprintf(mdrv->name, sizeof(mic_driver_name), mic_driver_name); + /* FIXME: use dma_set_mask_and_coherent() and check result */ + dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); + mdev->mmio.pa = MIC_X100_MMIO_BASE; mdev->mmio.len = MIC_X100_MMIO_LEN; mdev->mmio.va = devm_ioremap(&pdev->dev, MIC_X100_MMIO_BASE, @@ -294,18 +297,6 @@ mic_remove(pdev); } -static u64 mic_dma_mask = DMA_BIT_MASK(64); - -static struct platform_device mic_platform_dev = { - .name = mic_driver_name, - .id = 0, - .num_resources = 0, - .dev = { - .dma_mask = &mic_dma_mask, - .coherent_dma_mask = DMA_BIT_MASK(64), - }, -}; - static struct platform_driver __refdata mic_platform_driver = { .probe = mic_probe, .remove = mic_remove, @@ -315,6 +306,8 @@ }, }; +static struct platform_device *mic_platform_dev; + static int __init mic_init(void) { int ret; @@ -328,9 +321,12 @@ request_module("mic_x100_dma"); mic_init_card_debugfs(); - ret = platform_device_register(&mic_platform_dev); + + mic_platform_dev = platform_device_register_simple(mic_driver_name, + 0, NULL, 0); + ret = PTR_ERR_OR_ZERO(mic_platform_dev); if (ret) { - pr_err("platform_device_register ret %d\n", ret); + pr_err("platform_device_register_full ret %d\n", ret); goto cleanup_debugfs; } ret = platform_driver_register(&mic_platform_driver); @@ -341,7 +337,7 @@ return ret; device_unregister: - platform_device_unregister(&mic_platform_dev); + platform_device_unregister(mic_platform_dev); cleanup_debugfs: mic_exit_card_debugfs(); done: @@ -351,7 +347,7 @@ static void __exit mic_exit(void) { platform_driver_unregister(&mic_platform_driver); - platform_device_unregister(&mic_platform_dev); + platform_device_unregister(mic_platform_dev); mic_exit_card_debugfs(); } diff -Nru linux-4.19.98/drivers/misc/pci_endpoint_test.c linux-4.19.118/drivers/misc/pci_endpoint_test.c --- linux-4.19.98/drivers/misc/pci_endpoint_test.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/pci_endpoint_test.c 2020-04-23 08:30:24.000000000 +0000 @@ -104,6 +104,7 @@ struct completion irq_raised; int last_irq; int num_irqs; + int irq_type; /* mutex to protect the ioctls */ struct mutex mutex; struct miscdevice miscdev; @@ -163,6 +164,7 @@ struct pci_dev *pdev = test->pdev; pci_free_irq_vectors(pdev); + test->irq_type = IRQ_TYPE_UNDEFINED; } static bool pci_endpoint_test_alloc_irq_vectors(struct pci_endpoint_test *test, @@ -197,6 +199,8 @@ irq = 0; res = false; } + + test->irq_type = type; test->num_irqs = irq; return res; @@ -336,6 +340,7 @@ dma_addr_t orig_dst_phys_addr; size_t offset; size_t alignment = test->alignment; + int irq_type = test->irq_type; u32 src_crc32; u32 dst_crc32; @@ -432,6 +437,7 @@ dma_addr_t orig_phys_addr; size_t offset; size_t alignment = test->alignment; + int irq_type = test->irq_type; u32 crc32; if (size > SIZE_MAX - alignment) @@ -500,6 +506,7 @@ dma_addr_t orig_phys_addr; size_t offset; size_t alignment = test->alignment; + int irq_type = test->irq_type; u32 crc32; if (size > SIZE_MAX - alignment) @@ -561,7 +568,7 @@ return false; } - if (irq_type == req_irq_type) + if (test->irq_type == req_irq_type) return true; pci_endpoint_test_release_irq(test); @@ -573,12 +580,10 @@ if (!pci_endpoint_test_request_irq(test)) goto err; - irq_type = req_irq_type; return true; err: pci_endpoint_test_free_irq_vectors(test); - irq_type = IRQ_TYPE_UNDEFINED; return false; } @@ -636,7 +641,7 @@ { int err; int id; - char name[20]; + char name[24]; enum pci_barno bar; void __iomem *base; struct device *dev = &pdev->dev; @@ -655,6 +660,7 @@ test->test_reg_bar = 0; test->alignment = 0; test->pdev = pdev; + test->irq_type = IRQ_TYPE_UNDEFINED; if (no_msi) irq_type = IRQ_TYPE_LEGACY; diff -Nru linux-4.19.98/drivers/misc/sgi-xp/xpc_partition.c linux-4.19.118/drivers/misc/sgi-xp/xpc_partition.c --- linux-4.19.98/drivers/misc/sgi-xp/xpc_partition.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/misc/sgi-xp/xpc_partition.c 2020-04-23 08:30:24.000000000 +0000 @@ -70,7 +70,7 @@ unsigned long rp_pa = nasid; /* seed with nasid */ size_t len = 0; size_t buf_len = 0; - void *buf = buf; + void *buf = NULL; void *buf_base = NULL; enum xp_retval (*get_partition_rsvd_page_pa) (void *, u64 *, unsigned long *, size_t *) = diff -Nru linux-4.19.98/drivers/mmc/core/core.c linux-4.19.118/drivers/mmc/core/core.c --- linux-4.19.98/drivers/mmc/core/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/core/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -2043,8 +2043,11 @@ * the erase operation does not exceed the max_busy_timeout, we should * use R1B response. Or we need to prevent the host from doing hw busy * detection, which is done by converting to a R1 response instead. + * Note, some hosts requires R1B, which also means they are on their own + * when it comes to deal with the busy timeout. */ - if (card->host->max_busy_timeout && + if (!(card->host->caps & MMC_CAP_NEED_RSP_BUSY) && + card->host->max_busy_timeout && busy_timeout > card->host->max_busy_timeout) { cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; } else { diff -Nru linux-4.19.98/drivers/mmc/core/host.c linux-4.19.118/drivers/mmc/core/host.c --- linux-4.19.98/drivers/mmc/core/host.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/core/host.c 2020-04-23 08:30:24.000000000 +0000 @@ -385,8 +385,6 @@ if (mmc_gpio_alloc(host)) { put_device(&host->class_dev); - ida_simple_remove(&mmc_host_ida, host->index); - kfree(host); return NULL; } diff -Nru linux-4.19.98/drivers/mmc/core/mmc.c linux-4.19.118/drivers/mmc/core/mmc.c --- linux-4.19.98/drivers/mmc/core/mmc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/core/mmc.c 2020-04-23 08:30:24.000000000 +0000 @@ -1901,9 +1901,12 @@ * If the max_busy_timeout of the host is specified, validate it against * the sleep cmd timeout. A failure means we need to prevent the host * from doing hw busy detection, which is done by converting to a R1 - * response instead of a R1B. + * response instead of a R1B. Note, some hosts requires R1B, which also + * means they are on their own when it comes to deal with the busy + * timeout. */ - if (host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) { + if (!(host->caps & MMC_CAP_NEED_RSP_BUSY) && host->max_busy_timeout && + (timeout_ms > host->max_busy_timeout)) { cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; } else { cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; diff -Nru linux-4.19.98/drivers/mmc/core/mmc_ops.c linux-4.19.118/drivers/mmc/core/mmc_ops.c --- linux-4.19.98/drivers/mmc/core/mmc_ops.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/core/mmc_ops.c 2020-04-23 08:30:24.000000000 +0000 @@ -536,10 +536,12 @@ * If the cmd timeout and the max_busy_timeout of the host are both * specified, let's validate them. A failure means we need to prevent * the host from doing hw busy detection, which is done by converting - * to a R1 response instead of a R1B. + * to a R1 response instead of a R1B. Note, some hosts requires R1B, + * which also means they are on their own when it comes to deal with the + * busy timeout. */ - if (timeout_ms && host->max_busy_timeout && - (timeout_ms > host->max_busy_timeout)) + if (!(host->caps & MMC_CAP_NEED_RSP_BUSY) && timeout_ms && + host->max_busy_timeout && (timeout_ms > host->max_busy_timeout)) use_r1b_resp = false; cmd.opcode = MMC_SWITCH; diff -Nru linux-4.19.98/drivers/mmc/core/quirks.h linux-4.19.118/drivers/mmc/core/quirks.h --- linux-4.19.98/drivers/mmc/core/quirks.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/core/quirks.h 2020-04-23 08:30:24.000000000 +0000 @@ -119,7 +119,14 @@ END_FIXUP }; + static const struct mmc_fixup sdio_fixup_methods[] = { + SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, + add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), + + SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, + add_quirk, MMC_QUIRK_DISABLE_CD), + SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271, add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), diff -Nru linux-4.19.98/drivers/mmc/host/Kconfig linux-4.19.118/drivers/mmc/host/Kconfig --- linux-4.19.98/drivers/mmc/host/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -935,6 +935,8 @@ config MMC_SDHCI_OMAP tristate "TI SDHCI Controller Support" depends on MMC_SDHCI_PLTFM && OF + select THERMAL + imply TI_SOC_THERMAL help This selects the Secure Digital Host Controller Interface (SDHCI) support present in TI's DRA7 SOCs. The controller supports diff -Nru linux-4.19.98/drivers/mmc/host/mmc_spi.c linux-4.19.118/drivers/mmc/host/mmc_spi.c --- linux-4.19.98/drivers/mmc/host/mmc_spi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/mmc_spi.c 2020-04-23 08:30:24.000000000 +0000 @@ -1154,17 +1154,22 @@ * SPI protocol. Another is that when chipselect is released while * the card returns BUSY status, the clock must issue several cycles * with chipselect high before the card will stop driving its output. + * + * SPI_CS_HIGH means "asserted" here. In some cases like when using + * GPIOs for chip select, SPI_CS_HIGH is set but this will be logically + * inverted by gpiolib, so if we want to ascertain to drive it high + * we should toggle the default with an XOR as we do here. */ - host->spi->mode |= SPI_CS_HIGH; + host->spi->mode ^= SPI_CS_HIGH; if (spi_setup(host->spi) != 0) { /* Just warn; most cards work without it. */ dev_warn(&host->spi->dev, "can't change chip-select polarity\n"); - host->spi->mode &= ~SPI_CS_HIGH; + host->spi->mode ^= SPI_CS_HIGH; } else { mmc_spi_readbytes(host, 18); - host->spi->mode &= ~SPI_CS_HIGH; + host->spi->mode ^= SPI_CS_HIGH; if (spi_setup(host->spi) != 0) { /* Wot, we can't get the same setup we had before? */ dev_err(&host->spi->dev, diff -Nru linux-4.19.98/drivers/mmc/host/rtsx_pci_sdmmc.c linux-4.19.118/drivers/mmc/host/rtsx_pci_sdmmc.c --- linux-4.19.98/drivers/mmc/host/rtsx_pci_sdmmc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/rtsx_pci_sdmmc.c 2020-04-23 08:30:24.000000000 +0000 @@ -618,19 +618,22 @@ u8 sample_point, bool rx) { struct rtsx_pcr *pcr = host->pcr; - + u16 SD_VP_CTL = 0; dev_dbg(sdmmc_dev(host), "%s(%s): sample_point = %d\n", __func__, rx ? "RX" : "TX", sample_point); rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, CHANGE_CLK); - if (rx) + if (rx) { + SD_VP_CTL = SD_VPRX_CTL; rtsx_pci_write_register(pcr, SD_VPRX_CTL, PHASE_SELECT_MASK, sample_point); - else + } else { + SD_VP_CTL = SD_VPTX_CTL; rtsx_pci_write_register(pcr, SD_VPTX_CTL, PHASE_SELECT_MASK, sample_point); - rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET, 0); - rtsx_pci_write_register(pcr, SD_VPCLK0_CTL, PHASE_NOT_RESET, + } + rtsx_pci_write_register(pcr, SD_VP_CTL, PHASE_NOT_RESET, 0); + rtsx_pci_write_register(pcr, SD_VP_CTL, PHASE_NOT_RESET, PHASE_NOT_RESET); rtsx_pci_write_register(pcr, CLK_CTL, CHANGE_CLK, 0); rtsx_pci_write_register(pcr, SD_CFG1, SD_ASYNC_FIFO_NOT_RST, 0); diff -Nru linux-4.19.98/drivers/mmc/host/sdhci-brcmstb.c linux-4.19.118/drivers/mmc/host/sdhci-brcmstb.c --- linux-4.19.98/drivers/mmc/host/sdhci-brcmstb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/sdhci-brcmstb.c 2020-04-23 08:30:24.000000000 +0000 @@ -55,7 +55,9 @@ } sdhci_get_of_property(pdev); - mmc_of_parse(host->mmc); + res = mmc_of_parse(host->mmc); + if (res) + goto err; /* * Supply the existing CAPS, but clear the UHS modes. This diff -Nru linux-4.19.98/drivers/mmc/host/sdhci-of-at91.c linux-4.19.118/drivers/mmc/host/sdhci-of-at91.c --- linux-4.19.98/drivers/mmc/host/sdhci-of-at91.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/sdhci-of-at91.c 2020-04-23 08:30:24.000000000 +0000 @@ -126,7 +126,8 @@ { sdhci_reset(host, mask); - if (host->mmc->caps & MMC_CAP_NONREMOVABLE) + if ((host->mmc->caps & MMC_CAP_NONREMOVABLE) + || mmc_gpio_get_cd(host->mmc) >= 0) sdhci_at91_set_force_card_detect(host); } @@ -332,19 +333,22 @@ priv->mainck = devm_clk_get(&pdev->dev, "baseclk"); if (IS_ERR(priv->mainck)) { dev_err(&pdev->dev, "failed to get baseclk\n"); - return PTR_ERR(priv->mainck); + ret = PTR_ERR(priv->mainck); + goto sdhci_pltfm_free; } priv->hclock = devm_clk_get(&pdev->dev, "hclock"); if (IS_ERR(priv->hclock)) { dev_err(&pdev->dev, "failed to get hclock\n"); - return PTR_ERR(priv->hclock); + ret = PTR_ERR(priv->hclock); + goto sdhci_pltfm_free; } priv->gck = devm_clk_get(&pdev->dev, "multclk"); if (IS_ERR(priv->gck)) { dev_err(&pdev->dev, "failed to get multclk\n"); - return PTR_ERR(priv->gck); + ret = PTR_ERR(priv->gck); + goto sdhci_pltfm_free; } ret = sdhci_at91_set_clks_presets(&pdev->dev); @@ -402,8 +406,11 @@ * detection procedure using the SDMCC_CD signal is bypassed. * This bit is reset when a software reset for all command is performed * so we need to implement our own reset function to set back this bit. + * + * WA: SAMA5D2 doesn't drive CMD if using CD GPIO line. */ - if (host->mmc->caps & MMC_CAP_NONREMOVABLE) + if ((host->mmc->caps & MMC_CAP_NONREMOVABLE) + || mmc_gpio_get_cd(host->mmc) >= 0) sdhci_at91_set_force_card_detect(host); pm_runtime_put_autosuspend(&pdev->dev); diff -Nru linux-4.19.98/drivers/mmc/host/sdhci-omap.c linux-4.19.118/drivers/mmc/host/sdhci-omap.c --- linux-4.19.98/drivers/mmc/host/sdhci-omap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/sdhci-omap.c 2020-04-23 08:30:24.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include #include "sdhci-pltfm.h" @@ -115,6 +116,7 @@ struct pinctrl *pinctrl; struct pinctrl_state **pinctrl_state; + bool is_tuning; }; static void sdhci_omap_start_clock(struct sdhci_omap_host *omap_host); @@ -289,15 +291,19 @@ struct sdhci_host *host = mmc_priv(mmc); struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host); + struct thermal_zone_device *thermal_dev; struct device *dev = omap_host->dev; struct mmc_ios *ios = &mmc->ios; u32 start_window = 0, max_window = 0; + bool single_point_failure = false; bool dcrc_was_enabled = false; u8 cur_match, prev_match = 0; u32 length = 0, max_len = 0; u32 phase_delay = 0; + int temperature; int ret = 0; u32 reg; + int i; pltfm_host = sdhci_priv(host); omap_host = sdhci_pltfm_priv(pltfm_host); @@ -311,6 +317,16 @@ if (ios->timing == MMC_TIMING_UHS_SDR50 && !(reg & CAPA2_TSDR50)) return 0; + thermal_dev = thermal_zone_get_zone_by_name("cpu_thermal"); + if (IS_ERR(thermal_dev)) { + dev_err(dev, "Unable to get thermal zone for tuning\n"); + return PTR_ERR(thermal_dev); + } + + ret = thermal_zone_get_temp(thermal_dev, &temperature); + if (ret) + return ret; + reg = sdhci_omap_readl(omap_host, SDHCI_OMAP_DLL); reg |= DLL_SWT; sdhci_omap_writel(omap_host, SDHCI_OMAP_DLL, reg); @@ -326,6 +342,13 @@ dcrc_was_enabled = true; } + omap_host->is_tuning = true; + + /* + * Stage 1: Search for a maximum pass window ignoring any + * any single point failures. If the tuning value ends up + * near it, move away from it in stage 2 below + */ while (phase_delay <= MAX_PHASE_DELAY) { sdhci_omap_set_dll(omap_host, phase_delay); @@ -333,10 +356,15 @@ if (cur_match) { if (prev_match) { length++; + } else if (single_point_failure) { + /* ignore single point failure */ + length++; } else { start_window = phase_delay; length = 1; } + } else { + single_point_failure = prev_match; } if (length > max_len) { @@ -354,18 +382,84 @@ goto tuning_error; } + /* + * Assign tuning value as a ratio of maximum pass window based + * on temperature + */ + if (temperature < -20000) + phase_delay = min(max_window + 4 * (max_len - 1) - 24, + max_window + + DIV_ROUND_UP(13 * max_len, 16) * 4); + else if (temperature < 20000) + phase_delay = max_window + DIV_ROUND_UP(9 * max_len, 16) * 4; + else if (temperature < 40000) + phase_delay = max_window + DIV_ROUND_UP(8 * max_len, 16) * 4; + else if (temperature < 70000) + phase_delay = max_window + DIV_ROUND_UP(7 * max_len, 16) * 4; + else if (temperature < 90000) + phase_delay = max_window + DIV_ROUND_UP(5 * max_len, 16) * 4; + else if (temperature < 120000) + phase_delay = max_window + DIV_ROUND_UP(4 * max_len, 16) * 4; + else + phase_delay = max_window + DIV_ROUND_UP(3 * max_len, 16) * 4; + + /* + * Stage 2: Search for a single point failure near the chosen tuning + * value in two steps. First in the +3 to +10 range and then in the + * +2 to -10 range. If found, move away from it in the appropriate + * direction by the appropriate amount depending on the temperature. + */ + for (i = 3; i <= 10; i++) { + sdhci_omap_set_dll(omap_host, phase_delay + i); + + if (mmc_send_tuning(mmc, opcode, NULL)) { + if (temperature < 10000) + phase_delay += i + 6; + else if (temperature < 20000) + phase_delay += i - 12; + else if (temperature < 70000) + phase_delay += i - 8; + else + phase_delay += i - 6; + + goto single_failure_found; + } + } + + for (i = 2; i >= -10; i--) { + sdhci_omap_set_dll(omap_host, phase_delay + i); + + if (mmc_send_tuning(mmc, opcode, NULL)) { + if (temperature < 10000) + phase_delay += i + 12; + else if (temperature < 20000) + phase_delay += i + 8; + else if (temperature < 70000) + phase_delay += i + 8; + else if (temperature < 90000) + phase_delay += i + 10; + else + phase_delay += i + 12; + + goto single_failure_found; + } + } + +single_failure_found: reg = sdhci_omap_readl(omap_host, SDHCI_OMAP_AC12); if (!(reg & AC12_SCLK_SEL)) { ret = -EIO; goto tuning_error; } - phase_delay = max_window + 4 * (max_len >> 1); sdhci_omap_set_dll(omap_host, phase_delay); + omap_host->is_tuning = false; + goto ret; tuning_error: + omap_host->is_tuning = false; dev_err(dev, "Tuning failed\n"); sdhci_omap_disable_tuning(omap_host); @@ -695,6 +789,55 @@ sdhci_omap_start_clock(omap_host); } +void sdhci_omap_reset(struct sdhci_host *host, u8 mask) +{ + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host); + + /* Don't reset data lines during tuning operation */ + if (omap_host->is_tuning) + mask &= ~SDHCI_RESET_DATA; + + sdhci_reset(host, mask); +} + +#define CMD_ERR_MASK (SDHCI_INT_CRC | SDHCI_INT_END_BIT | SDHCI_INT_INDEX |\ + SDHCI_INT_TIMEOUT) +#define CMD_MASK (CMD_ERR_MASK | SDHCI_INT_RESPONSE) + +static u32 sdhci_omap_irq(struct sdhci_host *host, u32 intmask) +{ + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_omap_host *omap_host = sdhci_pltfm_priv(pltfm_host); + + if (omap_host->is_tuning && host->cmd && !host->data_early && + (intmask & CMD_ERR_MASK)) { + + /* + * Since we are not resetting data lines during tuning + * operation, data error or data complete interrupts + * might still arrive. Mark this request as a failure + * but still wait for the data interrupt + */ + if (intmask & SDHCI_INT_TIMEOUT) + host->cmd->error = -ETIMEDOUT; + else + host->cmd->error = -EILSEQ; + + host->cmd = NULL; + + /* + * Sometimes command error interrupts and command complete + * interrupt will arrive together. Clear all command related + * interrupts here. + */ + sdhci_writel(host, intmask & CMD_MASK, SDHCI_INT_STATUS); + intmask &= ~CMD_MASK; + } + + return intmask; +} + static struct sdhci_ops sdhci_omap_ops = { .set_clock = sdhci_omap_set_clock, .set_power = sdhci_omap_set_power, @@ -703,8 +846,9 @@ .get_min_clock = sdhci_omap_get_min_clock, .set_bus_width = sdhci_omap_set_bus_width, .platform_send_init_74_clocks = sdhci_omap_init_74_clocks, - .reset = sdhci_reset, + .reset = sdhci_omap_reset, .set_uhs_signaling = sdhci_omap_set_uhs_signaling, + .irq = sdhci_omap_irq, }; static int sdhci_omap_set_capabilities(struct sdhci_omap_host *omap_host) @@ -1003,6 +1147,9 @@ host->mmc_host_ops.execute_tuning = sdhci_omap_execute_tuning; host->mmc_host_ops.enable_sdio_irq = sdhci_omap_enable_sdio_irq; + /* R1B responses is required to properly manage HW busy detection. */ + mmc->caps |= MMC_CAP_NEED_RSP_BUSY; + ret = sdhci_setup_host(host); if (ret) goto err_put_sync; diff -Nru linux-4.19.98/drivers/mmc/host/sdhci-tegra.c linux-4.19.118/drivers/mmc/host/sdhci-tegra.c --- linux-4.19.98/drivers/mmc/host/sdhci-tegra.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/sdhci-tegra.c 2020-04-23 08:30:24.000000000 +0000 @@ -177,7 +177,7 @@ misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_DDR50; if (soc_data->nvquirks & NVQUIRK_ENABLE_SDR104) misc_ctrl |= SDHCI_MISC_CTRL_ENABLE_SDR104; - if (soc_data->nvquirks & SDHCI_MISC_CTRL_ENABLE_SDR50) + if (soc_data->nvquirks & NVQUIRK_ENABLE_SDR50) clk_ctrl |= SDHCI_CLOCK_CTRL_SDR50_TUNING_OVERRIDE; } @@ -502,6 +502,9 @@ if (tegra_host->soc_data->nvquirks & NVQUIRK_ENABLE_DDR50) host->mmc->caps |= MMC_CAP_1_8V_DDR; + /* R1B responses is required to properly manage HW busy detection. */ + host->mmc->caps |= MMC_CAP_NEED_RSP_BUSY; + tegra_host->power_gpio = devm_gpiod_get_optional(&pdev->dev, "power", GPIOD_OUT_HIGH); if (IS_ERR(tegra_host->power_gpio)) { diff -Nru linux-4.19.98/drivers/mmc/host/sdhci.c linux-4.19.118/drivers/mmc/host/sdhci.c --- linux-4.19.98/drivers/mmc/host/sdhci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mmc/host/sdhci.c 2020-04-23 08:30:24.000000000 +0000 @@ -3700,11 +3700,13 @@ if (host->ops->get_min_clock) mmc->f_min = host->ops->get_min_clock(host); else if (host->version >= SDHCI_SPEC_300) { - if (host->clk_mul) { - mmc->f_min = (host->max_clk * host->clk_mul) / 1024; + if (host->clk_mul) max_clk = host->max_clk * host->clk_mul; - } else - mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; + /* + * Divided Clock Mode minimum clock rate is always less than + * Programmable Clock Mode minimum clock rate. + */ + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; } else mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; diff -Nru linux-4.19.98/drivers/mtd/devices/phram.c linux-4.19.118/drivers/mtd/devices/phram.c --- linux-4.19.98/drivers/mtd/devices/phram.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mtd/devices/phram.c 2020-04-23 08:30:24.000000000 +0000 @@ -240,22 +240,25 @@ ret = parse_num64(&start, token[1]); if (ret) { - kfree(name); parse_err("illegal start address\n"); + goto error; } ret = parse_num64(&len, token[2]); if (ret) { - kfree(name); parse_err("illegal device length\n"); + goto error; } ret = register_device(name, start, len); - if (!ret) - pr_info("%s device: %#llx at %#llx\n", name, len, start); - else - kfree(name); + if (ret) + goto error; + pr_info("%s device: %#llx at %#llx\n", name, len, start); + return 0; + +error: + kfree(name); return ret; } diff -Nru linux-4.19.98/drivers/mtd/lpddr/lpddr_cmds.c linux-4.19.118/drivers/mtd/lpddr/lpddr_cmds.c --- linux-4.19.98/drivers/mtd/lpddr/lpddr_cmds.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mtd/lpddr/lpddr_cmds.c 2020-04-23 08:30:24.000000000 +0000 @@ -81,7 +81,6 @@ shared = kmalloc_array(lpddr->numchips, sizeof(struct flchip_shared), GFP_KERNEL); if (!shared) { - kfree(lpddr); kfree(mtd); return NULL; } diff -Nru linux-4.19.98/drivers/mtd/nand/onenand/onenand_base.c linux-4.19.118/drivers/mtd/nand/onenand/onenand_base.c --- linux-4.19.98/drivers/mtd/nand/onenand/onenand_base.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mtd/nand/onenand/onenand_base.c 2020-04-23 08:30:24.000000000 +0000 @@ -1251,44 +1251,44 @@ stats = mtd->ecc_stats; - /* Read-while-load method */ + /* Read-while-load method */ - /* Do first load to bufferRAM */ - if (read < len) { - if (!onenand_check_bufferram(mtd, from)) { + /* Do first load to bufferRAM */ + if (read < len) { + if (!onenand_check_bufferram(mtd, from)) { this->command(mtd, ONENAND_CMD_READ, from, writesize); - ret = this->wait(mtd, FL_READING); - onenand_update_bufferram(mtd, from, !ret); + ret = this->wait(mtd, FL_READING); + onenand_update_bufferram(mtd, from, !ret); if (mtd_is_eccerr(ret)) ret = 0; - } - } + } + } thislen = min_t(int, writesize, len - read); column = from & (writesize - 1); if (column + thislen > writesize) thislen = writesize - column; - while (!ret) { - /* If there is more to load then start next load */ - from += thislen; - if (read + thislen < len) { + while (!ret) { + /* If there is more to load then start next load */ + from += thislen; + if (read + thislen < len) { this->command(mtd, ONENAND_CMD_READ, from, writesize); - /* - * Chip boundary handling in DDP - * Now we issued chip 1 read and pointed chip 1 + /* + * Chip boundary handling in DDP + * Now we issued chip 1 read and pointed chip 1 * bufferram so we have to point chip 0 bufferram. - */ - if (ONENAND_IS_DDP(this) && - unlikely(from == (this->chipsize >> 1))) { - this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2); - boundary = 1; - } else - boundary = 0; - ONENAND_SET_PREV_BUFFERRAM(this); - } - /* While load is going, read from last bufferRAM */ - this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen); + */ + if (ONENAND_IS_DDP(this) && + unlikely(from == (this->chipsize >> 1))) { + this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2); + boundary = 1; + } else + boundary = 0; + ONENAND_SET_PREV_BUFFERRAM(this); + } + /* While load is going, read from last bufferRAM */ + this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen); /* Read oob area if needed */ if (oobbuf) { @@ -1304,24 +1304,24 @@ oobcolumn = 0; } - /* See if we are done */ - read += thislen; - if (read == len) - break; - /* Set up for next read from bufferRAM */ - if (unlikely(boundary)) - this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2); - ONENAND_SET_NEXT_BUFFERRAM(this); - buf += thislen; + /* See if we are done */ + read += thislen; + if (read == len) + break; + /* Set up for next read from bufferRAM */ + if (unlikely(boundary)) + this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2); + ONENAND_SET_NEXT_BUFFERRAM(this); + buf += thislen; thislen = min_t(int, writesize, len - read); - column = 0; - cond_resched(); - /* Now wait for load */ - ret = this->wait(mtd, FL_READING); - onenand_update_bufferram(mtd, from, !ret); + column = 0; + cond_resched(); + /* Now wait for load */ + ret = this->wait(mtd, FL_READING); + onenand_update_bufferram(mtd, from, !ret); if (mtd_is_eccerr(ret)) ret = 0; - } + } /* * Return success, if no ECC failures, else -EBADMSG diff -Nru linux-4.19.98/drivers/mtd/nand/spi/core.c linux-4.19.118/drivers/mtd/nand/spi/core.c --- linux-4.19.98/drivers/mtd/nand/spi/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mtd/nand/spi/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -629,18 +629,18 @@ static bool spinand_isbad(struct nand_device *nand, const struct nand_pos *pos) { struct spinand_device *spinand = nand_to_spinand(nand); + u8 marker[2] = { }; struct nand_page_io_req req = { .pos = *pos, - .ooblen = 2, + .ooblen = sizeof(marker), .ooboffs = 0, - .oobbuf.in = spinand->oobbuf, + .oobbuf.in = marker, .mode = MTD_OPS_RAW, }; - memset(spinand->oobbuf, 0, 2); spinand_select_target(spinand, pos->target); spinand_read_page(spinand, &req, false); - if (spinand->oobbuf[0] != 0xff || spinand->oobbuf[1] != 0xff) + if (marker[0] != 0xff || marker[1] != 0xff) return true; return false; @@ -664,15 +664,16 @@ static int spinand_markbad(struct nand_device *nand, const struct nand_pos *pos) { struct spinand_device *spinand = nand_to_spinand(nand); + u8 marker[2] = { }; struct nand_page_io_req req = { .pos = *pos, .ooboffs = 0, - .ooblen = 2, - .oobbuf.out = spinand->oobbuf, + .ooblen = sizeof(marker), + .oobbuf.out = marker, + .mode = MTD_OPS_RAW, }; int ret; - /* Erase block before marking it bad. */ ret = spinand_select_target(spinand, pos->target); if (ret) return ret; @@ -681,9 +682,6 @@ if (ret) return ret; - spinand_erase_op(spinand, pos); - - memset(spinand->oobbuf, 0, 2); return spinand_write_page(spinand, &req); } diff -Nru linux-4.19.98/drivers/mtd/parsers/sharpslpart.c linux-4.19.118/drivers/mtd/parsers/sharpslpart.c --- linux-4.19.98/drivers/mtd/parsers/sharpslpart.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mtd/parsers/sharpslpart.c 2020-04-23 08:30:24.000000000 +0000 @@ -165,10 +165,10 @@ static int sharpsl_nand_init_ftl(struct mtd_info *mtd, struct sharpsl_ftl *ftl) { - unsigned int block_num, log_num, phymax; + unsigned int block_num, phymax; + int i, ret, log_num; loff_t block_adr; u8 *oob; - int i, ret; oob = kzalloc(mtd->oobsize, GFP_KERNEL); if (!oob) diff -Nru linux-4.19.98/drivers/mtd/ubi/fastmap.c linux-4.19.118/drivers/mtd/ubi/fastmap.c --- linux-4.19.98/drivers/mtd/ubi/fastmap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/mtd/ubi/fastmap.c 2020-04-23 08:30:24.000000000 +0000 @@ -73,7 +73,7 @@ return 0; for (pnum = 0; pnum < ubi->peb_count; pnum++) { - if (test_bit(pnum, seen) && ubi->lookuptbl[pnum]) { + if (!test_bit(pnum, seen) && ubi->lookuptbl[pnum]) { ubi_err(ubi, "self-check failed for PEB %d, fastmap didn't see it", pnum); ret = -EINVAL; } @@ -1146,7 +1146,7 @@ struct rb_node *tmp_rb; int ret, i, j, free_peb_count, used_peb_count, vol_count; int scrub_peb_count, erase_peb_count; - unsigned long *seen_pebs = NULL; + unsigned long *seen_pebs; fm_raw = ubi->fm_buf; memset(ubi->fm_buf, 0, ubi->fm_size); @@ -1160,7 +1160,7 @@ dvbuf = new_fm_vbuf(ubi, UBI_FM_DATA_VOLUME_ID); if (!dvbuf) { ret = -ENOMEM; - goto out_kfree; + goto out_free_avbuf; } avhdr = ubi_get_vid_hdr(avbuf); @@ -1169,7 +1169,7 @@ seen_pebs = init_seen(ubi); if (IS_ERR(seen_pebs)) { ret = PTR_ERR(seen_pebs); - goto out_kfree; + goto out_free_dvbuf; } spin_lock(&ubi->volumes_lock); @@ -1337,7 +1337,7 @@ ret = ubi_io_write_vid_hdr(ubi, new_fm->e[0]->pnum, avbuf); if (ret) { ubi_err(ubi, "unable to write vid_hdr to fastmap SB!"); - goto out_kfree; + goto out_free_seen; } for (i = 0; i < new_fm->used_blocks; i++) { @@ -1359,7 +1359,7 @@ if (ret) { ubi_err(ubi, "unable to write vid_hdr to PEB %i!", new_fm->e[i]->pnum); - goto out_kfree; + goto out_free_seen; } } @@ -1369,7 +1369,7 @@ if (ret) { ubi_err(ubi, "unable to write fastmap to PEB %i!", new_fm->e[i]->pnum); - goto out_kfree; + goto out_free_seen; } } @@ -1379,10 +1379,13 @@ ret = self_check_seen(ubi, seen_pebs); dbg_bld("fastmap written!"); -out_kfree: - ubi_free_vid_buf(avbuf); - ubi_free_vid_buf(dvbuf); +out_free_seen: free_seen(seen_pebs); +out_free_dvbuf: + ubi_free_vid_buf(dvbuf); +out_free_avbuf: + ubi_free_vid_buf(avbuf); + out: return ret; } diff -Nru linux-4.19.98/drivers/net/bonding/bond_alb.c linux-4.19.118/drivers/net/bonding/bond_alb.c --- linux-4.19.98/drivers/net/bonding/bond_alb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/bonding/bond_alb.c 2020-04-23 08:30:24.000000000 +0000 @@ -66,11 +66,6 @@ }; #pragma pack() -static inline struct arp_pkt *arp_pkt(const struct sk_buff *skb) -{ - return (struct arp_pkt *)skb_network_header(skb); -} - /* Forward declaration */ static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[], bool strict_match); @@ -568,10 +563,11 @@ spin_unlock(&bond->mode_lock); } -static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bond) +static struct slave *rlb_choose_channel(struct sk_buff *skb, + struct bonding *bond, + const struct arp_pkt *arp) { struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); - struct arp_pkt *arp = arp_pkt(skb); struct slave *assigned_slave, *curr_active_slave; struct rlb_client_info *client_info; u32 hash_index = 0; @@ -668,8 +664,12 @@ */ static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond) { - struct arp_pkt *arp = arp_pkt(skb); struct slave *tx_slave = NULL; + struct arp_pkt *arp; + + if (!pskb_network_may_pull(skb, sizeof(*arp))) + return NULL; + arp = (struct arp_pkt *)skb_network_header(skb); /* Don't modify or load balance ARPs that do not originate locally * (e.g.,arrive via a bridge). @@ -679,7 +679,7 @@ if (arp->op_code == htons(ARPOP_REPLY)) { /* the arp must be sent on the selected rx channel */ - tx_slave = rlb_choose_channel(skb, bond); + tx_slave = rlb_choose_channel(skb, bond, arp); if (tx_slave) bond_hw_addr_copy(arp->mac_src, tx_slave->dev->dev_addr, tx_slave->dev->addr_len); @@ -690,7 +690,7 @@ * When the arp reply is received the entry will be updated * with the correct unicast address of the client. */ - rlb_choose_channel(skb, bond); + rlb_choose_channel(skb, bond, arp); /* The ARP reply packets must be delayed so that * they can cancel out the influence of the ARP request. @@ -1399,26 +1399,31 @@ bool do_tx_balance = true; u32 hash_index = 0; const u8 *hash_start = NULL; - struct ipv6hdr *ip6hdr; skb_reset_mac_header(skb); eth_data = eth_hdr(skb); switch (ntohs(skb->protocol)) { case ETH_P_IP: { - const struct iphdr *iph = ip_hdr(skb); + const struct iphdr *iph; if (is_broadcast_ether_addr(eth_data->h_dest) || - iph->daddr == ip_bcast || - iph->protocol == IPPROTO_IGMP) { + !pskb_network_may_pull(skb, sizeof(*iph))) { + do_tx_balance = false; + break; + } + iph = ip_hdr(skb); + if (iph->daddr == ip_bcast || iph->protocol == IPPROTO_IGMP) { do_tx_balance = false; break; } hash_start = (char *)&(iph->daddr); hash_size = sizeof(iph->daddr); - } break; - case ETH_P_IPV6: + } + case ETH_P_IPV6: { + const struct ipv6hdr *ip6hdr; + /* IPv6 doesn't really use broadcast mac address, but leave * that here just in case. */ @@ -1435,7 +1440,11 @@ break; } - /* Additianally, DAD probes should not be tx-balanced as that + if (!pskb_network_may_pull(skb, sizeof(*ip6hdr))) { + do_tx_balance = false; + break; + } + /* Additionally, DAD probes should not be tx-balanced as that * will lead to false positives for duplicate addresses and * prevent address configuration from working. */ @@ -1445,17 +1454,26 @@ break; } - hash_start = (char *)&(ipv6_hdr(skb)->daddr); - hash_size = sizeof(ipv6_hdr(skb)->daddr); + hash_start = (char *)&ip6hdr->daddr; + hash_size = sizeof(ip6hdr->daddr); break; - case ETH_P_IPX: - if (ipx_hdr(skb)->ipx_checksum != IPX_NO_CHECKSUM) { + } + case ETH_P_IPX: { + const struct ipxhdr *ipxhdr; + + if (pskb_network_may_pull(skb, sizeof(*ipxhdr))) { + do_tx_balance = false; + break; + } + ipxhdr = (struct ipxhdr *)skb_network_header(skb); + + if (ipxhdr->ipx_checksum != IPX_NO_CHECKSUM) { /* something is wrong with this packet */ do_tx_balance = false; break; } - if (ipx_hdr(skb)->ipx_type != IPX_TYPE_NCP) { + if (ipxhdr->ipx_type != IPX_TYPE_NCP) { /* The only protocol worth balancing in * this family since it has an "ARP" like * mechanism @@ -1464,9 +1482,11 @@ break; } + eth_data = eth_hdr(skb); hash_start = (char *)eth_data->h_dest; hash_size = ETH_ALEN; break; + } case ETH_P_ARP: do_tx_balance = false; if (bond_info->rlb_enabled) diff -Nru linux-4.19.98/drivers/net/can/dev.c linux-4.19.118/drivers/net/can/dev.c --- linux-4.19.98/drivers/net/can/dev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/can/dev.c 2020-04-23 08:30:24.000000000 +0000 @@ -892,6 +892,7 @@ = { .len = sizeof(struct can_bittiming) }, [IFLA_CAN_DATA_BITTIMING_CONST] = { .len = sizeof(struct can_bittiming_const) }, + [IFLA_CAN_TERMINATION] = { .type = NLA_U16 }, }; static int can_validate(struct nlattr *tb[], struct nlattr *data[], diff -Nru linux-4.19.98/drivers/net/can/slcan.c linux-4.19.118/drivers/net/can/slcan.c --- linux-4.19.98/drivers/net/can/slcan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/can/slcan.c 2020-04-23 08:30:24.000000000 +0000 @@ -147,7 +147,7 @@ u32 tmpid; char *cmd = sl->rbuff; - cf.can_id = 0; + memset(&cf, 0, sizeof(cf)); switch (*cmd) { case 'r': @@ -186,8 +186,6 @@ else return; - *(u64 *) (&cf.data) = 0; /* clear payload */ - /* RTR frames may have a dlc > 0 but they never have any data bytes */ if (!(cf.can_id & CAN_RTR_FLAG)) { for (i = 0; i < cf.can_dlc; i++) { @@ -343,9 +341,16 @@ */ static void slcan_write_wakeup(struct tty_struct *tty) { - struct slcan *sl = tty->disc_data; + struct slcan *sl; + + rcu_read_lock(); + sl = rcu_dereference(tty->disc_data); + if (!sl) + goto out; schedule_work(&sl->tx_work); +out: + rcu_read_unlock(); } /* Send a can_frame to a TTY queue. */ @@ -614,7 +619,10 @@ tty->disc_data = NULL; clear_bit(SLF_INUSE, &sl->flags); slc_free_netdev(sl->dev); + /* do not call free_netdev before rtnl_unlock */ + rtnl_unlock(); free_netdev(sl->dev); + return err; err_exit: rtnl_unlock(); @@ -640,10 +648,11 @@ return; spin_lock_bh(&sl->lock); - tty->disc_data = NULL; + rcu_assign_pointer(tty->disc_data, NULL); sl->tty = NULL; spin_unlock_bh(&sl->lock); + synchronize_rcu(); flush_work(&sl->tx_work); /* Flush network side */ diff -Nru linux-4.19.98/drivers/net/dsa/b53/b53_common.c linux-4.19.118/drivers/net/dsa/b53/b53_common.c --- linux-4.19.98/drivers/net/dsa/b53/b53_common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/b53/b53_common.c 2020-04-23 08:30:24.000000000 +0000 @@ -343,7 +343,8 @@ b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_CTRL, mgmt); } -static void b53_enable_vlan(struct b53_device *dev, bool enable) +static void b53_enable_vlan(struct b53_device *dev, bool enable, + bool enable_filtering) { u8 mgmt, vc0, vc1, vc4 = 0, vc5; @@ -368,8 +369,13 @@ vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID; vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN; vc4 &= ~VC4_ING_VID_CHECK_MASK; - vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S; - vc5 |= VC5_DROP_VTABLE_MISS; + if (enable_filtering) { + vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S; + vc5 |= VC5_DROP_VTABLE_MISS; + } else { + vc4 |= VC4_ING_VID_VIO_FWD << VC4_ING_VID_CHECK_S; + vc5 &= ~VC5_DROP_VTABLE_MISS; + } if (is5325(dev)) vc0 &= ~VC0_RESERVED_1; @@ -419,6 +425,9 @@ } b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt); + + dev->vlan_enabled = enable; + dev->vlan_filtering_enabled = enable_filtering; } static int b53_set_jumbo(struct b53_device *dev, bool enable, bool allow_10_100) @@ -622,25 +631,35 @@ b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc); } +static u16 b53_default_pvid(struct b53_device *dev) +{ + if (is5325(dev) || is5365(dev)) + return 1; + else + return 0; +} + int b53_configure_vlan(struct dsa_switch *ds) { struct b53_device *dev = ds->priv; struct b53_vlan vl = { 0 }; - int i; + int i, def_vid; + + def_vid = b53_default_pvid(dev); /* clear all vlan entries */ if (is5325(dev) || is5365(dev)) { - for (i = 1; i < dev->num_vlans; i++) + for (i = def_vid; i < dev->num_vlans; i++) b53_set_vlan_entry(dev, i, &vl); } else { b53_do_vlan_op(dev, VTA_CMD_CLEAR); } - b53_enable_vlan(dev, false); + b53_enable_vlan(dev, dev->vlan_enabled, dev->vlan_filtering_enabled); b53_for_each_port(dev, i) b53_write16(dev, B53_VLAN_PAGE, - B53_VLAN_PORT_DEF_TAG(i), 1); + B53_VLAN_PORT_DEF_TAG(i), def_vid); if (!is5325(dev) && !is5365(dev)) b53_set_jumbo(dev, dev->enable_jumbo, false); @@ -1071,6 +1090,46 @@ int b53_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering) { + struct b53_device *dev = ds->priv; + struct net_device *bridge_dev; + unsigned int i; + u16 pvid, new_pvid; + + /* Handle the case were multiple bridges span the same switch device + * and one of them has a different setting than what is being requested + * which would be breaking filtering semantics for any of the other + * bridge devices. + */ + b53_for_each_port(dev, i) { + bridge_dev = dsa_to_port(ds, i)->bridge_dev; + if (bridge_dev && + bridge_dev != dsa_to_port(ds, port)->bridge_dev && + br_vlan_enabled(bridge_dev) != vlan_filtering) { + netdev_err(bridge_dev, + "VLAN filtering is global to the switch!\n"); + return -EINVAL; + } + } + + b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), &pvid); + new_pvid = pvid; + if (dev->vlan_filtering_enabled && !vlan_filtering) { + /* Filtering is currently enabled, use the default PVID since + * the bridge does not expect tagging anymore + */ + dev->ports[port].pvid = pvid; + new_pvid = b53_default_pvid(dev); + } else if (!dev->vlan_filtering_enabled && vlan_filtering) { + /* Filtering is currently disabled, restore the previous PVID */ + new_pvid = dev->ports[port].pvid; + } + + if (pvid != new_pvid) + b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), + new_pvid); + + b53_enable_vlan(dev, dev->vlan_enabled, vlan_filtering); + return 0; } EXPORT_SYMBOL(b53_vlan_filtering); @@ -1086,7 +1145,7 @@ if (vlan->vid_end > dev->num_vlans) return -ERANGE; - b53_enable_vlan(dev, true); + b53_enable_vlan(dev, true, dev->vlan_filtering_enabled); return 0; } @@ -1106,6 +1165,9 @@ b53_get_vlan_entry(dev, vid, vl); + if (vid == 0 && vid == b53_default_pvid(dev)) + untagged = true; + vl->members |= BIT(port); if (untagged && !dsa_is_cpu_port(ds, port)) vl->untag |= BIT(port); @@ -1116,7 +1178,7 @@ b53_fast_age_vlan(dev, vid); } - if (pvid) { + if (pvid && !dsa_is_cpu_port(ds, port)) { b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), vlan->vid_end); b53_fast_age_vlan(dev, vid); @@ -1142,12 +1204,8 @@ vl->members &= ~BIT(port); - if (pvid == vid) { - if (is5325(dev) || is5365(dev)) - pvid = 1; - else - pvid = 0; - } + if (pvid == vid) + pvid = b53_default_pvid(dev); if (untagged && !dsa_is_cpu_port(ds, port)) vl->untag &= ~(BIT(port)); @@ -1460,10 +1518,7 @@ b53_write16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(port), pvlan); dev->ports[port].vlan_ctl_mask = pvlan; - if (is5325(dev) || is5365(dev)) - pvid = 1; - else - pvid = 0; + pvid = b53_default_pvid(dev); /* Make this port join all VLANs without VLAN entries */ if (is58xx(dev)) { diff -Nru linux-4.19.98/drivers/net/dsa/b53/b53_priv.h linux-4.19.118/drivers/net/dsa/b53/b53_priv.h --- linux-4.19.98/drivers/net/dsa/b53/b53_priv.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/b53/b53_priv.h 2020-04-23 08:30:24.000000000 +0000 @@ -73,6 +73,7 @@ struct b53_port { u16 vlan_ctl_mask; struct ethtool_eee eee; + u16 pvid; }; struct b53_vlan { @@ -118,6 +119,8 @@ unsigned int num_vlans; struct b53_vlan *vlans; + bool vlan_enabled; + bool vlan_filtering_enabled; unsigned int num_ports; struct b53_port *ports; }; diff -Nru linux-4.19.98/drivers/net/dsa/bcm_sf2.c linux-4.19.118/drivers/net/dsa/bcm_sf2.c --- linux-4.19.98/drivers/net/dsa/bcm_sf2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/bcm_sf2.c 2020-04-23 08:30:24.000000000 +0000 @@ -73,6 +73,7 @@ /* Force link status for IMP port */ reg = core_readl(priv, offset); reg |= (MII_SW_OR | LINK_STS); + reg &= ~GMII_SPEED_UP_2G; core_writel(priv, reg, offset); /* Enable Broadcast, Multicast, Unicast forwarding to IMP port */ @@ -460,7 +461,7 @@ priv->slave_mii_bus->parent = ds->dev->parent; priv->slave_mii_bus->phy_mask = ~priv->indir_phy_mask; - err = of_mdiobus_register(priv->slave_mii_bus, dn); + err = mdiobus_register(priv->slave_mii_bus); if (err && dn) of_node_put(dn); @@ -1013,6 +1014,7 @@ const struct bcm_sf2_of_data *data; struct b53_platform_data *pdata; struct dsa_switch_ops *ops; + struct device_node *ports; struct bcm_sf2_priv *priv; struct b53_device *dev; struct dsa_switch *ds; @@ -1076,7 +1078,11 @@ set_bit(0, priv->cfp.used); set_bit(0, priv->cfp.unique); - bcm_sf2_identify_ports(priv, dn->child); + ports = of_find_node_by_name(dn, "ports"); + if (ports) { + bcm_sf2_identify_ports(priv, ports); + of_node_put(ports); + } priv->irq0 = irq_of_parse_and_map(dn, 0); priv->irq1 = irq_of_parse_and_map(dn, 1); diff -Nru linux-4.19.98/drivers/net/dsa/bcm_sf2_cfp.c linux-4.19.118/drivers/net/dsa/bcm_sf2_cfp.c --- linux-4.19.98/drivers/net/dsa/bcm_sf2_cfp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/bcm_sf2_cfp.c 2020-04-23 08:30:24.000000000 +0000 @@ -742,17 +742,14 @@ fs->m_ext.data[1])) return -EINVAL; - if (fs->location != RX_CLS_LOC_ANY && fs->location >= CFP_NUM_RULES) + if (fs->location != RX_CLS_LOC_ANY && + fs->location > bcm_sf2_cfp_rule_size(priv)) return -EINVAL; if (fs->location != RX_CLS_LOC_ANY && test_bit(fs->location, priv->cfp.used)) return -EBUSY; - if (fs->location != RX_CLS_LOC_ANY && - fs->location > bcm_sf2_cfp_rule_size(priv)) - return -EINVAL; - /* This rule is a Wake-on-LAN filter and we must specifically * target the CPU port in order for it to be working. */ @@ -839,7 +836,7 @@ u32 next_loc = 0; int ret; - if (loc >= CFP_NUM_RULES) + if (loc > bcm_sf2_cfp_rule_size(priv)) return -EINVAL; /* Refuse deleting unused rules, and those that are not unique since diff -Nru linux-4.19.98/drivers/net/dsa/mt7530.c linux-4.19.118/drivers/net/dsa/mt7530.c --- linux-4.19.98/drivers/net/dsa/mt7530.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/mt7530.c 2020-04-23 08:30:24.000000000 +0000 @@ -549,7 +549,7 @@ static void mt7530_port_set_status(struct mt7530_priv *priv, int port, int enable) { - u32 mask = PMCR_TX_EN | PMCR_RX_EN; + u32 mask = PMCR_TX_EN | PMCR_RX_EN | PMCR_FORCE_LNK; if (enable) mt7530_set(priv, MT7530_PMCR_P(port), mask); @@ -824,8 +824,9 @@ */ mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK, MT7530_PORT_MATRIX_MODE); - mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK, - VLAN_ATTR(MT7530_VLAN_TRANSPARENT)); + mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK, + VLAN_ATTR(MT7530_VLAN_TRANSPARENT) | + PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); priv->ports[port].vlan_filtering = false; @@ -843,8 +844,8 @@ if (all_user_ports_removed) { mt7530_write(priv, MT7530_PCR_P(MT7530_CPU_PORT), PCR_MATRIX(dsa_user_ports(priv->ds))); - mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), - PORT_SPEC_TAG); + mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), PORT_SPEC_TAG + | PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); } } @@ -870,8 +871,9 @@ /* Set the port as a user port which is to be able to recognize VID * from incoming packets before fetching entry within the VLAN table. */ - mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK, - VLAN_ATTR(MT7530_VLAN_USER)); + mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK, + VLAN_ATTR(MT7530_VLAN_USER) | + PVC_EG_TAG(MT7530_VLAN_EG_DISABLED)); } static void @@ -1297,6 +1299,10 @@ mt7530_cpu_port_enable(priv, i); else mt7530_port_disable(ds, i, NULL); + + /* Enable consistent egress tag */ + mt7530_rmw(priv, MT7530_PVC_P(i), PVC_EG_TAG_MASK, + PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); } /* Flush the FDB table */ diff -Nru linux-4.19.98/drivers/net/dsa/mt7530.h linux-4.19.118/drivers/net/dsa/mt7530.h --- linux-4.19.98/drivers/net/dsa/mt7530.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/mt7530.h 2020-04-23 08:30:24.000000000 +0000 @@ -167,9 +167,16 @@ /* Register for port vlan control */ #define MT7530_PVC_P(x) (0x2010 + ((x) * 0x100)) #define PORT_SPEC_TAG BIT(5) +#define PVC_EG_TAG(x) (((x) & 0x7) << 8) +#define PVC_EG_TAG_MASK PVC_EG_TAG(7) #define VLAN_ATTR(x) (((x) & 0x3) << 6) #define VLAN_ATTR_MASK VLAN_ATTR(3) +enum mt7530_vlan_port_eg_tag { + MT7530_VLAN_EG_DISABLED = 0, + MT7530_VLAN_EG_CONSISTENT = 1, +}; + enum mt7530_vlan_port_attr { MT7530_VLAN_USER = 0, MT7530_VLAN_TRANSPARENT = 3, diff -Nru linux-4.19.98/drivers/net/dsa/qca8k.c linux-4.19.118/drivers/net/dsa/qca8k.c --- linux-4.19.98/drivers/net/dsa/qca8k.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/qca8k.c 2020-04-23 08:30:24.000000000 +0000 @@ -451,6 +451,18 @@ qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); break; + case PHY_INTERFACE_MODE_RGMII_ID: + /* RGMII_ID needs internal delay. This is enabled through + * PORT5_PAD_CTRL for all ports, rather than individual port + * registers + */ + qca8k_write(priv, reg, + QCA8K_PORT_PAD_RGMII_EN | + QCA8K_PORT_PAD_RGMII_TX_DELAY(QCA8K_MAX_DELAY) | + QCA8K_PORT_PAD_RGMII_RX_DELAY(QCA8K_MAX_DELAY)); + qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL, + QCA8K_PORT_PAD_RGMII_RX_DELAY_EN); + break; case PHY_INTERFACE_MODE_SGMII: qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN); break; diff -Nru linux-4.19.98/drivers/net/dsa/qca8k.h linux-4.19.118/drivers/net/dsa/qca8k.h --- linux-4.19.98/drivers/net/dsa/qca8k.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/dsa/qca8k.h 2020-04-23 08:30:24.000000000 +0000 @@ -40,6 +40,7 @@ ((0x8 + (x & 0x3)) << 22) #define QCA8K_PORT_PAD_RGMII_RX_DELAY(x) \ ((0x10 + (x & 0x3)) << 20) +#define QCA8K_MAX_DELAY 3 #define QCA8K_PORT_PAD_RGMII_RX_DELAY_EN BIT(24) #define QCA8K_PORT_PAD_SGMII_EN BIT(7) #define QCA8K_REG_MODULE_EN 0x030 diff -Nru linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_com.c linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_com.c --- linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_com.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_com.c 2020-04-23 08:30:24.000000000 +0000 @@ -201,6 +201,11 @@ static struct ena_comp_ctx *get_comp_ctxt(struct ena_com_admin_queue *queue, u16 command_id, bool capture) { + if (unlikely(!queue->comp_ctx)) { + pr_err("Completion context is NULL\n"); + return NULL; + } + if (unlikely(command_id >= queue->q_depth)) { pr_err("command id is larger than the queue size. cmd_id: %u queue size %d\n", command_id, queue->q_depth); @@ -842,6 +847,24 @@ 0); } +static void ena_com_hash_key_fill_default_key(struct ena_com_dev *ena_dev) +{ + struct ena_admin_feature_rss_flow_hash_control *hash_key = + (ena_dev->rss).hash_key; + + netdev_rss_key_fill(&hash_key->key, sizeof(hash_key->key)); + /* The key is stored in the device in u32 array + * as well as the API requires the key to be passed in this + * format. Thus the size of our array should be divided by 4 + */ + hash_key->keys_num = sizeof(hash_key->key) / sizeof(u32); +} + +int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev) +{ + return ena_dev->rss.hash_func; +} + static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev) { struct ena_rss *rss = &ena_dev->rss; @@ -2008,7 +2031,7 @@ if (unlikely(ret)) return ret; - if (get_resp.u.flow_hash_func.supported_func & (1 << rss->hash_func)) { + if (!(get_resp.u.flow_hash_func.supported_func & BIT(rss->hash_func))) { pr_err("Func hash %d isn't supported by device, abort\n", rss->hash_func); return -EOPNOTSUPP; @@ -2075,15 +2098,16 @@ switch (func) { case ENA_ADMIN_TOEPLITZ: - if (key_len > sizeof(hash_key->key)) { - pr_err("key len (%hu) is bigger than the max supported (%zu)\n", - key_len, sizeof(hash_key->key)); - return -EINVAL; + if (key) { + if (key_len != sizeof(hash_key->key)) { + pr_err("key len (%hu) doesn't equal the supported size (%zu)\n", + key_len, sizeof(hash_key->key)); + return -EINVAL; + } + memcpy(hash_key->key, key, key_len); + rss->hash_init_val = init_val; + hash_key->keys_num = key_len >> 2; } - - memcpy(hash_key->key, key, key_len); - rss->hash_init_val = init_val; - hash_key->keys_num = key_len >> 2; break; case ENA_ADMIN_CRC32: rss->hash_init_val = init_val; @@ -2093,6 +2117,7 @@ return -EINVAL; } + rss->hash_func = func; rc = ena_com_set_hash_function(ena_dev); /* Restore the old function */ @@ -2119,7 +2144,11 @@ if (unlikely(rc)) return rc; - rss->hash_func = get_resp.u.flow_hash_func.selected_func; + /* ffs() returns 1 in case the lsb is set */ + rss->hash_func = ffs(get_resp.u.flow_hash_func.selected_func); + if (rss->hash_func) + rss->hash_func--; + if (func) *func = rss->hash_func; @@ -2407,6 +2436,8 @@ if (unlikely(rc)) goto err_hash_key; + ena_com_hash_key_fill_default_key(ena_dev); + rc = ena_com_hash_ctrl_init(ena_dev); if (unlikely(rc)) goto err_hash_ctrl; diff -Nru linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_com.h linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_com.h --- linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_com.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_com.h 2020-04-23 08:30:24.000000000 +0000 @@ -42,6 +42,7 @@ #include #include #include +#include #include "ena_common_defs.h" #include "ena_admin_defs.h" @@ -631,6 +632,14 @@ */ void ena_com_rss_destroy(struct ena_com_dev *ena_dev); +/* ena_com_get_current_hash_function - Get RSS hash function + * @ena_dev: ENA communication layer struct + * + * Return the current hash function. + * @return: 0 or one of the ena_admin_hash_functions values. + */ +int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev); + /* ena_com_fill_hash_function - Fill RSS hash function * @ena_dev: ENA communication layer struct * @func: The hash function (Toeplitz or crc) diff -Nru linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_ethtool.c linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_ethtool.c --- linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_ethtool.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_ethtool.c 2020-04-23 08:30:24.000000000 +0000 @@ -649,6 +649,28 @@ return ENA_HASH_KEY_SIZE; } +static int ena_indirection_table_get(struct ena_adapter *adapter, u32 *indir) +{ + struct ena_com_dev *ena_dev = adapter->ena_dev; + int i, rc; + + if (!indir) + return 0; + + rc = ena_com_indirect_table_get(ena_dev, indir); + if (rc) + return rc; + + /* Our internal representation of the indices is: even indices + * for Tx and uneven indices for Rx. We need to convert the Rx + * indices to be consecutive + */ + for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) + indir[i] = ENA_IO_RXQ_IDX_TO_COMBINED_IDX(indir[i]); + + return rc; +} + static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, u8 *hfunc) { @@ -657,11 +679,25 @@ u8 func; int rc; - rc = ena_com_indirect_table_get(adapter->ena_dev, indir); + rc = ena_indirection_table_get(adapter, indir); if (rc) return rc; + /* We call this function in order to check if the device + * supports getting/setting the hash function. + */ rc = ena_com_get_hash_function(adapter->ena_dev, &ena_func, key); + + if (rc) { + if (rc == -EOPNOTSUPP) { + key = NULL; + hfunc = NULL; + rc = 0; + } + + return rc; + } + if (rc) return rc; @@ -670,7 +706,7 @@ func = ETH_RSS_HASH_TOP; break; case ENA_ADMIN_CRC32: - func = ETH_RSS_HASH_XOR; + func = ETH_RSS_HASH_CRC32; break; default: netif_err(adapter, drv, netdev, @@ -695,8 +731,8 @@ if (indir) { for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) { rc = ena_com_indirect_table_fill_entry(ena_dev, - ENA_IO_RXQ_IDX(indir[i]), - i); + i, + ENA_IO_RXQ_IDX(indir[i])); if (unlikely(rc)) { netif_err(adapter, drv, netdev, "Cannot fill indirect table (index is too large)\n"); @@ -713,10 +749,13 @@ } switch (hfunc) { + case ETH_RSS_HASH_NO_CHANGE: + func = ena_com_get_current_hash_function(ena_dev); + break; case ETH_RSS_HASH_TOP: func = ENA_ADMIN_TOEPLITZ; break; - case ETH_RSS_HASH_XOR: + case ETH_RSS_HASH_CRC32: func = ENA_ADMIN_CRC32; break; default: @@ -817,6 +856,7 @@ .get_channels = ena_get_channels, .get_tunable = ena_get_tunable, .set_tunable = ena_set_tunable, + .get_ts_info = ethtool_op_get_ts_info, }; void ena_set_ethtool_ops(struct net_device *netdev) diff -Nru linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_netdev.c linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_netdev.c --- linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_netdev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_netdev.c 2020-04-23 08:30:24.000000000 +0000 @@ -1800,6 +1800,7 @@ err_setup_tx: ena_free_io_irq(adapter); err_req_irq: + ena_del_napi(adapter); return rc; } @@ -2846,8 +2847,8 @@ if (adapter->keep_alive_timeout == ENA_HW_HINTS_NO_TIMEOUT) return; - keep_alive_expired = round_jiffies(adapter->last_keep_alive_jiffies + - adapter->keep_alive_timeout); + keep_alive_expired = adapter->last_keep_alive_jiffies + + adapter->keep_alive_timeout; if (unlikely(time_is_before_jiffies(keep_alive_expired))) { netif_err(adapter, drv, adapter->netdev, "Keep alive watchdog timeout.\n"); @@ -2949,7 +2950,7 @@ } /* Reset the timer */ - mod_timer(&adapter->timer_service, jiffies + HZ); + mod_timer(&adapter->timer_service, round_jiffies(jiffies + HZ)); } static int ena_calc_io_queue_num(struct pci_dev *pdev, diff -Nru linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_netdev.h linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_netdev.h --- linux-4.19.98/drivers/net/ethernet/amazon/ena/ena_netdev.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/amazon/ena/ena_netdev.h 2020-04-23 08:30:24.000000000 +0000 @@ -113,6 +113,8 @@ #define ENA_IO_TXQ_IDX(q) (2 * (q)) #define ENA_IO_RXQ_IDX(q) (2 * (q) + 1) +#define ENA_IO_TXQ_IDX_TO_COMBINED_IDX(q) ((q) / 2) +#define ENA_IO_RXQ_IDX_TO_COMBINED_IDX(q) (((q) - 1) / 2) #define ENA_MGMNT_IRQ_IDX 0 #define ENA_IO_IRQ_FIRST_IDX 1 diff -Nru linux-4.19.98/drivers/net/ethernet/amd/xgbe/xgbe-drv.c linux-4.19.118/drivers/net/ethernet/amd/xgbe/xgbe-drv.c --- linux-4.19.98/drivers/net/ethernet/amd/xgbe/xgbe-drv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/amd/xgbe/xgbe-drv.c 2020-04-23 08:30:24.000000000 +0000 @@ -515,7 +515,7 @@ xgbe_disable_rx_tx_ints(pdata); /* Turn on polling */ - __napi_schedule_irqoff(&pdata->napi); + __napi_schedule(&pdata->napi); } } else { /* Don't clear Rx/Tx status if doing per channel DMA diff -Nru linux-4.19.98/drivers/net/ethernet/apm/xgene/xgene_enet_main.c linux-4.19.118/drivers/net/ethernet/apm/xgene/xgene_enet_main.c --- linux-4.19.98/drivers/net/ethernet/apm/xgene/xgene_enet_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/apm/xgene/xgene_enet_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2034,7 +2034,7 @@ int ret; ndev = alloc_etherdev_mqs(sizeof(struct xgene_enet_pdata), - XGENE_NUM_RX_RING, XGENE_NUM_TX_RING); + XGENE_NUM_TX_RING, XGENE_NUM_RX_RING); if (!ndev) return -ENOMEM; diff -Nru linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/aq_nic.c linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/aq_nic.c --- linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/aq_nic.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/aq_nic.c 2020-04-23 08:30:24.000000000 +0000 @@ -399,8 +399,10 @@ dx_buff->len, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(aq_nic_get_dev(self), dx_buff->pa))) + if (unlikely(dma_mapping_error(aq_nic_get_dev(self), dx_buff->pa))) { + ret = 0; goto exit; + } first = dx_buff; dx_buff->len_pkt = skb->len; @@ -530,10 +532,6 @@ if (likely(frags)) { err = self->aq_hw_ops->hw_ring_tx_xmit(self->aq_hw, ring, frags); - if (err >= 0) { - ++ring->stats.tx.packets; - ring->stats.tx.bytes += skb->len; - } } else { err = NETDEV_TX_BUSY; } diff -Nru linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/aq_ring.c linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/aq_ring.c --- linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/aq_ring.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/aq_ring.c 2020-04-23 08:30:24.000000000 +0000 @@ -162,9 +162,12 @@ } } - if (unlikely(buff->is_eop)) - dev_kfree_skb_any(buff->skb); + if (unlikely(buff->is_eop)) { + ++self->stats.rx.packets; + self->stats.tx.bytes += buff->skb->len; + dev_kfree_skb_any(buff->skb); + } buff->pa = 0U; buff->eop_index = 0xffffU; self->sw_head = aq_ring_next_dx(self, self->sw_head); diff -Nru linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/aq_vec.c linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/aq_vec.c --- linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/aq_vec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/aq_vec.c 2020-04-23 08:30:24.000000000 +0000 @@ -309,15 +309,13 @@ { struct aq_vec_s *self = private; u64 irq_mask = 0U; - irqreturn_t err = 0; + int err; - if (!self) { - err = -EINVAL; - goto err_exit; - } + if (!self) + return IRQ_NONE; err = self->aq_hw_ops->hw_irq_read(self->aq_hw, &irq_mask); if (err < 0) - goto err_exit; + return IRQ_NONE; if (irq_mask) { self->aq_hw_ops->hw_irq_disable(self->aq_hw, @@ -325,11 +323,10 @@ napi_schedule(&self->napi); } else { self->aq_hw_ops->hw_irq_enable(self->aq_hw, 1U); - err = IRQ_NONE; + return IRQ_NONE; } -err_exit: - return err >= 0 ? IRQ_HANDLED : IRQ_NONE; + return IRQ_HANDLED; } cpumask_t *aq_vec_get_affinity_mask(struct aq_vec_s *self) diff -Nru linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c --- linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c 2020-04-23 08:30:24.000000000 +0000 @@ -207,8 +207,8 @@ u32 i = 0U; u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues); int err = 0; - u16 bitary[(HW_ATL_A0_RSS_REDIRECTION_MAX * - HW_ATL_A0_RSS_REDIRECTION_BITS / 16U)]; + u16 bitary[1 + (HW_ATL_A0_RSS_REDIRECTION_MAX * + HW_ATL_A0_RSS_REDIRECTION_BITS / 16U)]; memset(bitary, 0, sizeof(bitary)); diff -Nru linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c --- linux-4.19.98/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c 2020-04-23 08:30:24.000000000 +0000 @@ -192,8 +192,8 @@ u32 i = 0U; u32 num_rss_queues = max(1U, self->aq_nic_cfg->num_rss_queues); int err = 0; - u16 bitary[(HW_ATL_B0_RSS_REDIRECTION_MAX * - HW_ATL_B0_RSS_REDIRECTION_BITS / 16U)]; + u16 bitary[1 + (HW_ATL_B0_RSS_REDIRECTION_MAX * + HW_ATL_B0_RSS_REDIRECTION_BITS / 16U)]; memset(bitary, 0, sizeof(bitary)); diff -Nru linux-4.19.98/drivers/net/ethernet/broadcom/b44.c linux-4.19.118/drivers/net/ethernet/broadcom/b44.c --- linux-4.19.98/drivers/net/ethernet/broadcom/b44.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/broadcom/b44.c 2020-04-23 08:30:24.000000000 +0000 @@ -1519,8 +1519,10 @@ int ethaddr_bytes = ETH_ALEN; memset(ppattern + offset, 0xff, magicsync); - for (j = 0; j < magicsync; j++) - set_bit(len++, (unsigned long *) pmask); + for (j = 0; j < magicsync; j++) { + pmask[len >> 3] |= BIT(len & 7); + len++; + } for (j = 0; j < B44_MAX_PATTERNS; j++) { if ((B44_PATTERN_SIZE - len) >= ETH_ALEN) @@ -1532,7 +1534,8 @@ for (k = 0; k< ethaddr_bytes; k++) { ppattern[offset + magicsync + (j * ETH_ALEN) + k] = macaddr[k]; - set_bit(len++, (unsigned long *) pmask); + pmask[len >> 3] |= BIT(len & 7); + len++; } } return len - 1; diff -Nru linux-4.19.98/drivers/net/ethernet/broadcom/bcmsysport.c linux-4.19.118/drivers/net/ethernet/broadcom/bcmsysport.c --- linux-4.19.98/drivers/net/ethernet/broadcom/bcmsysport.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/broadcom/bcmsysport.c 2020-04-23 08:30:24.000000000 +0000 @@ -2168,7 +2168,7 @@ return -ENOSPC; index = find_first_zero_bit(priv->filters, RXCHK_BRCM_TAG_MAX); - if (index > RXCHK_BRCM_TAG_MAX) + if (index >= RXCHK_BRCM_TAG_MAX) return -ENOSPC; /* Location is the classification ID, and index is the position @@ -2470,7 +2470,7 @@ priv->phy_interface = of_get_phy_mode(dn); /* Default to GMII interface mode */ - if (priv->phy_interface < 0) + if ((int)priv->phy_interface < 0) priv->phy_interface = PHY_INTERFACE_MODE_GMII; /* In the case of a fixed PHY, the DT node associated @@ -2716,6 +2716,9 @@ umac_reset(priv); + /* Disable the UniMAC RX/TX */ + umac_enable_set(priv, CMD_RX_EN | CMD_TX_EN, 0); + /* We may have been suspended and never received a WOL event that * would turn off MPD detection, take care of that now */ diff -Nru linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt.c linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt.c --- linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-04-23 08:30:24.000000000 +0000 @@ -5861,7 +5861,7 @@ int tcs, i; tcs = netdev_get_num_tc(dev); - if (tcs > 1) { + if (tcs) { int i, off, count; for (i = 0; i < tcs; i++) { @@ -8097,13 +8097,13 @@ struct bnxt *bp = netdev_priv(dev); if (netif_running(dev)) - bnxt_close_nic(bp, false, false); + bnxt_close_nic(bp, true, false); dev->mtu = new_mtu; bnxt_set_ring_params(bp); if (netif_running(dev)) - return bnxt_open_nic(bp, false, false); + return bnxt_open_nic(bp, true, false); return 0; } @@ -8215,11 +8215,23 @@ struct flow_keys *keys1 = &f1->fkeys; struct flow_keys *keys2 = &f2->fkeys; - if (keys1->addrs.v4addrs.src == keys2->addrs.v4addrs.src && - keys1->addrs.v4addrs.dst == keys2->addrs.v4addrs.dst && - keys1->ports.ports == keys2->ports.ports && - keys1->basic.ip_proto == keys2->basic.ip_proto && - keys1->basic.n_proto == keys2->basic.n_proto && + if (keys1->basic.n_proto != keys2->basic.n_proto || + keys1->basic.ip_proto != keys2->basic.ip_proto) + return false; + + if (keys1->basic.n_proto == htons(ETH_P_IP)) { + if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src || + keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst) + return false; + } else { + if (memcmp(&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src, + sizeof(keys1->addrs.v6addrs.src)) || + memcmp(&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst, + sizeof(keys1->addrs.v6addrs.dst))) + return false; + } + + if (keys1->ports.ports == keys2->ports.ports && keys1->control.flags == keys2->control.flags && ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) && ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr)) @@ -8810,6 +8822,10 @@ bp->rx_nr_rings++; bp->cp_nr_rings++; } + if (rc) { + bp->tx_nr_rings = 0; + bp->rx_nr_rings = 0; + } return rc; } diff -Nru linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt.h linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt.h --- linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-04-23 08:30:24.000000000 +0000 @@ -527,6 +527,7 @@ #define DFLT_HWRM_CMD_TIMEOUT 500 #define HWRM_CMD_TIMEOUT (bp->hwrm_cmd_timeout) #define HWRM_RESET_TIMEOUT ((HWRM_CMD_TIMEOUT) * 4) +#define HWRM_COREDUMP_TIMEOUT ((HWRM_CMD_TIMEOUT) * 12) #define HWRM_RESP_ERR_CODE_MASK 0xffff #define HWRM_RESP_LEN_OFFSET 4 #define HWRM_RESP_LEN_MASK 0xffff0000 diff -Nru linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c --- linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c 2020-04-23 08:30:24.000000000 +0000 @@ -396,7 +396,7 @@ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_QUEUE_DSCP_QCAPS, -1, -1); mutex_lock(&bp->hwrm_cmd_lock); - rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + rc = _hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); if (!rc) { bp->max_dscp_value = (1 << resp->num_dscp_bits) - 1; if (bp->max_dscp_value < 0x3f) @@ -479,24 +479,26 @@ { struct bnxt *bp = netdev_priv(dev); struct ieee_ets *my_ets = bp->ieee_ets; + int rc; ets->ets_cap = bp->max_tc; if (!my_ets) { - int rc; - if (bp->dcbx_cap & DCB_CAP_DCBX_HOST) return 0; my_ets = kzalloc(sizeof(*my_ets), GFP_KERNEL); if (!my_ets) - return 0; + return -ENOMEM; rc = bnxt_hwrm_queue_cos2bw_qcfg(bp, my_ets); if (rc) - return 0; + goto error; rc = bnxt_hwrm_queue_pri2cos_qcfg(bp, my_ets); if (rc) - return 0; + goto error; + + /* cache result */ + bp->ieee_ets = my_ets; } ets->cbs = my_ets->cbs; @@ -505,6 +507,9 @@ memcpy(ets->tc_tsa, my_ets->tc_tsa, sizeof(ets->tc_tsa)); memcpy(ets->prio_tc, my_ets->prio_tc, sizeof(ets->prio_tc)); return 0; +error: + kfree(my_ets); + return rc; } static int bnxt_dcbnl_ieee_setets(struct net_device *dev, struct ieee_ets *ets) diff -Nru linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c --- linux-4.19.98/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-04-23 08:30:24.000000000 +0000 @@ -1778,21 +1778,19 @@ mutex_lock(&bp->hwrm_cmd_lock); hwrm_err = _hwrm_send_message(bp, &install, sizeof(install), INSTALL_PACKAGE_TIMEOUT); - if (hwrm_err) - goto flash_pkg_exit; - - if (resp->error_code) { + if (hwrm_err) { u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err; - if (error_code == NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { + if (resp->error_code && error_code == + NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { install.flags |= cpu_to_le16( NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG); hwrm_err = _hwrm_send_message(bp, &install, sizeof(install), INSTALL_PACKAGE_TIMEOUT); - if (hwrm_err) - goto flash_pkg_exit; } + if (hwrm_err) + goto flash_pkg_exit; } if (resp->result) { @@ -2600,7 +2598,7 @@ bool offline = false; u8 test_results = 0; u8 test_mask = 0; - int rc, i; + int rc = 0, i; if (!bp->num_tests || !BNXT_SINGLE_PF(bp)) return; @@ -2671,9 +2669,9 @@ } bnxt_hwrm_phy_loopback(bp, false, false); bnxt_half_close_nic(bp); - bnxt_open_nic(bp, false, true); + rc = bnxt_open_nic(bp, false, true); } - if (bnxt_test_irq(bp)) { + if (rc || bnxt_test_irq(bp)) { buf[BNXT_IRQ_TEST_IDX] = 1; etest->flags |= ETH_TEST_FL_FAILED; } @@ -2835,7 +2833,7 @@ req.component_id = cpu_to_le16(component_id); req.segment_id = cpu_to_le16(segment_id); - return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + return hwrm_send_message(bp, &req, sizeof(req), HWRM_COREDUMP_TIMEOUT); } static int bnxt_hwrm_dbg_coredump_retrieve(struct bnxt *bp, u16 component_id, diff -Nru linux-4.19.98/drivers/net/ethernet/broadcom/genet/bcmgenet.c linux-4.19.118/drivers/net/ethernet/broadcom/genet/bcmgenet.c --- linux-4.19.98/drivers/net/ethernet/broadcom/genet/bcmgenet.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/broadcom/genet/bcmgenet.c 2020-04-23 08:30:24.000000000 +0000 @@ -2166,8 +2166,8 @@ DMA_END_ADDR); /* Initialize Tx NAPI */ - netif_napi_add(priv->dev, &ring->napi, bcmgenet_tx_poll, - NAPI_POLL_WEIGHT); + netif_tx_napi_add(priv->dev, &ring->napi, bcmgenet_tx_poll, + NAPI_POLL_WEIGHT); } /* Initialize a RDMA ring */ diff -Nru linux-4.19.98/drivers/net/ethernet/cadence/macb_main.c linux-4.19.118/drivers/net/ethernet/cadence/macb_main.c --- linux-4.19.98/drivers/net/ethernet/cadence/macb_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/cadence/macb_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -66,7 +66,11 @@ /* Max length of transmit frame must be a multiple of 8 bytes */ #define MACB_TX_LEN_ALIGN 8 #define MACB_MAX_TX_LEN ((unsigned int)((1 << MACB_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) -#define GEM_MAX_TX_LEN ((unsigned int)((1 << GEM_TX_FRMLEN_SIZE) - 1) & ~((unsigned int)(MACB_TX_LEN_ALIGN - 1))) +/* Limit maximum TX length as per Cadence TSO errata. This is to avoid a + * false amba_error in TX path from the DMA assuming there is not enough + * space in the SRAM (16KB) even when there is. + */ +#define GEM_MAX_TX_LEN (unsigned int)(0x3FC0) #define GEM_MTU_MIN_SIZE ETH_MIN_MTU #define MACB_NETIF_LSO NETIF_F_TSO @@ -1654,16 +1658,14 @@ /* Validate LSO compatibility */ - /* there is only one buffer */ - if (!skb_is_nonlinear(skb)) + /* there is only one buffer or protocol is not UDP */ + if (!skb_is_nonlinear(skb) || (ip_hdr(skb)->protocol != IPPROTO_UDP)) return features; /* length of header */ hdrlen = skb_transport_offset(skb); - if (ip_hdr(skb)->protocol == IPPROTO_TCP) - hdrlen += tcp_hdrlen(skb); - /* For LSO: + /* For UFO only: * When software supplies two or more payload buffers all payload buffers * apart from the last must be a multiple of 8 bytes in size. */ diff -Nru linux-4.19.98/drivers/net/ethernet/cavium/thunder/thunder_bgx.c linux-4.19.118/drivers/net/ethernet/cavium/thunder/thunder_bgx.c --- linux-4.19.98/drivers/net/ethernet/cavium/thunder/thunder_bgx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/cavium/thunder/thunder_bgx.c 2020-04-23 08:30:24.000000000 +0000 @@ -413,10 +413,19 @@ lmac = &bgx->lmac[lmacid]; cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG); - if (enable) + if (enable) { cfg |= CMR_PKT_RX_EN | CMR_PKT_TX_EN; - else + + /* enable TX FIFO Underflow interrupt */ + bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1S, + GMI_TXX_INT_UNDFLW); + } else { cfg &= ~(CMR_PKT_RX_EN | CMR_PKT_TX_EN); + + /* Disable TX FIFO Underflow interrupt */ + bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1C, + GMI_TXX_INT_UNDFLW); + } bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg); if (bgx->is_rgx) @@ -1544,6 +1553,48 @@ return bgx_init_of_phy(bgx); } +static irqreturn_t bgx_intr_handler(int irq, void *data) +{ + struct bgx *bgx = (struct bgx *)data; + u64 status, val; + int lmac; + + for (lmac = 0; lmac < bgx->lmac_count; lmac++) { + status = bgx_reg_read(bgx, lmac, BGX_GMP_GMI_TXX_INT); + if (status & GMI_TXX_INT_UNDFLW) { + pci_err(bgx->pdev, "BGX%d lmac%d UNDFLW\n", + bgx->bgx_id, lmac); + val = bgx_reg_read(bgx, lmac, BGX_CMRX_CFG); + val &= ~CMR_EN; + bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val); + val |= CMR_EN; + bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val); + } + /* clear interrupts */ + bgx_reg_write(bgx, lmac, BGX_GMP_GMI_TXX_INT, status); + } + + return IRQ_HANDLED; +} + +static void bgx_register_intr(struct pci_dev *pdev) +{ + struct bgx *bgx = pci_get_drvdata(pdev); + int ret; + + ret = pci_alloc_irq_vectors(pdev, BGX_LMAC_VEC_OFFSET, + BGX_LMAC_VEC_OFFSET, PCI_IRQ_ALL_TYPES); + if (ret < 0) { + pci_err(pdev, "Req for #%d msix vectors failed\n", + BGX_LMAC_VEC_OFFSET); + return; + } + ret = pci_request_irq(pdev, GMPX_GMI_TX_INT, bgx_intr_handler, NULL, + bgx, "BGX%d", bgx->bgx_id); + if (ret) + pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx); +} + static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int err; @@ -1559,7 +1610,7 @@ pci_set_drvdata(pdev, bgx); - err = pci_enable_device(pdev); + err = pcim_enable_device(pdev); if (err) { dev_err(dev, "Failed to enable PCI device\n"); pci_set_drvdata(pdev, NULL); @@ -1613,6 +1664,8 @@ bgx_init_hw(bgx); + bgx_register_intr(pdev); + /* Enable all LMACs */ for (lmac = 0; lmac < bgx->lmac_count; lmac++) { err = bgx_lmac_enable(bgx, lmac); @@ -1629,6 +1682,7 @@ err_enable: bgx_vnic[bgx->bgx_id] = NULL; + pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx); err_release_regions: pci_release_regions(pdev); err_disable_device: @@ -1646,6 +1700,8 @@ for (lmac = 0; lmac < bgx->lmac_count; lmac++) bgx_lmac_disable(bgx, lmac); + pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx); + bgx_vnic[bgx->bgx_id] = NULL; pci_release_regions(pdev); pci_disable_device(pdev); diff -Nru linux-4.19.98/drivers/net/ethernet/cavium/thunder/thunder_bgx.h linux-4.19.118/drivers/net/ethernet/cavium/thunder/thunder_bgx.h --- linux-4.19.98/drivers/net/ethernet/cavium/thunder/thunder_bgx.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/cavium/thunder/thunder_bgx.h 2020-04-23 08:30:24.000000000 +0000 @@ -183,6 +183,15 @@ #define BGX_GMP_GMI_TXX_BURST 0x38228 #define BGX_GMP_GMI_TXX_MIN_PKT 0x38240 #define BGX_GMP_GMI_TXX_SGMII_CTL 0x38300 +#define BGX_GMP_GMI_TXX_INT 0x38500 +#define BGX_GMP_GMI_TXX_INT_W1S 0x38508 +#define BGX_GMP_GMI_TXX_INT_ENA_W1C 0x38510 +#define BGX_GMP_GMI_TXX_INT_ENA_W1S 0x38518 +#define GMI_TXX_INT_PTP_LOST BIT_ULL(4) +#define GMI_TXX_INT_LATE_COL BIT_ULL(3) +#define GMI_TXX_INT_XSDEF BIT_ULL(2) +#define GMI_TXX_INT_XSCOL BIT_ULL(1) +#define GMI_TXX_INT_UNDFLW BIT_ULL(0) #define BGX_MSIX_VEC_0_29_ADDR 0x400000 /* +(0..29) << 4 */ #define BGX_MSIX_VEC_0_29_CTL 0x400008 diff -Nru linux-4.19.98/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c linux-4.19.118/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c --- linux-4.19.98/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2449,6 +2449,8 @@ if (!is_offload(adapter)) return -EOPNOTSUPP; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; if (!(adapter->flags & FULL_INIT_DONE)) return -EIO; /* need the memory controllers */ if (copy_from_user(&t, useraddr, sizeof(t))) diff -Nru linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c --- linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -70,8 +70,7 @@ static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos) { v = seq_tab_get_idx(seq->private, *pos + 1); - if (v) - ++*pos; + ++(*pos); return v; } diff -Nru linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c --- linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -5452,7 +5452,7 @@ whoami = t4_read_reg(adapter, PL_WHOAMI_A); pci_read_config_word(pdev, PCI_DEVICE_ID, &device_id); chip = t4_get_chip_type(adapter, CHELSIO_PCI_ID_VER(device_id)); - if (chip < 0) { + if ((int)chip < 0) { dev_err(&pdev->dev, "Device %d is not supported\n", device_id); err = chip; goto out_free_adapter; diff -Nru linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ptp.c linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ptp.c --- linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ptp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/cxgb4_ptp.c 2020-04-23 08:30:24.000000000 +0000 @@ -246,6 +246,9 @@ FW_PTP_CMD_PORTID_V(0)); c.retval_len16 = cpu_to_be32(FW_CMD_LEN16_V(sizeof(c) / 16)); c.u.ts.sc = FW_PTP_SC_ADJ_FTIME; + c.u.ts.sign = (delta < 0) ? 1 : 0; + if (delta < 0) + delta = -delta; c.u.ts.tm = cpu_to_be64(delta); err = t4_wr_mbox(adapter, adapter->mbox, &c, sizeof(c), NULL); diff -Nru linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/l2t.c linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/l2t.c --- linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/l2t.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/l2t.c 2020-04-23 08:30:24.000000000 +0000 @@ -683,8 +683,7 @@ static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos) { v = l2t_get_idx(seq, *pos); - if (v) - ++*pos; + ++(*pos); return v; } diff -Nru linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/smt.c linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/smt.c --- linux-4.19.98/drivers/net/ethernet/chelsio/cxgb4/smt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/chelsio/cxgb4/smt.c 2020-04-23 08:30:24.000000000 +0000 @@ -98,11 +98,9 @@ static void t4_smte_free(struct smt_entry *e) { - spin_lock_bh(&e->lock); if (atomic_read(&e->refcnt) == 0) { /* hasn't been recycled */ e->state = SMT_STATE_UNUSED; } - spin_unlock_bh(&e->lock); } /** @@ -112,8 +110,10 @@ */ void cxgb4_smt_release(struct smt_entry *e) { + spin_lock_bh(&e->lock); if (atomic_dec_and_test(&e->refcnt)) t4_smte_free(e); + spin_unlock_bh(&e->lock); } EXPORT_SYMBOL(cxgb4_smt_release); diff -Nru linux-4.19.98/drivers/net/ethernet/cisco/enic/enic_main.c linux-4.19.118/drivers/net/ethernet/cisco/enic/enic_main.c --- linux-4.19.98/drivers/net/ethernet/cisco/enic/enic_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/cisco/enic/enic_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2013,10 +2013,10 @@ napi_disable(&enic->napi[i]); netif_carrier_off(netdev); - netif_tx_disable(netdev); if (vnic_dev_get_intr_mode(enic->vdev) == VNIC_DEV_INTR_MODE_MSIX) for (i = 0; i < enic->wq_count; i++) napi_disable(&enic->napi[enic_cq_wq(enic, i)]); + netif_tx_disable(netdev); if (!enic_is_dynamic(enic) && !enic_is_sriov_vf(enic)) enic_dev_del_station_addr(enic); diff -Nru linux-4.19.98/drivers/net/ethernet/dec/tulip/dmfe.c linux-4.19.118/drivers/net/ethernet/dec/tulip/dmfe.c --- linux-4.19.98/drivers/net/ethernet/dec/tulip/dmfe.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/dec/tulip/dmfe.c 2020-04-23 08:30:24.000000000 +0000 @@ -2222,15 +2222,16 @@ if (cr6set) dmfe_cr6_user_set = cr6set; - switch(mode) { - case DMFE_10MHF: + switch (mode) { + case DMFE_10MHF: case DMFE_100MHF: case DMFE_10MFD: case DMFE_100MFD: case DMFE_1M_HPNA: dmfe_media_mode = mode; break; - default:dmfe_media_mode = DMFE_AUTO; + default: + dmfe_media_mode = DMFE_AUTO; break; } diff -Nru linux-4.19.98/drivers/net/ethernet/dec/tulip/uli526x.c linux-4.19.118/drivers/net/ethernet/dec/tulip/uli526x.c --- linux-4.19.98/drivers/net/ethernet/dec/tulip/uli526x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/dec/tulip/uli526x.c 2020-04-23 08:30:24.000000000 +0000 @@ -1817,8 +1817,8 @@ if (cr6set) uli526x_cr6_user_set = cr6set; - switch (mode) { - case ULI526X_10MHF: + switch (mode) { + case ULI526X_10MHF: case ULI526X_100MHF: case ULI526X_10MFD: case ULI526X_100MFD: diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c linux-4.19.118/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c --- linux-4.19.98/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c 2020-04-23 08:30:24.000000000 +0000 @@ -1600,13 +1600,15 @@ * Skb freeing is not handled here. * * This function may be called on error paths in the Tx function, so guard - * against cases when not all fd relevant fields were filled in. + * against cases when not all fd relevant fields were filled in. To avoid + * reading the invalid transmission timestamp for the error paths set ts to + * false. * * Return the skb backpointer, since for S/G frames the buffer containing it * gets freed here. */ static struct sk_buff *dpaa_cleanup_tx_fd(const struct dpaa_priv *priv, - const struct qm_fd *fd) + const struct qm_fd *fd, bool ts) { const enum dma_data_direction dma_dir = DMA_TO_DEVICE; struct device *dev = priv->net_dev->dev.parent; @@ -1620,18 +1622,6 @@ skbh = (struct sk_buff **)phys_to_virt(addr); skb = *skbh; - if (priv->tx_tstamp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) { - memset(&shhwtstamps, 0, sizeof(shhwtstamps)); - - if (!fman_port_get_tstamp(priv->mac_dev->port[TX], (void *)skbh, - &ns)) { - shhwtstamps.hwtstamp = ns_to_ktime(ns); - skb_tstamp_tx(skb, &shhwtstamps); - } else { - dev_warn(dev, "fman_port_get_tstamp failed!\n"); - } - } - if (unlikely(qm_fd_get_format(fd) == qm_fd_sg)) { nr_frags = skb_shinfo(skb)->nr_frags; dma_unmap_single(dev, addr, @@ -1654,14 +1644,29 @@ dma_unmap_page(dev, qm_sg_addr(&sgt[i]), qm_sg_entry_get_len(&sgt[i]), dma_dir); } - - /* Free the page frag that we allocated on Tx */ - skb_free_frag(phys_to_virt(addr)); } else { dma_unmap_single(dev, addr, skb_tail_pointer(skb) - (u8 *)skbh, dma_dir); } + /* DMA unmapping is required before accessing the HW provided info */ + if (ts && priv->tx_tstamp && + skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) { + memset(&shhwtstamps, 0, sizeof(shhwtstamps)); + + if (!fman_port_get_tstamp(priv->mac_dev->port[TX], (void *)skbh, + &ns)) { + shhwtstamps.hwtstamp = ns_to_ktime(ns); + skb_tstamp_tx(skb, &shhwtstamps); + } else { + dev_warn(dev, "fman_port_get_tstamp failed!\n"); + } + } + + if (qm_fd_get_format(fd) == qm_fd_sg) + /* Free the page frag that we allocated on Tx */ + skb_free_frag(phys_to_virt(addr)); + return skb; } @@ -2116,7 +2121,7 @@ if (likely(dpaa_xmit(priv, percpu_stats, queue_mapping, &fd) == 0)) return NETDEV_TX_OK; - dpaa_cleanup_tx_fd(priv, &fd); + dpaa_cleanup_tx_fd(priv, &fd, false); skb_to_fd_failed: enomem: percpu_stats->tx_errors++; @@ -2162,7 +2167,7 @@ percpu_priv->stats.tx_errors++; - skb = dpaa_cleanup_tx_fd(priv, fd); + skb = dpaa_cleanup_tx_fd(priv, fd, false); dev_kfree_skb(skb); } @@ -2203,7 +2208,7 @@ percpu_priv->tx_confirm++; - skb = dpaa_cleanup_tx_fd(priv, fd); + skb = dpaa_cleanup_tx_fd(priv, fd, true); consume_skb(skb); } @@ -2433,7 +2438,7 @@ percpu_priv->stats.tx_fifo_errors++; count_ern(percpu_priv, msg); - skb = dpaa_cleanup_tx_fd(priv, fd); + skb = dpaa_cleanup_tx_fd(priv, fd, false); dev_kfree_skb_any(skb); } @@ -2759,9 +2764,7 @@ headroom = (u16)(bl->priv_data_size + DPAA_PARSE_RESULTS_SIZE + DPAA_TIME_STAMP_SIZE + DPAA_HASH_RESULTS_SIZE); - return DPAA_FD_DATA_ALIGNMENT ? ALIGN(headroom, - DPAA_FD_DATA_ALIGNMENT) : - headroom; + return ALIGN(headroom, DPAA_FD_DATA_ALIGNMENT); } static int dpaa_eth_probe(struct platform_device *pdev) diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/fec_main.c linux-4.19.118/drivers/net/ethernet/freescale/fec_main.c --- linux-4.19.98/drivers/net/ethernet/freescale/fec_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/fec_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2476,15 +2476,15 @@ return -EINVAL; } - cycle = fec_enet_us_to_itr_clock(ndev, fep->rx_time_itr); + cycle = fec_enet_us_to_itr_clock(ndev, ec->rx_coalesce_usecs); if (cycle > 0xFFFF) { pr_err("Rx coalesced usec exceed hardware limitation\n"); return -EINVAL; } - cycle = fec_enet_us_to_itr_clock(ndev, fep->tx_time_itr); + cycle = fec_enet_us_to_itr_clock(ndev, ec->tx_coalesce_usecs); if (cycle > 0xFFFF) { - pr_err("Rx coalesced usec exceed hardware limitation\n"); + pr_err("Tx coalesced usec exceed hardware limitation\n"); return -EINVAL; } diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/fman/Kconfig linux-4.19.118/drivers/net/ethernet/freescale/fman/Kconfig --- linux-4.19.98/drivers/net/ethernet/freescale/fman/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/fman/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -7,3 +7,31 @@ help Freescale Data-Path Acceleration Architecture Frame Manager (FMan) support + +config DPAA_ERRATUM_A050385 + bool + depends on ARM64 && FSL_DPAA + default y + help + DPAA FMan erratum A050385 software workaround implementation: + align buffers, data start, SG fragment length to avoid FMan DMA + splits. + FMAN DMA read or writes under heavy traffic load may cause FMAN + internal resource leak thus stopping further packet processing. + The FMAN internal queue can overflow when FMAN splits single + read or write transactions into multiple smaller transactions + such that more than 17 AXI transactions are in flight from FMAN + to interconnect. When the FMAN internal queue overflows, it can + stall further packet processing. The issue can occur with any + one of the following three conditions: + 1. FMAN AXI transaction crosses 4K address boundary (Errata + A010022) + 2. FMAN DMA address for an AXI transaction is not 16 byte + aligned, i.e. the last 4 bits of an address are non-zero + 3. Scatter Gather (SG) frames have more than one SG buffer in + the SG list and any one of the buffers, except the last + buffer in the SG list has data size that is not a multiple + of 16 bytes, i.e., other than 16, 32, 48, 64, etc. + With any one of the above three conditions present, there is + likelihood of stalled FMAN packet processing, especially under + stress with multiple ports injecting line-rate traffic. diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/fman/fman.c linux-4.19.118/drivers/net/ethernet/freescale/fman/fman.c --- linux-4.19.98/drivers/net/ethernet/freescale/fman/fman.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/fman/fman.c 2020-04-23 08:30:24.000000000 +0000 @@ -1,5 +1,6 @@ /* * Copyright 2008-2015 Freescale Semiconductor Inc. + * Copyright 2020 NXP * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -566,6 +567,10 @@ u32 qmi_def_tnums_thresh; }; +#ifdef CONFIG_DPAA_ERRATUM_A050385 +static bool fman_has_err_a050385; +#endif + static irqreturn_t fman_exceptions(struct fman *fman, enum fman_exceptions exception) { @@ -2517,6 +2522,14 @@ } EXPORT_SYMBOL(fman_bind); +#ifdef CONFIG_DPAA_ERRATUM_A050385 +bool fman_has_errata_a050385(void) +{ + return fman_has_err_a050385; +} +EXPORT_SYMBOL(fman_has_errata_a050385); +#endif + static irqreturn_t fman_err_irq(int irq, void *handle) { struct fman *fman = (struct fman *)handle; @@ -2844,6 +2857,11 @@ goto fman_free; } +#ifdef CONFIG_DPAA_ERRATUM_A050385 + fman_has_err_a050385 = + of_property_read_bool(fm_node, "fsl,erratum-a050385"); +#endif + return fman; fman_node_put: diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/fman/fman.h linux-4.19.118/drivers/net/ethernet/freescale/fman/fman.h --- linux-4.19.98/drivers/net/ethernet/freescale/fman/fman.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/fman/fman.h 2020-04-23 08:30:24.000000000 +0000 @@ -1,5 +1,6 @@ /* * Copyright 2008-2015 Freescale Semiconductor Inc. + * Copyright 2020 NXP * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -398,6 +399,10 @@ int fman_get_rx_extra_headroom(void); +#ifdef CONFIG_DPAA_ERRATUM_A050385 +bool fman_has_errata_a050385(void); +#endif + struct fman *fman_bind(struct device *dev); #endif /* __FM_H */ diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/fman/fman_memac.c linux-4.19.118/drivers/net/ethernet/freescale/fman/fman_memac.c --- linux-4.19.98/drivers/net/ethernet/freescale/fman/fman_memac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/fman/fman_memac.c 2020-04-23 08:30:24.000000000 +0000 @@ -110,7 +110,7 @@ /* Interface Mode Register (IF_MODE) */ #define IF_MODE_MASK 0x00000003 /* 30-31 Mask on i/f mode bits */ -#define IF_MODE_XGMII 0x00000000 /* 30-31 XGMII (10G) interface */ +#define IF_MODE_10G 0x00000000 /* 30-31 10G interface */ #define IF_MODE_GMII 0x00000002 /* 30-31 GMII (1G) interface */ #define IF_MODE_RGMII 0x00000004 #define IF_MODE_RGMII_AUTO 0x00008000 @@ -440,7 +440,7 @@ tmp = 0; switch (phy_if) { case PHY_INTERFACE_MODE_XGMII: - tmp |= IF_MODE_XGMII; + tmp |= IF_MODE_10G; break; default: tmp |= IF_MODE_GMII; diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/gianfar.c linux-4.19.118/drivers/net/ethernet/freescale/gianfar.c --- linux-4.19.98/drivers/net/ethernet/freescale/gianfar.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/gianfar.c 2020-04-23 08:30:24.000000000 +0000 @@ -2685,13 +2685,17 @@ skb_dirtytx = tx_queue->skb_dirtytx; while ((skb = tx_queue->tx_skbuff[skb_dirtytx])) { + bool do_tstamp; + + do_tstamp = (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && + priv->hwts_tx_en; frags = skb_shinfo(skb)->nr_frags; /* When time stamping, one additional TxBD must be freed. * Also, we need to dma_unmap_single() the TxPAL. */ - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) + if (unlikely(do_tstamp)) nr_txbds = frags + 2; else nr_txbds = frags + 1; @@ -2705,7 +2709,7 @@ (lstatus & BD_LENGTH_MASK)) break; - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) { + if (unlikely(do_tstamp)) { next = next_txbd(bdp, base, tx_ring_size); buflen = be16_to_cpu(next->length) + GMAC_FCB_LEN + GMAC_TXPAL_LEN; @@ -2715,7 +2719,7 @@ dma_unmap_single(priv->dev, be32_to_cpu(bdp->bufPtr), buflen, DMA_TO_DEVICE); - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)) { + if (unlikely(do_tstamp)) { struct skb_shared_hwtstamps shhwtstamps; u64 *ns = (u64 *)(((uintptr_t)skb->data + 0x10) & ~0x7UL); diff -Nru linux-4.19.98/drivers/net/ethernet/freescale/xgmac_mdio.c linux-4.19.118/drivers/net/ethernet/freescale/xgmac_mdio.c --- linux-4.19.98/drivers/net/ethernet/freescale/xgmac_mdio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/freescale/xgmac_mdio.c 2020-04-23 08:30:24.000000000 +0000 @@ -49,6 +49,7 @@ struct mdio_fsl_priv { struct tgec_mdio_controller __iomem *mdio_base; bool is_little_endian; + bool has_a011043; }; static u32 xgmac_read32(void __iomem *regs, @@ -226,7 +227,8 @@ return ret; /* Return all Fs if nothing was there */ - if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) { + if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) && + !priv->has_a011043) { dev_err(&bus->dev, "Error while reading PHY%d reg at %d.%hhu\n", phy_id, dev_addr, regnum); @@ -274,6 +276,9 @@ priv->is_little_endian = of_property_read_bool(pdev->dev.of_node, "little-endian"); + priv->has_a011043 = of_property_read_bool(pdev->dev.of_node, + "fsl,erratum-a011043"); + ret = of_mdiobus_register(bus, np); if (ret) { dev_err(&pdev->dev, "cannot register MDIO bus\n"); diff -Nru linux-4.19.98/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c linux-4.19.118/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c --- linux-4.19.98/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c 2020-04-23 08:30:24.000000000 +0000 @@ -1201,7 +1201,7 @@ goto err_free_mdio; priv->phy_mode = of_get_phy_mode(node); - if (priv->phy_mode < 0) { + if ((int)priv->phy_mode < 0) { netdev_err(ndev, "not find phy-mode\n"); ret = -EINVAL; goto err_mdiobus; diff -Nru linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c --- linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c 2020-04-23 08:30:24.000000000 +0000 @@ -1464,7 +1464,7 @@ int i; /* Find the stopped queue the same way the stack does */ - for (i = 0; i < ndev->real_num_tx_queues; i++) { + for (i = 0; i < ndev->num_tx_queues; i++) { struct netdev_queue *q; unsigned long trans_start; @@ -2605,9 +2605,10 @@ cur_chain = head->next; while (cur_chain) { chain = cur_chain->next; - devm_kfree(&pdev->dev, chain); + devm_kfree(&pdev->dev, cur_chain); cur_chain = chain; } + head->next = NULL; return -ENOMEM; } @@ -2642,7 +2643,7 @@ struct hnae3_handle *h = priv->ae_handle; struct hns3_enet_tqp_vector *tqp_vector; int ret = 0; - u16 i; + int i; for (i = 0; i < priv->vector_num; i++) { tqp_vector = &priv->tqp_vector[i]; @@ -2679,7 +2680,7 @@ ret = hns3_get_vector_ring_chain(tqp_vector, &vector_ring_chain); if (ret) - return ret; + goto map_ring_fail; ret = h->ae_algo->ops->map_ring_to_vector(h, tqp_vector->vector_irq, &vector_ring_chain); @@ -2687,13 +2688,19 @@ hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain); if (ret) - return ret; + goto map_ring_fail; netif_napi_add(priv->netdev, &tqp_vector->napi, hns3_nic_common_poll, NAPI_POLL_WEIGHT); } return 0; + +map_ring_fail: + while (i--) + netif_napi_del(&priv->tqp_vector[i].napi); + + return ret; } static int hns3_nic_alloc_vector_data(struct hns3_nic_priv *priv) diff -Nru linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c --- linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -4833,6 +4833,7 @@ struct hclge_vport_vtag_tx_cfg_cmd *req; struct hclge_dev *hdev = vport->back; struct hclge_desc desc; + u16 bmap_index; int status; hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_PORT_TX_CFG, false); @@ -4855,8 +4856,10 @@ hnae3_set_bit(req->vport_vlan_cfg, HCLGE_CFG_NIC_ROCE_SEL_B, 0); req->vf_offset = vport->vport_id / HCLGE_VF_NUM_PER_CMD; - req->vf_bitmap[req->vf_offset] = - 1 << (vport->vport_id % HCLGE_VF_NUM_PER_BYTE); + bmap_index = vport->vport_id % HCLGE_VF_NUM_PER_CMD / + HCLGE_VF_NUM_PER_BYTE; + req->vf_bitmap[bmap_index] = + 1U << (vport->vport_id % HCLGE_VF_NUM_PER_BYTE); status = hclge_cmd_send(&hdev->hw, &desc, 1); if (status) @@ -4873,6 +4876,7 @@ struct hclge_vport_vtag_rx_cfg_cmd *req; struct hclge_dev *hdev = vport->back; struct hclge_desc desc; + u16 bmap_index; int status; hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_PORT_RX_CFG, false); @@ -4888,8 +4892,10 @@ vcfg->vlan2_vlan_prionly ? 1 : 0); req->vf_offset = vport->vport_id / HCLGE_VF_NUM_PER_CMD; - req->vf_bitmap[req->vf_offset] = - 1 << (vport->vport_id % HCLGE_VF_NUM_PER_BYTE); + bmap_index = vport->vport_id % HCLGE_VF_NUM_PER_CMD / + HCLGE_VF_NUM_PER_BYTE; + req->vf_bitmap[bmap_index] = + 1U << (vport->vport_id % HCLGE_VF_NUM_PER_BYTE); status = hclge_cmd_send(&hdev->hw, &desc, 1); if (status) @@ -5922,18 +5928,17 @@ struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_dev *hdev = vport->back; - return min_t(u32, hdev->rss_size_max * kinfo->num_tc, hdev->num_tqps); + return min_t(u32, hdev->rss_size_max, + vport->alloc_tqps / kinfo->num_tc); } static void hclge_get_channels(struct hnae3_handle *handle, struct ethtool_channels *ch) { - struct hclge_vport *vport = hclge_get_vport(handle); - ch->max_combined = hclge_get_max_channels(handle); ch->other_count = 1; ch->max_other = 1; - ch->combined_count = vport->alloc_tqps; + ch->combined_count = handle->kinfo.rss_size; } static void hclge_get_tqps_and_rss_info(struct hnae3_handle *handle, diff -Nru linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h --- linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h 2020-04-23 08:30:24.000000000 +0000 @@ -600,7 +600,7 @@ u16 alloc_rss_size; u16 qs_offset; - u16 bw_limit; /* VSI BW Limit (0 = disabled) */ + u32 bw_limit; /* VSI BW Limit (0 = disabled) */ u8 dwrr; struct hclge_tx_vtag_cfg txvlan_cfg; diff -Nru linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c --- linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c 2020-04-23 08:30:24.000000000 +0000 @@ -181,12 +181,10 @@ return ret; ret = hclge_bind_ring_with_vector(vport, vector_id, en, &ring_chain); - if (ret) - return ret; hclge_free_vector_ring_chain(&ring_chain); - return 0; + return ret; } static int hclge_set_vf_promisc_mode(struct hclge_vport *vport, diff -Nru linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c --- linux-4.19.98/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1957,7 +1957,8 @@ struct hnae3_handle *nic = &hdev->nic; struct hnae3_knic_private_info *kinfo = &nic->kinfo; - return min_t(u32, hdev->rss_size_max * kinfo->num_tc, hdev->num_tqps); + return min_t(u32, hdev->rss_size_max, + hdev->num_tqps / kinfo->num_tc); } /** @@ -1978,7 +1979,7 @@ ch->max_combined = hclgevf_get_max_channels(hdev); ch->other_count = 0; ch->max_other = 0; - ch->combined_count = hdev->num_tqps; + ch->combined_count = handle->kinfo.rss_size; } static void hclgevf_get_tqps_and_rss_info(struct hnae3_handle *handle, diff -Nru linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c --- linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_cmdq.c 2020-04-23 08:30:24.000000000 +0000 @@ -398,7 +398,8 @@ spin_unlock_bh(&cmdq->cmdq_lock); - if (!wait_for_completion_timeout(&done, CMDQ_TIMEOUT)) { + if (!wait_for_completion_timeout(&done, + msecs_to_jiffies(CMDQ_TIMEOUT))) { spin_lock_bh(&cmdq->cmdq_lock); if (cmdq->errcode[curr_prod_idx] == &errcode) diff -Nru linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c --- linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c 2020-04-23 08:30:24.000000000 +0000 @@ -309,6 +309,7 @@ } hw_ioctxt.func_idx = HINIC_HWIF_FUNC_IDX(hwif); + hw_ioctxt.ppf_idx = HINIC_HWIF_PPF_IDX(hwif); hw_ioctxt.set_cmdq_depth = HW_IOCTXT_SET_CMDQ_DEPTH_DEFAULT; hw_ioctxt.cmdq_depth = 0; @@ -369,50 +370,6 @@ return -EFAULT; } -static int wait_for_io_stopped(struct hinic_hwdev *hwdev) -{ - struct hinic_cmd_io_status cmd_io_status; - struct hinic_hwif *hwif = hwdev->hwif; - struct pci_dev *pdev = hwif->pdev; - struct hinic_pfhwdev *pfhwdev; - unsigned long end; - u16 out_size; - int err; - - if (!HINIC_IS_PF(hwif) && !HINIC_IS_PPF(hwif)) { - dev_err(&pdev->dev, "Unsupported PCI Function type\n"); - return -EINVAL; - } - - pfhwdev = container_of(hwdev, struct hinic_pfhwdev, hwdev); - - cmd_io_status.func_idx = HINIC_HWIF_FUNC_IDX(hwif); - - end = jiffies + msecs_to_jiffies(IO_STATUS_TIMEOUT); - do { - err = hinic_msg_to_mgmt(&pfhwdev->pf_to_mgmt, HINIC_MOD_COMM, - HINIC_COMM_CMD_IO_STATUS_GET, - &cmd_io_status, sizeof(cmd_io_status), - &cmd_io_status, &out_size, - HINIC_MGMT_MSG_SYNC); - if ((err) || (out_size != sizeof(cmd_io_status))) { - dev_err(&pdev->dev, "Failed to get IO status, ret = %d\n", - err); - return err; - } - - if (cmd_io_status.status == IO_STOPPED) { - dev_info(&pdev->dev, "IO stopped\n"); - return 0; - } - - msleep(20); - } while (time_before(jiffies, end)); - - dev_err(&pdev->dev, "Wait for IO stopped - Timeout\n"); - return -ETIMEDOUT; -} - /** * clear_io_resource - set the IO resources as not active in the NIC * @hwdev: the NIC HW device @@ -432,11 +389,8 @@ return -EINVAL; } - err = wait_for_io_stopped(hwdev); - if (err) { - dev_err(&pdev->dev, "IO has not stopped yet\n"); - return err; - } + /* sleep 100ms to wait for firmware stopping I/O */ + msleep(100); cmd_clear_io_res.func_idx = HINIC_HWIF_FUNC_IDX(hwif); diff -Nru linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h --- linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.h 2020-04-23 08:30:24.000000000 +0000 @@ -104,8 +104,8 @@ u8 rsvd2; u8 rsvd3; + u8 ppf_idx; u8 rsvd4; - u8 rsvd5; u16 rq_depth; u16 rx_buf_sz_idx; diff -Nru linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_if.h linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_if.h --- linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_if.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_if.h 2020-04-23 08:30:24.000000000 +0000 @@ -146,6 +146,7 @@ #define HINIC_HWIF_FUNC_IDX(hwif) ((hwif)->attr.func_idx) #define HINIC_HWIF_PCI_INTF(hwif) ((hwif)->attr.pci_intf_idx) #define HINIC_HWIF_PF_IDX(hwif) ((hwif)->attr.pf_idx) +#define HINIC_HWIF_PPF_IDX(hwif) ((hwif)->attr.ppf_idx) #define HINIC_FUNC_TYPE(hwif) ((hwif)->attr.func_type) #define HINIC_IS_PF(hwif) (HINIC_FUNC_TYPE(hwif) == HINIC_PF) diff -Nru linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c --- linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.c 2020-04-23 08:30:24.000000000 +0000 @@ -52,7 +52,7 @@ #define MSG_NOT_RESP 0xFFFF -#define MGMT_MSG_TIMEOUT 1000 +#define MGMT_MSG_TIMEOUT 5000 #define mgmt_to_pfhwdev(pf_mgmt) \ container_of(pf_mgmt, struct hinic_pfhwdev, pf_to_mgmt) @@ -276,7 +276,8 @@ goto unlock_sync_msg; } - if (!wait_for_completion_timeout(recv_done, MGMT_MSG_TIMEOUT)) { + if (!wait_for_completion_timeout(recv_done, + msecs_to_jiffies(MGMT_MSG_TIMEOUT))) { dev_err(&pdev->dev, "MGMT timeout, MSG id = %d\n", msg_id); err = -ETIMEDOUT; goto unlock_sync_msg; diff -Nru linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h --- linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_hw_qp.h 2020-04-23 08:30:24.000000000 +0000 @@ -103,6 +103,7 @@ struct hinic_wq *wq; + struct cpumask affinity_mask; u32 irq; u16 msix_entry; diff -Nru linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_rx.c linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_rx.c --- linux-4.19.98/drivers/net/ethernet/huawei/hinic/hinic_rx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/huawei/hinic/hinic_rx.c 2020-04-23 08:30:24.000000000 +0000 @@ -414,7 +414,6 @@ struct hinic_hwdev *hwdev = nic_dev->hwdev; struct hinic_rq *rq = rxq->rq; struct hinic_qp *qp; - struct cpumask mask; int err; rx_add_napi(rxq); @@ -431,8 +430,8 @@ } qp = container_of(rq, struct hinic_qp, rq); - cpumask_set_cpu(qp->q_id % num_online_cpus(), &mask); - return irq_set_affinity_hint(rq->irq, &mask); + cpumask_set_cpu(qp->q_id % num_online_cpus(), &rq->affinity_mask); + return irq_set_affinity_hint(rq->irq, &rq->affinity_mask); } static void rx_free_irq(struct hinic_rxq *rxq) diff -Nru linux-4.19.98/drivers/net/ethernet/ibm/ehea/ehea_main.c linux-4.19.118/drivers/net/ethernet/ibm/ehea/ehea_main.c --- linux-4.19.98/drivers/net/ethernet/ibm/ehea/ehea_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/ibm/ehea/ehea_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1464,7 +1464,7 @@ memset(pr, 0, sizeof(struct ehea_port_res)); - pr->tx_bytes = rx_bytes; + pr->tx_bytes = tx_bytes; pr->tx_packets = tx_packets; pr->rx_bytes = rx_bytes; pr->rx_packets = rx_packets; diff -Nru linux-4.19.98/drivers/net/ethernet/intel/i40e/i40e_common.c linux-4.19.118/drivers/net/ethernet/intel/i40e/i40e_common.c --- linux-4.19.98/drivers/net/ethernet/intel/i40e/i40e_common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/intel/i40e/i40e_common.c 2020-04-23 08:30:24.000000000 +0000 @@ -1668,25 +1668,15 @@ return status; } -/** - * i40e_set_fc - * @hw: pointer to the hw struct - * @aq_failures: buffer to return AdminQ failure information - * @atomic_restart: whether to enable atomic link restart - * - * Set the requested flow control mode using set_phy_config. - **/ -enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures, - bool atomic_restart) +static noinline_for_stack enum i40e_status_code +i40e_set_fc_status(struct i40e_hw *hw, + struct i40e_aq_get_phy_abilities_resp *abilities, + bool atomic_restart) { - enum i40e_fc_mode fc_mode = hw->fc.requested_mode; - struct i40e_aq_get_phy_abilities_resp abilities; struct i40e_aq_set_phy_config config; - enum i40e_status_code status; + enum i40e_fc_mode fc_mode = hw->fc.requested_mode; u8 pause_mask = 0x0; - *aq_failures = 0x0; - switch (fc_mode) { case I40E_FC_FULL: pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX; @@ -1702,6 +1692,48 @@ break; } + memset(&config, 0, sizeof(struct i40e_aq_set_phy_config)); + /* clear the old pause settings */ + config.abilities = abilities->abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) & + ~(I40E_AQ_PHY_FLAG_PAUSE_RX); + /* set the new abilities */ + config.abilities |= pause_mask; + /* If the abilities have changed, then set the new config */ + if (config.abilities == abilities->abilities) + return 0; + + /* Auto restart link so settings take effect */ + if (atomic_restart) + config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK; + /* Copy over all the old settings */ + config.phy_type = abilities->phy_type; + config.phy_type_ext = abilities->phy_type_ext; + config.link_speed = abilities->link_speed; + config.eee_capability = abilities->eee_capability; + config.eeer = abilities->eeer_val; + config.low_power_ctrl = abilities->d3_lpan; + config.fec_config = abilities->fec_cfg_curr_mod_ext_info & + I40E_AQ_PHY_FEC_CONFIG_MASK; + + return i40e_aq_set_phy_config(hw, &config, NULL); +} + +/** + * i40e_set_fc + * @hw: pointer to the hw struct + * @aq_failures: buffer to return AdminQ failure information + * @atomic_restart: whether to enable atomic link restart + * + * Set the requested flow control mode using set_phy_config. + **/ +enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures, + bool atomic_restart) +{ + struct i40e_aq_get_phy_abilities_resp abilities; + enum i40e_status_code status; + + *aq_failures = 0x0; + /* Get the current phy config */ status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities, NULL); @@ -1710,31 +1742,10 @@ return status; } - memset(&config, 0, sizeof(struct i40e_aq_set_phy_config)); - /* clear the old pause settings */ - config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) & - ~(I40E_AQ_PHY_FLAG_PAUSE_RX); - /* set the new abilities */ - config.abilities |= pause_mask; - /* If the abilities have changed, then set the new config */ - if (config.abilities != abilities.abilities) { - /* Auto restart link so settings take effect */ - if (atomic_restart) - config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK; - /* Copy over all the old settings */ - config.phy_type = abilities.phy_type; - config.phy_type_ext = abilities.phy_type_ext; - config.link_speed = abilities.link_speed; - config.eee_capability = abilities.eee_capability; - config.eeer = abilities.eeer_val; - config.low_power_ctrl = abilities.d3_lpan; - config.fec_config = abilities.fec_cfg_curr_mod_ext_info & - I40E_AQ_PHY_FEC_CONFIG_MASK; - status = i40e_aq_set_phy_config(hw, &config, NULL); + status = i40e_set_fc_status(hw, &abilities, atomic_restart); + if (status) + *aq_failures |= I40E_SET_FC_AQ_FAIL_SET; - if (status) - *aq_failures |= I40E_SET_FC_AQ_FAIL_SET; - } /* Update the link info */ status = i40e_update_link_info(hw); if (status) { @@ -2563,7 +2574,7 @@ * i40e_updatelink_status - update status of the HW network link * @hw: pointer to the hw struct **/ -i40e_status i40e_update_link_info(struct i40e_hw *hw) +noinline_for_stack i40e_status i40e_update_link_info(struct i40e_hw *hw) { struct i40e_aq_get_phy_abilities_resp abilities; i40e_status status = 0; diff -Nru linux-4.19.98/drivers/net/ethernet/intel/ice/ice_ethtool.c linux-4.19.118/drivers/net/ethernet/intel/ice/ice_ethtool.c --- linux-4.19.98/drivers/net/ethernet/intel/ice/ice_ethtool.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/intel/ice/ice_ethtool.c 2020-04-23 08:30:24.000000000 +0000 @@ -772,13 +772,6 @@ else return -EINVAL; - /* Tell the OS link is going down, the link will go back up when fw - * says it is ready asynchronously - */ - ice_print_link_msg(vsi, false); - netif_carrier_off(netdev); - netif_tx_stop_all_queues(netdev); - /* Set the FC mode and only restart AN if link is up */ status = ice_set_fc(pi, &aq_failures, link_up); diff -Nru linux-4.19.98/drivers/net/ethernet/intel/igb/e1000_82575.c linux-4.19.118/drivers/net/ethernet/intel/igb/e1000_82575.c --- linux-4.19.98/drivers/net/ethernet/intel/igb/e1000_82575.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/intel/igb/e1000_82575.c 2020-04-23 08:30:24.000000000 +0000 @@ -530,7 +530,7 @@ dev_spec->module_plugged = true; if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) { hw->phy.media_type = e1000_media_type_internal_serdes; - } else if (eth_flags->e100_base_fx) { + } else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { dev_spec->sgmii_active = true; hw->phy.media_type = e1000_media_type_internal_serdes; } else if (eth_flags->e1000_base_t) { @@ -657,14 +657,10 @@ break; } - /* do not change link mode for 100BaseFX */ - if (dev_spec->eth_flags.e100_base_fx) - break; - /* change current link mode setting */ ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK; - if (hw->phy.media_type == e1000_media_type_copper) + if (dev_spec->sgmii_active) ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII; else ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; diff -Nru linux-4.19.98/drivers/net/ethernet/intel/igb/igb_ethtool.c linux-4.19.118/drivers/net/ethernet/intel/igb/igb_ethtool.c --- linux-4.19.98/drivers/net/ethernet/intel/igb/igb_ethtool.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/intel/igb/igb_ethtool.c 2020-04-23 08:30:24.000000000 +0000 @@ -181,7 +181,7 @@ advertising &= ~ADVERTISED_1000baseKX_Full; } } - if (eth_flags->e100_base_fx) { + if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) { supported |= SUPPORTED_100baseT_Full; advertising |= ADVERTISED_100baseT_Full; } diff -Nru linux-4.19.98/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c linux-4.19.118/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c --- linux-4.19.98/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c 2020-04-23 08:30:24.000000000 +0000 @@ -114,7 +114,6 @@ **/ static void ixgbe_ipsec_clear_hw_tables(struct ixgbe_adapter *adapter) { - struct ixgbe_ipsec *ipsec = adapter->ipsec; struct ixgbe_hw *hw = &adapter->hw; u32 buf[4] = {0, 0, 0, 0}; u16 idx; @@ -133,9 +132,6 @@ ixgbe_ipsec_set_tx_sa(hw, idx, buf, 0); ixgbe_ipsec_set_rx_sa(hw, idx, 0, buf, 0, 0, 0); } - - ipsec->num_rx_sa = 0; - ipsec->num_tx_sa = 0; } /** diff -Nru linux-4.19.98/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c linux-4.19.118/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c --- linux-4.19.98/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1822,13 +1822,7 @@ static void ixgbe_dma_sync_frag(struct ixgbe_ring *rx_ring, struct sk_buff *skb) { - /* if the page was released unmap it, else just sync our portion */ - if (unlikely(IXGBE_CB(skb)->page_released)) { - dma_unmap_page_attrs(rx_ring->dev, IXGBE_CB(skb)->dma, - ixgbe_rx_pg_size(rx_ring), - DMA_FROM_DEVICE, - IXGBE_RX_DMA_ATTR); - } else if (ring_uses_build_skb(rx_ring)) { + if (ring_uses_build_skb(rx_ring)) { unsigned long offset = (unsigned long)(skb->data) & ~PAGE_MASK; dma_sync_single_range_for_cpu(rx_ring->dev, @@ -1845,6 +1839,14 @@ skb_frag_size(frag), DMA_FROM_DEVICE); } + + /* If the page was released, just unmap it. */ + if (unlikely(IXGBE_CB(skb)->page_released)) { + dma_unmap_page_attrs(rx_ring->dev, IXGBE_CB(skb)->dma, + ixgbe_rx_pg_size(rx_ring), + DMA_FROM_DEVICE, + IXGBE_RX_DMA_ATTR); + } } /** @@ -5187,7 +5189,7 @@ struct ixgbe_hw *hw = &adapter->hw; struct hlist_node *node2; struct ixgbe_fdir_filter *filter; - u64 action; + u8 queue; spin_lock(&adapter->fdir_perfect_lock); @@ -5196,17 +5198,34 @@ hlist_for_each_entry_safe(filter, node2, &adapter->fdir_filter_list, fdir_node) { - action = filter->action; - if (action != IXGBE_FDIR_DROP_QUEUE && action != 0) - action = - (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1; + if (filter->action == IXGBE_FDIR_DROP_QUEUE) { + queue = IXGBE_FDIR_DROP_QUEUE; + } else { + u32 ring = ethtool_get_flow_spec_ring(filter->action); + u8 vf = ethtool_get_flow_spec_ring_vf(filter->action); + + if (!vf && (ring >= adapter->num_rx_queues)) { + e_err(drv, "FDIR restore failed without VF, ring: %u\n", + ring); + continue; + } else if (vf && + ((vf > adapter->num_vfs) || + ring >= adapter->num_rx_queues_per_pool)) { + e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n", + vf, ring); + continue; + } + + /* Map the ring onto the absolute queue index */ + if (!vf) + queue = adapter->rx_ring[ring]->reg_idx; + else + queue = ((vf - 1) * + adapter->num_rx_queues_per_pool) + ring; + } ixgbe_fdir_write_perfect_filter_82599(hw, - &filter->filter, - filter->sw_idx, - (action == IXGBE_FDIR_DROP_QUEUE) ? - IXGBE_FDIR_DROP_QUEUE : - adapter->rx_ring[action]->reg_idx); + &filter->filter, filter->sw_idx, queue); } spin_unlock(&adapter->fdir_perfect_lock); diff -Nru linux-4.19.98/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c linux-4.19.118/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c --- linux-4.19.98/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2066,11 +2066,6 @@ struct ixgbe_hw *hw = &adapter->hw; int count = 0; - if ((netdev_uc_count(netdev)) > 10) { - pr_err("Too many unicast filters - No Space\n"); - return -ENOSPC; - } - if (!netdev_uc_empty(netdev)) { struct netdev_hw_addr *ha; diff -Nru linux-4.19.98/drivers/net/ethernet/marvell/mvneta.c linux-4.19.118/drivers/net/ethernet/marvell/mvneta.c --- linux-4.19.98/drivers/net/ethernet/marvell/mvneta.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/marvell/mvneta.c 2020-04-23 08:30:24.000000000 +0000 @@ -385,6 +385,8 @@ struct u64_stats_sync syncp; u64 rx_packets; u64 rx_bytes; + u64 rx_dropped; + u64 rx_errors; u64 tx_packets; u64 tx_bytes; }; @@ -701,6 +703,8 @@ struct mvneta_pcpu_stats *cpu_stats; u64 rx_packets; u64 rx_bytes; + u64 rx_dropped; + u64 rx_errors; u64 tx_packets; u64 tx_bytes; @@ -709,19 +713,20 @@ start = u64_stats_fetch_begin_irq(&cpu_stats->syncp); rx_packets = cpu_stats->rx_packets; rx_bytes = cpu_stats->rx_bytes; + rx_dropped = cpu_stats->rx_dropped; + rx_errors = cpu_stats->rx_errors; tx_packets = cpu_stats->tx_packets; tx_bytes = cpu_stats->tx_bytes; } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start)); stats->rx_packets += rx_packets; stats->rx_bytes += rx_bytes; + stats->rx_dropped += rx_dropped; + stats->rx_errors += rx_errors; stats->tx_packets += tx_packets; stats->tx_bytes += tx_bytes; } - stats->rx_errors = dev->stats.rx_errors; - stats->rx_dropped = dev->stats.rx_dropped; - stats->tx_dropped = dev->stats.tx_dropped; } @@ -1698,8 +1703,14 @@ static void mvneta_rx_error(struct mvneta_port *pp, struct mvneta_rx_desc *rx_desc) { + struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); u32 status = rx_desc->status; + /* update per-cpu counter */ + u64_stats_update_begin(&stats->syncp); + stats->rx_errors++; + u64_stats_update_end(&stats->syncp); + switch (status & MVNETA_RXD_ERR_CODE_MASK) { case MVNETA_RXD_ERR_CRC: netdev_err(pp->dev, "bad rx status %08x (crc error), size=%d\n", @@ -1960,7 +1971,6 @@ /* Check errors only for FIRST descriptor */ if (rx_status & MVNETA_RXD_ERR_SUMMARY) { mvneta_rx_error(pp, rx_desc); - dev->stats.rx_errors++; /* leave the descriptor untouched */ continue; } @@ -1971,11 +1981,17 @@ skb_size = max(rx_copybreak, rx_header_size); rxq->skb = netdev_alloc_skb_ip_align(dev, skb_size); if (unlikely(!rxq->skb)) { + struct mvneta_pcpu_stats *stats = this_cpu_ptr(pp->stats); + netdev_err(dev, "Can't allocate skb on queue %d\n", rxq->id); - dev->stats.rx_dropped++; + rxq->skb_alloc_err++; + + u64_stats_update_begin(&stats->syncp); + stats->rx_dropped++; + u64_stats_update_end(&stats->syncp); continue; } copy_size = min(skb_size, rx_bytes); @@ -2135,7 +2151,6 @@ mvneta_bm_pool_put_bp(pp->bm_priv, bm_pool, rx_desc->buf_phys_addr); err_drop_frame: - dev->stats.rx_errors++; mvneta_rx_error(pp, rx_desc); /* leave the descriptor untouched */ continue; @@ -2786,11 +2801,10 @@ /* For the case where the last mvneta_poll did not process all * RX packets */ - rx_queue = fls(((cause_rx_tx >> 8) & 0xff)); - cause_rx_tx |= pp->neta_armada3700 ? pp->cause_rx_tx : port->cause_rx_tx; + rx_queue = fls(((cause_rx_tx >> 8) & 0xff)); if (rx_queue) { rx_queue = rx_queue - 1; if (pp->bm_priv) diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c 2020-04-23 08:30:24.000000000 +0000 @@ -1364,8 +1364,14 @@ skb->protocol = *((__be16 *)(skb->data)); - skb->ip_summed = CHECKSUM_COMPLETE; - skb->csum = csum_unfold((__force __sum16)cqe->check_sum); + if (netdev->features & NETIF_F_RXCSUM) { + skb->ip_summed = CHECKSUM_COMPLETE; + skb->csum = csum_unfold((__force __sum16)cqe->check_sum); + stats->csum_complete++; + } else { + skb->ip_summed = CHECKSUM_NONE; + stats->csum_none++; + } if (unlikely(mlx5e_rx_hw_stamp(tstamp))) skb_hwtstamps(skb)->hwtstamp = @@ -1384,7 +1390,6 @@ skb->dev = netdev; - stats->csum_complete++; stats->packets++; stats->bytes += cqe_bcnt; } diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c 2020-04-23 08:30:24.000000000 +0000 @@ -211,6 +211,9 @@ s->tx_tls_resync_bytes += sq_stats->tls_resync_bytes; #endif s->tx_cqes += sq_stats->cqes; + + /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */ + barrier(); } } diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -289,7 +289,6 @@ const char *event_name; bool teardown = false; unsigned long flags; - u32 fpga_qpn; u8 syndrome; switch (event) { @@ -300,7 +299,6 @@ case MLX5_EVENT_TYPE_FPGA_QP_ERROR: syndrome = MLX5_GET(fpga_qp_error_event, data, syndrome); event_name = mlx5_fpga_qp_syndrome_to_string(syndrome); - fpga_qpn = MLX5_GET(fpga_qp_error_event, data, fpga_qpn); break; default: mlx5_fpga_warn_ratelimited(fdev, "Unexpected event %u\n", diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/fpga/ipsec.c 2020-04-23 08:30:24.000000000 +0000 @@ -848,6 +848,7 @@ mutex_lock(&fpga_xfrm->lock); if (!--fpga_xfrm->num_rules) { mlx5_fpga_ipsec_release_sa_ctx(fpga_xfrm->sa_ctx); + kfree(fpga_xfrm->sa_ctx); fpga_xfrm->sa_ctx = NULL; } mutex_unlock(&fpga_xfrm->lock); @@ -1472,7 +1473,7 @@ if (!memcmp(&xfrm->attrs, attrs, sizeof(xfrm->attrs))) return 0; - if (!mlx5_fpga_esp_validate_xfrm_attrs(mdev, attrs)) { + if (mlx5_fpga_esp_validate_xfrm_attrs(mdev, attrs)) { mlx5_core_warn(mdev, "Tried to create an esp with unsupported attrs\n"); return -EOPNOTSUPP; } diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -469,6 +469,7 @@ mlx5_core_warn(dev, "flow steering can't delete fte in index %d of flow group id %d\n", fte->index, fg->id); + node->active = 0; } } @@ -1597,6 +1598,11 @@ fte_tmp = NULL; goto out; } + if (!fte_tmp->node.active) { + tree_put_node(&fte_tmp->node); + fte_tmp = NULL; + goto out; + } nested_down_write_ref_node(&fte_tmp->node, FS_LOCK_CHILD); out: diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/qp.c linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/qp.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlx5/core/qp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlx5/core/qp.c 2020-04-23 08:30:24.000000000 +0000 @@ -44,14 +44,15 @@ { struct mlx5_qp_table *table = &dev->priv.qp_table; struct mlx5_core_rsc_common *common; + unsigned long flags; - spin_lock(&table->lock); + spin_lock_irqsave(&table->lock, flags); common = radix_tree_lookup(&table->tree, rsn); if (common) atomic_inc(&common->refcount); - spin_unlock(&table->lock); + spin_unlock_irqrestore(&table->lock, flags); if (!common) { mlx5_core_warn(dev, "Async event for bogus resource 0x%x\n", diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/reg.h linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/reg.h --- linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/reg.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/reg.h 2020-04-23 08:30:24.000000000 +0000 @@ -3215,7 +3215,7 @@ * Configures the ETS elements. */ #define MLXSW_REG_QEEC_ID 0x400D -#define MLXSW_REG_QEEC_LEN 0x1C +#define MLXSW_REG_QEEC_LEN 0x20 MLXSW_REG_DEFINE(qeec, MLXSW_REG_QEEC_ID, MLXSW_REG_QEEC_LEN); @@ -3257,6 +3257,15 @@ */ MLXSW_ITEM32(reg, qeec, next_element_index, 0x08, 0, 8); +/* reg_qeec_mise + * Min shaper configuration enable. Enables configuration of the min + * shaper on this ETS element + * 0 - Disable + * 1 - Enable + * Access: RW + */ +MLXSW_ITEM32(reg, qeec, mise, 0x0C, 31, 1); + enum { MLXSW_REG_QEEC_BYTES_MODE, MLXSW_REG_QEEC_PACKETS_MODE, @@ -3273,6 +3282,17 @@ */ MLXSW_ITEM32(reg, qeec, pb, 0x0C, 28, 1); +/* The smallest permitted min shaper rate. */ +#define MLXSW_REG_QEEC_MIS_MIN 200000 /* Kbps */ + +/* reg_qeec_min_shaper_rate + * Min shaper information rate. + * For CPU port, can only be configured for port hierarchy. + * When in bytes mode, value is specified in units of 1000bps. + * Access: RW + */ +MLXSW_ITEM32(reg, qeec, min_shaper_rate, 0x0C, 0, 28); + /* reg_qeec_mase * Max shaper configuration enable. Enables configuration of the max * shaper on this ETS element. diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum.c linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum.c 2020-04-23 08:30:24.000000000 +0000 @@ -2753,6 +2753,21 @@ return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(qeec), qeec_pl); } +static int mlxsw_sp_port_min_bw_set(struct mlxsw_sp_port *mlxsw_sp_port, + enum mlxsw_reg_qeec_hr hr, u8 index, + u8 next_index, u32 minrate) +{ + struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; + char qeec_pl[MLXSW_REG_QEEC_LEN]; + + mlxsw_reg_qeec_pack(qeec_pl, mlxsw_sp_port->local_port, hr, index, + next_index); + mlxsw_reg_qeec_mise_set(qeec_pl, true); + mlxsw_reg_qeec_min_shaper_rate_set(qeec_pl, minrate); + + return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(qeec), qeec_pl); +} + int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port, u8 switch_prio, u8 tclass) { @@ -2829,6 +2844,16 @@ if (err) return err; } + + /* Configure the min shaper for multicast TCs. */ + for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { + err = mlxsw_sp_port_min_bw_set(mlxsw_sp_port, + MLXSW_REG_QEEC_HIERARCY_TC, + i + 8, i, + MLXSW_REG_QEEC_MIS_MIN); + if (err) + return err; + } /* Map all priorities to traffic class 0. */ for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) { diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c 2020-04-23 08:30:24.000000000 +0000 @@ -215,7 +215,7 @@ start_again: err = devlink_dpipe_entry_ctx_prepare(dump_ctx); if (err) - return err; + goto err_ctx_prepare; j = 0; for (; i < rif_count; i++) { struct mlxsw_sp_rif *rif = mlxsw_sp_rif_by_index(mlxsw_sp, i); @@ -247,6 +247,7 @@ return 0; err_entry_append: err_entry_get: +err_ctx_prepare: rtnl_unlock(); devlink_dpipe_entry_clear(&entry); return err; diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c 2020-04-23 08:30:24.000000000 +0000 @@ -98,9 +98,11 @@ u8 prio = tcf_vlan_push_prio(a); u16 vid = tcf_vlan_push_vid(a); - return mlxsw_sp_acl_rulei_act_vlan(mlxsw_sp, rulei, - action, vid, - proto, prio, extack); + err = mlxsw_sp_acl_rulei_act_vlan(mlxsw_sp, rulei, + action, vid, + proto, prio, extack); + if (err) + return err; } else { NL_SET_ERR_MSG_MOD(extack, "Unsupported action"); dev_err(mlxsw_sp->bus_info->dev, "Unsupported action\n"); diff -Nru linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c --- linux-4.19.98/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mellanox/mlxsw/spectrum_mr.c 2020-04-23 08:30:24.000000000 +0000 @@ -637,12 +637,12 @@ return 0; err_erif_unresolve: - list_for_each_entry_from_reverse(erve, &mr_vif->route_evif_list, - vif_node) + list_for_each_entry_continue_reverse(erve, &mr_vif->route_evif_list, + vif_node) mlxsw_sp_mr_route_evif_unresolve(mr_table, erve); err_irif_unresolve: - list_for_each_entry_from_reverse(irve, &mr_vif->route_ivif_list, - vif_node) + list_for_each_entry_continue_reverse(irve, &mr_vif->route_ivif_list, + vif_node) mlxsw_sp_mr_route_ivif_unresolve(mr_table, irve); mr_vif->rif = NULL; return err; diff -Nru linux-4.19.98/drivers/net/ethernet/micrel/ks8851_mll.c linux-4.19.118/drivers/net/ethernet/micrel/ks8851_mll.c --- linux-4.19.98/drivers/net/ethernet/micrel/ks8851_mll.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/micrel/ks8851_mll.c 2020-04-23 08:30:24.000000000 +0000 @@ -476,21 +476,47 @@ */ /** - * ks_rdreg8 - read 8 bit register from device + * ks_check_endian - Check whether endianness of the bus is correct * @ks : The chip information - * @offset: The register address * - * Read a 8bit register from the chip, returning the result + * The KS8851-16MLL EESK pin allows selecting the endianness of the 16bit + * bus. To maintain optimum performance, the bus endianness should be set + * such that it matches the endianness of the CPU. */ -static u8 ks_rdreg8(struct ks_net *ks, int offset) + +static int ks_check_endian(struct ks_net *ks) { - u16 data; - u8 shift_bit = offset & 0x03; - u8 shift_data = (offset & 1) << 3; - ks->cmd_reg_cache = (u16) offset | (u16)(BE0 << shift_bit); - iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); - data = ioread16(ks->hw_addr); - return (u8)(data >> shift_data); + u16 cider; + + /* + * Read CIDER register first, however read it the "wrong" way around. + * If the endian strap on the KS8851-16MLL in incorrect and the chip + * is operating in different endianness than the CPU, then the meaning + * of BE[3:0] byte-enable bits is also swapped such that: + * BE[3,2,1,0] becomes BE[1,0,3,2] + * + * Luckily for us, the byte-enable bits are the top four MSbits of + * the address register and the CIDER register is at offset 0xc0. + * Hence, by reading address 0xc0c0, which is not impacted by endian + * swapping, we assert either BE[3:2] or BE[1:0] while reading the + * CIDER register. + * + * If the bus configuration is correct, reading 0xc0c0 asserts + * BE[3:2] and this read returns 0x0000, because to read register + * with bottom two LSbits of address set to 0, BE[1:0] must be + * asserted. + * + * If the bus configuration is NOT correct, reading 0xc0c0 asserts + * BE[1:0] and this read returns non-zero 0x8872 value. + */ + iowrite16(BE3 | BE2 | KS_CIDER, ks->hw_addr_cmd); + cider = ioread16(ks->hw_addr); + if (!cider) + return 0; + + netdev_err(ks->netdev, "incorrect EESK endian strap setting\n"); + + return -EINVAL; } /** @@ -509,22 +535,6 @@ } /** - * ks_wrreg8 - write 8bit register value to chip - * @ks: The chip information - * @offset: The register address - * @value: The value to write - * - */ -static void ks_wrreg8(struct ks_net *ks, int offset, u8 value) -{ - u8 shift_bit = (offset & 0x03); - u16 value_write = (u16)(value << ((offset & 1) << 3)); - ks->cmd_reg_cache = (u16)offset | (BE0 << shift_bit); - iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); - iowrite16(value_write, ks->hw_addr); -} - -/** * ks_wrreg16 - write 16bit register value to chip * @ks: The chip information * @offset: The register address @@ -643,8 +653,7 @@ u16 reg_data = 0; /* Regardless of bus width, 8 bit read should always work.*/ - reg_data = ks_rdreg8(ks, KS_CCR) & 0x00FF; - reg_data |= ks_rdreg8(ks, KS_CCR+1) << 8; + reg_data = ks_rdreg16(ks, KS_CCR); /* addr/data bus are multiplexed */ ks->sharedbus = (reg_data & CCR_SHARED) == CCR_SHARED; @@ -748,7 +757,7 @@ /* 1. set sudo DMA mode */ ks_wrreg16(ks, KS_RXFDPR, RXFDPR_RXFPAI); - ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); + ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA); /* 2. read prepend data */ /** @@ -765,7 +774,7 @@ ks_inblk(ks, buf, ALIGN(len, 4)); /* 4. reset sudo DMA Mode */ - ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr); + ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); } /** @@ -867,14 +876,17 @@ { struct net_device *netdev = pw; struct ks_net *ks = netdev_priv(netdev); + unsigned long flags; u16 status; + spin_lock_irqsave(&ks->statelock, flags); /*this should be the first in IRQ handler */ ks_save_cmd_reg(ks); status = ks_rdreg16(ks, KS_ISR); if (unlikely(!status)) { ks_restore_cmd_reg(ks); + spin_unlock_irqrestore(&ks->statelock, flags); return IRQ_NONE; } @@ -900,6 +912,7 @@ ks->netdev->stats.rx_over_errors++; /* this should be the last in IRQ handler*/ ks_restore_cmd_reg(ks); + spin_unlock_irqrestore(&ks->statelock, flags); return IRQ_HANDLED; } @@ -969,6 +982,7 @@ /* shutdown RX/TX QMU */ ks_disable_qmu(ks); + ks_disable_int(ks); /* set powermode to soft power down to save power */ ks_set_powermode(ks, PMECR_PM_SOFTDOWN); @@ -998,13 +1012,13 @@ ks->txh.txw[1] = cpu_to_le16(len); /* 1. set sudo-DMA mode */ - ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); + ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA); /* 2. write status/lenth info */ ks_outblk(ks, ks->txh.txw, 4); /* 3. write pkt data */ ks_outblk(ks, (u16 *)pdata, ALIGN(len, 4)); /* 4. reset sudo-DMA mode */ - ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr); + ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); /* 5. Enqueue Tx(move the pkt from TX buffer into TXQ) */ ks_wrreg16(ks, KS_TXQCR, TXQCR_METFE); /* 6. wait until TXQCR_METFE is auto-cleared */ @@ -1025,10 +1039,9 @@ { netdev_tx_t retv = NETDEV_TX_OK; struct ks_net *ks = netdev_priv(netdev); + unsigned long flags; - disable_irq(netdev->irq); - ks_disable_int(ks); - spin_lock(&ks->statelock); + spin_lock_irqsave(&ks->statelock, flags); /* Extra space are required: * 4 byte for alignment, 4 for status/length, 4 for CRC @@ -1042,9 +1055,7 @@ dev_kfree_skb(skb); } else retv = NETDEV_TX_BUSY; - spin_unlock(&ks->statelock); - ks_enable_int(ks); - enable_irq(netdev->irq); + spin_unlock_irqrestore(&ks->statelock, flags); return retv; } @@ -1573,6 +1584,10 @@ goto err_free; } + err = ks_check_endian(ks); + if (err) + goto err_free; + netdev->irq = platform_get_irq(pdev, 0); if ((int)netdev->irq < 0) { diff -Nru linux-4.19.98/drivers/net/ethernet/mscc/ocelot_board.c linux-4.19.118/drivers/net/ethernet/mscc/ocelot_board.c --- linux-4.19.98/drivers/net/ethernet/mscc/ocelot_board.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/mscc/ocelot_board.c 2020-04-23 08:30:24.000000000 +0000 @@ -105,6 +105,14 @@ if (err != 4) break; + /* At this point the IFH was read correctly, so it is safe to + * presume that there is no error. The err needs to be reset + * otherwise a frame could come in CPU queue between the while + * condition and the check for error later on. And in that case + * the new frame is just removed and not processed. + */ + err = 0; + ocelot_parse_ifh(ifh, &info); dev = ocelot->ports[info.port]->dev; diff -Nru linux-4.19.98/drivers/net/ethernet/natsemi/sonic.c linux-4.19.118/drivers/net/ethernet/natsemi/sonic.c --- linux-4.19.98/drivers/net/ethernet/natsemi/sonic.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/natsemi/sonic.c 2020-04-23 08:30:24.000000000 +0000 @@ -63,6 +63,8 @@ netif_dbg(lp, ifup, dev, "%s: initializing sonic driver\n", __func__); + spin_lock_init(&lp->lock); + for (i = 0; i < SONIC_NUM_RRS; i++) { struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); if (skb == NULL) { @@ -113,6 +115,24 @@ return 0; } +/* Wait for the SONIC to become idle. */ +static void sonic_quiesce(struct net_device *dev, u16 mask) +{ + struct sonic_local * __maybe_unused lp = netdev_priv(dev); + int i; + u16 bits; + + for (i = 0; i < 1000; ++i) { + bits = SONIC_READ(SONIC_CMD) & mask; + if (!bits) + return; + if (irqs_disabled() || in_interrupt()) + udelay(20); + else + usleep_range(100, 200); + } + WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits); +} /* * Close the SONIC device @@ -129,6 +149,9 @@ /* * stop the SONIC, disable interrupts */ + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); + sonic_quiesce(dev, SONIC_CR_ALL); + SONIC_WRITE(SONIC_IMR, 0); SONIC_WRITE(SONIC_ISR, 0x7fff); SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); @@ -168,6 +191,9 @@ * put the Sonic into software-reset mode and * disable all interrupts before releasing DMA buffers */ + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); + sonic_quiesce(dev, SONIC_CR_ALL); + SONIC_WRITE(SONIC_IMR, 0); SONIC_WRITE(SONIC_ISR, 0x7fff); SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); @@ -205,8 +231,6 @@ * wake the tx queue * Concurrently with all of this, the SONIC is potentially writing to * the status flags of the TDs. - * Until some mutual exclusion is added, this code will not work with SMP. However, - * MIPS Jazz machines and m68k Macs were all uni-processor machines. */ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) @@ -214,7 +238,8 @@ struct sonic_local *lp = netdev_priv(dev); dma_addr_t laddr; int length; - int entry = lp->next_tx; + int entry; + unsigned long flags; netif_dbg(lp, tx_queued, dev, "%s: skb=%p\n", __func__, skb); @@ -231,11 +256,15 @@ laddr = dma_map_single(lp->device, skb->data, length, DMA_TO_DEVICE); if (!laddr) { - printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name); - dev_kfree_skb(skb); - return NETDEV_TX_BUSY; + pr_err_ratelimited("%s: failed to map tx DMA buffer.\n", dev->name); + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; } + spin_lock_irqsave(&lp->lock, flags); + + entry = lp->next_tx; + sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1); /* single fragment */ sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of packet */ @@ -245,10 +274,6 @@ sonic_tda_put(dev, entry, SONIC_TD_LINK, sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL); - /* - * Must set tx_skb[entry] only after clearing status, and - * before clearing EOL and before stopping queue - */ wmb(); lp->tx_len[entry] = length; lp->tx_laddr[entry] = laddr; @@ -271,6 +296,8 @@ SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP); + spin_unlock_irqrestore(&lp->lock, flags); + return NETDEV_TX_OK; } @@ -283,15 +310,28 @@ struct net_device *dev = dev_id; struct sonic_local *lp = netdev_priv(dev); int status; + unsigned long flags; + + /* The lock has two purposes. Firstly, it synchronizes sonic_interrupt() + * with sonic_send_packet() so that the two functions can share state. + * Secondly, it makes sonic_interrupt() re-entrant, as that is required + * by macsonic which must use two IRQs with different priority levels. + */ + spin_lock_irqsave(&lp->lock, flags); + + status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; + if (!status) { + spin_unlock_irqrestore(&lp->lock, flags); - if (!(status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)) return IRQ_NONE; + } do { + SONIC_WRITE(SONIC_ISR, status); /* clear the interrupt(s) */ + if (status & SONIC_INT_PKTRX) { netif_dbg(lp, intr, dev, "%s: packet rx\n", __func__); sonic_rx(dev); /* got packet(s) */ - SONIC_WRITE(SONIC_ISR, SONIC_INT_PKTRX); /* clear the interrupt */ } if (status & SONIC_INT_TXDN) { @@ -299,11 +339,12 @@ int td_status; int freed_some = 0; - /* At this point, cur_tx is the index of a TD that is one of: - * unallocated/freed (status set & tx_skb[entry] clear) - * allocated and sent (status set & tx_skb[entry] set ) - * allocated and not yet sent (status clear & tx_skb[entry] set ) - * still being allocated by sonic_send_packet (status clear & tx_skb[entry] clear) + /* The state of a Transmit Descriptor may be inferred + * from { tx_skb[entry], td_status } as follows. + * { clear, clear } => the TD has never been used + * { set, clear } => the TD was handed to SONIC + * { set, set } => the TD was handed back + * { clear, set } => the TD is available for re-use */ netif_dbg(lp, intr, dev, "%s: tx done\n", __func__); @@ -312,18 +353,19 @@ if ((td_status = sonic_tda_get(dev, entry, SONIC_TD_STATUS)) == 0) break; - if (td_status & 0x0001) { + if (td_status & SONIC_TCR_PTX) { lp->stats.tx_packets++; lp->stats.tx_bytes += sonic_tda_get(dev, entry, SONIC_TD_PKTSIZE); } else { - lp->stats.tx_errors++; - if (td_status & 0x0642) + if (td_status & (SONIC_TCR_EXD | + SONIC_TCR_EXC | SONIC_TCR_BCM)) lp->stats.tx_aborted_errors++; - if (td_status & 0x0180) + if (td_status & + (SONIC_TCR_NCRS | SONIC_TCR_CRLS)) lp->stats.tx_carrier_errors++; - if (td_status & 0x0020) + if (td_status & SONIC_TCR_OWC) lp->stats.tx_window_errors++; - if (td_status & 0x0004) + if (td_status & SONIC_TCR_FU) lp->stats.tx_fifo_errors++; } @@ -345,7 +387,6 @@ if (freed_some || lp->tx_skb[entry] == NULL) netif_wake_queue(dev); /* The ring is no longer full */ lp->cur_tx = entry; - SONIC_WRITE(SONIC_ISR, SONIC_INT_TXDN); /* clear the interrupt */ } /* @@ -354,42 +395,37 @@ if (status & SONIC_INT_RFO) { netif_dbg(lp, rx_err, dev, "%s: rx fifo overrun\n", __func__); - lp->stats.rx_fifo_errors++; - SONIC_WRITE(SONIC_ISR, SONIC_INT_RFO); /* clear the interrupt */ } if (status & SONIC_INT_RDE) { netif_dbg(lp, rx_err, dev, "%s: rx descriptors exhausted\n", __func__); - lp->stats.rx_dropped++; - SONIC_WRITE(SONIC_ISR, SONIC_INT_RDE); /* clear the interrupt */ } if (status & SONIC_INT_RBAE) { netif_dbg(lp, rx_err, dev, "%s: rx buffer area exceeded\n", __func__); - lp->stats.rx_dropped++; - SONIC_WRITE(SONIC_ISR, SONIC_INT_RBAE); /* clear the interrupt */ } /* counter overruns; all counters are 16bit wide */ - if (status & SONIC_INT_FAE) { + if (status & SONIC_INT_FAE) lp->stats.rx_frame_errors += 65536; - SONIC_WRITE(SONIC_ISR, SONIC_INT_FAE); /* clear the interrupt */ - } - if (status & SONIC_INT_CRC) { + if (status & SONIC_INT_CRC) lp->stats.rx_crc_errors += 65536; - SONIC_WRITE(SONIC_ISR, SONIC_INT_CRC); /* clear the interrupt */ - } - if (status & SONIC_INT_MP) { + if (status & SONIC_INT_MP) lp->stats.rx_missed_errors += 65536; - SONIC_WRITE(SONIC_ISR, SONIC_INT_MP); /* clear the interrupt */ - } /* transmit error */ if (status & SONIC_INT_TXER) { - if (SONIC_READ(SONIC_TCR) & SONIC_TCR_FU) - netif_dbg(lp, tx_err, dev, "%s: tx fifo underrun\n", - __func__); - SONIC_WRITE(SONIC_ISR, SONIC_INT_TXER); /* clear the interrupt */ + u16 tcr = SONIC_READ(SONIC_TCR); + + netif_dbg(lp, tx_err, dev, "%s: TXER intr, TCR %04x\n", + __func__, tcr); + + if (tcr & (SONIC_TCR_EXD | SONIC_TCR_EXC | + SONIC_TCR_FU | SONIC_TCR_BCM)) { + /* Aborted transmission. Try again. */ + netif_stop_queue(dev); + SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP); + } } /* bus retry */ @@ -399,107 +435,164 @@ /* ... to help debug DMA problems causing endless interrupts. */ /* Bounce the eth interface to turn on the interrupt again. */ SONIC_WRITE(SONIC_IMR, 0); - SONIC_WRITE(SONIC_ISR, SONIC_INT_BR); /* clear the interrupt */ } - /* load CAM done */ - if (status & SONIC_INT_LCD) - SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the interrupt */ - } while((status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT)); + status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT; + } while (status); + + spin_unlock_irqrestore(&lp->lock, flags); + return IRQ_HANDLED; } +/* Return the array index corresponding to a given Receive Buffer pointer. */ +static int index_from_addr(struct sonic_local *lp, dma_addr_t addr, + unsigned int last) +{ + unsigned int i = last; + + do { + i = (i + 1) & SONIC_RRS_MASK; + if (addr == lp->rx_laddr[i]) + return i; + } while (i != last); + + return -ENOENT; +} + +/* Allocate and map a new skb to be used as a receive buffer. */ +static bool sonic_alloc_rb(struct net_device *dev, struct sonic_local *lp, + struct sk_buff **new_skb, dma_addr_t *new_addr) +{ + *new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); + if (!*new_skb) + return false; + + if (SONIC_BUS_SCALE(lp->dma_bitmode) == 2) + skb_reserve(*new_skb, 2); + + *new_addr = dma_map_single(lp->device, skb_put(*new_skb, SONIC_RBSIZE), + SONIC_RBSIZE, DMA_FROM_DEVICE); + if (!*new_addr) { + dev_kfree_skb(*new_skb); + *new_skb = NULL; + return false; + } + + return true; +} + +/* Place a new receive resource in the Receive Resource Area and update RWP. */ +static void sonic_update_rra(struct net_device *dev, struct sonic_local *lp, + dma_addr_t old_addr, dma_addr_t new_addr) +{ + unsigned int entry = sonic_rr_entry(dev, SONIC_READ(SONIC_RWP)); + unsigned int end = sonic_rr_entry(dev, SONIC_READ(SONIC_RRP)); + u32 buf; + + /* The resources in the range [RRP, RWP) belong to the SONIC. This loop + * scans the other resources in the RRA, those in the range [RWP, RRP). + */ + do { + buf = (sonic_rra_get(dev, entry, SONIC_RR_BUFADR_H) << 16) | + sonic_rra_get(dev, entry, SONIC_RR_BUFADR_L); + + if (buf == old_addr) + break; + + entry = (entry + 1) & SONIC_RRS_MASK; + } while (entry != end); + + WARN_ONCE(buf != old_addr, "failed to find resource!\n"); + + sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, new_addr >> 16); + sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, new_addr & 0xffff); + + entry = (entry + 1) & SONIC_RRS_MASK; + + SONIC_WRITE(SONIC_RWP, sonic_rr_addr(dev, entry)); +} + /* * We have a good packet(s), pass it/them up the network stack. */ static void sonic_rx(struct net_device *dev) { struct sonic_local *lp = netdev_priv(dev); - int status; int entry = lp->cur_rx; + int prev_entry = lp->eol_rx; + bool rbe = false; while (sonic_rda_get(dev, entry, SONIC_RD_IN_USE) == 0) { - struct sk_buff *used_skb; - struct sk_buff *new_skb; - dma_addr_t new_laddr; - u16 bufadr_l; - u16 bufadr_h; - int pkt_len; - - status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); - if (status & SONIC_RCR_PRX) { - /* Malloc up new buffer. */ - new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2); - if (new_skb == NULL) { - lp->stats.rx_dropped++; + u16 status = sonic_rda_get(dev, entry, SONIC_RD_STATUS); + + /* If the RD has LPKT set, the chip has finished with the RB */ + if ((status & SONIC_RCR_PRX) && (status & SONIC_RCR_LPKT)) { + struct sk_buff *new_skb; + dma_addr_t new_laddr; + u32 addr = (sonic_rda_get(dev, entry, + SONIC_RD_PKTPTR_H) << 16) | + sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L); + int i = index_from_addr(lp, addr, entry); + + if (i < 0) { + WARN_ONCE(1, "failed to find buffer!\n"); break; } - /* provide 16 byte IP header alignment unless DMA requires otherwise */ - if(SONIC_BUS_SCALE(lp->dma_bitmode) == 2) - skb_reserve(new_skb, 2); - - new_laddr = dma_map_single(lp->device, skb_put(new_skb, SONIC_RBSIZE), - SONIC_RBSIZE, DMA_FROM_DEVICE); - if (!new_laddr) { - dev_kfree_skb(new_skb); - printk(KERN_ERR "%s: Failed to map rx buffer, dropping packet.\n", dev->name); + + if (sonic_alloc_rb(dev, lp, &new_skb, &new_laddr)) { + struct sk_buff *used_skb = lp->rx_skb[i]; + int pkt_len; + + /* Pass the used buffer up the stack */ + dma_unmap_single(lp->device, addr, SONIC_RBSIZE, + DMA_FROM_DEVICE); + + pkt_len = sonic_rda_get(dev, entry, + SONIC_RD_PKTLEN); + skb_trim(used_skb, pkt_len); + used_skb->protocol = eth_type_trans(used_skb, + dev); + netif_rx(used_skb); + lp->stats.rx_packets++; + lp->stats.rx_bytes += pkt_len; + + lp->rx_skb[i] = new_skb; + lp->rx_laddr[i] = new_laddr; + } else { + /* Failed to obtain a new buffer so re-use it */ + new_laddr = addr; lp->stats.rx_dropped++; - break; } - - /* now we have a new skb to replace it, pass the used one up the stack */ - dma_unmap_single(lp->device, lp->rx_laddr[entry], SONIC_RBSIZE, DMA_FROM_DEVICE); - used_skb = lp->rx_skb[entry]; - pkt_len = sonic_rda_get(dev, entry, SONIC_RD_PKTLEN); - skb_trim(used_skb, pkt_len); - used_skb->protocol = eth_type_trans(used_skb, dev); - netif_rx(used_skb); - lp->stats.rx_packets++; - lp->stats.rx_bytes += pkt_len; - - /* and insert the new skb */ - lp->rx_laddr[entry] = new_laddr; - lp->rx_skb[entry] = new_skb; - - bufadr_l = (unsigned long)new_laddr & 0xffff; - bufadr_h = (unsigned long)new_laddr >> 16; - sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, bufadr_l); - sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, bufadr_h); - } else { - /* This should only happen, if we enable accepting broken packets. */ - lp->stats.rx_errors++; - if (status & SONIC_RCR_FAER) - lp->stats.rx_frame_errors++; - if (status & SONIC_RCR_CRCR) - lp->stats.rx_crc_errors++; - } - if (status & SONIC_RCR_LPKT) { - /* - * this was the last packet out of the current receive buffer - * give the buffer back to the SONIC + /* If RBE is already asserted when RWP advances then + * it's safe to clear RBE after processing this packet. */ - lp->cur_rwp += SIZEOF_SONIC_RR * SONIC_BUS_SCALE(lp->dma_bitmode); - if (lp->cur_rwp >= lp->rra_end) lp->cur_rwp = lp->rra_laddr & 0xffff; - SONIC_WRITE(SONIC_RWP, lp->cur_rwp); - if (SONIC_READ(SONIC_ISR) & SONIC_INT_RBE) { - netif_dbg(lp, rx_err, dev, "%s: rx buffer exhausted\n", - __func__); - SONIC_WRITE(SONIC_ISR, SONIC_INT_RBE); /* clear the flag */ - } - } else - printk(KERN_ERR "%s: rx desc without RCR_LPKT. Shouldn't happen !?\n", - dev->name); + rbe = rbe || SONIC_READ(SONIC_ISR) & SONIC_INT_RBE; + sonic_update_rra(dev, lp, addr, new_laddr); + } /* * give back the descriptor */ - sonic_rda_put(dev, entry, SONIC_RD_LINK, - sonic_rda_get(dev, entry, SONIC_RD_LINK) | SONIC_EOL); + sonic_rda_put(dev, entry, SONIC_RD_STATUS, 0); sonic_rda_put(dev, entry, SONIC_RD_IN_USE, 1); - sonic_rda_put(dev, lp->eol_rx, SONIC_RD_LINK, - sonic_rda_get(dev, lp->eol_rx, SONIC_RD_LINK) & ~SONIC_EOL); - lp->eol_rx = entry; - lp->cur_rx = entry = (entry + 1) & SONIC_RDS_MASK; + + prev_entry = entry; + entry = (entry + 1) & SONIC_RDS_MASK; + } + + lp->cur_rx = entry; + + if (prev_entry != lp->eol_rx) { + /* Advance the EOL flag to put descriptors back into service */ + sonic_rda_put(dev, prev_entry, SONIC_RD_LINK, SONIC_EOL | + sonic_rda_get(dev, prev_entry, SONIC_RD_LINK)); + sonic_rda_put(dev, lp->eol_rx, SONIC_RD_LINK, ~SONIC_EOL & + sonic_rda_get(dev, lp->eol_rx, SONIC_RD_LINK)); + lp->eol_rx = prev_entry; } + + if (rbe) + SONIC_WRITE(SONIC_ISR, SONIC_INT_RBE); /* * If any worth-while packets have been received, netif_rx() * has done a mark_bh(NET_BH) for us and will work on them @@ -549,6 +642,8 @@ (netdev_mc_count(dev) > 15)) { rcr |= SONIC_RCR_AMC; } else { + unsigned long flags; + netif_dbg(lp, ifup, dev, "%s: mc_count %d\n", __func__, netdev_mc_count(dev)); sonic_set_cam_enable(dev, 1); /* always enable our own address */ @@ -562,9 +657,14 @@ i++; } SONIC_WRITE(SONIC_CDC, 16); - /* issue Load CAM command */ SONIC_WRITE(SONIC_CDP, lp->cda_laddr & 0xffff); + + /* LCAM and TXP commands can't be used simultaneously */ + spin_lock_irqsave(&lp->lock, flags); + sonic_quiesce(dev, SONIC_CR_TXP); SONIC_WRITE(SONIC_CMD, SONIC_CR_LCAM); + sonic_quiesce(dev, SONIC_CR_LCAM); + spin_unlock_irqrestore(&lp->lock, flags); } } @@ -579,7 +679,6 @@ */ static int sonic_init(struct net_device *dev) { - unsigned int cmd; struct sonic_local *lp = netdev_priv(dev); int i; @@ -591,12 +690,16 @@ SONIC_WRITE(SONIC_ISR, 0x7fff); SONIC_WRITE(SONIC_CMD, SONIC_CR_RST); + /* While in reset mode, clear CAM Enable register */ + SONIC_WRITE(SONIC_CE, 0); + /* * clear software reset flag, disable receiver, clear and * enable interrupts, then completely initialize the SONIC */ SONIC_WRITE(SONIC_CMD, 0); - SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS | SONIC_CR_STP); + sonic_quiesce(dev, SONIC_CR_ALL); /* * initialize the receive resource area @@ -614,15 +717,10 @@ } /* initialize all RRA registers */ - lp->rra_end = (lp->rra_laddr + SONIC_NUM_RRS * SIZEOF_SONIC_RR * - SONIC_BUS_SCALE(lp->dma_bitmode)) & 0xffff; - lp->cur_rwp = (lp->rra_laddr + (SONIC_NUM_RRS - 1) * SIZEOF_SONIC_RR * - SONIC_BUS_SCALE(lp->dma_bitmode)) & 0xffff; - - SONIC_WRITE(SONIC_RSA, lp->rra_laddr & 0xffff); - SONIC_WRITE(SONIC_REA, lp->rra_end); - SONIC_WRITE(SONIC_RRP, lp->rra_laddr & 0xffff); - SONIC_WRITE(SONIC_RWP, lp->cur_rwp); + SONIC_WRITE(SONIC_RSA, sonic_rr_addr(dev, 0)); + SONIC_WRITE(SONIC_REA, sonic_rr_addr(dev, SONIC_NUM_RRS)); + SONIC_WRITE(SONIC_RRP, sonic_rr_addr(dev, 0)); + SONIC_WRITE(SONIC_RWP, sonic_rr_addr(dev, SONIC_NUM_RRS - 1)); SONIC_WRITE(SONIC_URRA, lp->rra_laddr >> 16); SONIC_WRITE(SONIC_EOBC, (SONIC_RBSIZE >> 1) - (lp->dma_bitmode ? 2 : 1)); @@ -630,14 +728,7 @@ netif_dbg(lp, ifup, dev, "%s: issuing RRRA command\n", __func__); SONIC_WRITE(SONIC_CMD, SONIC_CR_RRRA); - i = 0; - while (i++ < 100) { - if (SONIC_READ(SONIC_CMD) & SONIC_CR_RRRA) - break; - } - - netif_dbg(lp, ifup, dev, "%s: status=%x, i=%d\n", __func__, - SONIC_READ(SONIC_CMD), i); + sonic_quiesce(dev, SONIC_CR_RRRA); /* * Initialize the receive descriptors so that they @@ -712,28 +803,17 @@ * load the CAM */ SONIC_WRITE(SONIC_CMD, SONIC_CR_LCAM); - - i = 0; - while (i++ < 100) { - if (SONIC_READ(SONIC_ISR) & SONIC_INT_LCD) - break; - } - netif_dbg(lp, ifup, dev, "%s: CMD=%x, ISR=%x, i=%d\n", __func__, - SONIC_READ(SONIC_CMD), SONIC_READ(SONIC_ISR), i); + sonic_quiesce(dev, SONIC_CR_LCAM); /* * enable receiver, disable loopback * and enable all interrupts */ - SONIC_WRITE(SONIC_CMD, SONIC_CR_RXEN | SONIC_CR_STP); SONIC_WRITE(SONIC_RCR, SONIC_RCR_DEFAULT); SONIC_WRITE(SONIC_TCR, SONIC_TCR_DEFAULT); SONIC_WRITE(SONIC_ISR, 0x7fff); SONIC_WRITE(SONIC_IMR, SONIC_IMR_DEFAULT); - - cmd = SONIC_READ(SONIC_CMD); - if ((cmd & SONIC_CR_RXEN) == 0 || (cmd & SONIC_CR_STP) == 0) - printk(KERN_ERR "sonic_init: failed, status=%x\n", cmd); + SONIC_WRITE(SONIC_CMD, SONIC_CR_RXEN); netif_dbg(lp, ifup, dev, "%s: new status=%x\n", __func__, SONIC_READ(SONIC_CMD)); diff -Nru linux-4.19.98/drivers/net/ethernet/natsemi/sonic.h linux-4.19.118/drivers/net/ethernet/natsemi/sonic.h --- linux-4.19.98/drivers/net/ethernet/natsemi/sonic.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/natsemi/sonic.h 2020-04-23 08:30:24.000000000 +0000 @@ -110,6 +110,9 @@ #define SONIC_CR_TXP 0x0002 #define SONIC_CR_HTX 0x0001 +#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \ + SONIC_CR_RXEN | SONIC_CR_TXP) + /* * SONIC data configuration bits */ @@ -175,6 +178,7 @@ #define SONIC_TCR_NCRS 0x0100 #define SONIC_TCR_CRLS 0x0080 #define SONIC_TCR_EXC 0x0040 +#define SONIC_TCR_OWC 0x0020 #define SONIC_TCR_PMB 0x0008 #define SONIC_TCR_FU 0x0004 #define SONIC_TCR_BCM 0x0002 @@ -274,8 +278,9 @@ #define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */ #define SONIC_NUM_TDS 16 /* number of transmit descriptors */ -#define SONIC_RDS_MASK (SONIC_NUM_RDS-1) -#define SONIC_TDS_MASK (SONIC_NUM_TDS-1) +#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1) +#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1) +#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1) #define SONIC_RBSIZE 1520 /* size of one resource buffer */ @@ -312,8 +317,6 @@ u32 rda_laddr; /* logical DMA address of RDA */ dma_addr_t rx_laddr[SONIC_NUM_RRS]; /* logical DMA addresses of rx skbuffs */ dma_addr_t tx_laddr[SONIC_NUM_TDS]; /* logical DMA addresses of tx skbuffs */ - unsigned int rra_end; - unsigned int cur_rwp; unsigned int cur_rx; unsigned int cur_tx; /* first unacked transmit packet */ unsigned int eol_rx; @@ -322,6 +325,7 @@ int msg_enable; struct device *device; /* generic device */ struct net_device_stats stats; + spinlock_t lock; }; #define TX_TIMEOUT (3 * HZ) @@ -344,30 +348,30 @@ as far as we can tell. */ /* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put() is a much better name. */ -static inline void sonic_buf_put(void* base, int bitmode, +static inline void sonic_buf_put(u16 *base, int bitmode, int offset, __u16 val) { if (bitmode) #ifdef __BIG_ENDIAN - ((__u16 *) base + (offset*2))[1] = val; + __raw_writew(val, base + (offset * 2) + 1); #else - ((__u16 *) base + (offset*2))[0] = val; + __raw_writew(val, base + (offset * 2) + 0); #endif else - ((__u16 *) base)[offset] = val; + __raw_writew(val, base + (offset * 1) + 0); } -static inline __u16 sonic_buf_get(void* base, int bitmode, +static inline __u16 sonic_buf_get(u16 *base, int bitmode, int offset) { if (bitmode) #ifdef __BIG_ENDIAN - return ((volatile __u16 *) base + (offset*2))[1]; + return __raw_readw(base + (offset * 2) + 1); #else - return ((volatile __u16 *) base + (offset*2))[0]; + return __raw_readw(base + (offset * 2) + 0); #endif else - return ((volatile __u16 *) base)[offset]; + return __raw_readw(base + (offset * 1) + 0); } /* Inlines that you should actually use for reading/writing DMA buffers */ @@ -447,6 +451,22 @@ (entry * SIZEOF_SONIC_RR) + offset); } +static inline u16 sonic_rr_addr(struct net_device *dev, int entry) +{ + struct sonic_local *lp = netdev_priv(dev); + + return lp->rra_laddr + + entry * SIZEOF_SONIC_RR * SONIC_BUS_SCALE(lp->dma_bitmode); +} + +static inline u16 sonic_rr_entry(struct net_device *dev, u16 addr) +{ + struct sonic_local *lp = netdev_priv(dev); + + return (addr - (u16)lp->rra_laddr) / (SIZEOF_SONIC_RR * + SONIC_BUS_SCALE(lp->dma_bitmode)); +} + static const char version[] = "sonic.c:v0.92 20.9.98 tsbogend@alpha.franken.de\n"; diff -Nru linux-4.19.98/drivers/net/ethernet/neterion/vxge/vxge-config.h linux-4.19.118/drivers/net/ethernet/neterion/vxge/vxge-config.h --- linux-4.19.98/drivers/net/ethernet/neterion/vxge/vxge-config.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/neterion/vxge/vxge-config.h 2020-04-23 08:30:24.000000000 +0000 @@ -2065,7 +2065,7 @@ if ((level >= VXGE_ERR && VXGE_COMPONENT_LL & VXGE_DEBUG_ERR_MASK) || \ (level >= VXGE_TRACE && VXGE_COMPONENT_LL & VXGE_DEBUG_TRACE_MASK))\ if ((mask & VXGE_DEBUG_MASK) == mask) \ - printk(fmt "\n", __VA_ARGS__); \ + printk(fmt "\n", ##__VA_ARGS__); \ } while (0) #else #define vxge_debug_ll(level, mask, fmt, ...) diff -Nru linux-4.19.98/drivers/net/ethernet/neterion/vxge/vxge-main.h linux-4.19.118/drivers/net/ethernet/neterion/vxge/vxge-main.h --- linux-4.19.98/drivers/net/ethernet/neterion/vxge/vxge-main.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/neterion/vxge/vxge-main.h 2020-04-23 08:30:24.000000000 +0000 @@ -452,49 +452,49 @@ #if (VXGE_DEBUG_LL_CONFIG & VXGE_DEBUG_MASK) #define vxge_debug_ll_config(level, fmt, ...) \ - vxge_debug_ll(level, VXGE_DEBUG_LL_CONFIG, fmt, __VA_ARGS__) + vxge_debug_ll(level, VXGE_DEBUG_LL_CONFIG, fmt, ##__VA_ARGS__) #else #define vxge_debug_ll_config(level, fmt, ...) #endif #if (VXGE_DEBUG_INIT & VXGE_DEBUG_MASK) #define vxge_debug_init(level, fmt, ...) \ - vxge_debug_ll(level, VXGE_DEBUG_INIT, fmt, __VA_ARGS__) + vxge_debug_ll(level, VXGE_DEBUG_INIT, fmt, ##__VA_ARGS__) #else #define vxge_debug_init(level, fmt, ...) #endif #if (VXGE_DEBUG_TX & VXGE_DEBUG_MASK) #define vxge_debug_tx(level, fmt, ...) \ - vxge_debug_ll(level, VXGE_DEBUG_TX, fmt, __VA_ARGS__) + vxge_debug_ll(level, VXGE_DEBUG_TX, fmt, ##__VA_ARGS__) #else #define vxge_debug_tx(level, fmt, ...) #endif #if (VXGE_DEBUG_RX & VXGE_DEBUG_MASK) #define vxge_debug_rx(level, fmt, ...) \ - vxge_debug_ll(level, VXGE_DEBUG_RX, fmt, __VA_ARGS__) + vxge_debug_ll(level, VXGE_DEBUG_RX, fmt, ##__VA_ARGS__) #else #define vxge_debug_rx(level, fmt, ...) #endif #if (VXGE_DEBUG_MEM & VXGE_DEBUG_MASK) #define vxge_debug_mem(level, fmt, ...) \ - vxge_debug_ll(level, VXGE_DEBUG_MEM, fmt, __VA_ARGS__) + vxge_debug_ll(level, VXGE_DEBUG_MEM, fmt, ##__VA_ARGS__) #else #define vxge_debug_mem(level, fmt, ...) #endif #if (VXGE_DEBUG_ENTRYEXIT & VXGE_DEBUG_MASK) #define vxge_debug_entryexit(level, fmt, ...) \ - vxge_debug_ll(level, VXGE_DEBUG_ENTRYEXIT, fmt, __VA_ARGS__) + vxge_debug_ll(level, VXGE_DEBUG_ENTRYEXIT, fmt, ##__VA_ARGS__) #else #define vxge_debug_entryexit(level, fmt, ...) #endif #if (VXGE_DEBUG_INTR & VXGE_DEBUG_MASK) #define vxge_debug_intr(level, fmt, ...) \ - vxge_debug_ll(level, VXGE_DEBUG_INTR, fmt, __VA_ARGS__) + vxge_debug_ll(level, VXGE_DEBUG_INTR, fmt, ##__VA_ARGS__) #else #define vxge_debug_intr(level, fmt, ...) #endif diff -Nru linux-4.19.98/drivers/net/ethernet/netronome/nfp/bpf/jit.c linux-4.19.118/drivers/net/ethernet/netronome/nfp/bpf/jit.c --- linux-4.19.98/drivers/net/ethernet/netronome/nfp/bpf/jit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/netronome/nfp/bpf/jit.c 2020-04-23 08:30:24.000000000 +0000 @@ -326,7 +326,18 @@ return; } - if (sc == SHF_SC_L_SHF) + /* NFP shift instruction has something special. If shift direction is + * left then shift amount of 1 to 31 is specified as 32 minus the amount + * to shift. + * + * But no need to do this for indirect shift which has shift amount be + * 0. Even after we do this subtraction, shift amount 0 will be turned + * into 32 which will eventually be encoded the same as 0 because only + * low 5 bits are encoded, but shift amount be 32 will fail the + * FIELD_PREP check done later on shift mask (0x1f), due to 32 is out of + * mask range. + */ + if (sc == SHF_SC_L_SHF && shift) shift = 32 - shift; insn = OP_SHF_BASE | diff -Nru linux-4.19.98/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h linux-4.19.118/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h --- linux-4.19.98/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h 2020-04-23 08:30:24.000000000 +0000 @@ -423,7 +423,7 @@ #define NFP_NET_CFG_MBOX_SIMPLE_CMD 0x0 #define NFP_NET_CFG_MBOX_SIMPLE_RET 0x4 #define NFP_NET_CFG_MBOX_SIMPLE_VAL 0x8 -#define NFP_NET_CFG_MBOX_SIMPLE_LEN 0x12 +#define NFP_NET_CFG_MBOX_SIMPLE_LEN 12 #define NFP_NET_CFG_MBOX_CMD_CTAG_FILTER_ADD 1 #define NFP_NET_CFG_MBOX_CMD_CTAG_FILTER_KILL 2 diff -Nru linux-4.19.98/drivers/net/ethernet/ni/nixge.c linux-4.19.118/drivers/net/ethernet/ni/nixge.c --- linux-4.19.98/drivers/net/ethernet/ni/nixge.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/ni/nixge.c 2020-04-23 08:30:24.000000000 +0000 @@ -1233,7 +1233,7 @@ } priv->phy_mode = of_get_phy_mode(pdev->dev.of_node); - if (priv->phy_mode < 0) { + if ((int)priv->phy_mode < 0) { netdev_err(ndev, "not find \"phy-mode\" property\n"); err = -EINVAL; goto unregister_mdio; diff -Nru linux-4.19.98/drivers/net/ethernet/pasemi/pasemi_mac.c linux-4.19.118/drivers/net/ethernet/pasemi/pasemi_mac.c --- linux-4.19.98/drivers/net/ethernet/pasemi/pasemi_mac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/pasemi/pasemi_mac.c 2020-04-23 08:30:24.000000000 +0000 @@ -1053,7 +1053,6 @@ dn = pci_device_to_OF_node(mac->pdev); phy_dn = of_parse_phandle(dn, "phy-handle", 0); - of_node_put(phy_dn); mac->link = 0; mac->speed = 0; @@ -1062,6 +1061,7 @@ phydev = of_phy_connect(dev, phy_dn, &pasemi_adjust_link, 0, PHY_INTERFACE_MODE_SGMII); + of_node_put(phy_dn); if (!phydev) { printk(KERN_ERR "%s: Could not attach to phy\n", dev->name); return -ENODEV; diff -Nru linux-4.19.98/drivers/net/ethernet/qlogic/qed/qed_iwarp.c linux-4.19.118/drivers/net/ethernet/qlogic/qed/qed_iwarp.c --- linux-4.19.98/drivers/net/ethernet/qlogic/qed/qed_iwarp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qlogic/qed/qed_iwarp.c 2020-04-23 08:30:24.000000000 +0000 @@ -532,7 +532,8 @@ /* Make sure ep is closed before returning and freeing memory. */ if (ep) { - while (ep->state != QED_IWARP_EP_CLOSED && wait_count++ < 200) + while (READ_ONCE(ep->state) != QED_IWARP_EP_CLOSED && + wait_count++ < 200) msleep(100); if (ep->state != QED_IWARP_EP_CLOSED) @@ -1023,8 +1024,6 @@ params.ep_context = ep; - ep->state = QED_IWARP_EP_CLOSED; - switch (fw_return_code) { case RDMA_RETURN_OK: ep->qp->max_rd_atomic_req = ep->cm_info.ord; @@ -1084,6 +1083,10 @@ break; } + if (fw_return_code != RDMA_RETURN_OK) + /* paired with READ_ONCE in destroy_qp */ + smp_store_release(&ep->state, QED_IWARP_EP_CLOSED); + ep->event_cb(ep->cb_context, ¶ms); /* on passive side, if there is no associated QP (REJECT) we need to @@ -2638,6 +2641,7 @@ cbs.rx_release_cb = qed_iwarp_ll2_rel_rx_pkt; cbs.tx_comp_cb = qed_iwarp_ll2_comp_tx_pkt; cbs.tx_release_cb = qed_iwarp_ll2_rel_tx_pkt; + cbs.slowpath_cb = NULL; cbs.cookie = p_hwfn; memset(&data, 0, sizeof(data)); @@ -2828,7 +2832,9 @@ params.status = (fw_return_code == IWARP_QP_IN_ERROR_GOOD_CLOSE) ? 0 : -ECONNRESET; - ep->state = QED_IWARP_EP_CLOSED; + /* paired with READ_ONCE in destroy_qp */ + smp_store_release(&ep->state, QED_IWARP_EP_CLOSED); + spin_lock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); list_del(&ep->list_entry); spin_unlock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock); @@ -2917,7 +2923,8 @@ params.event = QED_IWARP_EVENT_ACTIVE_COMPLETE; params.ep_context = ep; params.cm_info = &ep->cm_info; - ep->state = QED_IWARP_EP_CLOSED; + /* paired with READ_ONCE in destroy_qp */ + smp_store_release(&ep->state, QED_IWARP_EP_CLOSED); switch (fw_return_code) { case IWARP_CONN_ERROR_TCP_CONNECT_INVALID_PACKET: diff -Nru linux-4.19.98/drivers/net/ethernet/qlogic/qed/qed_l2.c linux-4.19.118/drivers/net/ethernet/qlogic/qed/qed_l2.c --- linux-4.19.98/drivers/net/ethernet/qlogic/qed/qed_l2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qlogic/qed/qed_l2.c 2020-04-23 08:30:24.000000000 +0000 @@ -1631,10 +1631,9 @@ } } -static void __qed_get_vport_pstats(struct qed_hwfn *p_hwfn, - struct qed_ptt *p_ptt, - struct qed_eth_stats *p_stats, - u16 statistics_bin) +static noinline_for_stack void +__qed_get_vport_pstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, + struct qed_eth_stats *p_stats, u16 statistics_bin) { struct eth_pstorm_per_queue_stat pstats; u32 pstats_addr = 0, pstats_len = 0; @@ -1661,10 +1660,9 @@ HILO_64_REGPAIR(pstats.error_drop_pkts); } -static void __qed_get_vport_tstats(struct qed_hwfn *p_hwfn, - struct qed_ptt *p_ptt, - struct qed_eth_stats *p_stats, - u16 statistics_bin) +static noinline_for_stack void +__qed_get_vport_tstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, + struct qed_eth_stats *p_stats, u16 statistics_bin) { struct tstorm_per_port_stat tstats; u32 tstats_addr, tstats_len; @@ -1709,10 +1707,9 @@ } } -static void __qed_get_vport_ustats(struct qed_hwfn *p_hwfn, - struct qed_ptt *p_ptt, - struct qed_eth_stats *p_stats, - u16 statistics_bin) +static noinline_for_stack +void __qed_get_vport_ustats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, + struct qed_eth_stats *p_stats, u16 statistics_bin) { struct eth_ustorm_per_queue_stat ustats; u32 ustats_addr = 0, ustats_len = 0; @@ -1751,10 +1748,9 @@ } } -static void __qed_get_vport_mstats(struct qed_hwfn *p_hwfn, - struct qed_ptt *p_ptt, - struct qed_eth_stats *p_stats, - u16 statistics_bin) +static noinline_for_stack void +__qed_get_vport_mstats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, + struct qed_eth_stats *p_stats, u16 statistics_bin) { struct eth_mstorm_per_queue_stat mstats; u32 mstats_addr = 0, mstats_len = 0; @@ -1780,9 +1776,9 @@ HILO_64_REGPAIR(mstats.tpa_coalesced_bytes); } -static void __qed_get_vport_port_stats(struct qed_hwfn *p_hwfn, - struct qed_ptt *p_ptt, - struct qed_eth_stats *p_stats) +static noinline_for_stack void +__qed_get_vport_port_stats(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, + struct qed_eth_stats *p_stats) { struct qed_eth_stats_common *p_common = &p_stats->common; struct port_stats port_stats; diff -Nru linux-4.19.98/drivers/net/ethernet/qlogic/qede/qede.h linux-4.19.118/drivers/net/ethernet/qlogic/qede/qede.h --- linux-4.19.98/drivers/net/ethernet/qlogic/qede/qede.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qlogic/qede/qede.h 2020-04-23 08:30:24.000000000 +0000 @@ -162,6 +162,8 @@ struct list_head entry; struct list_head rdma_event_list; struct workqueue_struct *rdma_wq; + struct kref refcnt; + struct completion event_comp; }; struct qede_ptp; diff -Nru linux-4.19.98/drivers/net/ethernet/qlogic/qede/qede_rdma.c linux-4.19.118/drivers/net/ethernet/qlogic/qede/qede_rdma.c --- linux-4.19.98/drivers/net/ethernet/qlogic/qede/qede_rdma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qlogic/qede/qede_rdma.c 2020-04-23 08:30:24.000000000 +0000 @@ -57,6 +57,9 @@ static int qede_rdma_create_wq(struct qede_dev *edev) { INIT_LIST_HEAD(&edev->rdma_info.rdma_event_list); + kref_init(&edev->rdma_info.refcnt); + init_completion(&edev->rdma_info.event_comp); + edev->rdma_info.rdma_wq = create_singlethread_workqueue("rdma_wq"); if (!edev->rdma_info.rdma_wq) { DP_NOTICE(edev, "qedr: Could not create workqueue\n"); @@ -81,8 +84,23 @@ } } +static void qede_rdma_complete_event(struct kref *ref) +{ + struct qede_rdma_dev *rdma_dev = + container_of(ref, struct qede_rdma_dev, refcnt); + + /* no more events will be added after this */ + complete(&rdma_dev->event_comp); +} + static void qede_rdma_destroy_wq(struct qede_dev *edev) { + /* Avoid race with add_event flow, make sure it finishes before + * we start accessing the list and cleaning up the work + */ + kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event); + wait_for_completion(&edev->rdma_info.event_comp); + qede_rdma_cleanup_event(edev); destroy_workqueue(edev->rdma_info.rdma_wq); } @@ -287,15 +305,24 @@ if (!edev->rdma_info.qedr_dev) return; + /* We don't want the cleanup flow to start while we're allocating and + * scheduling the work + */ + if (!kref_get_unless_zero(&edev->rdma_info.refcnt)) + return; /* already being destroyed */ + event_node = qede_rdma_get_free_event_node(edev); if (!event_node) - return; + goto out; event_node->event = event; event_node->ptr = edev; INIT_WORK(&event_node->work, qede_rdma_handle_event); queue_work(edev->rdma_info.rdma_wq, &event_node->work); + +out: + kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event); } void qede_rdma_dev_event_open(struct qede_dev *edev) diff -Nru linux-4.19.98/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c linux-4.19.118/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c --- linux-4.19.98/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c 2020-04-23 08:30:24.000000000 +0000 @@ -1720,7 +1720,7 @@ ahw->reset.seq_error = 0; ahw->reset.buff = kzalloc(QLC_83XX_RESTART_TEMPLATE_SIZE, GFP_KERNEL); - if (p_dev->ahw->reset.buff == NULL) + if (ahw->reset.buff == NULL) return -ENOMEM; p_buff = p_dev->ahw->reset.buff; @@ -2043,6 +2043,7 @@ break; } entry += p_hdr->size; + cond_resched(); } p_dev->ahw->reset.seq_index = index; } diff -Nru linux-4.19.98/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c linux-4.19.118/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c --- linux-4.19.98/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c 2020-04-23 08:30:24.000000000 +0000 @@ -703,6 +703,7 @@ addr += 16; reg_read -= 16; ret += 16; + cond_resched(); } out: mutex_unlock(&adapter->ahw->mem_lock); @@ -1383,6 +1384,7 @@ buf_offset += entry->hdr.cap_size; entry_offset += entry->hdr.offset; buffer = fw_dump->data + buf_offset; + cond_resched(); } fw_dump->clr = 1; diff -Nru linux-4.19.98/drivers/net/ethernet/qualcomm/qca_spi.c linux-4.19.118/drivers/net/ethernet/qualcomm/qca_spi.c --- linux-4.19.98/drivers/net/ethernet/qualcomm/qca_spi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qualcomm/qca_spi.c 2020-04-23 08:30:24.000000000 +0000 @@ -475,7 +475,6 @@ u16 signature = 0; u16 spi_config; u16 wrbuf_space = 0; - static u16 reset_count; if (event == QCASPI_EVENT_CPUON) { /* Read signature twice, if not valid @@ -528,13 +527,13 @@ qca->sync = QCASPI_SYNC_RESET; qca->stats.trig_reset++; - reset_count = 0; + qca->reset_count = 0; break; case QCASPI_SYNC_RESET: - reset_count++; + qca->reset_count++; netdev_dbg(qca->net_dev, "sync: waiting for CPU on, count %u.\n", - reset_count); - if (reset_count >= QCASPI_RESET_TIMEOUT) { + qca->reset_count); + if (qca->reset_count >= QCASPI_RESET_TIMEOUT) { /* reset did not seem to take place, try again */ qca->sync = QCASPI_SYNC_UNKNOWN; qca->stats.reset_timeout++; diff -Nru linux-4.19.98/drivers/net/ethernet/qualcomm/qca_spi.h linux-4.19.118/drivers/net/ethernet/qualcomm/qca_spi.h --- linux-4.19.98/drivers/net/ethernet/qualcomm/qca_spi.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qualcomm/qca_spi.h 2020-04-23 08:30:24.000000000 +0000 @@ -92,6 +92,7 @@ unsigned int intr_req; unsigned int intr_svc; + u16 reset_count; #ifdef CONFIG_DEBUG_FS struct dentry *device_root; diff -Nru linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c --- linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c 2020-04-23 08:30:24.000000000 +0000 @@ -22,25 +22,6 @@ #include "rmnet_vnd.h" #include "rmnet_private.h" -/* Locking scheme - - * The shared resource which needs to be protected is realdev->rx_handler_data. - * For the writer path, this is using rtnl_lock(). The writer paths are - * rmnet_newlink(), rmnet_dellink() and rmnet_force_unassociate_device(). These - * paths are already called with rtnl_lock() acquired in. There is also an - * ASSERT_RTNL() to ensure that we are calling with rtnl acquired. For - * dereference here, we will need to use rtnl_dereference(). Dev list writing - * needs to happen with rtnl_lock() acquired for netdev_master_upper_dev_link(). - * For the reader path, the real_dev->rx_handler_data is called in the TX / RX - * path. We only need rcu_read_lock() for these scenarios. In these cases, - * the rcu_read_lock() is held in __dev_queue_xmit() and - * netif_receive_skb_internal(), so readers need to use rcu_dereference_rtnl() - * to get the relevant information. For dev list reading, we again acquire - * rcu_read_lock() in rmnet_dellink() for netdev_master_upper_dev_get_rcu(). - * We also use unregister_netdevice_many() to free all rmnet devices in - * rmnet_force_unassociate_device() so we dont lose the rtnl_lock() and free in - * same context. - */ - /* Local Definitions and Declarations */ static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX + 1] = { @@ -60,9 +41,10 @@ return rtnl_dereference(real_dev->rx_handler_data); } -static int rmnet_unregister_real_device(struct net_device *real_dev, - struct rmnet_port *port) +static int rmnet_unregister_real_device(struct net_device *real_dev) { + struct rmnet_port *port = rmnet_get_port_rtnl(real_dev); + if (port->nr_rmnet_devs) return -EINVAL; @@ -70,9 +52,6 @@ kfree(port); - /* release reference on real_dev */ - dev_put(real_dev); - netdev_dbg(real_dev, "Removed from rmnet\n"); return 0; } @@ -98,9 +77,6 @@ return -EBUSY; } - /* hold on to real dev for MAP data */ - dev_hold(real_dev); - for (entry = 0; entry < RMNET_MAX_LOGICAL_EP; entry++) INIT_HLIST_HEAD(&port->muxed_ep[entry]); @@ -108,28 +84,33 @@ return 0; } -static void rmnet_unregister_bridge(struct net_device *dev, - struct rmnet_port *port) +static void rmnet_unregister_bridge(struct rmnet_port *port) { - struct rmnet_port *bridge_port; - struct net_device *bridge_dev; + struct net_device *bridge_dev, *real_dev, *rmnet_dev; + struct rmnet_port *real_port; if (port->rmnet_mode != RMNET_EPMODE_BRIDGE) return; - /* bridge slave handling */ + rmnet_dev = port->rmnet_dev; if (!port->nr_rmnet_devs) { - bridge_dev = port->bridge_ep; - - bridge_port = rmnet_get_port_rtnl(bridge_dev); - bridge_port->bridge_ep = NULL; - bridge_port->rmnet_mode = RMNET_EPMODE_VND; + /* bridge device */ + real_dev = port->bridge_ep; + bridge_dev = port->dev; + + real_port = rmnet_get_port_rtnl(real_dev); + real_port->bridge_ep = NULL; + real_port->rmnet_mode = RMNET_EPMODE_VND; } else { + /* real device */ bridge_dev = port->bridge_ep; - bridge_port = rmnet_get_port_rtnl(bridge_dev); - rmnet_unregister_real_device(bridge_dev, bridge_port); + port->bridge_ep = NULL; + port->rmnet_mode = RMNET_EPMODE_VND; } + + netdev_upper_dev_unlink(bridge_dev, rmnet_dev); + rmnet_unregister_real_device(bridge_dev); } static int rmnet_newlink(struct net *src_net, struct net_device *dev, @@ -144,6 +125,11 @@ int err = 0; u16 mux_id; + if (!tb[IFLA_LINK]) { + NL_SET_ERR_MSG_MOD(extack, "link not specified"); + return -EINVAL; + } + real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); if (!real_dev || !dev) return -ENODEV; @@ -166,7 +152,12 @@ if (err) goto err1; + err = netdev_upper_dev_link(real_dev, dev, extack); + if (err < 0) + goto err2; + port->rmnet_mode = mode; + port->rmnet_dev = dev; hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]); @@ -182,8 +173,11 @@ return 0; +err2: + unregister_netdevice(dev); + rmnet_vnd_dellink(mux_id, port, ep); err1: - rmnet_unregister_real_device(real_dev, port); + rmnet_unregister_real_device(real_dev); err0: kfree(ep); return err; @@ -192,77 +186,74 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head) { struct rmnet_priv *priv = netdev_priv(dev); - struct net_device *real_dev; + struct net_device *real_dev, *bridge_dev; + struct rmnet_port *real_port, *bridge_port; struct rmnet_endpoint *ep; - struct rmnet_port *port; - u8 mux_id; + u8 mux_id = priv->mux_id; real_dev = priv->real_dev; - if (!real_dev || !rmnet_is_real_dev_registered(real_dev)) + if (!rmnet_is_real_dev_registered(real_dev)) return; - port = rmnet_get_port_rtnl(real_dev); - - mux_id = rmnet_vnd_get_mux(dev); + real_port = rmnet_get_port_rtnl(real_dev); + bridge_dev = real_port->bridge_ep; + if (bridge_dev) { + bridge_port = rmnet_get_port_rtnl(bridge_dev); + rmnet_unregister_bridge(bridge_port); + } - ep = rmnet_get_endpoint(port, mux_id); + ep = rmnet_get_endpoint(real_port, mux_id); if (ep) { hlist_del_init_rcu(&ep->hlnode); - rmnet_unregister_bridge(dev, port); - rmnet_vnd_dellink(mux_id, port, ep); + rmnet_vnd_dellink(mux_id, real_port, ep); kfree(ep); } - rmnet_unregister_real_device(real_dev, port); + netdev_upper_dev_unlink(real_dev, dev); + rmnet_unregister_real_device(real_dev); unregister_netdevice_queue(dev, head); } -static void rmnet_force_unassociate_device(struct net_device *dev) +static void rmnet_force_unassociate_device(struct net_device *real_dev) { - struct net_device *real_dev = dev; struct hlist_node *tmp_ep; struct rmnet_endpoint *ep; struct rmnet_port *port; unsigned long bkt_ep; LIST_HEAD(list); - if (!rmnet_is_real_dev_registered(real_dev)) - return; - - ASSERT_RTNL(); - - port = rmnet_get_port_rtnl(dev); - - rcu_read_lock(); - rmnet_unregister_bridge(dev, port); - - hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { - unregister_netdevice_queue(ep->egress_dev, &list); - rmnet_vnd_dellink(ep->mux_id, port, ep); + port = rmnet_get_port_rtnl(real_dev); - hlist_del_init_rcu(&ep->hlnode); - kfree(ep); + if (port->nr_rmnet_devs) { + /* real device */ + rmnet_unregister_bridge(port); + hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { + unregister_netdevice_queue(ep->egress_dev, &list); + netdev_upper_dev_unlink(real_dev, ep->egress_dev); + rmnet_vnd_dellink(ep->mux_id, port, ep); + hlist_del_init_rcu(&ep->hlnode); + kfree(ep); + } + rmnet_unregister_real_device(real_dev); + unregister_netdevice_many(&list); + } else { + rmnet_unregister_bridge(port); } - - rcu_read_unlock(); - unregister_netdevice_many(&list); - - rmnet_unregister_real_device(real_dev, port); } static int rmnet_config_notify_cb(struct notifier_block *nb, unsigned long event, void *data) { - struct net_device *dev = netdev_notifier_info_to_dev(data); + struct net_device *real_dev = netdev_notifier_info_to_dev(data); - if (!dev) + if (!rmnet_is_real_dev_registered(real_dev)) return NOTIFY_DONE; switch (event) { case NETDEV_UNREGISTER: - netdev_dbg(dev, "Kernel unregister\n"); - rmnet_force_unassociate_device(dev); + netdev_dbg(real_dev, "Kernel unregister\n"); + rmnet_force_unassociate_device(real_dev); break; default: @@ -297,32 +288,41 @@ { struct rmnet_priv *priv = netdev_priv(dev); struct net_device *real_dev; - struct rmnet_endpoint *ep; struct rmnet_port *port; u16 mux_id; if (!dev) return -ENODEV; - real_dev = __dev_get_by_index(dev_net(dev), - nla_get_u32(tb[IFLA_LINK])); - - if (!real_dev || !rmnet_is_real_dev_registered(real_dev)) + real_dev = priv->real_dev; + if (!rmnet_is_real_dev_registered(real_dev)) return -ENODEV; port = rmnet_get_port_rtnl(real_dev); if (data[IFLA_RMNET_MUX_ID]) { mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]); - ep = rmnet_get_endpoint(port, priv->mux_id); - if (!ep) - return -ENODEV; - hlist_del_init_rcu(&ep->hlnode); - hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]); + if (mux_id != priv->mux_id) { + struct rmnet_endpoint *ep; - ep->mux_id = mux_id; - priv->mux_id = mux_id; + ep = rmnet_get_endpoint(port, priv->mux_id); + if (!ep) + return -ENODEV; + + if (rmnet_get_endpoint(port, mux_id)) { + NL_SET_ERR_MSG_MOD(extack, + "MUX ID already exists"); + return -EINVAL; + } + + hlist_del_init_rcu(&ep->hlnode); + hlist_add_head_rcu(&ep->hlnode, + &port->muxed_ep[mux_id]); + + ep->mux_id = mux_id; + priv->mux_id = mux_id; + } } if (data[IFLA_RMNET_FLAGS]) { @@ -388,11 +388,10 @@ .fill_info = rmnet_fill_info, }; -/* Needs either rcu_read_lock() or rtnl lock */ -struct rmnet_port *rmnet_get_port(struct net_device *real_dev) +struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev) { if (rmnet_is_real_dev_registered(real_dev)) - return rcu_dereference_rtnl(real_dev->rx_handler_data); + return rcu_dereference_bh(real_dev->rx_handler_data); else return NULL; } @@ -418,7 +417,7 @@ struct rmnet_port *port, *slave_port; int err; - port = rmnet_get_port(real_dev); + port = rmnet_get_port_rtnl(real_dev); /* If there is more than one rmnet dev attached, its probably being * used for muxing. Skip the briding in that case @@ -426,6 +425,9 @@ if (port->nr_rmnet_devs > 1) return -EINVAL; + if (port->rmnet_mode != RMNET_EPMODE_VND) + return -EINVAL; + if (rmnet_is_real_dev_registered(slave_dev)) return -EBUSY; @@ -433,9 +435,17 @@ if (err) return -EBUSY; - slave_port = rmnet_get_port(slave_dev); + err = netdev_master_upper_dev_link(slave_dev, rmnet_dev, NULL, NULL, + extack); + if (err) { + rmnet_unregister_real_device(slave_dev); + return err; + } + + slave_port = rmnet_get_port_rtnl(slave_dev); slave_port->rmnet_mode = RMNET_EPMODE_BRIDGE; slave_port->bridge_ep = real_dev; + slave_port->rmnet_dev = rmnet_dev; port->rmnet_mode = RMNET_EPMODE_BRIDGE; port->bridge_ep = slave_dev; @@ -447,16 +457,9 @@ int rmnet_del_bridge(struct net_device *rmnet_dev, struct net_device *slave_dev) { - struct rmnet_priv *priv = netdev_priv(rmnet_dev); - struct net_device *real_dev = priv->real_dev; - struct rmnet_port *port, *slave_port; + struct rmnet_port *port = rmnet_get_port_rtnl(slave_dev); - port = rmnet_get_port(real_dev); - port->rmnet_mode = RMNET_EPMODE_VND; - port->bridge_ep = NULL; - - slave_port = rmnet_get_port(slave_dev); - rmnet_unregister_real_device(slave_dev, slave_port); + rmnet_unregister_bridge(port); netdev_dbg(slave_dev, "removed from rmnet as slave\n"); return 0; @@ -482,8 +485,8 @@ static void __exit rmnet_exit(void) { - unregister_netdevice_notifier(&rmnet_dev_notifier); rtnl_link_unregister(&rmnet_link_ops); + unregister_netdevice_notifier(&rmnet_dev_notifier); } module_init(rmnet_init) diff -Nru linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h --- linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h 2020-04-23 08:30:24.000000000 +0000 @@ -37,6 +37,7 @@ u8 rmnet_mode; struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP]; struct net_device *bridge_ep; + struct net_device *rmnet_dev; }; extern struct rtnl_link_ops rmnet_link_ops; @@ -74,7 +75,7 @@ struct rmnet_priv_stats stats; }; -struct rmnet_port *rmnet_get_port(struct net_device *real_dev); +struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev); struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); int rmnet_add_bridge(struct net_device *rmnet_dev, struct net_device *slave_dev, diff -Nru linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c --- linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c 2020-04-23 08:30:24.000000000 +0000 @@ -168,6 +168,9 @@ static void rmnet_bridge_handler(struct sk_buff *skb, struct net_device *bridge_dev) { + if (skb_mac_header_was_set(skb)) + skb_push(skb, skb->mac_len); + if (bridge_dev) { skb->dev = bridge_dev; dev_queue_xmit(skb); @@ -193,7 +196,7 @@ return RX_HANDLER_PASS; dev = skb->dev; - port = rmnet_get_port(dev); + port = rmnet_get_port_rcu(dev); switch (port->rmnet_mode) { case RMNET_EPMODE_VND: @@ -226,7 +229,7 @@ skb->dev = priv->real_dev; mux_id = priv->mux_id; - port = rmnet_get_port(skb->dev); + port = rmnet_get_port_rcu(skb->dev); if (!port) goto drop; diff -Nru linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c --- linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c 2020-04-23 08:30:24.000000000 +0000 @@ -276,14 +276,6 @@ return 0; } -u8 rmnet_vnd_get_mux(struct net_device *rmnet_dev) -{ - struct rmnet_priv *priv; - - priv = netdev_priv(rmnet_dev); - return priv->mux_id; -} - int rmnet_vnd_do_flow_control(struct net_device *rmnet_dev, int enable) { netdev_dbg(rmnet_dev, "Setting VND TX queue state to %d\n", enable); diff -Nru linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h --- linux-4.19.98/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h 2020-04-23 08:30:24.000000000 +0000 @@ -25,6 +25,5 @@ struct rmnet_endpoint *ep); void rmnet_vnd_rx_fixup(struct sk_buff *skb, struct net_device *dev); void rmnet_vnd_tx_fixup(struct sk_buff *skb, struct net_device *dev); -u8 rmnet_vnd_get_mux(struct net_device *rmnet_dev); void rmnet_vnd_setup(struct net_device *dev); #endif /* _RMNET_VND_H_ */ diff -Nru linux-4.19.98/drivers/net/ethernet/realtek/r8169.c linux-4.19.118/drivers/net/ethernet/realtek/r8169.c --- linux-4.19.98/drivers/net/ethernet/realtek/r8169.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/realtek/r8169.c 2020-04-23 08:30:24.000000000 +0000 @@ -7249,7 +7249,7 @@ RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable); RTL_W8(tp, Cfg9346, Cfg9346_Lock); /* fall through */ - case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_24: + case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_17: flags = PCI_IRQ_LEGACY; break; default: diff -Nru linux-4.19.98/drivers/net/ethernet/renesas/sh_eth.c linux-4.19.118/drivers/net/ethernet/renesas/sh_eth.c --- linux-4.19.98/drivers/net/ethernet/renesas/sh_eth.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/renesas/sh_eth.c 2020-04-23 08:30:24.000000000 +0000 @@ -3133,12 +3133,16 @@ struct device_node *np = dev->of_node; struct sh_eth_plat_data *pdata; const char *mac_addr; + int ret; pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return NULL; - pdata->phy_interface = of_get_phy_mode(np); + ret = of_get_phy_mode(np); + if (ret < 0) + return NULL; + pdata->phy_interface = ret; mac_addr = of_get_mac_address(np); if (mac_addr) diff -Nru linux-4.19.98/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c linux-4.19.118/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c --- linux-4.19.98/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2282,7 +2282,7 @@ if (!str || !*str) return -EINVAL; while ((opt = strsep(&str, ",")) != NULL) { - if (!strncmp(opt, "eee_timer:", 6)) { + if (!strncmp(opt, "eee_timer:", 10)) { if (kstrtoint(opt + 10, 0, &eee_timer)) goto err; } diff -Nru linux-4.19.98/drivers/net/ethernet/sfc/efx.c linux-4.19.118/drivers/net/ethernet/sfc/efx.c --- linux-4.19.98/drivers/net/ethernet/sfc/efx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/sfc/efx.c 2020-04-23 08:30:24.000000000 +0000 @@ -522,6 +522,7 @@ if (tx_queue->channel) tx_queue->channel = channel; tx_queue->buffer = NULL; + tx_queue->cb_page = NULL; memset(&tx_queue->txd, 0, sizeof(tx_queue->txd)); } diff -Nru linux-4.19.98/drivers/net/ethernet/sfc/ptp.c linux-4.19.118/drivers/net/ethernet/sfc/ptp.c --- linux-4.19.98/drivers/net/ethernet/sfc/ptp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/sfc/ptp.c 2020-04-23 08:30:24.000000000 +0000 @@ -563,13 +563,45 @@ u32 nic_major, u32 nic_minor, s32 correction) { + u32 sync_timestamp; ktime_t kt = { 0 }; + s16 delta; if (!(nic_major & 0x80000000)) { WARN_ON_ONCE(nic_major >> 16); - /* Use the top bits from the latest sync event. */ - nic_major &= 0xffff; - nic_major |= (last_sync_timestamp_major(efx) & 0xffff0000); + + /* Medford provides 48 bits of timestamp, so we must get the top + * 16 bits from the timesync event state. + * + * We only have the lower 16 bits of the time now, but we do + * have a full resolution timestamp at some point in past. As + * long as the difference between the (real) now and the sync + * is less than 2^15, then we can reconstruct the difference + * between those two numbers using only the lower 16 bits of + * each. + * + * Put another way + * + * a - b = ((a mod k) - b) mod k + * + * when -k/2 < (a-b) < k/2. In our case k is 2^16. We know + * (a mod k) and b, so can calculate the delta, a - b. + * + */ + sync_timestamp = last_sync_timestamp_major(efx); + + /* Because delta is s16 this does an implicit mask down to + * 16 bits which is what we need, assuming + * MEDFORD_TX_SECS_EVENT_BITS is 16. delta is signed so that + * we can deal with the (unlikely) case of sync timestamps + * arriving from the future. + */ + delta = nic_major - sync_timestamp; + + /* Recover the fully specified time now, by applying the offset + * to the (fully specified) sync time. + */ + nic_major = sync_timestamp + delta; kt = ptp->nic_to_kernel_time(nic_major, nic_minor, correction); diff -Nru linux-4.19.98/drivers/net/ethernet/smsc/smc911x.c linux-4.19.118/drivers/net/ethernet/smsc/smc911x.c --- linux-4.19.98/drivers/net/ethernet/smsc/smc911x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/smsc/smc911x.c 2020-04-23 08:30:24.000000000 +0000 @@ -947,7 +947,7 @@ if (lp->ctl_rspeed != 100) my_ad_caps &= ~(ADVERTISE_100BASE4|ADVERTISE_100FULL|ADVERTISE_100HALF); - if (!lp->ctl_rfduplx) + if (!lp->ctl_rfduplx) my_ad_caps &= ~(ADVERTISE_100FULL|ADVERTISE_10FULL); /* Update our Auto-Neg Advertisement Register */ diff -Nru linux-4.19.98/drivers/net/ethernet/socionext/netsec.c linux-4.19.118/drivers/net/ethernet/socionext/netsec.c --- linux-4.19.98/drivers/net/ethernet/socionext/netsec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/socionext/netsec.c 2020-04-23 08:30:24.000000000 +0000 @@ -432,9 +432,12 @@ return 0; } +static int netsec_phy_read(struct mii_bus *bus, int phy_addr, int reg_addr); + static int netsec_phy_write(struct mii_bus *bus, int phy_addr, int reg, u16 val) { + int status; struct netsec_priv *priv = bus->priv; if (netsec_mac_write(priv, GMAC_REG_GDR, val)) @@ -447,8 +450,19 @@ GMAC_REG_SHIFT_CR_GAR))) return -ETIMEDOUT; - return netsec_mac_wait_while_busy(priv, GMAC_REG_GAR, - NETSEC_GMAC_GAR_REG_GB); + status = netsec_mac_wait_while_busy(priv, GMAC_REG_GAR, + NETSEC_GMAC_GAR_REG_GB); + + /* Developerbox implements RTL8211E PHY and there is + * a compatibility problem with F_GMAC4. + * RTL8211E expects MDC clock must be kept toggling for several + * clock cycle with MDIO high before entering the IDLE state. + * To meet this requirement, netsec driver needs to issue dummy + * read(e.g. read PHYID1(offset 0x2) register) right after write. + */ + netsec_phy_read(bus, phy_addr, MII_PHYSID1); + + return status; } static int netsec_phy_read(struct mii_bus *bus, int phy_addr, int reg_addr) @@ -1590,7 +1604,7 @@ NETIF_MSG_LINK | NETIF_MSG_PROBE; priv->phy_interface = device_get_phy_mode(&pdev->dev); - if (priv->phy_interface < 0) { + if ((int)priv->phy_interface < 0) { dev_err(&pdev->dev, "missing required property 'phy-mode'\n"); ret = -ENODEV; goto free_ndev; diff -Nru linux-4.19.98/drivers/net/ethernet/socionext/sni_ave.c linux-4.19.118/drivers/net/ethernet/socionext/sni_ave.c --- linux-4.19.98/drivers/net/ethernet/socionext/sni_ave.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/socionext/sni_ave.c 2020-04-23 08:30:24.000000000 +0000 @@ -1575,7 +1575,7 @@ np = dev->of_node; phy_mode = of_get_phy_mode(np); - if (phy_mode < 0) { + if ((int)phy_mode < 0) { dev_err(dev, "phy-mode not found\n"); return -EINVAL; } diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c 2020-04-23 08:30:24.000000000 +0000 @@ -191,7 +191,7 @@ struct device *dev = &gmac->pdev->dev; gmac->phy_mode = of_get_phy_mode(dev->of_node); - if (gmac->phy_mode < 0) { + if ((int)gmac->phy_mode < 0) { dev_err(dev, "missing phy mode property\n"); return -EINVAL; } diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c 2020-04-23 08:30:24.000000000 +0000 @@ -355,7 +355,7 @@ dwmac->dev = &pdev->dev; dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); - if (dwmac->phy_mode < 0) { + if ((int)dwmac->phy_mode < 0) { dev_err(&pdev->dev, "missing phy-mode property\n"); ret = -EINVAL; goto err_remove_config_dt; diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c 2020-04-23 08:30:24.000000000 +0000 @@ -1420,7 +1420,7 @@ ret = rk_gmac_clk_init(plat_dat); if (ret) - return ret; + goto err_remove_config_dt; ret = rk_gmac_powerup(plat_dat->bsp_priv); if (ret) diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c 2020-04-23 08:30:24.000000000 +0000 @@ -155,6 +155,8 @@ plat_dat->init = sun7i_gmac_init; plat_dat->exit = sun7i_gmac_exit; plat_dat->fix_mac_speed = sun7i_fix_speed; + plat_dat->tx_fifo_size = 4096; + plat_dat->rx_fifo_size = 16384; ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv); if (ret) diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -34,6 +34,7 @@ static void dwmac1000_core_init(struct mac_device_info *hw, struct net_device *dev) { + struct stmmac_priv *priv = netdev_priv(dev); void __iomem *ioaddr = hw->pcsr; u32 value = readl(ioaddr + GMAC_CONTROL); int mtu = dev->mtu; @@ -45,7 +46,7 @@ * Broadcom tags can look like invalid LLC/SNAP packets and cause the * hardware to truncate packets on reception. */ - if (netdev_uses_dsa(dev)) + if (netdev_uses_dsa(dev) || !priv->plat->enh_desc) value &= ~GMAC_CONTROL_ACS; if (mtu > 1500) @@ -217,7 +218,7 @@ reg++; } - while (reg <= perfect_addr_number) { + while (reg < perfect_addr_number) { writel(0, ioaddr + GMAC_ADDR_HIGH(reg)); writel(0, ioaddr + GMAC_ADDR_LOW(reg)); reg++; diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -443,7 +443,7 @@ } /* Handle multiple unicast addresses */ - if (netdev_uc_count(dev) > GMAC_MAX_PERFECT_ADDRESSES) { + if (netdev_uc_count(dev) > hw->unicast_filter_entries) { /* Switch to promiscuous mode if more than 128 addrs * are required */ diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac5.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac5.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/dwmac5.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/dwmac5.c 2020-04-23 08:30:24.000000000 +0000 @@ -515,6 +515,7 @@ if (!enable) { val |= PPSCMDx(index, 0x5); + val |= PPSEN0; writel(val, ioaddr + MAC_PPS_CONTROL); return 0; } diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -4513,6 +4513,7 @@ { struct net_device *ndev = dev_get_drvdata(dev); struct stmmac_priv *priv = netdev_priv(ndev); + u32 chan; if (!ndev || !netif_running(ndev)) return 0; @@ -4527,6 +4528,9 @@ stmmac_disable_all_queues(priv); + for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) + del_timer_sync(&priv->tx_queue[chan].txtimer); + /* Stop TX/RX DMA */ stmmac_stop_all_dma(priv); diff -Nru linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c --- linux-4.19.98/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c 2020-04-23 08:30:24.000000000 +0000 @@ -174,7 +174,7 @@ /* structure describing a PTP hardware clock */ static struct ptp_clock_info stmmac_ptp_clock_ops = { .owner = THIS_MODULE, - .name = "stmmac_ptp_clock", + .name = "stmmac ptp", .max_adj = 62500000, .n_alarm = 0, .n_ext_ts = 0, diff -Nru linux-4.19.98/drivers/net/ethernet/xilinx/xilinx_axienet_main.c linux-4.19.118/drivers/net/ethernet/xilinx/xilinx_axienet_main.c --- linux-4.19.98/drivers/net/ethernet/xilinx/xilinx_axienet_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ethernet/xilinx/xilinx_axienet_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1573,7 +1573,7 @@ } } else { lp->phy_mode = of_get_phy_mode(pdev->dev.of_node); - if (lp->phy_mode < 0) { + if ((int)lp->phy_mode < 0) { ret = -EINVAL; goto free_netdev; } diff -Nru linux-4.19.98/drivers/net/geneve.c linux-4.19.118/drivers/net/geneve.c --- linux-4.19.98/drivers/net/geneve.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/geneve.c 2020-04-23 08:30:24.000000000 +0000 @@ -1725,8 +1725,6 @@ if (!net_eq(dev_net(geneve->dev), net)) unregister_netdevice_queue(geneve->dev, head); } - - WARN_ON_ONCE(!list_empty(&gn->sock_list)); } static void __net_exit geneve_exit_batch_net(struct list_head *net_list) @@ -1741,6 +1739,12 @@ /* unregister the devices gathered above */ unregister_netdevice_many(&list); rtnl_unlock(); + + list_for_each_entry(net, net_list, exit_list) { + const struct geneve_net *gn = net_generic(net, geneve_net_id); + + WARN_ON_ONCE(!list_empty(&gn->sock_list)); + } } static struct pernet_operations geneve_net_ops = { diff -Nru linux-4.19.98/drivers/net/gtp.c linux-4.19.118/drivers/net/gtp.c --- linux-4.19.98/drivers/net/gtp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/gtp.c 2020-04-23 08:30:24.000000000 +0000 @@ -772,12 +772,12 @@ int i; gtp->addr_hash = kmalloc_array(hsize, sizeof(struct hlist_head), - GFP_KERNEL); + GFP_KERNEL | __GFP_NOWARN); if (gtp->addr_hash == NULL) return -ENOMEM; gtp->tid_hash = kmalloc_array(hsize, sizeof(struct hlist_head), - GFP_KERNEL); + GFP_KERNEL | __GFP_NOWARN); if (gtp->tid_hash == NULL) goto err1; @@ -809,19 +809,21 @@ return NULL; } - if (sock->sk->sk_protocol != IPPROTO_UDP) { + sk = sock->sk; + if (sk->sk_protocol != IPPROTO_UDP || + sk->sk_type != SOCK_DGRAM || + (sk->sk_family != AF_INET && sk->sk_family != AF_INET6)) { pr_debug("socket fd=%d not UDP\n", fd); sk = ERR_PTR(-EINVAL); goto out_sock; } - lock_sock(sock->sk); - if (sock->sk->sk_user_data) { + lock_sock(sk); + if (sk->sk_user_data) { sk = ERR_PTR(-EBUSY); goto out_rel_sock; } - sk = sock->sk; sock_hold(sk); tuncfg.sk_user_data = gtp; diff -Nru linux-4.19.98/drivers/net/hyperv/hyperv_net.h linux-4.19.118/drivers/net/hyperv/hyperv_net.h --- linux-4.19.98/drivers/net/hyperv/hyperv_net.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/hyperv/hyperv_net.h 2020-04-23 08:30:24.000000000 +0000 @@ -616,7 +616,8 @@ /* The number of entries in the send indirection table */ u32 count; - /* The offset of the send indirection table from top of this struct. + /* The offset of the send indirection table from the beginning of + * struct nvsp_message. * The send indirection table tells which channel to put the send * traffic on. Each entry is a channel number. */ diff -Nru linux-4.19.98/drivers/net/hyperv/netvsc.c linux-4.19.118/drivers/net/hyperv/netvsc.c --- linux-4.19.98/drivers/net/hyperv/netvsc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/hyperv/netvsc.c 2020-04-23 08:30:24.000000000 +0000 @@ -110,7 +110,7 @@ init_waitqueue_head(&net_device->wait_drain); net_device->destroy = false; - net_device->tx_disable = false; + net_device->tx_disable = true; net_device->max_pkt = RNDIS_MAX_PKT_DEFAULT; net_device->pkt_align = RNDIS_PKT_ALIGN_DEFAULT; @@ -1182,20 +1182,39 @@ } static void netvsc_send_table(struct net_device *ndev, - const struct nvsp_message *nvmsg) + struct netvsc_device *nvscdev, + const struct nvsp_message *nvmsg, + u32 msglen) { struct net_device_context *net_device_ctx = netdev_priv(ndev); - u32 count, *tab; + u32 count, offset, *tab; int i; count = nvmsg->msg.v5_msg.send_table.count; + offset = nvmsg->msg.v5_msg.send_table.offset; + if (count != VRSS_SEND_TAB_SIZE) { netdev_err(ndev, "Received wrong send-table size:%u\n", count); return; } - tab = (u32 *)((unsigned long)&nvmsg->msg.v5_msg.send_table + - nvmsg->msg.v5_msg.send_table.offset); + /* If negotiated version <= NVSP_PROTOCOL_VERSION_6, the offset may be + * wrong due to a host bug. So fix the offset here. + */ + if (nvscdev->nvsp_version <= NVSP_PROTOCOL_VERSION_6 && + msglen >= sizeof(struct nvsp_message_header) + + sizeof(union nvsp_6_message_uber) + count * sizeof(u32)) + offset = sizeof(struct nvsp_message_header) + + sizeof(union nvsp_6_message_uber); + + /* Boundary check for all versions */ + if (offset > msglen - count * sizeof(u32)) { + netdev_err(ndev, "Received send-table offset too big:%u\n", + offset); + return; + } + + tab = (void *)nvmsg + offset; for (i = 0; i < count; i++) net_device_ctx->tx_table[i] = tab[i]; @@ -1213,12 +1232,14 @@ net_device_ctx->vf_alloc ? "added" : "removed"); } -static void netvsc_receive_inband(struct net_device *ndev, - const struct nvsp_message *nvmsg) +static void netvsc_receive_inband(struct net_device *ndev, + struct netvsc_device *nvscdev, + const struct nvsp_message *nvmsg, + u32 msglen) { switch (nvmsg->hdr.msg_type) { case NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE: - netvsc_send_table(ndev, nvmsg); + netvsc_send_table(ndev, nvscdev, nvmsg, msglen); break; case NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION: @@ -1235,6 +1256,7 @@ int budget) { const struct nvsp_message *nvmsg = hv_pkt_data(desc); + u32 msglen = hv_pkt_datalen(desc); trace_nvsp_recv(ndev, channel, nvmsg); @@ -1250,7 +1272,7 @@ break; case VM_PKT_DATA_INBAND: - netvsc_receive_inband(ndev, nvmsg); + netvsc_receive_inband(ndev, net_device, nvmsg, msglen); break; default: diff -Nru linux-4.19.98/drivers/net/hyperv/netvsc_drv.c linux-4.19.118/drivers/net/hyperv/netvsc_drv.c --- linux-4.19.98/drivers/net/hyperv/netvsc_drv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/hyperv/netvsc_drv.c 2020-04-23 08:30:24.000000000 +0000 @@ -295,9 +295,9 @@ else if (flow.basic.n_proto == htons(ETH_P_IPV6)) hash = jhash2((u32 *)&flow.addrs.v6addrs, 8, hashrnd); else - hash = 0; + return 0; - skb_set_hash(skb, hash, PKT_HASH_TYPE_L3); + __skb_set_sw_hash(skb, hash, false); } return hash; @@ -804,8 +804,7 @@ skb->protocol == htons(ETH_P_IP)) netvsc_comp_ipcsum(skb); - /* Do L4 checksum offload if enabled and present. - */ + /* Do L4 checksum offload if enabled and present. */ if (csum_info && (net->features & NETIF_F_RXCSUM)) { if (csum_info->receive.tcp_checksum_succeeded || csum_info->receive.udp_checksum_succeeded) @@ -985,6 +984,7 @@ } /* In any case device is now ready */ + nvdev->tx_disable = false; netif_device_attach(ndev); /* Note: enable and attach happen when sub-channels setup */ @@ -2004,6 +2004,12 @@ struct netvsc_vf_pcpu_stats *pcpu_stats = this_cpu_ptr(ndev_ctx->vf_stats); + skb = skb_share_check(skb, GFP_ATOMIC); + if (unlikely(!skb)) + return RX_HANDLER_CONSUMED; + + *pskb = skb; + skb->dev = ndev; u64_stats_update_begin(&pcpu_stats->syncp); @@ -2331,6 +2337,8 @@ else net->max_mtu = ETH_DATA_LEN; + nvdev->tx_disable = false; + ret = register_netdevice(net); if (ret != 0) { pr_err("Unable to register netdev.\n"); diff -Nru linux-4.19.98/drivers/net/ipvlan/ipvlan_core.c linux-4.19.118/drivers/net/ipvlan/ipvlan_core.c --- linux-4.19.98/drivers/net/ipvlan/ipvlan_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ipvlan/ipvlan_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -298,6 +298,7 @@ } if (dev) dev_put(dev); + cond_resched(); } } @@ -504,19 +505,21 @@ struct ethhdr *ethh = eth_hdr(skb); int ret = NET_XMIT_DROP; - /* In this mode we dont care about multicast and broadcast traffic */ - if (is_multicast_ether_addr(ethh->h_dest)) { - pr_debug_ratelimited("Dropped {multi|broad}cast of type=[%x]\n", - ntohs(skb->protocol)); - kfree_skb(skb); - goto out; - } - /* The ipvlan is a pseudo-L2 device, so the packets that we receive * will have L2; which need to discarded and processed further * in the net-ns of the main-device. */ if (skb_mac_header_was_set(skb)) { + /* In this mode we dont care about + * multicast and broadcast traffic */ + if (is_multicast_ether_addr(ethh->h_dest)) { + pr_debug_ratelimited( + "Dropped {multi|broad}cast of type=[%x]\n", + ntohs(skb->protocol)); + kfree_skb(skb); + goto out; + } + skb_pull(skb, sizeof(*ethh)); skb->mac_header = (typeof(skb->mac_header))~0U; skb_reset_network_header(skb); diff -Nru linux-4.19.98/drivers/net/ipvlan/ipvlan_main.c linux-4.19.118/drivers/net/ipvlan/ipvlan_main.c --- linux-4.19.98/drivers/net/ipvlan/ipvlan_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ipvlan/ipvlan_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -236,7 +236,6 @@ static int ipvlan_open(struct net_device *dev) { struct ipvl_dev *ipvlan = netdev_priv(dev); - struct net_device *phy_dev = ipvlan->phy_dev; struct ipvl_addr *addr; if (ipvlan->port->mode == IPVLAN_MODE_L3 || @@ -250,7 +249,7 @@ ipvlan_ht_addr_add(ipvlan, addr); rcu_read_unlock(); - return dev_uc_add(phy_dev, phy_dev->dev_addr); + return 0; } static int ipvlan_stop(struct net_device *dev) @@ -262,8 +261,6 @@ dev_uc_unsync(phy_dev, dev); dev_mc_unsync(phy_dev, dev); - dev_uc_del(phy_dev, phy_dev->dev_addr); - rcu_read_lock(); list_for_each_entry_rcu(addr, &ipvlan->addrs, anode) ipvlan_ht_addr_del(addr); diff -Nru linux-4.19.98/drivers/net/macsec.c linux-4.19.118/drivers/net/macsec.c --- linux-4.19.98/drivers/net/macsec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/macsec.c 2020-04-23 08:30:24.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -2886,6 +2887,11 @@ dev_uc_sync(real_dev, dev); } +static sci_t dev_to_sci(struct net_device *dev, __be16 port) +{ + return make_sci(dev->dev_addr, port); +} + static int macsec_set_mac_address(struct net_device *dev, void *p) { struct macsec_dev *macsec = macsec_priv(dev); @@ -2907,6 +2913,7 @@ out: ether_addr_copy(dev->dev_addr, addr->sa_data); + macsec->secy.sci = dev_to_sci(dev, MACSEC_PORT_ES); return 0; } @@ -2989,6 +2996,7 @@ static const struct nla_policy macsec_rtnl_policy[IFLA_MACSEC_MAX + 1] = { [IFLA_MACSEC_SCI] = { .type = NLA_U64 }, + [IFLA_MACSEC_PORT] = { .type = NLA_U16 }, [IFLA_MACSEC_ICV_LEN] = { .type = NLA_U8 }, [IFLA_MACSEC_CIPHER_SUITE] = { .type = NLA_U64 }, [IFLA_MACSEC_WINDOW] = { .type = NLA_U32 }, @@ -3188,11 +3196,6 @@ return false; } -static sci_t dev_to_sci(struct net_device *dev, __be16 port) -{ - return make_sci(dev->dev_addr, port); -} - static int macsec_add_dev(struct net_device *dev, sci_t sci, u8 icv_len) { struct macsec_dev *macsec = macsec_priv(dev); @@ -3246,6 +3249,8 @@ real_dev = __dev_get_by_index(net, nla_get_u32(tb[IFLA_LINK])); if (!real_dev) return -ENODEV; + if (real_dev->type != ARPHRD_ETHER) + return -EINVAL; dev->priv_flags |= IFF_MACSEC; diff -Nru linux-4.19.98/drivers/net/macvlan.c linux-4.19.118/drivers/net/macvlan.c --- linux-4.19.98/drivers/net/macvlan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/macvlan.c 2020-04-23 08:30:24.000000000 +0000 @@ -338,6 +338,8 @@ if (src) dev_put(src->dev); kfree_skb(skb); + + cond_resched(); } } diff -Nru linux-4.19.98/drivers/net/phy/fixed_phy.c linux-4.19.118/drivers/net/phy/fixed_phy.c --- linux-4.19.98/drivers/net/phy/fixed_phy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/phy/fixed_phy.c 2020-04-23 08:30:24.000000000 +0000 @@ -67,11 +67,11 @@ do { s = read_seqcount_begin(&fp->seqcount); /* Issue callback if user registered it. */ - if (fp->link_update) { + if (fp->link_update) fp->link_update(fp->phydev->attached_dev, &fp->status); - fixed_phy_update(fp); - } + /* Check the GPIO for change in status */ + fixed_phy_update(fp); state = fp->status; } while (read_seqcount_retry(&fp->seqcount, s)); diff -Nru linux-4.19.98/drivers/net/phy/mdio-bcm-iproc.c linux-4.19.118/drivers/net/phy/mdio-bcm-iproc.c --- linux-4.19.98/drivers/net/phy/mdio-bcm-iproc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/phy/mdio-bcm-iproc.c 2020-04-23 08:30:24.000000000 +0000 @@ -188,6 +188,23 @@ return 0; } +#ifdef CONFIG_PM_SLEEP +int iproc_mdio_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct iproc_mdio_priv *priv = platform_get_drvdata(pdev); + + /* restore the mii clock configuration */ + iproc_mdio_config_clk(priv->base); + + return 0; +} + +static const struct dev_pm_ops iproc_mdio_pm_ops = { + .resume = iproc_mdio_resume +}; +#endif /* CONFIG_PM_SLEEP */ + static const struct of_device_id iproc_mdio_of_match[] = { { .compatible = "brcm,iproc-mdio", }, { /* sentinel */ }, @@ -198,6 +215,9 @@ .driver = { .name = "iproc-mdio", .of_match_table = iproc_mdio_of_match, +#ifdef CONFIG_PM_SLEEP + .pm = &iproc_mdio_pm_ops, +#endif }, .probe = iproc_mdio_probe, .remove = iproc_mdio_remove, diff -Nru linux-4.19.98/drivers/net/phy/mdio-mux-bcm-iproc.c linux-4.19.118/drivers/net/phy/mdio-mux-bcm-iproc.c --- linux-4.19.98/drivers/net/phy/mdio-mux-bcm-iproc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/phy/mdio-mux-bcm-iproc.c 2020-04-23 08:30:24.000000000 +0000 @@ -301,8 +301,13 @@ { struct platform_device *pdev = to_platform_device(dev); struct iproc_mdiomux_desc *md = platform_get_drvdata(pdev); + int rc; - clk_prepare_enable(md->core_clk); + rc = clk_prepare_enable(md->core_clk); + if (rc) { + dev_err(md->dev, "failed to enable core clk\n"); + return rc; + } mdio_mux_iproc_config(md); return 0; diff -Nru linux-4.19.98/drivers/net/phy/mdio_bus.c linux-4.19.118/drivers/net/phy/mdio_bus.c --- linux-4.19.98/drivers/net/phy/mdio_bus.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/phy/mdio_bus.c 2020-04-23 08:30:24.000000000 +0000 @@ -56,11 +56,12 @@ gpiod = fwnode_get_named_gpiod(&mdiodev->dev.of_node->fwnode, "reset-gpios", 0, GPIOD_OUT_LOW, "PHY reset"); - if (PTR_ERR(gpiod) == -ENOENT || - PTR_ERR(gpiod) == -ENOSYS) - gpiod = NULL; - else if (IS_ERR(gpiod)) - return PTR_ERR(gpiod); + if (IS_ERR(gpiod)) { + if (PTR_ERR(gpiod) == -ENOENT || PTR_ERR(gpiod) == -ENOSYS) + gpiod = NULL; + else + return PTR_ERR(gpiod); + } mdiodev->reset = gpiod; diff -Nru linux-4.19.98/drivers/net/phy/micrel.c linux-4.19.118/drivers/net/phy/micrel.c --- linux-4.19.98/drivers/net/phy/micrel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/phy/micrel.c 2020-04-23 08:30:24.000000000 +0000 @@ -29,6 +29,7 @@ #include #include #include +#include /* Operation Mode Strap Override */ #define MII_KSZPHY_OMSO 0x16 @@ -738,6 +739,12 @@ genphy_resume(phydev); + /* After switching from power-down to normal mode, an internal global + * reset is automatically generated. Wait a minimum of 1 ms before + * read/write access to the PHY registers. + */ + usleep_range(1000, 2000); + ret = kszphy_config_reset(phydev); if (ret) return ret; @@ -977,6 +984,7 @@ .driver_data = &ksz9021_type, .probe = kszphy_probe, .config_init = ksz9031_config_init, + .soft_reset = genphy_soft_reset, .read_status = ksz9031_read_status, .ack_interrupt = kszphy_ack_interrupt, .config_intr = kszphy_config_intr, diff -Nru linux-4.19.98/drivers/net/phy/phy_device.c linux-4.19.118/drivers/net/phy/phy_device.c --- linux-4.19.98/drivers/net/phy/phy_device.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/phy/phy_device.c 2020-04-23 08:30:24.000000000 +0000 @@ -91,7 +91,7 @@ * MDIO bus driver and clock gated at this point. */ if (!netdev) - return !phydev->suspended; + goto out; if (netdev->wol_enabled) return false; @@ -111,7 +111,8 @@ if (device_may_wakeup(&netdev->dev)) return false; - return true; +out: + return !phydev->suspended; } static int mdio_bus_phy_suspend(struct device *dev) @@ -129,6 +130,8 @@ if (!mdio_bus_phy_may_suspend(phydev)) return 0; + phydev->suspended_by_mdio_bus = 1; + return phy_suspend(phydev); } @@ -137,9 +140,11 @@ struct phy_device *phydev = to_phy_device(dev); int ret; - if (!mdio_bus_phy_may_suspend(phydev)) + if (!phydev->suspended_by_mdio_bus) goto no_resume; + phydev->suspended_by_mdio_bus = 0; + ret = phy_resume(phydev); if (ret < 0) return ret; @@ -1656,7 +1661,7 @@ { int ret; - ret = phy_write(phydev, MII_BMCR, BMCR_RESET); + ret = phy_set_bits(phydev, MII_BMCR, BMCR_RESET); if (ret < 0) return ret; diff -Nru linux-4.19.98/drivers/net/ppp/ppp_async.c linux-4.19.118/drivers/net/ppp/ppp_async.c --- linux-4.19.98/drivers/net/ppp/ppp_async.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/ppp/ppp_async.c 2020-04-23 08:30:24.000000000 +0000 @@ -878,15 +878,15 @@ skb = dev_alloc_skb(ap->mru + PPP_HDRLEN + 2); if (!skb) goto nomem; - ap->rpkt = skb; - } - if (skb->len == 0) { - /* Try to get the payload 4-byte aligned. - * This should match the - * PPP_ALLSTATIONS/PPP_UI/compressed tests in - * process_input_packet, but we do not have - * enough chars here to test buf[1] and buf[2]. - */ + ap->rpkt = skb; + } + if (skb->len == 0) { + /* Try to get the payload 4-byte aligned. + * This should match the + * PPP_ALLSTATIONS/PPP_UI/compressed tests in + * process_input_packet, but we do not have + * enough chars here to test buf[1] and buf[2]. + */ if (buf[0] != PPP_ALLSTATIONS) skb_reserve(skb, 2 + (buf[0] & 1)); } diff -Nru linux-4.19.98/drivers/net/slip/slhc.c linux-4.19.118/drivers/net/slip/slhc.c --- linux-4.19.98/drivers/net/slip/slhc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/slip/slhc.c 2020-04-23 08:30:24.000000000 +0000 @@ -232,7 +232,7 @@ register struct cstate *cs = lcs->next; register unsigned long deltaS, deltaA; register short changes = 0; - int hlen; + int nlen, hlen; unsigned char new_seq[16]; register unsigned char *cp = new_seq; struct iphdr *ip; @@ -248,6 +248,8 @@ return isize; ip = (struct iphdr *) icp; + if (ip->version != 4 || ip->ihl < 5) + return isize; /* Bail if this packet isn't TCP, or is an IP fragment */ if (ip->protocol != IPPROTO_TCP || (ntohs(ip->frag_off) & 0x3fff)) { @@ -258,10 +260,14 @@ comp->sls_o_tcp++; return isize; } - /* Extract TCP header */ + nlen = ip->ihl * 4; + if (isize < nlen + sizeof(*th)) + return isize; - th = (struct tcphdr *)(((unsigned char *)ip) + ip->ihl*4); - hlen = ip->ihl*4 + th->doff*4; + th = (struct tcphdr *)(icp + nlen); + if (th->doff < sizeof(struct tcphdr) / 4) + return isize; + hlen = nlen + th->doff * 4; /* Bail if the TCP packet isn't `compressible' (i.e., ACK isn't set or * some other control bit is set). Also uncompressible if diff -Nru linux-4.19.98/drivers/net/slip/slip.c linux-4.19.118/drivers/net/slip/slip.c --- linux-4.19.98/drivers/net/slip/slip.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/slip/slip.c 2020-04-23 08:30:24.000000000 +0000 @@ -452,9 +452,16 @@ */ static void slip_write_wakeup(struct tty_struct *tty) { - struct slip *sl = tty->disc_data; + struct slip *sl; + + rcu_read_lock(); + sl = rcu_dereference(tty->disc_data); + if (!sl) + goto out; schedule_work(&sl->tx_work); +out: + rcu_read_unlock(); } static void sl_tx_timeout(struct net_device *dev) @@ -856,7 +863,10 @@ tty->disc_data = NULL; clear_bit(SLF_INUSE, &sl->flags); sl_free_netdev(sl->dev); + /* do not call free_netdev before rtnl_unlock */ + rtnl_unlock(); free_netdev(sl->dev); + return err; err_exit: rtnl_unlock(); @@ -882,10 +892,11 @@ return; spin_lock_bh(&sl->lock); - tty->disc_data = NULL; + rcu_assign_pointer(tty->disc_data, NULL); sl->tty = NULL; spin_unlock_bh(&sl->lock); + synchronize_rcu(); flush_work(&sl->tx_work); /* VSV = very important to remove timers */ diff -Nru linux-4.19.98/drivers/net/team/team.c linux-4.19.118/drivers/net/team/team.c --- linux-4.19.98/drivers/net/team/team.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/team/team.c 2020-04-23 08:30:24.000000000 +0000 @@ -2215,6 +2215,8 @@ [TEAM_ATTR_OPTION_CHANGED] = { .type = NLA_FLAG }, [TEAM_ATTR_OPTION_TYPE] = { .type = NLA_U8 }, [TEAM_ATTR_OPTION_DATA] = { .type = NLA_BINARY }, + [TEAM_ATTR_OPTION_PORT_IFINDEX] = { .type = NLA_U32 }, + [TEAM_ATTR_OPTION_ARRAY_INDEX] = { .type = NLA_U32 }, }; static int team_nl_cmd_noop(struct sk_buff *skb, struct genl_info *info) diff -Nru linux-4.19.98/drivers/net/tun.c linux-4.19.118/drivers/net/tun.c --- linux-4.19.98/drivers/net/tun.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/tun.c 2020-04-23 08:30:24.000000000 +0000 @@ -1900,6 +1900,10 @@ if (ret != XDP_PASS) { rcu_read_unlock(); local_bh_enable(); + if (frags) { + tfile->napi.skb = NULL; + mutex_unlock(&tfile->napi_mutex); + } return total_len; } } diff -Nru linux-4.19.98/drivers/net/usb/lan78xx.c linux-4.19.118/drivers/net/usb/lan78xx.c --- linux-4.19.98/drivers/net/usb/lan78xx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/usb/lan78xx.c 2020-04-23 08:30:24.000000000 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -3686,6 +3687,19 @@ tasklet_schedule(&dev->bh); } +static netdev_features_t lan78xx_features_check(struct sk_buff *skb, + struct net_device *netdev, + netdev_features_t features) +{ + if (skb->len + TX_OVERHEAD > MAX_SINGLE_PACKET_SIZE) + features &= ~NETIF_F_GSO_MASK; + + features = vlan_features_check(skb, features); + features = vxlan_features_check(skb, features); + + return features; +} + static const struct net_device_ops lan78xx_netdev_ops = { .ndo_open = lan78xx_open, .ndo_stop = lan78xx_stop, @@ -3699,6 +3713,7 @@ .ndo_set_features = lan78xx_set_features, .ndo_vlan_rx_add_vid = lan78xx_vlan_rx_add_vid, .ndo_vlan_rx_kill_vid = lan78xx_vlan_rx_kill_vid, + .ndo_features_check = lan78xx_features_check, }; static void lan78xx_stat_monitor(struct timer_list *t) diff -Nru linux-4.19.98/drivers/net/usb/qmi_wwan.c linux-4.19.118/drivers/net/usb/qmi_wwan.c --- linux-4.19.98/drivers/net/usb/qmi_wwan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/usb/qmi_wwan.c 2020-04-23 08:30:24.000000000 +0000 @@ -63,7 +63,6 @@ enum qmi_wwan_quirks { QMI_WWAN_QUIRK_DTR = 1 << 0, /* needs "set DTR" request */ - QMI_WWAN_QUIRK_QUECTEL_DYNCFG = 1 << 1, /* check num. endpoints */ }; struct qmimux_hdr { @@ -275,6 +274,9 @@ netdev_dbg(net, "mode: raw IP\n"); } else if (!net->header_ops) { /* don't bother if already set */ ether_setup(net); + /* Restoring min/max mtu values set originally by usbnet */ + net->min_mtu = 0; + net->max_mtu = ETH_MAX_MTU; clear_bit(EVENT_NO_IP_ALIGN, &dev->flags); netdev_dbg(net, "mode: Ethernet\n"); } @@ -853,16 +855,6 @@ .data = QMI_WWAN_QUIRK_DTR, }; -static const struct driver_info qmi_wwan_info_quirk_quectel_dyncfg = { - .description = "WWAN/QMI device", - .flags = FLAG_WWAN | FLAG_SEND_ZLP, - .bind = qmi_wwan_bind, - .unbind = qmi_wwan_unbind, - .manage_power = qmi_wwan_manage_power, - .rx_fixup = qmi_wwan_rx_fixup, - .data = QMI_WWAN_QUIRK_DTR | QMI_WWAN_QUIRK_QUECTEL_DYNCFG, -}; - #define HUAWEI_VENDOR_ID 0x12D1 /* map QMI/wwan function by a fixed interface number */ @@ -883,14 +875,18 @@ #define QMI_GOBI_DEVICE(vend, prod) \ QMI_FIXED_INTF(vend, prod, 0) -/* Quectel does not use fixed interface numbers on at least some of their - * devices. We need to check the number of endpoints to ensure that we bind to - * the correct interface. +/* Many devices have QMI and DIAG functions which are distinguishable + * from other vendor specific functions by class, subclass and + * protocol all being 0xff. The DIAG function has exactly 2 endpoints + * and is silently rejected when probed. + * + * This makes it possible to match dynamically numbered QMI functions + * as seen on e.g. many Quectel modems. */ -#define QMI_QUIRK_QUECTEL_DYNCFG(vend, prod) \ +#define QMI_MATCH_FF_FF_FF(vend, prod) \ USB_DEVICE_AND_INTERFACE_INFO(vend, prod, USB_CLASS_VENDOR_SPEC, \ USB_SUBCLASS_VENDOR_SPEC, 0xff), \ - .driver_info = (unsigned long)&qmi_wwan_info_quirk_quectel_dyncfg + .driver_info = (unsigned long)&qmi_wwan_info_quirk_dtr static const struct usb_device_id products[] = { /* 1. CDC ECM like devices match on the control interface */ @@ -996,9 +992,10 @@ USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x581d, USB_CLASS_VENDOR_SPEC, 1, 7), .driver_info = (unsigned long)&qmi_wwan_info, }, - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ - {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ /* 3. Combined interface devices matching on interface number */ {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ @@ -1150,6 +1147,7 @@ {QMI_FIXED_INTF(0x1435, 0xd182, 5)}, /* Wistron NeWeb D18 */ {QMI_FIXED_INTF(0x1435, 0xd191, 4)}, /* Wistron NeWeb D19Q1 */ {QMI_QUIRK_SET_DTR(0x1508, 0x1001, 4)}, /* Fibocom NL668 series */ + {QMI_FIXED_INTF(0x1690, 0x7588, 4)}, /* ASKEY WWHC050 */ {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ {QMI_FIXED_INTF(0x16d8, 0x6007, 0)}, /* CMOTech CHE-628S */ {QMI_FIXED_INTF(0x16d8, 0x6008, 0)}, /* CMOTech CMU-301 */ @@ -1297,6 +1295,7 @@ {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ + {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ @@ -1388,7 +1387,6 @@ { struct usb_device_id *id = (struct usb_device_id *)prod; struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc; - const struct driver_info *info; /* Workaround to enable dynamic IDs. This disables usbnet * blacklisting functionality. Which, if required, can be @@ -1424,12 +1422,8 @@ * different. Ignore the current interface if the number of endpoints * equals the number for the diag interface (two). */ - info = (void *)id->driver_info; - - if (info->data & QMI_WWAN_QUIRK_QUECTEL_DYNCFG) { - if (desc->bNumEndpoints == 2) - return -ENODEV; - } + if (desc->bNumEndpoints == 2) + return -ENODEV; return usbnet_probe(intf, id); } diff -Nru linux-4.19.98/drivers/net/usb/r8152.c linux-4.19.118/drivers/net/usb/r8152.c --- linux-4.19.98/drivers/net/usb/r8152.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/usb/r8152.c 2020-04-23 08:30:24.000000000 +0000 @@ -2701,6 +2701,8 @@ } msleep(20); + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + break; } return data; @@ -4062,7 +4064,10 @@ if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & AUTOLOAD_DONE) break; + msleep(20); + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + break; } data = r8153_phy_status(tp, 0); @@ -4180,7 +4185,10 @@ if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & AUTOLOAD_DONE) break; + msleep(20); + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + break; } data = r8153_phy_status(tp, 0); @@ -5259,6 +5267,11 @@ intf->needs_remote_wakeup = 1; + if (!rtl_can_wakeup(tp)) + __rtl_set_wol(tp, 0); + else + tp->saved_wolopts = __rtl_get_wol(tp); + tp->rtl_ops.init(tp); queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); set_ethernet_addr(tp); @@ -5272,10 +5285,6 @@ goto out1; } - if (!rtl_can_wakeup(tp)) - __rtl_set_wol(tp, 0); - - tp->saved_wolopts = __rtl_get_wol(tp); if (tp->saved_wolopts) device_set_wakeup_enable(&udev->dev, true); else diff -Nru linux-4.19.98/drivers/net/vrf.c linux-4.19.118/drivers/net/vrf.c --- linux-4.19.98/drivers/net/vrf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/vrf.c 2020-04-23 08:30:24.000000000 +0000 @@ -993,23 +993,24 @@ struct sk_buff *skb) { int orig_iif = skb->skb_iif; - bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr); - bool is_ndisc = ipv6_ndisc_frame(skb); + bool need_strict; - /* loopback, multicast & non-ND link-local traffic; do not push through - * packet taps again. Reset pkt_type for upper layers to process skb + /* loopback traffic; do not push through packet taps again. + * Reset pkt_type for upper layers to process skb */ - if (skb->pkt_type == PACKET_LOOPBACK || (need_strict && !is_ndisc)) { + if (skb->pkt_type == PACKET_LOOPBACK) { skb->dev = vrf_dev; skb->skb_iif = vrf_dev->ifindex; IP6CB(skb)->flags |= IP6SKB_L3SLAVE; - if (skb->pkt_type == PACKET_LOOPBACK) - skb->pkt_type = PACKET_HOST; + skb->pkt_type = PACKET_HOST; goto out; } - /* if packet is NDISC then keep the ingress interface */ - if (!is_ndisc) { + /* if packet is NDISC or addressed to multicast or link-local + * then keep the ingress interface + */ + need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr); + if (!ipv6_ndisc_frame(skb) && !need_strict) { vrf_rx_stats(vrf_dev, skb->len); skb->dev = vrf_dev; skb->skb_iif = vrf_dev->ifindex; diff -Nru linux-4.19.98/drivers/net/vxlan.c linux-4.19.118/drivers/net/vxlan.c --- linux-4.19.98/drivers/net/vxlan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/vxlan.c 2020-04-23 08:30:24.000000000 +0000 @@ -2451,10 +2451,19 @@ /* Setup stats when device is created */ static int vxlan_init(struct net_device *dev) { + struct vxlan_dev *vxlan = netdev_priv(dev); + int err; + dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); if (!dev->tstats) return -ENOMEM; + err = gro_cells_init(&vxlan->gro_cells, dev); + if (err) { + free_percpu(dev->tstats); + return err; + } + return 0; } @@ -2712,8 +2721,6 @@ vxlan->dev = dev; - gro_cells_init(&vxlan->gro_cells, dev); - for (h = 0; h < FDB_HASH_SIZE; ++h) INIT_HLIST_HEAD(&vxlan->fdb_head[h]); } @@ -3496,7 +3503,6 @@ struct vxlan_rdst *dst = &vxlan->default_dst; struct vxlan_rdst old_dst; struct vxlan_config conf; - struct vxlan_fdb *f = NULL; int err; err = vxlan_nl2conf(tb, data, @@ -3522,19 +3528,19 @@ old_dst.remote_ifindex, 0); if (!vxlan_addr_any(&dst->remote_ip)) { - err = vxlan_fdb_create(vxlan, all_zeros_mac, + err = vxlan_fdb_update(vxlan, all_zeros_mac, &dst->remote_ip, NUD_REACHABLE | NUD_PERMANENT, + NLM_F_APPEND | NLM_F_CREATE, vxlan->cfg.dst_port, dst->remote_vni, dst->remote_vni, dst->remote_ifindex, - NTF_SELF, &f); + NTF_SELF); if (err) { spin_unlock_bh(&vxlan->hash_lock); return err; } - vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH); } spin_unlock_bh(&vxlan->hash_lock); } diff -Nru linux-4.19.98/drivers/net/wan/fsl_ucc_hdlc.c linux-4.19.118/drivers/net/wan/fsl_ucc_hdlc.c --- linux-4.19.98/drivers/net/wan/fsl_ucc_hdlc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wan/fsl_ucc_hdlc.c 2020-04-23 08:30:24.000000000 +0000 @@ -242,6 +242,11 @@ ret = -ENOMEM; goto free_riptr; } + if (riptr != (u16)riptr || tiptr != (u16)tiptr) { + dev_err(priv->dev, "MURAM allocation out of addressable range\n"); + ret = -ENOMEM; + goto free_tiptr; + } /* Set RIPTR, TIPTR */ iowrite16be(riptr, &priv->ucc_pram->riptr); diff -Nru linux-4.19.98/drivers/net/wan/ixp4xx_hss.c linux-4.19.118/drivers/net/wan/ixp4xx_hss.c --- linux-4.19.98/drivers/net/wan/ixp4xx_hss.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wan/ixp4xx_hss.c 2020-04-23 08:30:24.000000000 +0000 @@ -261,7 +261,7 @@ struct hss_plat_info *plat; buffer_t *rx_buff_tab[RX_DESCS], *tx_buff_tab[TX_DESCS]; struct desc *desc_tab; /* coherent */ - u32 desc_tab_phys; + dma_addr_t desc_tab_phys; unsigned int id; unsigned int clock_type, clock_rate, loopback; unsigned int initialized, carrier; @@ -861,7 +861,7 @@ dev->stats.tx_dropped++; return NETDEV_TX_OK; } - memcpy_swab32(mem, (u32 *)((int)skb->data & ~3), bytes / 4); + memcpy_swab32(mem, (u32 *)((uintptr_t)skb->data & ~3), bytes / 4); dev_kfree_skb(skb); #endif diff -Nru linux-4.19.98/drivers/net/wan/sdla.c linux-4.19.118/drivers/net/wan/sdla.c --- linux-4.19.98/drivers/net/wan/sdla.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wan/sdla.c 2020-04-23 08:30:24.000000000 +0000 @@ -711,7 +711,7 @@ spin_lock_irqsave(&sdla_lock, flags); SDLA_WINDOW(dev, addr); - pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK)); + pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK)); __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len); SDLA_WINDOW(dev, addr); pbuf->opp_flag = 1; diff -Nru linux-4.19.98/drivers/net/wimax/i2400m/op-rfkill.c linux-4.19.118/drivers/net/wimax/i2400m/op-rfkill.c --- linux-4.19.98/drivers/net/wimax/i2400m/op-rfkill.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wimax/i2400m/op-rfkill.c 2020-04-23 08:30:24.000000000 +0000 @@ -147,6 +147,7 @@ error_alloc: d_fnend(4, dev, "(wimax_dev %p state %d) = %d\n", wimax_dev, state, result); + kfree(cmd); return result; } diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath10k/mac.c linux-4.19.118/drivers/net/wireless/ath/ath10k/mac.c --- linux-4.19.98/drivers/net/wireless/ath/ath10k/mac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath10k/mac.c 2020-04-23 08:30:24.000000000 +0000 @@ -1,7 +1,7 @@ /* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -3853,7 +3853,7 @@ ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n", ret); dma_unmap_single(ar->dev, paddr, skb->len, - DMA_FROM_DEVICE); + DMA_TO_DEVICE); ieee80211_free_txskb(ar->hw, skb); } } else { diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath10k/pci.c linux-4.19.118/drivers/net/wireless/ath/ath10k/pci.c --- linux-4.19.98/drivers/net/wireless/ath/ath10k/pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath10k/pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -1613,11 +1613,22 @@ { struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); u32 i; + int ret; + + mutex_lock(&ar->conf_mutex); + if (ar->state != ATH10K_STATE_ON) { + ath10k_warn(ar, "Skipping pci_dump_memory_reg invalid state\n"); + ret = -EIO; + goto done; + } for (i = 0; i < region->len; i += 4) *(u32 *)(buf + i) = ioread32(ar_pci->mem + region->start + i); - return region->len; + ret = region->len; +done: + mutex_unlock(&ar->conf_mutex); + return ret; } /* if an error happened returns < 0, otherwise the length */ @@ -1713,7 +1724,11 @@ count = ath10k_pci_dump_memory_sram(ar, current_region, buf); break; case ATH10K_MEM_REGION_TYPE_IOREG: - count = ath10k_pci_dump_memory_reg(ar, current_region, buf); + ret = ath10k_pci_dump_memory_reg(ar, current_region, buf); + if (ret < 0) + break; + + count = ret; break; default: ret = ath10k_pci_dump_memory_generic(ar, current_region, buf); diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath10k/sdio.c linux-4.19.118/drivers/net/wireless/ath/ath10k/sdio.c --- linux-4.19.98/drivers/net/wireless/ath/ath10k/sdio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath10k/sdio.c 2020-04-23 08:30:24.000000000 +0000 @@ -392,16 +392,11 @@ struct ath10k_htc_hdr *htc_hdr = (struct ath10k_htc_hdr *)skb->data; bool trailer_present = htc_hdr->flags & ATH10K_HTC_FLAG_TRAILER_PRESENT; enum ath10k_htc_ep_id eid; - u16 payload_len; u8 *trailer; int ret; - payload_len = le16_to_cpu(htc_hdr->len); - skb->len = payload_len + sizeof(struct ath10k_htc_hdr); - if (trailer_present) { - trailer = skb->data + sizeof(*htc_hdr) + - payload_len - htc_hdr->trailer_len; + trailer = skb->data + skb->len - htc_hdr->trailer_len; eid = pipe_id_to_eid(htc_hdr->eid); @@ -638,13 +633,31 @@ { struct ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar); struct sk_buff *skb = pkt->skb; + struct ath10k_htc_hdr *htc_hdr; int ret; ret = ath10k_sdio_readsb(ar, ar_sdio->mbox_info.htc_addr, skb->data, pkt->alloc_len); + if (ret) + goto out; + + /* Update actual length. The original length may be incorrect, + * as the FW will bundle multiple packets as long as their sizes + * fit within the same aligned length (pkt->alloc_len). + */ + htc_hdr = (struct ath10k_htc_hdr *)skb->data; + pkt->act_len = le16_to_cpu(htc_hdr->len) + sizeof(*htc_hdr); + if (pkt->act_len > pkt->alloc_len) { + ath10k_warn(ar, "rx packet too large (%zu > %zu)\n", + pkt->act_len, pkt->alloc_len); + ret = -EMSGSIZE; + goto out; + } + + skb_put(skb, pkt->act_len); + +out: pkt->status = ret; - if (!ret) - skb_put(skb, pkt->act_len); return ret; } diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath10k/wmi-tlv.c linux-4.19.118/drivers/net/wireless/ath/ath10k/wmi-tlv.c --- linux-4.19.98/drivers/net/wireless/ath/ath10k/wmi-tlv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath10k/wmi-tlv.c 2020-04-23 08:30:24.000000000 +0000 @@ -2693,7 +2693,7 @@ ieee80211_is_deauth(hdr->frame_control) || ieee80211_is_disassoc(hdr->frame_control)) && ieee80211_has_protected(hdr->frame_control)) { - len += IEEE80211_CCMP_MIC_LEN; + skb_put(msdu, IEEE80211_CCMP_MIC_LEN); buf_len += IEEE80211_CCMP_MIC_LEN; } diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath10k/wmi.c linux-4.19.118/drivers/net/wireless/ath/ath10k/wmi.c --- linux-4.19.98/drivers/net/wireless/ath/ath10k/wmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath10k/wmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -1,7 +1,7 @@ /* * Copyright (c) 2005-2011 Atheros Communications Inc. * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -2340,7 +2340,7 @@ msdu = pkt_addr->vaddr; dma_unmap_single(ar->dev, pkt_addr->paddr, - msdu->len, DMA_FROM_DEVICE); + msdu->len, DMA_TO_DEVICE); info = IEEE80211_SKB_CB(msdu); if (status) @@ -9193,7 +9193,7 @@ msdu = pkt_addr->vaddr; dma_unmap_single(ar->dev, pkt_addr->paddr, - msdu->len, DMA_FROM_DEVICE); + msdu->len, DMA_TO_DEVICE); ieee80211_free_txskb(ar->hw, msdu); return 0; diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath9k/dynack.c linux-4.19.118/drivers/net/wireless/ath/ath9k/dynack.c --- linux-4.19.98/drivers/net/wireless/ath/ath9k/dynack.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath9k/dynack.c 2020-04-23 08:30:24.000000000 +0000 @@ -300,9 +300,9 @@ an->ackto = ackto; - spin_lock(&da->qlock); + spin_lock_bh(&da->qlock); list_add_tail(&an->list, &da->nodes); - spin_unlock(&da->qlock); + spin_unlock_bh(&da->qlock); } EXPORT_SYMBOL(ath_dynack_node_init); @@ -316,9 +316,9 @@ { struct ath_dynack *da = &ah->dynack; - spin_lock(&da->qlock); + spin_lock_bh(&da->qlock); list_del(&an->list); - spin_unlock(&da->qlock); + spin_unlock_bh(&da->qlock); } EXPORT_SYMBOL(ath_dynack_node_deinit); diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath9k/hif_usb.c linux-4.19.118/drivers/net/wireless/ath/ath9k/hif_usb.c --- linux-4.19.98/drivers/net/wireless/ath/ath9k/hif_usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath9k/hif_usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -1216,7 +1216,7 @@ static int send_eject_command(struct usb_interface *interface) { struct usb_device *udev = interface_to_usbdev(interface); - struct usb_host_interface *iface_desc = &interface->altsetting[0]; + struct usb_host_interface *iface_desc = interface->cur_altsetting; struct usb_endpoint_descriptor *endpoint; unsigned char *cmd; u8 bulk_out_ep; diff -Nru linux-4.19.98/drivers/net/wireless/ath/ath9k/main.c linux-4.19.118/drivers/net/wireless/ath/ath9k/main.c --- linux-4.19.98/drivers/net/wireless/ath/ath9k/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/ath9k/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1457,6 +1457,9 @@ ath_chanctx_set_channel(sc, ctx, &hw->conf.chandef); } + if (changed & IEEE80211_CONF_CHANGE_POWER) + ath9k_set_txpower(sc, NULL); + mutex_unlock(&sc->mutex); ath9k_ps_restore(sc); diff -Nru linux-4.19.98/drivers/net/wireless/ath/wcn36xx/smd.c linux-4.19.118/drivers/net/wireless/ath/wcn36xx/smd.c --- linux-4.19.98/drivers/net/wireless/ath/wcn36xx/smd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wcn36xx/smd.c 2020-04-23 08:30:24.000000000 +0000 @@ -641,52 +641,58 @@ struct cfg80211_scan_request *req) { struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); - struct wcn36xx_hal_start_scan_offload_req_msg msg_body; + struct wcn36xx_hal_start_scan_offload_req_msg *msg_body; int ret, i; if (req->ie_len > WCN36XX_MAX_SCAN_IE_LEN) return -EINVAL; mutex_lock(&wcn->hal_mutex); - INIT_HAL_MSG(msg_body, WCN36XX_HAL_START_SCAN_OFFLOAD_REQ); + msg_body = kzalloc(sizeof(*msg_body), GFP_KERNEL); + if (!msg_body) { + ret = -ENOMEM; + goto out; + } - msg_body.scan_type = WCN36XX_HAL_SCAN_TYPE_ACTIVE; - msg_body.min_ch_time = 30; - msg_body.max_ch_time = 100; - msg_body.scan_hidden = 1; - memcpy(msg_body.mac, vif->addr, ETH_ALEN); - msg_body.bss_type = vif_priv->bss_type; - msg_body.p2p_search = vif->p2p; - - msg_body.num_ssid = min_t(u8, req->n_ssids, ARRAY_SIZE(msg_body.ssids)); - for (i = 0; i < msg_body.num_ssid; i++) { - msg_body.ssids[i].length = min_t(u8, req->ssids[i].ssid_len, - sizeof(msg_body.ssids[i].ssid)); - memcpy(msg_body.ssids[i].ssid, req->ssids[i].ssid, - msg_body.ssids[i].length); - } - - msg_body.num_channel = min_t(u8, req->n_channels, - sizeof(msg_body.channels)); - for (i = 0; i < msg_body.num_channel; i++) - msg_body.channels[i] = req->channels[i]->hw_value; + INIT_HAL_MSG((*msg_body), WCN36XX_HAL_START_SCAN_OFFLOAD_REQ); - msg_body.header.len -= WCN36XX_MAX_SCAN_IE_LEN; + msg_body->scan_type = WCN36XX_HAL_SCAN_TYPE_ACTIVE; + msg_body->min_ch_time = 30; + msg_body->max_ch_time = 100; + msg_body->scan_hidden = 1; + memcpy(msg_body->mac, vif->addr, ETH_ALEN); + msg_body->bss_type = vif_priv->bss_type; + msg_body->p2p_search = vif->p2p; + + msg_body->num_ssid = min_t(u8, req->n_ssids, ARRAY_SIZE(msg_body->ssids)); + for (i = 0; i < msg_body->num_ssid; i++) { + msg_body->ssids[i].length = min_t(u8, req->ssids[i].ssid_len, + sizeof(msg_body->ssids[i].ssid)); + memcpy(msg_body->ssids[i].ssid, req->ssids[i].ssid, + msg_body->ssids[i].length); + } + + msg_body->num_channel = min_t(u8, req->n_channels, + sizeof(msg_body->channels)); + for (i = 0; i < msg_body->num_channel; i++) + msg_body->channels[i] = req->channels[i]->hw_value; + + msg_body->header.len -= WCN36XX_MAX_SCAN_IE_LEN; if (req->ie_len > 0) { - msg_body.ie_len = req->ie_len; - msg_body.header.len += req->ie_len; - memcpy(msg_body.ie, req->ie, req->ie_len); + msg_body->ie_len = req->ie_len; + msg_body->header.len += req->ie_len; + memcpy(msg_body->ie, req->ie, req->ie_len); } - PREPARE_HAL_BUF(wcn->hal_buf, msg_body); + PREPARE_HAL_BUF(wcn->hal_buf, (*msg_body)); wcn36xx_dbg(WCN36XX_DBG_HAL, "hal start hw-scan (channels: %u; ssids: %u; p2p: %s)\n", - msg_body.num_channel, msg_body.num_ssid, - msg_body.p2p_search ? "yes" : "no"); + msg_body->num_channel, msg_body->num_ssid, + msg_body->p2p_search ? "yes" : "no"); - ret = wcn36xx_smd_send_and_wait(wcn, msg_body.header.len); + ret = wcn36xx_smd_send_and_wait(wcn, msg_body->header.len); if (ret) { wcn36xx_err("Sending hal_start_scan_offload failed\n"); goto out; @@ -698,6 +704,7 @@ goto out; } out: + kfree(msg_body); mutex_unlock(&wcn->hal_mutex); return ret; } @@ -1257,96 +1264,104 @@ static int wcn36xx_smd_config_bss_v1(struct wcn36xx *wcn, const struct wcn36xx_hal_config_bss_req_msg *orig) { - struct wcn36xx_hal_config_bss_req_msg_v1 msg_body; - struct wcn36xx_hal_config_bss_params_v1 *bss = &msg_body.bss_params; - struct wcn36xx_hal_config_sta_params_v1 *sta = &bss->sta; + struct wcn36xx_hal_config_bss_req_msg_v1 *msg_body; + struct wcn36xx_hal_config_bss_params_v1 *bss; + struct wcn36xx_hal_config_sta_params_v1 *sta; + int ret; + + msg_body = kzalloc(sizeof(*msg_body), GFP_KERNEL); + if (!msg_body) + return -ENOMEM; + + INIT_HAL_MSG((*msg_body), WCN36XX_HAL_CONFIG_BSS_REQ); - INIT_HAL_MSG(msg_body, WCN36XX_HAL_CONFIG_BSS_REQ); + bss = &msg_body->bss_params; + sta = &bss->sta; /* convert orig to v1 */ - memcpy(&msg_body.bss_params.bssid, + memcpy(&msg_body->bss_params.bssid, &orig->bss_params.bssid, ETH_ALEN); - memcpy(&msg_body.bss_params.self_mac_addr, + memcpy(&msg_body->bss_params.self_mac_addr, &orig->bss_params.self_mac_addr, ETH_ALEN); - msg_body.bss_params.bss_type = orig->bss_params.bss_type; - msg_body.bss_params.oper_mode = orig->bss_params.oper_mode; - msg_body.bss_params.nw_type = orig->bss_params.nw_type; + msg_body->bss_params.bss_type = orig->bss_params.bss_type; + msg_body->bss_params.oper_mode = orig->bss_params.oper_mode; + msg_body->bss_params.nw_type = orig->bss_params.nw_type; - msg_body.bss_params.short_slot_time_supported = + msg_body->bss_params.short_slot_time_supported = orig->bss_params.short_slot_time_supported; - msg_body.bss_params.lla_coexist = orig->bss_params.lla_coexist; - msg_body.bss_params.llb_coexist = orig->bss_params.llb_coexist; - msg_body.bss_params.llg_coexist = orig->bss_params.llg_coexist; - msg_body.bss_params.ht20_coexist = orig->bss_params.ht20_coexist; - msg_body.bss_params.lln_non_gf_coexist = + msg_body->bss_params.lla_coexist = orig->bss_params.lla_coexist; + msg_body->bss_params.llb_coexist = orig->bss_params.llb_coexist; + msg_body->bss_params.llg_coexist = orig->bss_params.llg_coexist; + msg_body->bss_params.ht20_coexist = orig->bss_params.ht20_coexist; + msg_body->bss_params.lln_non_gf_coexist = orig->bss_params.lln_non_gf_coexist; - msg_body.bss_params.lsig_tx_op_protection_full_support = + msg_body->bss_params.lsig_tx_op_protection_full_support = orig->bss_params.lsig_tx_op_protection_full_support; - msg_body.bss_params.rifs_mode = orig->bss_params.rifs_mode; - msg_body.bss_params.beacon_interval = orig->bss_params.beacon_interval; - msg_body.bss_params.dtim_period = orig->bss_params.dtim_period; - msg_body.bss_params.tx_channel_width_set = + msg_body->bss_params.rifs_mode = orig->bss_params.rifs_mode; + msg_body->bss_params.beacon_interval = orig->bss_params.beacon_interval; + msg_body->bss_params.dtim_period = orig->bss_params.dtim_period; + msg_body->bss_params.tx_channel_width_set = orig->bss_params.tx_channel_width_set; - msg_body.bss_params.oper_channel = orig->bss_params.oper_channel; - msg_body.bss_params.ext_channel = orig->bss_params.ext_channel; + msg_body->bss_params.oper_channel = orig->bss_params.oper_channel; + msg_body->bss_params.ext_channel = orig->bss_params.ext_channel; - msg_body.bss_params.reserved = orig->bss_params.reserved; + msg_body->bss_params.reserved = orig->bss_params.reserved; - memcpy(&msg_body.bss_params.ssid, + memcpy(&msg_body->bss_params.ssid, &orig->bss_params.ssid, sizeof(orig->bss_params.ssid)); - msg_body.bss_params.action = orig->bss_params.action; - msg_body.bss_params.rateset = orig->bss_params.rateset; - msg_body.bss_params.ht = orig->bss_params.ht; - msg_body.bss_params.obss_prot_enabled = + msg_body->bss_params.action = orig->bss_params.action; + msg_body->bss_params.rateset = orig->bss_params.rateset; + msg_body->bss_params.ht = orig->bss_params.ht; + msg_body->bss_params.obss_prot_enabled = orig->bss_params.obss_prot_enabled; - msg_body.bss_params.rmf = orig->bss_params.rmf; - msg_body.bss_params.ht_oper_mode = orig->bss_params.ht_oper_mode; - msg_body.bss_params.dual_cts_protection = + msg_body->bss_params.rmf = orig->bss_params.rmf; + msg_body->bss_params.ht_oper_mode = orig->bss_params.ht_oper_mode; + msg_body->bss_params.dual_cts_protection = orig->bss_params.dual_cts_protection; - msg_body.bss_params.max_probe_resp_retry_limit = + msg_body->bss_params.max_probe_resp_retry_limit = orig->bss_params.max_probe_resp_retry_limit; - msg_body.bss_params.hidden_ssid = orig->bss_params.hidden_ssid; - msg_body.bss_params.proxy_probe_resp = + msg_body->bss_params.hidden_ssid = orig->bss_params.hidden_ssid; + msg_body->bss_params.proxy_probe_resp = orig->bss_params.proxy_probe_resp; - msg_body.bss_params.edca_params_valid = + msg_body->bss_params.edca_params_valid = orig->bss_params.edca_params_valid; - memcpy(&msg_body.bss_params.acbe, + memcpy(&msg_body->bss_params.acbe, &orig->bss_params.acbe, sizeof(orig->bss_params.acbe)); - memcpy(&msg_body.bss_params.acbk, + memcpy(&msg_body->bss_params.acbk, &orig->bss_params.acbk, sizeof(orig->bss_params.acbk)); - memcpy(&msg_body.bss_params.acvi, + memcpy(&msg_body->bss_params.acvi, &orig->bss_params.acvi, sizeof(orig->bss_params.acvi)); - memcpy(&msg_body.bss_params.acvo, + memcpy(&msg_body->bss_params.acvo, &orig->bss_params.acvo, sizeof(orig->bss_params.acvo)); - msg_body.bss_params.ext_set_sta_key_param_valid = + msg_body->bss_params.ext_set_sta_key_param_valid = orig->bss_params.ext_set_sta_key_param_valid; - memcpy(&msg_body.bss_params.ext_set_sta_key_param, + memcpy(&msg_body->bss_params.ext_set_sta_key_param, &orig->bss_params.ext_set_sta_key_param, sizeof(orig->bss_params.acvo)); - msg_body.bss_params.wcn36xx_hal_persona = + msg_body->bss_params.wcn36xx_hal_persona = orig->bss_params.wcn36xx_hal_persona; - msg_body.bss_params.spectrum_mgt_enable = + msg_body->bss_params.spectrum_mgt_enable = orig->bss_params.spectrum_mgt_enable; - msg_body.bss_params.tx_mgmt_power = orig->bss_params.tx_mgmt_power; - msg_body.bss_params.max_tx_power = orig->bss_params.max_tx_power; + msg_body->bss_params.tx_mgmt_power = orig->bss_params.tx_mgmt_power; + msg_body->bss_params.max_tx_power = orig->bss_params.max_tx_power; wcn36xx_smd_convert_sta_to_v1(wcn, &orig->bss_params.sta, - &msg_body.bss_params.sta); + &msg_body->bss_params.sta); - PREPARE_HAL_BUF(wcn->hal_buf, msg_body); + PREPARE_HAL_BUF(wcn->hal_buf, (*msg_body)); wcn36xx_dbg(WCN36XX_DBG_HAL, "hal config bss v1 bssid %pM self_mac_addr %pM bss_type %d oper_mode %d nw_type %d\n", @@ -1358,7 +1373,10 @@ sta->bssid, sta->action, sta->sta_index, sta->bssid_index, sta->aid, sta->type, sta->mac); - return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len); + ret = wcn36xx_smd_send_and_wait(wcn, msg_body->header.len); + kfree(msg_body); + + return ret; } @@ -1410,16 +1428,21 @@ struct ieee80211_sta *sta, const u8 *bssid, bool update) { - struct wcn36xx_hal_config_bss_req_msg msg; + struct wcn36xx_hal_config_bss_req_msg *msg; struct wcn36xx_hal_config_bss_params *bss; struct wcn36xx_hal_config_sta_params *sta_params; struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); int ret; mutex_lock(&wcn->hal_mutex); - INIT_HAL_MSG(msg, WCN36XX_HAL_CONFIG_BSS_REQ); + msg = kzalloc(sizeof(*msg), GFP_KERNEL); + if (!msg) { + ret = -ENOMEM; + goto out; + } + INIT_HAL_MSG((*msg), WCN36XX_HAL_CONFIG_BSS_REQ); - bss = &msg.bss_params; + bss = &msg->bss_params; sta_params = &bss->sta; WARN_ON(is_zero_ether_addr(bssid)); @@ -1514,11 +1537,11 @@ sta_params->mac); if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) { - ret = wcn36xx_smd_config_bss_v1(wcn, &msg); + ret = wcn36xx_smd_config_bss_v1(wcn, msg); } else { - PREPARE_HAL_BUF(wcn->hal_buf, msg); + PREPARE_HAL_BUF(wcn->hal_buf, (*msg)); - ret = wcn36xx_smd_send_and_wait(wcn, msg.header.len); + ret = wcn36xx_smd_send_and_wait(wcn, msg->header.len); } if (ret) { wcn36xx_err("Sending hal_config_bss failed\n"); @@ -1534,6 +1557,7 @@ goto out; } out: + kfree(msg); mutex_unlock(&wcn->hal_mutex); return ret; } diff -Nru linux-4.19.98/drivers/net/wireless/ath/wil6210/debugfs.c linux-4.19.118/drivers/net/wireless/ath/wil6210/debugfs.c --- linux-4.19.98/drivers/net/wireless/ath/wil6210/debugfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wil6210/debugfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -730,32 +730,6 @@ return debugfs_create_file(name, mode, parent, wil_blob, &fops_ioblob); } -/*---reset---*/ -static ssize_t wil_write_file_reset(struct file *file, const char __user *buf, - size_t len, loff_t *ppos) -{ - struct wil6210_priv *wil = file->private_data; - struct net_device *ndev = wil->main_ndev; - - /** - * BUG: - * this code does NOT sync device state with the rest of system - * use with care, debug only!!! - */ - rtnl_lock(); - dev_close(ndev); - ndev->flags &= ~IFF_UP; - rtnl_unlock(); - wil_reset(wil, true); - - return len; -} - -static const struct file_operations fops_reset = { - .write = wil_write_file_reset, - .open = simple_open, -}; - /*---write channel 1..4 to rxon for it, 0 to rxoff---*/ static ssize_t wil_write_file_rxon(struct file *file, const char __user *buf, size_t len, loff_t *ppos) @@ -991,6 +965,8 @@ int rc; void *frame; + memset(¶ms, 0, sizeof(params)); + if (!len) return -EINVAL; @@ -2459,7 +2435,6 @@ {"desc", 0444, &fops_txdesc}, {"bf", 0444, &fops_bf}, {"mem_val", 0644, &fops_memread}, - {"reset", 0244, &fops_reset}, {"rxon", 0244, &fops_rxon}, {"tx_mgmt", 0244, &fops_txmgmt}, {"wmi_send", 0244, &fops_wmi}, diff -Nru linux-4.19.98/drivers/net/wireless/ath/wil6210/interrupt.c linux-4.19.118/drivers/net/wireless/ath/wil6210/interrupt.c --- linux-4.19.98/drivers/net/wireless/ath/wil6210/interrupt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wil6210/interrupt.c 2020-04-23 08:30:24.000000000 +0000 @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2017 Qualcomm Atheros, Inc. - * Copyright (c) 2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -590,10 +590,14 @@ } if (isr & BIT_DMA_EP_MISC_ICR_HALP) { - wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n"); - wil6210_mask_halp(wil); isr &= ~BIT_DMA_EP_MISC_ICR_HALP; - complete(&wil->halp.comp); + if (wil->halp.handle_icr) { + /* no need to handle HALP ICRs until next vote */ + wil->halp.handle_icr = false; + wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n"); + wil6210_mask_halp(wil); + complete(&wil->halp.comp); + } } wil->isr_misc = isr; diff -Nru linux-4.19.98/drivers/net/wireless/ath/wil6210/main.c linux-4.19.118/drivers/net/wireless/ath/wil6210/main.c --- linux-4.19.98/drivers/net/wireless/ath/wil6210/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wil6210/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1687,7 +1687,7 @@ return rc; /* Rx RING. After MAC and beacon */ - rc = wil->txrx_ops.rx_init(wil, 1 << rx_ring_order); + rc = wil->txrx_ops.rx_init(wil, rx_ring_order); if (rc) return rc; @@ -1814,11 +1814,14 @@ if (++wil->halp.ref_cnt == 1) { reinit_completion(&wil->halp.comp); + /* mark to IRQ context to handle HALP ICR */ + wil->halp.handle_icr = true; wil6210_set_halp(wil); rc = wait_for_completion_timeout(&wil->halp.comp, to_jiffies); if (!rc) { wil_err(wil, "HALP vote timed out\n"); /* Mask HALP as done in case the interrupt is raised */ + wil->halp.handle_icr = false; wil6210_mask_halp(wil); } else { wil_dbg_irq(wil, diff -Nru linux-4.19.98/drivers/net/wireless/ath/wil6210/txrx.c linux-4.19.118/drivers/net/wireless/ath/wil6210/txrx.c --- linux-4.19.98/drivers/net/wireless/ath/wil6210/txrx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wil6210/txrx.c 2020-04-23 08:30:24.000000000 +0000 @@ -881,7 +881,7 @@ } } -static int wil_rx_init(struct wil6210_priv *wil, u16 size) +static int wil_rx_init(struct wil6210_priv *wil, uint order) { struct wil_ring *vring = &wil->ring_rx; int rc; @@ -895,7 +895,7 @@ wil_rx_buf_len_init(wil); - vring->size = size; + vring->size = 1 << order; vring->is_rx = true; rc = wil_vring_alloc(wil, vring); if (rc) diff -Nru linux-4.19.98/drivers/net/wireless/ath/wil6210/txrx_edma.c linux-4.19.118/drivers/net/wireless/ath/wil6210/txrx_edma.c --- linux-4.19.98/drivers/net/wireless/ath/wil6210/txrx_edma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wil6210/txrx_edma.c 2020-04-23 08:30:24.000000000 +0000 @@ -268,6 +268,9 @@ struct list_head *active = &wil->rx_buff_mgmt.active; dma_addr_t pa; + if (!wil->rx_buff_mgmt.buff_arr) + return; + while (!list_empty(active)) { struct wil_rx_buff *rx_buff = list_first_entry(active, struct wil_rx_buff, list); @@ -590,9 +593,9 @@ WIL_MAX_ETH_MTU : WIL_EDMA_RX_BUF_LEN_DEFAULT; } -static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size) +static int wil_rx_init_edma(struct wil6210_priv *wil, uint desc_ring_order) { - u16 status_ring_size; + u16 status_ring_size, desc_ring_size = 1 << desc_ring_order; struct wil_ring *ring = &wil->ring_rx; int rc; size_t elem_size = wil->use_compressed_rx_status ? @@ -607,7 +610,12 @@ "compressed RX status cannot be used with SW reorder\n"); return -EINVAL; } - + if (wil->rx_status_ring_order <= desc_ring_order) + /* make sure sring is larger than desc ring */ + wil->rx_status_ring_order = desc_ring_order + 1; + if (wil->rx_buff_id_count <= desc_ring_size) + /* make sure we will not run out of buff_ids */ + wil->rx_buff_id_count = desc_ring_size + 512; if (wil->rx_status_ring_order < WIL_SRING_SIZE_ORDER_MIN || wil->rx_status_ring_order > WIL_SRING_SIZE_ORDER_MAX) wil->rx_status_ring_order = WIL_RX_SRING_SIZE_ORDER_DEFAULT; diff -Nru linux-4.19.98/drivers/net/wireless/ath/wil6210/wil6210.h linux-4.19.118/drivers/net/wireless/ath/wil6210/wil6210.h --- linux-4.19.98/drivers/net/wireless/ath/wil6210/wil6210.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wil6210/wil6210.h 2020-04-23 08:30:24.000000000 +0000 @@ -602,7 +602,7 @@ struct wil_ring *ring, struct sk_buff *skb); irqreturn_t (*irq_tx)(int irq, void *cookie); /* RX ops */ - int (*rx_init)(struct wil6210_priv *wil, u16 ring_size); + int (*rx_init)(struct wil6210_priv *wil, uint ring_order); void (*rx_fini)(struct wil6210_priv *wil); int (*wmi_addba_rx_resp)(struct wil6210_priv *wil, u8 mid, u8 cid, u8 tid, u8 token, u16 status, bool amsdu, @@ -778,6 +778,7 @@ struct mutex lock; /* protect halp ref_cnt */ unsigned int ref_cnt; struct completion comp; + u8 handle_icr; }; struct wil_blob_wrapper { diff -Nru linux-4.19.98/drivers/net/wireless/ath/wil6210/wmi.c linux-4.19.118/drivers/net/wireless/ath/wil6210/wmi.c --- linux-4.19.98/drivers/net/wireless/ath/wil6210/wmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/ath/wil6210/wmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -2802,7 +2802,7 @@ if (mid == MID_BROADCAST) mid = 0; - if (mid >= wil->max_vifs) { + if (mid >= ARRAY_SIZE(wil->vifs) || mid >= wil->max_vifs) { wil_dbg_wmi(wil, "invalid mid %d, event skipped\n", mid); return; diff -Nru linux-4.19.98/drivers/net/wireless/broadcom/b43legacy/main.c linux-4.19.118/drivers/net/wireless/broadcom/b43legacy/main.c --- linux-4.19.98/drivers/net/wireless/broadcom/b43legacy/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/broadcom/b43legacy/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1304,8 +1304,9 @@ } /* Interrupt handler bottom-half */ -static void b43legacy_interrupt_tasklet(struct b43legacy_wldev *dev) +static void b43legacy_interrupt_tasklet(unsigned long data) { + struct b43legacy_wldev *dev = (struct b43legacy_wldev *)data; u32 reason; u32 dma_reason[ARRAY_SIZE(dev->dma_reason)]; u32 merged_dma_reason = 0; @@ -3775,7 +3776,7 @@ b43legacy_set_status(wldev, B43legacy_STAT_UNINIT); wldev->bad_frames_preempt = modparam_bad_frames_preempt; tasklet_init(&wldev->isr_tasklet, - (void (*)(unsigned long))b43legacy_interrupt_tasklet, + b43legacy_interrupt_tasklet, (unsigned long)wldev); if (modparam_pio) wldev->__using_pio = true; diff -Nru linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --- linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c 2020-04-23 08:30:24.000000000 +0000 @@ -617,15 +617,13 @@ err = brcmf_sdiod_set_backplane_window(sdiodev, addr); if (err) - return err; + goto out; addr &= SBSDIO_SB_OFT_ADDR_MASK; addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; - if (!err) - err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, addr, - mypkt); - + err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, addr, mypkt); +out: brcmu_pkt_buf_free_skb(mypkt); return err; diff -Nru linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h --- linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h 2020-04-23 08:30:24.000000000 +0000 @@ -90,6 +90,7 @@ int (*get_memdump)(struct device *dev, void *data, size_t len); int (*get_fwname)(struct device *dev, const char *ext, unsigned char *fw_name); + void (*debugfs_create)(struct device *dev); }; @@ -235,6 +236,15 @@ return bus->ops->get_fwname(bus->dev, ext, fw_name); } +static inline +void brcmf_bus_debugfs_create(struct brcmf_bus *bus) +{ + if (!bus->ops->debugfs_create) + return; + + return bus->ops->debugfs_create(bus->dev); +} + /* * interface functions from common layer */ diff -Nru linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --- linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -1105,6 +1105,7 @@ brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read); brcmf_feat_debugfs_create(drvr); brcmf_proto_debugfs_create(drvr); + brcmf_bus_debugfs_create(bus_if); return 0; diff -Nru linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --- linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c 2020-04-23 08:30:24.000000000 +0000 @@ -1934,6 +1934,7 @@ BRCMF_SDIO_FT_NORMAL)) { rd->len = 0; brcmu_pkt_buf_free_skb(pkt); + continue; } bus->sdcnt.rx_readahead_cnt++; if (rd->len != roundup(rd_new.len, 16)) { @@ -3131,9 +3132,12 @@ return 0; } -static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) +static void brcmf_sdio_debugfs_create(struct device *dev) { - struct brcmf_pub *drvr = bus->sdiodev->bus_if->drvr; + struct brcmf_bus *bus_if = dev_get_drvdata(dev); + struct brcmf_pub *drvr = bus_if->drvr; + struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; + struct brcmf_sdio *bus = sdiodev->bus; struct dentry *dentry = brcmf_debugfs_get_devdir(drvr); if (IS_ERR_OR_NULL(dentry)) @@ -3153,7 +3157,7 @@ return 0; } -static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus) +static void brcmf_sdio_debugfs_create(struct device *dev) { } #endif /* DEBUG */ @@ -3438,8 +3442,6 @@ if (bus->rxbuf) bus->rxblen = value; - brcmf_sdio_debugfs_create(bus); - /* the commands below use the terms tx and rx from * a device perspective, ie. bus:txglom affects the * bus transfers from device to host. @@ -4050,6 +4052,7 @@ .get_ramsize = brcmf_sdio_bus_get_ramsize, .get_memdump = brcmf_sdio_bus_get_memdump, .get_fwname = brcmf_sdio_get_fwname, + .debugfs_create = brcmf_sdio_debugfs_create }; #define BRCMF_SDIO_FW_CODE 0 diff -Nru linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --- linux-4.19.98/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -441,6 +441,7 @@ usb_free_urb(req->urb); list_del(q->next); } + kfree(reqs); return NULL; } @@ -1357,7 +1358,7 @@ goto fail; } - desc = &intf->altsetting[0].desc; + desc = &intf->cur_altsetting->desc; if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) || (desc->bInterfaceSubClass != 2) || (desc->bInterfaceProtocol != 0xff)) { @@ -1370,7 +1371,7 @@ num_of_eps = desc->bNumEndpoints; for (ep = 0; ep < num_of_eps; ep++) { - endpoint = &intf->altsetting[0].endpoint[ep].desc; + endpoint = &intf->cur_altsetting->endpoint[ep].desc; endpoint_num = usb_endpoint_num(endpoint); if (!usb_endpoint_xfer_bulk(endpoint)) continue; diff -Nru linux-4.19.98/drivers/net/wireless/cisco/airo.c linux-4.19.118/drivers/net/wireless/cisco/airo.c --- linux-4.19.98/drivers/net/wireless/cisco/airo.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/cisco/airo.c 2020-04-23 08:30:24.000000000 +0000 @@ -7786,16 +7786,8 @@ case AIROGVLIST: ridcode = RID_APLIST; break; case AIROGDRVNAM: ridcode = RID_DRVNAME; break; case AIROGEHTENC: ridcode = RID_ETHERENCAP; break; - case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; - /* Only super-user can read WEP keys */ - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - break; - case AIROGWEPKNV: ridcode = RID_WEP_PERM; - /* Only super-user can read WEP keys */ - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - break; + case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; break; + case AIROGWEPKNV: ridcode = RID_WEP_PERM; break; case AIROGSTAT: ridcode = RID_STATUS; break; case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; case AIROGSTATSC32: ridcode = RID_STATS; break; @@ -7809,7 +7801,13 @@ return -EINVAL; } - if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL) + if (ridcode == RID_WEP_TEMP || ridcode == RID_WEP_PERM) { + /* Only super-user can read WEP keys */ + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + } + + if ((iobuf = kzalloc(RIDSIZE, GFP_KERNEL)) == NULL) return -ENOMEM; PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1); diff -Nru linux-4.19.98/drivers/net/wireless/intel/ipw2x00/ipw2100.c linux-4.19.118/drivers/net/wireless/intel/ipw2x00/ipw2100.c --- linux-4.19.98/drivers/net/wireless/intel/ipw2x00/ipw2100.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/ipw2x00/ipw2100.c 2020-04-23 08:30:24.000000000 +0000 @@ -3220,8 +3220,9 @@ } } -static void ipw2100_irq_tasklet(struct ipw2100_priv *priv) +static void ipw2100_irq_tasklet(unsigned long data) { + struct ipw2100_priv *priv = (struct ipw2100_priv *)data; struct net_device *dev = priv->net_dev; unsigned long flags; u32 inta, tmp; @@ -6025,7 +6026,7 @@ spin_unlock_irqrestore(&priv->low_lock, flags); } -static void ipw2100_irq_tasklet(struct ipw2100_priv *priv); +static void ipw2100_irq_tasklet(unsigned long data); static const struct net_device_ops ipw2100_netdev_ops = { .ndo_open = ipw2100_open, @@ -6155,7 +6156,7 @@ INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); INIT_DELAYED_WORK(&priv->scan_event, ipw2100_scan_event); - tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) + tasklet_init(&priv->irq_tasklet, ipw2100_irq_tasklet, (unsigned long)priv); /* NOTE: We do not start the deferred work for status checks yet */ diff -Nru linux-4.19.98/drivers/net/wireless/intel/ipw2x00/ipw2200.c linux-4.19.118/drivers/net/wireless/intel/ipw2x00/ipw2200.c --- linux-4.19.98/drivers/net/wireless/intel/ipw2x00/ipw2200.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/ipw2x00/ipw2200.c 2020-04-23 08:30:24.000000000 +0000 @@ -1959,8 +1959,9 @@ wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); } -static void ipw_irq_tasklet(struct ipw_priv *priv) +static void ipw_irq_tasklet(unsigned long data) { + struct ipw_priv *priv = (struct ipw_priv *)data; u32 inta, inta_mask, handled = 0; unsigned long flags; int rc = 0; @@ -10694,7 +10695,7 @@ INIT_WORK(&priv->qos_activate, ipw_bg_qos_activate); #endif /* CONFIG_IPW2200_QOS */ - tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) + tasklet_init(&priv->irq_tasklet, ipw_irq_tasklet, (unsigned long)priv); return ret; diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlegacy/3945-mac.c linux-4.19.118/drivers/net/wireless/intel/iwlegacy/3945-mac.c --- linux-4.19.98/drivers/net/wireless/intel/iwlegacy/3945-mac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlegacy/3945-mac.c 2020-04-23 08:30:24.000000000 +0000 @@ -1392,8 +1392,9 @@ } static void -il3945_irq_tasklet(struct il_priv *il) +il3945_irq_tasklet(unsigned long data) { + struct il_priv *il = (struct il_priv *)data; u32 inta, handled = 0; u32 inta_fh; unsigned long flags; @@ -3419,7 +3420,7 @@ timer_setup(&il->watchdog, il_bg_watchdog, 0); tasklet_init(&il->irq_tasklet, - (void (*)(unsigned long))il3945_irq_tasklet, + il3945_irq_tasklet, (unsigned long)il); } diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlegacy/4965-mac.c linux-4.19.118/drivers/net/wireless/intel/iwlegacy/4965-mac.c --- linux-4.19.98/drivers/net/wireless/intel/iwlegacy/4965-mac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlegacy/4965-mac.c 2020-04-23 08:30:24.000000000 +0000 @@ -4360,8 +4360,9 @@ } static void -il4965_irq_tasklet(struct il_priv *il) +il4965_irq_tasklet(unsigned long data) { + struct il_priv *il = (struct il_priv *)data; u32 inta, handled = 0; u32 inta_fh; unsigned long flags; @@ -6257,7 +6258,7 @@ timer_setup(&il->watchdog, il_bg_watchdog, 0); tasklet_init(&il->irq_tasklet, - (void (*)(unsigned long))il4965_irq_tasklet, + il4965_irq_tasklet, (unsigned long)il); } diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlegacy/common.c linux-4.19.118/drivers/net/wireless/intel/iwlegacy/common.c --- linux-4.19.98/drivers/net/wireless/intel/iwlegacy/common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlegacy/common.c 2020-04-23 08:30:24.000000000 +0000 @@ -717,7 +717,7 @@ u32 gp = _il_rd(il, CSR_EEPROM_GP); int sz; int ret; - u16 addr; + int addr; /* allocate eeprom */ sz = il->cfg->eeprom_size; diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h linux-4.19.118/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h 2020-04-23 08:30:24.000000000 +0000 @@ -165,7 +165,7 @@ */ struct iwl_nvm_get_info { __le32 reserved; -} __packed; /* GRP_REGULATORY_NVM_GET_INFO_CMD_S_VER_1 */ +} __packed; /* REGULATORY_NVM_GET_INFO_CMD_API_S_VER_1 */ /** * enum iwl_nvm_info_general_flags - flags in NVM_GET_INFO resp @@ -180,14 +180,14 @@ * @flags: bit 0: 1 - empty, 0 - non-empty * @nvm_version: nvm version * @board_type: board type - * @reserved: reserved + * @n_hw_addrs: number of reserved MAC addresses */ struct iwl_nvm_get_info_general { __le32 flags; __le16 nvm_version; u8 board_type; - u8 reserved; -} __packed; /* GRP_REGULATORY_NVM_GET_INFO_GENERAL_S_VER_1 */ + u8 n_hw_addrs; +} __packed; /* REGULATORY_NVM_GET_INFO_GENERAL_S_VER_2 */ /** * enum iwl_nvm_mac_sku_flags - flags in &iwl_nvm_get_info_sku @@ -231,7 +231,7 @@ struct iwl_nvm_get_info_phy { __le32 tx_chains; __le32 rx_chains; -} __packed; /* GRP_REGULATORY_NVM_GET_INFO_PHY_SKU_SECTION_S_VER_1 */ +} __packed; /* REGULATORY_NVM_GET_INFO_PHY_SKU_SECTION_S_VER_1 */ #define IWL_NUM_CHANNELS (51) @@ -245,7 +245,7 @@ __le32 lar_enabled; __le16 channel_profile[IWL_NUM_CHANNELS]; __le16 reserved; -} __packed; /* GRP_REGULATORY_NVM_GET_INFO_REGULATORY_S_VER_1 */ +} __packed; /* REGULATORY_NVM_GET_INFO_REGULATORY_S_VER_1 */ /** * struct iwl_nvm_get_info_rsp - response to get NVM data @@ -259,7 +259,7 @@ struct iwl_nvm_get_info_sku mac_sku; struct iwl_nvm_get_info_phy phy_sku; struct iwl_nvm_get_info_regulatory regulatory; -} __packed; /* GRP_REGULATORY_NVM_GET_INFO_CMD_RSP_S_VER_2 */ +} __packed; /* REGULATORY_NVM_GET_INFO_RSP_API_S_VER_3 */ /** * struct iwl_nvm_access_complete_cmd - NVM_ACCESS commands are completed diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c 2020-04-23 08:30:24.000000000 +0000 @@ -217,6 +217,34 @@ NVM_CHANNEL_DC_HIGH = BIT(12), }; +/** + * enum iwl_reg_capa_flags - global flags applied for the whole regulatory + * domain. + * @REG_CAPA_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the + * 2.4Ghz band is allowed. + * @REG_CAPA_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the + * 5Ghz band is allowed. + * @REG_CAPA_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed + * for this regulatory domain (valid only in 5Ghz). + * @REG_CAPA_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed + * for this regulatory domain (valid only in 5Ghz). + * @REG_CAPA_MCS_8_ALLOWED: 11ac with MCS 8 is allowed. + * @REG_CAPA_MCS_9_ALLOWED: 11ac with MCS 9 is allowed. + * @REG_CAPA_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden + * for this regulatory domain (valid only in 5Ghz). + * @REG_CAPA_DC_HIGH_ENABLED: DC HIGH allowed. + */ +enum iwl_reg_capa_flags { + REG_CAPA_BF_CCD_LOW_BAND = BIT(0), + REG_CAPA_BF_CCD_HIGH_BAND = BIT(1), + REG_CAPA_160MHZ_ALLOWED = BIT(2), + REG_CAPA_80MHZ_ALLOWED = BIT(3), + REG_CAPA_MCS_8_ALLOWED = BIT(4), + REG_CAPA_MCS_9_ALLOWED = BIT(5), + REG_CAPA_40MHZ_FORBIDDEN = BIT(7), + REG_CAPA_DC_HIGH_ENABLED = BIT(9), +}; + static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level, int chan, u16 flags) { @@ -923,6 +951,7 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u8 *nvm_chan, int ch_idx, u16 nvm_flags, + u16 cap_flags, const struct iwl_cfg *cfg) { u32 flags = NL80211_RRF_NO_HT40; @@ -966,6 +995,20 @@ (flags & NL80211_RRF_NO_IR)) flags |= NL80211_RRF_GO_CONCURRENT; + /* + * cap_flags is per regulatory domain so apply it for every channel + */ + if (ch_idx >= NUM_2GHZ_CHANNELS) { + if (cap_flags & REG_CAPA_40MHZ_FORBIDDEN) + flags |= NL80211_RRF_NO_HT40; + + if (!(cap_flags & REG_CAPA_80MHZ_ALLOWED)) + flags |= NL80211_RRF_NO_80MHZ; + + if (!(cap_flags & REG_CAPA_160MHZ_ALLOWED)) + flags |= NL80211_RRF_NO_160MHZ; + } + return flags; } @@ -977,7 +1020,7 @@ struct ieee80211_regdomain * iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, int num_of_ch, __le32 *channels, u16 fw_mcc, - u16 geo_info) + u16 geo_info, u16 cap) { int ch_idx; u16 ch_flags; @@ -1038,7 +1081,8 @@ } reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx, - ch_flags, cfg); + ch_flags, cap, + cfg); /* we can't continue the same rule */ if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags || @@ -1315,6 +1359,7 @@ bool lar_fw_supported = !iwlwifi_mod_params.lar_disable && fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_LAR_SUPPORT); + bool empty_otp; u32 mac_flags; u32 sbands_flags = 0; @@ -1330,7 +1375,9 @@ } rsp = (void *)hcmd.resp_pkt->data; - if (le32_to_cpu(rsp->general.flags) & NVM_GENERAL_FLAGS_EMPTY_OTP) + empty_otp = !!(le32_to_cpu(rsp->general.flags) & + NVM_GENERAL_FLAGS_EMPTY_OTP); + if (empty_otp) IWL_INFO(trans, "OTP is empty\n"); nvm = kzalloc(sizeof(*nvm) + @@ -1354,6 +1401,11 @@ /* Initialize general data */ nvm->nvm_version = le16_to_cpu(rsp->general.nvm_version); + nvm->n_hw_addrs = rsp->general.n_hw_addrs; + if (nvm->n_hw_addrs == 0) + IWL_WARN(trans, + "Firmware declares no reserved mac addresses. OTP is empty: %d\n", + empty_otp); /* Initialize MAC sku data */ mac_flags = le32_to_cpu(rsp->mac_sku.mac_sku_flags); diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h linux-4.19.118/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h 2020-04-23 08:30:24.000000000 +0000 @@ -7,7 +7,7 @@ * * Copyright(c) 2008 - 2015 Intel Corporation. All rights reserved. * Copyright(c) 2016 - 2017 Intel Deutschland GmbH - * Copyright(c) 2018 Intel Corporation + * Copyright(c) 2018 - 2019 Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as @@ -34,7 +34,7 @@ * * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2016 - 2017 Intel Deutschland GmbH - * Copyright(c) 2018 Intel Corporation + * Copyright(c) 2018 - 2019 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -108,7 +108,7 @@ struct ieee80211_regdomain * iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, int num_of_ch, __le32 *channels, u16 fw_mcc, - u16 geo_info); + u16 geo_info, u16 cap); /** * struct iwl_nvm_section - describes an NVM section in memory. diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/fw.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/fw.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/fw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/fw.c 2020-04-23 08:30:24.000000000 +0000 @@ -110,12 +110,12 @@ int i; struct iwl_rss_config_cmd cmd = { .flags = cpu_to_le32(IWL_RSS_ENABLE), - .hash_mask = IWL_RSS_HASH_TYPE_IPV4_TCP | - IWL_RSS_HASH_TYPE_IPV4_UDP | - IWL_RSS_HASH_TYPE_IPV4_PAYLOAD | - IWL_RSS_HASH_TYPE_IPV6_TCP | - IWL_RSS_HASH_TYPE_IPV6_UDP | - IWL_RSS_HASH_TYPE_IPV6_PAYLOAD, + .hash_mask = BIT(IWL_RSS_HASH_TYPE_IPV4_TCP) | + BIT(IWL_RSS_HASH_TYPE_IPV4_UDP) | + BIT(IWL_RSS_HASH_TYPE_IPV4_PAYLOAD) | + BIT(IWL_RSS_HASH_TYPE_IPV6_TCP) | + BIT(IWL_RSS_HASH_TYPE_IPV6_UDP) | + BIT(IWL_RSS_HASH_TYPE_IPV6_PAYLOAD), }; if (mvm->trans->num_rx_queues == 1) diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c 2020-04-23 08:30:24.000000000 +0000 @@ -317,7 +317,8 @@ __le32_to_cpu(resp->n_channels), resp->channels, __le16_to_cpu(resp->mcc), - __le16_to_cpu(resp->geo_info)); + __le16_to_cpu(resp->geo_info), + __le16_to_cpu(resp->cap)); /* Store the return source id */ src_id = resp->source_id; kfree(resp); diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c 2020-04-23 08:30:24.000000000 +0000 @@ -286,7 +286,7 @@ int regulatory_type; /* Checking for required sections */ - if (mvm->trans->cfg->nvm_type != IWL_NVM_EXT) { + if (mvm->trans->cfg->nvm_type == IWL_NVM) { if (!mvm->nvm_sections[NVM_SECTION_TYPE_SW].data || !mvm->nvm_sections[mvm->cfg->nvm_hw_section_num].data) { IWL_ERR(mvm, "Can't parse empty OTP/NVM sections\n"); @@ -314,7 +314,8 @@ } /* PHY_SKU section is mandatory in B0 */ - if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { + if (mvm->trans->cfg->nvm_type == IWL_NVM_EXT && + !mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) { IWL_ERR(mvm, "Can't parse phy_sku in B0, empty sections\n"); return NULL; diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c 2020-04-23 08:30:24.000000000 +0000 @@ -1077,7 +1077,6 @@ he_phy_data = le64_to_cpu(desc->v1.he_phy_data); rx_status->flag |= RX_FLAG_AMPDU_DETAILS; - rx_status->ampdu_reference = mvm->ampdu_ref; /* toggle is switched whenever new aggregation starts */ if (toggle_bit != mvm->ampdu_toggle) { mvm->ampdu_ref++; @@ -1092,6 +1091,7 @@ RX_FLAG_AMPDU_EOF_BIT; } } + rx_status->ampdu_reference = mvm->ampdu_ref; } rcu_read_lock(); diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/sta.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/sta.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/sta.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/sta.c 2020-04-23 08:30:24.000000000 +0000 @@ -2462,7 +2462,7 @@ struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); struct iwl_mvm_tid_data *tid_data; u16 normalized_ssn; - int txq_id; + u16 txq_id; int ret; if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT)) @@ -2506,17 +2506,24 @@ */ txq_id = mvmsta->tid_data[tid].txq_id; if (txq_id == IWL_MVM_INVALID_QUEUE) { - txq_id = iwl_mvm_find_free_queue(mvm, mvmsta->sta_id, - IWL_MVM_DQA_MIN_DATA_QUEUE, - IWL_MVM_DQA_MAX_DATA_QUEUE); - if (txq_id < 0) { - ret = txq_id; + ret = iwl_mvm_find_free_queue(mvm, mvmsta->sta_id, + IWL_MVM_DQA_MIN_DATA_QUEUE, + IWL_MVM_DQA_MAX_DATA_QUEUE); + if (ret < 0) { IWL_ERR(mvm, "Failed to allocate agg queue\n"); goto release_locks; } + txq_id = ret; + /* TXQ hasn't yet been enabled, so mark it only as reserved */ mvm->queue_info[txq_id].status = IWL_MVM_QUEUE_RESERVED; + } else if (WARN_ON(txq_id >= IWL_MAX_HW_QUEUES)) { + ret = -ENXIO; + IWL_ERR(mvm, "tid_id %d out of range (0, %d)!\n", + tid, IWL_MAX_HW_QUEUES - 1); + goto out; + } else if (unlikely(mvm->queue_info[txq_id].status == IWL_MVM_QUEUE_SHARED)) { ret = -ENXIO; @@ -3038,6 +3045,10 @@ igtk_cmd.sta_id = cpu_to_le32(sta_id); if (remove_key) { + /* This is a valid situation for IGTK */ + if (sta_id == IWL_MVM_INVALID_STA) + return 0; + igtk_cmd.ctrl_flags |= cpu_to_le32(STA_KEY_NOT_VALID); } else { struct ieee80211_key_seq seq; @@ -3345,9 +3356,9 @@ IWL_DEBUG_WEP(mvm, "mvm remove dynamic key: idx=%d sta=%d\n", keyconf->keyidx, sta_id); - if (mvm_sta && (keyconf->cipher == WLAN_CIPHER_SUITE_AES_CMAC || - keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || - keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256)) + if (keyconf->cipher == WLAN_CIPHER_SUITE_AES_CMAC || + keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 || + keyconf->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256) return iwl_mvm_send_sta_igtk(mvm, keyconf, sta_id, true); if (!__test_and_clear_bit(keyconf->hw_key_idx, mvm->fw_key_table)) { diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/tt.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/tt.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/mvm/tt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/mvm/tt.c 2020-04-23 08:30:24.000000000 +0000 @@ -739,7 +739,8 @@ static void iwl_mvm_thermal_zone_register(struct iwl_mvm *mvm) { int i; - char name[] = "iwlwifi"; + char name[16]; + static atomic_t counter = ATOMIC_INIT(0); if (!iwl_mvm_is_tt_in_fw(mvm)) { mvm->tz_device.tzone = NULL; @@ -749,6 +750,7 @@ BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH); + sprintf(name, "iwlwifi_%u", atomic_inc_return(&counter) & 0xFF); mvm->tz_device.tzone = thermal_zone_device_register(name, IWL_MAX_DTS_TRIPS, IWL_WRITABLE_TRIPS_MSK, diff -Nru linux-4.19.98/drivers/net/wireless/intel/iwlwifi/pcie/trans.c linux-4.19.118/drivers/net/wireless/intel/iwlwifi/pcie/trans.c --- linux-4.19.98/drivers/net/wireless/intel/iwlwifi/pcie/trans.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intel/iwlwifi/pcie/trans.c 2020-04-23 08:30:24.000000000 +0000 @@ -3283,6 +3283,15 @@ spin_lock_init(&trans_pcie->reg_lock); mutex_init(&trans_pcie->mutex); init_waitqueue_head(&trans_pcie->ucode_write_waitq); + + trans_pcie->rba.alloc_wq = alloc_workqueue("rb_allocator", + WQ_HIGHPRI | WQ_UNBOUND, 1); + if (!trans_pcie->rba.alloc_wq) { + ret = -ENOMEM; + goto out_free_trans; + } + INIT_WORK(&trans_pcie->rba.rx_alloc, iwl_pcie_rx_allocator_work); + trans_pcie->tso_hdr_page = alloc_percpu(struct iwl_tso_hdr_page); if (!trans_pcie->tso_hdr_page) { ret = -ENOMEM; @@ -3485,10 +3494,6 @@ trans_pcie->inta_mask = CSR_INI_SET_MASK; } - trans_pcie->rba.alloc_wq = alloc_workqueue("rb_allocator", - WQ_HIGHPRI | WQ_UNBOUND, 1); - INIT_WORK(&trans_pcie->rba.rx_alloc, iwl_pcie_rx_allocator_work); - #ifdef CONFIG_IWLWIFI_PCIE_RTPM trans->runtime_pm_mode = IWL_PLAT_PM_MODE_D0I3; #else @@ -3501,6 +3506,8 @@ iwl_pcie_free_ict(trans); out_no_pci: free_percpu(trans_pcie->tso_hdr_page); + destroy_workqueue(trans_pcie->rba.alloc_wq); +out_free_trans: iwl_trans_free(trans); return ERR_PTR(ret); } diff -Nru linux-4.19.98/drivers/net/wireless/intersil/hostap/hostap_ap.c linux-4.19.118/drivers/net/wireless/intersil/hostap/hostap_ap.c --- linux-4.19.98/drivers/net/wireless/intersil/hostap/hostap_ap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intersil/hostap/hostap_ap.c 2020-04-23 08:30:24.000000000 +0000 @@ -2508,7 +2508,7 @@ sta->supported_rates[0] = 2; if (sta->tx_supp_rates & WLAN_RATE_2M) sta->supported_rates[1] = 4; - if (sta->tx_supp_rates & WLAN_RATE_5M5) + if (sta->tx_supp_rates & WLAN_RATE_5M5) sta->supported_rates[2] = 11; if (sta->tx_supp_rates & WLAN_RATE_11M) sta->supported_rates[3] = 22; diff -Nru linux-4.19.98/drivers/net/wireless/intersil/orinoco/orinoco_usb.c linux-4.19.118/drivers/net/wireless/intersil/orinoco/orinoco_usb.c --- linux-4.19.98/drivers/net/wireless/intersil/orinoco/orinoco_usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/intersil/orinoco/orinoco_usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -1364,7 +1364,8 @@ int retval; BUG_ON(in_interrupt()); - BUG_ON(!upriv); + if (!upriv) + return -EINVAL; upriv->reply_count = 0; /* Write the MAGIC number on the simulated registers to keep @@ -1611,9 +1612,9 @@ /* set up the endpoint information */ /* check out the endpoints */ - iface_desc = &interface->altsetting[0].desc; + iface_desc = &interface->cur_altsetting->desc; for (i = 0; i < iface_desc->bNumEndpoints; ++i) { - ep = &interface->altsetting[0].endpoint[i].desc; + ep = &interface->cur_altsetting->endpoint[i].desc; if (usb_endpoint_is_bulk_in(ep)) { /* we found a bulk in endpoint */ diff -Nru linux-4.19.98/drivers/net/wireless/mac80211_hwsim.c linux-4.19.118/drivers/net/wireless/mac80211_hwsim.c --- linux-4.19.98/drivers/net/wireless/mac80211_hwsim.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/mac80211_hwsim.c 2020-04-23 08:30:24.000000000 +0000 @@ -3327,9 +3327,9 @@ param.no_vif = true; if (info->attrs[HWSIM_ATTR_RADIO_NAME]) { - hwname = kasprintf(GFP_KERNEL, "%.*s", - nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), - (char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME])); + hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]), + nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), + GFP_KERNEL); if (!hwname) return -ENOMEM; param.hwname = hwname; @@ -3385,9 +3385,9 @@ if (info->attrs[HWSIM_ATTR_RADIO_ID]) { idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]); } else if (info->attrs[HWSIM_ATTR_RADIO_NAME]) { - hwname = kasprintf(GFP_KERNEL, "%.*s", - nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), - (char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME])); + hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]), + nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), + GFP_KERNEL); if (!hwname) return -ENOMEM; } else diff -Nru linux-4.19.98/drivers/net/wireless/marvell/libertas/cfg.c linux-4.19.118/drivers/net/wireless/marvell/libertas/cfg.c --- linux-4.19.98/drivers/net/wireless/marvell/libertas/cfg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/marvell/libertas/cfg.c 2020-04-23 08:30:24.000000000 +0000 @@ -273,6 +273,10 @@ int hw, ap, ap_max = ie[1]; u8 hw_rate; + if (ap_max > MAX_RATES) { + lbs_deb_assoc("invalid rates\n"); + return tlv; + } /* Advance past IE header */ ie += 2; @@ -1717,6 +1721,9 @@ struct cmd_ds_802_11_ad_hoc_join cmd; u8 preamble = RADIO_PREAMBLE_SHORT; int ret = 0; + int hw, i; + u8 rates_max; + u8 *rates; /* TODO: set preamble based on scan result */ ret = lbs_set_radio(priv, preamble, 1); @@ -1775,9 +1782,14 @@ if (!rates_eid) { lbs_add_rates(cmd.bss.rates); } else { - int hw, i; - u8 rates_max = rates_eid[1]; - u8 *rates = cmd.bss.rates; + rates_max = rates_eid[1]; + if (rates_max > MAX_RATES) { + lbs_deb_join("invalid rates"); + rcu_read_unlock(); + ret = -EINVAL; + goto out; + } + rates = cmd.bss.rates; for (hw = 0; hw < ARRAY_SIZE(lbs_rates); hw++) { u8 hw_rate = lbs_rates[hw].bitrate / 5; for (i = 0; i < rates_max; i++) { diff -Nru linux-4.19.98/drivers/net/wireless/marvell/libertas_tf/cmd.c linux-4.19.118/drivers/net/wireless/marvell/libertas_tf/cmd.c --- linux-4.19.98/drivers/net/wireless/marvell/libertas_tf/cmd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/marvell/libertas_tf/cmd.c 2020-04-23 08:30:24.000000000 +0000 @@ -69,7 +69,7 @@ break; } - for (ch = priv->range.start; ch < priv->range.end; ch++) + for (ch = range->start; ch < range->end; ch++) priv->channels[CHAN_TO_IDX(ch)].flags = 0; } diff -Nru linux-4.19.98/drivers/net/wireless/marvell/mwifiex/main.h linux-4.19.118/drivers/net/wireless/marvell/mwifiex/main.h --- linux-4.19.98/drivers/net/wireless/marvell/mwifiex/main.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/marvell/mwifiex/main.h 2020-04-23 08:30:24.000000000 +0000 @@ -1294,19 +1294,6 @@ return pos; } -/* This function return interface number with the same bss_type. - */ -static inline u8 -mwifiex_get_intf_num(struct mwifiex_adapter *adapter, u8 bss_type) -{ - u8 i, num = 0; - - for (i = 0; i < adapter->priv_num; i++) - if (adapter->priv[i] && adapter->priv[i]->bss_type == bss_type) - num++; - return num; -} - /* * This function returns the correct private structure pointer based * upon the BSS type and BSS number. diff -Nru linux-4.19.98/drivers/net/wireless/marvell/mwifiex/scan.c linux-4.19.118/drivers/net/wireless/marvell/mwifiex/scan.c --- linux-4.19.98/drivers/net/wireless/marvell/mwifiex/scan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/marvell/mwifiex/scan.c 2020-04-23 08:30:24.000000000 +0000 @@ -2894,6 +2894,13 @@ vs_param_set->header.len = cpu_to_le16((((u16) priv->vs_ie[id].ie[1]) & 0x00FF) + 2); + if (le16_to_cpu(vs_param_set->header.len) > + MWIFIEX_MAX_VSIE_LEN) { + mwifiex_dbg(priv->adapter, ERROR, + "Invalid param length!\n"); + break; + } + memcpy(vs_param_set->ie, priv->vs_ie[id].ie, le16_to_cpu(vs_param_set->header.len)); *buffer += le16_to_cpu(vs_param_set->header.len) + diff -Nru linux-4.19.98/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c linux-4.19.118/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c --- linux-4.19.98/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c 2020-04-23 08:30:24.000000000 +0000 @@ -232,6 +232,7 @@ if (country_ie_len > (IEEE80211_COUNTRY_STRING_LEN + MWIFIEX_MAX_TRIPLET_802_11D)) { + rcu_read_unlock(); mwifiex_dbg(priv->adapter, ERROR, "11D: country_ie_len overflow!, deauth AP\n"); return -EINVAL; diff -Nru linux-4.19.98/drivers/net/wireless/marvell/mwifiex/tdls.c linux-4.19.118/drivers/net/wireless/marvell/mwifiex/tdls.c --- linux-4.19.98/drivers/net/wireless/marvell/mwifiex/tdls.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/marvell/mwifiex/tdls.c 2020-04-23 08:30:24.000000000 +0000 @@ -897,7 +897,7 @@ u8 *peer, *pos, *end; u8 i, action, basic; u16 cap = 0; - int ie_len = 0; + int ies_len = 0; if (len < (sizeof(struct ethhdr) + 3)) return; @@ -919,7 +919,7 @@ pos = buf + sizeof(struct ethhdr) + 4; /* payload 1+ category 1 + action 1 + dialog 1 */ cap = get_unaligned_le16(pos); - ie_len = len - sizeof(struct ethhdr) - TDLS_REQ_FIX_LEN; + ies_len = len - sizeof(struct ethhdr) - TDLS_REQ_FIX_LEN; pos += 2; break; @@ -929,7 +929,7 @@ /* payload 1+ category 1 + action 1 + dialog 1 + status code 2*/ pos = buf + sizeof(struct ethhdr) + 6; cap = get_unaligned_le16(pos); - ie_len = len - sizeof(struct ethhdr) - TDLS_RESP_FIX_LEN; + ies_len = len - sizeof(struct ethhdr) - TDLS_RESP_FIX_LEN; pos += 2; break; @@ -937,7 +937,7 @@ if (len < (sizeof(struct ethhdr) + TDLS_CONFIRM_FIX_LEN)) return; pos = buf + sizeof(struct ethhdr) + TDLS_CONFIRM_FIX_LEN; - ie_len = len - sizeof(struct ethhdr) - TDLS_CONFIRM_FIX_LEN; + ies_len = len - sizeof(struct ethhdr) - TDLS_CONFIRM_FIX_LEN; break; default: mwifiex_dbg(priv->adapter, ERROR, "Unknown TDLS frame type.\n"); @@ -950,33 +950,33 @@ sta_ptr->tdls_cap.capab = cpu_to_le16(cap); - for (end = pos + ie_len; pos + 1 < end; pos += 2 + pos[1]) { - if (pos + 2 + pos[1] > end) + for (end = pos + ies_len; pos + 1 < end; pos += 2 + pos[1]) { + u8 ie_len = pos[1]; + + if (pos + 2 + ie_len > end) break; switch (*pos) { case WLAN_EID_SUPP_RATES: - if (pos[1] > 32) + if (ie_len > sizeof(sta_ptr->tdls_cap.rates)) return; - sta_ptr->tdls_cap.rates_len = pos[1]; - for (i = 0; i < pos[1]; i++) + sta_ptr->tdls_cap.rates_len = ie_len; + for (i = 0; i < ie_len; i++) sta_ptr->tdls_cap.rates[i] = pos[i + 2]; break; case WLAN_EID_EXT_SUPP_RATES: - if (pos[1] > 32) + if (ie_len > sizeof(sta_ptr->tdls_cap.rates)) return; basic = sta_ptr->tdls_cap.rates_len; - if (pos[1] > 32 - basic) + if (ie_len > sizeof(sta_ptr->tdls_cap.rates) - basic) return; - for (i = 0; i < pos[1]; i++) + for (i = 0; i < ie_len; i++) sta_ptr->tdls_cap.rates[basic + i] = pos[i + 2]; - sta_ptr->tdls_cap.rates_len += pos[1]; + sta_ptr->tdls_cap.rates_len += ie_len; break; case WLAN_EID_HT_CAPABILITY: - if (pos > end - sizeof(struct ieee80211_ht_cap) - 2) - return; - if (pos[1] != sizeof(struct ieee80211_ht_cap)) + if (ie_len != sizeof(struct ieee80211_ht_cap)) return; /* copy the ie's value into ht_capb*/ memcpy((u8 *)&sta_ptr->tdls_cap.ht_capb, pos + 2, @@ -984,59 +984,45 @@ sta_ptr->is_11n_enabled = 1; break; case WLAN_EID_HT_OPERATION: - if (pos > end - - sizeof(struct ieee80211_ht_operation) - 2) - return; - if (pos[1] != sizeof(struct ieee80211_ht_operation)) + if (ie_len != sizeof(struct ieee80211_ht_operation)) return; /* copy the ie's value into ht_oper*/ memcpy(&sta_ptr->tdls_cap.ht_oper, pos + 2, sizeof(struct ieee80211_ht_operation)); break; case WLAN_EID_BSS_COEX_2040: - if (pos > end - 3) - return; - if (pos[1] != 1) + if (ie_len != sizeof(pos[2])) return; sta_ptr->tdls_cap.coex_2040 = pos[2]; break; case WLAN_EID_EXT_CAPABILITY: - if (pos > end - sizeof(struct ieee_types_header)) - return; - if (pos[1] < sizeof(struct ieee_types_header)) + if (ie_len < sizeof(struct ieee_types_header)) return; - if (pos[1] > 8) + if (ie_len > 8) return; memcpy((u8 *)&sta_ptr->tdls_cap.extcap, pos, sizeof(struct ieee_types_header) + - min_t(u8, pos[1], 8)); + min_t(u8, ie_len, 8)); break; case WLAN_EID_RSN: - if (pos > end - sizeof(struct ieee_types_header)) + if (ie_len < sizeof(struct ieee_types_header)) return; - if (pos[1] < sizeof(struct ieee_types_header)) - return; - if (pos[1] > IEEE_MAX_IE_SIZE - + if (ie_len > IEEE_MAX_IE_SIZE - sizeof(struct ieee_types_header)) return; memcpy((u8 *)&sta_ptr->tdls_cap.rsn_ie, pos, sizeof(struct ieee_types_header) + - min_t(u8, pos[1], IEEE_MAX_IE_SIZE - + min_t(u8, ie_len, IEEE_MAX_IE_SIZE - sizeof(struct ieee_types_header))); break; case WLAN_EID_QOS_CAPA: - if (pos > end - 3) - return; - if (pos[1] != 1) + if (ie_len != sizeof(pos[2])) return; sta_ptr->tdls_cap.qos_info = pos[2]; break; case WLAN_EID_VHT_OPERATION: if (priv->adapter->is_hw_11ac_capable) { - if (pos > end - - sizeof(struct ieee80211_vht_operation) - 2) - return; - if (pos[1] != + if (ie_len != sizeof(struct ieee80211_vht_operation)) return; /* copy the ie's value into vhtoper*/ @@ -1046,10 +1032,7 @@ break; case WLAN_EID_VHT_CAPABILITY: if (priv->adapter->is_hw_11ac_capable) { - if (pos > end - - sizeof(struct ieee80211_vht_cap) - 2) - return; - if (pos[1] != sizeof(struct ieee80211_vht_cap)) + if (ie_len != sizeof(struct ieee80211_vht_cap)) return; /* copy the ie's value into vhtcap*/ memcpy((u8 *)&sta_ptr->tdls_cap.vhtcap, pos + 2, @@ -1059,9 +1042,7 @@ break; case WLAN_EID_AID: if (priv->adapter->is_hw_11ac_capable) { - if (pos > end - 4) - return; - if (pos[1] != 2) + if (ie_len != sizeof(u16)) return; sta_ptr->tdls_cap.aid = get_unaligned_le16((pos + 2)); diff -Nru linux-4.19.98/drivers/net/wireless/marvell/mwifiex/wmm.c linux-4.19.118/drivers/net/wireless/marvell/mwifiex/wmm.c --- linux-4.19.98/drivers/net/wireless/marvell/mwifiex/wmm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/marvell/mwifiex/wmm.c 2020-04-23 08:30:24.000000000 +0000 @@ -977,6 +977,10 @@ "WMM Parameter Set Count: %d\n", wmm_param_ie->qos_info_bitmap & mask); + if (wmm_param_ie->vend_hdr.len + 2 > + sizeof(struct ieee_types_wmm_parameter)) + break; + memcpy((u8 *) &priv->curr_bss_params.bss_descriptor. wmm_ie, wmm_param_ie, wmm_param_ie->vend_hdr.len + 2); diff -Nru linux-4.19.98/drivers/net/wireless/mediatek/mt76/dma.c linux-4.19.118/drivers/net/wireless/mediatek/mt76/dma.c --- linux-4.19.98/drivers/net/wireless/mediatek/mt76/dma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/mediatek/mt76/dma.c 2020-04-23 08:30:24.000000000 +0000 @@ -396,10 +396,13 @@ struct page *page = virt_to_head_page(data); int offset = data - page_address(page); struct sk_buff *skb = q->rx_head; + struct skb_shared_info *shinfo = skb_shinfo(skb); - offset += q->buf_offset; - skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, offset, len, - q->buf_size); + if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) { + offset += q->buf_offset; + skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len, + q->buf_size); + } if (more) return; diff -Nru linux-4.19.98/drivers/net/wireless/mediatek/mt76/usb.c linux-4.19.118/drivers/net/wireless/mediatek/mt76/usb.c --- linux-4.19.98/drivers/net/wireless/mediatek/mt76/usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/mediatek/mt76/usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -273,10 +273,16 @@ void mt76u_buf_free(struct mt76u_buf *buf) { struct urb *urb = buf->urb; + struct scatterlist *sg; int i; - for (i = 0; i < urb->num_sgs; i++) - skb_free_frag(sg_virt(&urb->sg[i])); + for (i = 0; i < urb->num_sgs; i++) { + sg = &urb->sg[i]; + if (!sg) + continue; + + skb_free_frag(sg_virt(sg)); + } usb_free_urb(buf->urb); } EXPORT_SYMBOL_GPL(mt76u_buf_free); @@ -478,7 +484,8 @@ nsgs = 1; } - for (i = 0; i < MT_NUM_RX_ENTRIES; i++) { + q->ndesc = MT_NUM_RX_ENTRIES; + for (i = 0; i < q->ndesc; i++) { err = mt76u_buf_alloc(dev, &q->entry[i].ubuf, nsgs, q->buf_size, SKB_WITH_OVERHEAD(q->buf_size), @@ -486,7 +493,6 @@ if (err < 0) return err; } - q->ndesc = MT_NUM_RX_ENTRIES; return mt76u_submit_rx_buffers(dev); } diff -Nru linux-4.19.98/drivers/net/wireless/mediatek/mt7601u/phy.c linux-4.19.118/drivers/net/wireless/mediatek/mt7601u/phy.c --- linux-4.19.98/drivers/net/wireless/mediatek/mt7601u/phy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/mediatek/mt7601u/phy.c 2020-04-23 08:30:24.000000000 +0000 @@ -221,7 +221,7 @@ do { val = mt7601u_bbp_rr(dev, MT_BBP_REG_VERSION); - if (val && ~val) + if (val && val != 0xff) break; } while (--i); diff -Nru linux-4.19.98/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c linux-4.19.118/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c --- linux-4.19.98/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -5921,7 +5921,7 @@ u8 dir, xtype, num; int ret = 0; - host_interface = &interface->altsetting[0]; + host_interface = interface->cur_altsetting; interface_desc = &host_interface->desc; endpoints = interface_desc->bNumEndpoints; diff -Nru linux-4.19.98/drivers/net/wireless/realtek/rtlwifi/debug.c linux-4.19.118/drivers/net/wireless/realtek/rtlwifi/debug.c --- linux-4.19.98/drivers/net/wireless/realtek/rtlwifi/debug.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/realtek/rtlwifi/debug.c 2020-04-23 08:30:24.000000000 +0000 @@ -109,7 +109,7 @@ .open = dl_debug_open_common, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = single_release, }; static int rtl_debug_get_mac_page(struct seq_file *m, void *v) diff -Nru linux-4.19.98/drivers/net/wireless/realtek/rtlwifi/pci.c linux-4.19.118/drivers/net/wireless/realtek/rtlwifi/pci.c --- linux-4.19.98/drivers/net/wireless/realtek/rtlwifi/pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/realtek/rtlwifi/pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -1082,13 +1082,15 @@ return ret; } -static void _rtl_pci_irq_tasklet(struct ieee80211_hw *hw) +static void _rtl_pci_irq_tasklet(unsigned long data) { + struct ieee80211_hw *hw = (struct ieee80211_hw *)data; _rtl_pci_tx_chk_waitq(hw); } -static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) +static void _rtl_pci_prepare_bcn_tasklet(unsigned long data) { + struct ieee80211_hw *hw = (struct ieee80211_hw *)data; struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); @@ -1214,10 +1216,10 @@ /*task */ tasklet_init(&rtlpriv->works.irq_tasklet, - (void (*)(unsigned long))_rtl_pci_irq_tasklet, + _rtl_pci_irq_tasklet, (unsigned long)hw); tasklet_init(&rtlpriv->works.irq_prepare_bcn_tasklet, - (void (*)(unsigned long))_rtl_pci_prepare_bcn_tasklet, + _rtl_pci_prepare_bcn_tasklet, (unsigned long)hw); INIT_WORK(&rtlpriv->works.lps_change_work, rtl_lps_change_work_callback); diff -Nru linux-4.19.98/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c linux-4.19.118/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c --- linux-4.19.98/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c 2020-04-23 08:30:24.000000000 +0000 @@ -3404,75 +3404,6 @@ "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0)); } -static u8 _rtl8821ae_mrate_idx_to_arfr_id( - struct ieee80211_hw *hw, u8 rate_index, - enum wireless_mode wirelessmode) -{ - struct rtl_priv *rtlpriv = rtl_priv(hw); - struct rtl_phy *rtlphy = &rtlpriv->phy; - u8 ret = 0; - switch (rate_index) { - case RATR_INX_WIRELESS_NGB: - if (rtlphy->rf_type == RF_1T1R) - ret = 1; - else - ret = 0; - ; break; - case RATR_INX_WIRELESS_N: - case RATR_INX_WIRELESS_NG: - if (rtlphy->rf_type == RF_1T1R) - ret = 5; - else - ret = 4; - ; break; - case RATR_INX_WIRELESS_NB: - if (rtlphy->rf_type == RF_1T1R) - ret = 3; - else - ret = 2; - ; break; - case RATR_INX_WIRELESS_GB: - ret = 6; - break; - case RATR_INX_WIRELESS_G: - ret = 7; - break; - case RATR_INX_WIRELESS_B: - ret = 8; - break; - case RATR_INX_WIRELESS_MC: - if ((wirelessmode == WIRELESS_MODE_B) - || (wirelessmode == WIRELESS_MODE_G) - || (wirelessmode == WIRELESS_MODE_N_24G) - || (wirelessmode == WIRELESS_MODE_AC_24G)) - ret = 6; - else - ret = 7; - case RATR_INX_WIRELESS_AC_5N: - if (rtlphy->rf_type == RF_1T1R) - ret = 10; - else - ret = 9; - break; - case RATR_INX_WIRELESS_AC_24N: - if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) { - if (rtlphy->rf_type == RF_1T1R) - ret = 10; - else - ret = 9; - } else { - if (rtlphy->rf_type == RF_1T1R) - ret = 11; - else - ret = 12; - } - break; - default: - ret = 0; break; - } - return ret; -} - static u32 _rtl8821ae_rate_to_bitmap_2ssvht(__le16 vht_rate) { u8 i, j, tmp_rate; @@ -3761,7 +3692,7 @@ break; } - ratr_index = _rtl8821ae_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode); + ratr_index = rtl_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode); sta_entry->ratr_index = ratr_index; ratr_bitmap = _rtl8821ae_set_ra_vht_ratr_bitmap(hw, wirelessmode, ratr_bitmap); diff -Nru linux-4.19.98/drivers/net/wireless/rsi/rsi_91x_hal.c linux-4.19.118/drivers/net/wireless/rsi/rsi_91x_hal.c --- linux-4.19.98/drivers/net/wireless/rsi/rsi_91x_hal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/rsi/rsi_91x_hal.c 2020-04-23 08:30:24.000000000 +0000 @@ -616,6 +616,7 @@ bl_start_cmd_timer(adapter, timeout); status = bl_write_cmd(adapter, cmd, exp_resp, ®out_val); if (status < 0) { + bl_stop_cmd_timer(adapter); rsi_dbg(ERR_ZONE, "%s: Command %s (%0x) writing failed..\n", __func__, str, cmd); @@ -731,10 +732,9 @@ } status = bl_cmd(adapter, cmd_req, cmd_resp, str); - if (status) { - bl_stop_cmd_timer(adapter); + if (status) return status; - } + return 0; } @@ -822,10 +822,9 @@ status = bl_cmd(adapter, EOF_REACHED, FW_LOADING_SUCCESSFUL, "EOF_REACHED"); - if (status) { - bl_stop_cmd_timer(adapter); + if (status) return status; - } + rsi_dbg(INFO_ZONE, "FW loading is done and FW is running..\n"); return 0; } @@ -846,6 +845,7 @@ status = hif_ops->master_reg_read(adapter, SWBL_REGOUT, ®out_val, 2); if (status < 0) { + bl_stop_cmd_timer(adapter); rsi_dbg(ERR_ZONE, "%s: REGOUT read failed\n", __func__); return status; diff -Nru linux-4.19.98/drivers/net/wireless/rsi/rsi_91x_sdio.c linux-4.19.118/drivers/net/wireless/rsi/rsi_91x_sdio.c --- linux-4.19.98/drivers/net/wireless/rsi/rsi_91x_sdio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/rsi/rsi_91x_sdio.c 2020-04-23 08:30:24.000000000 +0000 @@ -1129,6 +1129,12 @@ rsi_mac80211_detach(adapter); mdelay(10); + if (IS_ENABLED(CONFIG_RSI_COEX) && adapter->priv->coex_mode > 1 && + adapter->priv->bt_adapter) { + rsi_bt_ops.detach(adapter->priv->bt_adapter); + adapter->priv->bt_adapter = NULL; + } + /* Reset Chip */ rsi_reset_chip(adapter); @@ -1305,6 +1311,12 @@ rsi_dbg(ERR_ZONE, "##### Device can not wake up through WLAN\n"); + if (IS_ENABLED(CONFIG_RSI_COEX) && common->coex_mode > 1 && + common->bt_adapter) { + rsi_bt_ops.detach(common->bt_adapter); + common->bt_adapter = NULL; + } + ret = rsi_sdio_disable_interrupts(pfunction); if (sdev->write_fail) @@ -1352,6 +1364,12 @@ if (rsi_config_wowlan(adapter, wowlan)) rsi_dbg(ERR_ZONE, "Failed to configure WoWLAN\n"); + if (IS_ENABLED(CONFIG_RSI_COEX) && adapter->priv->coex_mode > 1 && + adapter->priv->bt_adapter) { + rsi_bt_ops.detach(adapter->priv->bt_adapter); + adapter->priv->bt_adapter = NULL; + } + rsi_sdio_disable_interrupts(sdev->pfunction); if (sdev->write_fail) diff -Nru linux-4.19.98/drivers/net/wireless/rsi/rsi_91x_usb.c linux-4.19.118/drivers/net/wireless/rsi/rsi_91x_usb.c --- linux-4.19.98/drivers/net/wireless/rsi/rsi_91x_usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/rsi/rsi_91x_usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -16,6 +16,7 @@ */ #include +#include #include #include "rsi_usb.h" #include "rsi_hal.h" @@ -29,7 +30,7 @@ "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n" "6[AP + BT classic], 14[AP + BT classic + BT LE]"); -static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num); +static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t flags); /** * rsi_usb_card_write() - This function writes to the USB Card. @@ -117,7 +118,7 @@ __le16 buffer_size; int ii, bin_found = 0, bout_found = 0; - iface_desc = &(interface->altsetting[0]); + iface_desc = interface->cur_altsetting; for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) { endpoint = &(iface_desc->endpoint[ii].desc); @@ -283,20 +284,29 @@ status = 0; out: - if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num)) + if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num, GFP_ATOMIC)) rsi_dbg(ERR_ZONE, "%s: Failed in urb submission", __func__); if (status) dev_kfree_skb(rx_cb->rx_skb); } +static void rsi_rx_urb_kill(struct rsi_hw *adapter, u8 ep_num) +{ + struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; + struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; + struct urb *urb = rx_cb->rx_urb; + + usb_kill_urb(urb); +} + /** * rsi_rx_urb_submit() - This function submits the given URB to the USB stack. * @adapter: Pointer to the adapter structure. * * Return: 0 on success, a negative error code on failure. */ -static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num) +static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num, gfp_t mem_flags) { struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev; struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1]; @@ -326,9 +336,11 @@ rsi_rx_done_handler, rx_cb); - status = usb_submit_urb(urb, GFP_KERNEL); - if (status) + status = usb_submit_urb(urb, mem_flags); + if (status) { rsi_dbg(ERR_ZONE, "%s: Failed in urb submission\n", __func__); + dev_kfree_skb(skb); + } return status; } @@ -781,17 +793,20 @@ rsi_dbg(INIT_ZONE, "%s: Device Init Done\n", __func__); } - status = rsi_rx_urb_submit(adapter, WLAN_EP); + status = rsi_rx_urb_submit(adapter, WLAN_EP, GFP_KERNEL); if (status) goto err1; if (adapter->priv->coex_mode > 1) { - status = rsi_rx_urb_submit(adapter, BT_EP); + status = rsi_rx_urb_submit(adapter, BT_EP, GFP_KERNEL); if (status) - goto err1; + goto err_kill_wlan_urb; } return 0; + +err_kill_wlan_urb: + rsi_rx_urb_kill(adapter, WLAN_EP); err1: rsi_deinit_usb_interface(adapter); err: @@ -815,6 +830,17 @@ return; rsi_mac80211_detach(adapter); + + if (IS_ENABLED(CONFIG_RSI_COEX) && adapter->priv->coex_mode > 1 && + adapter->priv->bt_adapter) { + rsi_bt_ops.detach(adapter->priv->bt_adapter); + adapter->priv->bt_adapter = NULL; + } + + if (adapter->priv->coex_mode > 1) + rsi_rx_urb_kill(adapter, BT_EP); + rsi_rx_urb_kill(adapter, WLAN_EP); + rsi_reset_card(adapter); rsi_deinit_usb_interface(adapter); rsi_91x_deinit(adapter); diff -Nru linux-4.19.98/drivers/net/wireless/zydas/zd1211rw/zd_usb.c linux-4.19.118/drivers/net/wireless/zydas/zd1211rw/zd_usb.c --- linux-4.19.98/drivers/net/wireless/zydas/zd1211rw/zd_usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/net/wireless/zydas/zd1211rw/zd_usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -1275,7 +1275,7 @@ static int eject_installer(struct usb_interface *intf) { struct usb_device *udev = interface_to_usbdev(intf); - struct usb_host_interface *iface_desc = &intf->altsetting[0]; + struct usb_host_interface *iface_desc = intf->cur_altsetting; struct usb_endpoint_descriptor *endpoint; unsigned char *cmd; u8 bulk_out_ep; diff -Nru linux-4.19.98/drivers/nfc/fdp/fdp.c linux-4.19.118/drivers/nfc/fdp/fdp.c --- linux-4.19.98/drivers/nfc/fdp/fdp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nfc/fdp/fdp.c 2020-04-23 08:30:24.000000000 +0000 @@ -192,7 +192,7 @@ const struct firmware *fw; struct sk_buff *skb; unsigned long len; - u8 max_size, payload_size; + int max_size, payload_size; int rc = 0; if ((type == NCI_PATCH_TYPE_OTP && !info->otp_patch) || @@ -215,8 +215,7 @@ while (len) { - payload_size = min_t(unsigned long, (unsigned long) max_size, - len); + payload_size = min_t(unsigned long, max_size, len); skb = nci_skb_alloc(ndev, (NCI_CTRL_HDR_SIZE + payload_size), GFP_KERNEL); diff -Nru linux-4.19.98/drivers/nfc/pn544/i2c.c linux-4.19.118/drivers/nfc/pn544/i2c.c --- linux-4.19.98/drivers/nfc/pn544/i2c.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nfc/pn544/i2c.c 2020-04-23 08:30:24.000000000 +0000 @@ -236,6 +236,7 @@ out: gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity); + usleep_range(10000, 15000); } static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode) diff -Nru linux-4.19.98/drivers/nfc/pn544/pn544.c linux-4.19.118/drivers/nfc/pn544/pn544.c --- linux-4.19.98/drivers/nfc/pn544/pn544.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nfc/pn544/pn544.c 2020-04-23 08:30:24.000000000 +0000 @@ -704,7 +704,7 @@ target->nfcid1_len != 10) return -EOPNOTSUPP; - return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE, + return nfc_hci_send_cmd(hdev, NFC_HCI_RF_READER_A_GATE, PN544_RF_READER_CMD_ACTIVATE_NEXT, target->nfcid1, target->nfcid1_len, NULL); } else if (target->supported_protocols & (NFC_PROTO_JEWEL_MASK | diff -Nru linux-4.19.98/drivers/nfc/port100.c linux-4.19.118/drivers/nfc/port100.c --- linux-4.19.98/drivers/nfc/port100.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nfc/port100.c 2020-04-23 08:30:24.000000000 +0000 @@ -574,7 +574,7 @@ { struct port100_frame *frame = _frame; - frame->datalen = cpu_to_le16(le16_to_cpu(frame->datalen) + len); + le16_add_cpu(&frame->datalen, len); } static bool port100_rx_frame_is_valid(void *_frame) diff -Nru linux-4.19.98/drivers/ntb/hw/idt/ntb_hw_idt.c linux-4.19.118/drivers/ntb/hw/idt/ntb_hw_idt.c --- linux-4.19.98/drivers/ntb/hw/idt/ntb_hw_idt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ntb/hw/idt/ntb_hw_idt.c 2020-04-23 08:30:24.000000000 +0000 @@ -1105,9 +1105,9 @@ } /* Allocate memory for memory window descriptors */ - ret_mws = devm_kcalloc(&ndev->ntb.pdev->dev, *mw_cnt, - sizeof(*ret_mws), GFP_KERNEL); - if (IS_ERR_OR_NULL(ret_mws)) + ret_mws = devm_kcalloc(&ndev->ntb.pdev->dev, *mw_cnt, sizeof(*ret_mws), + GFP_KERNEL); + if (!ret_mws) return ERR_PTR(-ENOMEM); /* Copy the info of detected memory windows */ @@ -2390,7 +2390,7 @@ /* Allocate memory for the IDT PCIe-device descriptor */ ndev = devm_kzalloc(&pdev->dev, sizeof(*ndev), GFP_KERNEL); - if (IS_ERR_OR_NULL(ndev)) { + if (!ndev) { dev_err(&pdev->dev, "Memory allocation failed for descriptor"); return ERR_PTR(-ENOMEM); } diff -Nru linux-4.19.98/drivers/ntb/hw/mscc/ntb_hw_switchtec.c linux-4.19.118/drivers/ntb/hw/mscc/ntb_hw_switchtec.c --- linux-4.19.98/drivers/ntb/hw/mscc/ntb_hw_switchtec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/ntb/hw/mscc/ntb_hw_switchtec.c 2020-04-23 08:30:24.000000000 +0000 @@ -899,7 +899,7 @@ } sndev->peer_partition = ffs(tpart_vec) - 1; - if (!(part_map & (1 << sndev->peer_partition))) { + if (!(part_map & (1ULL << sndev->peer_partition))) { dev_err(&sndev->stdev->dev, "ntb target partition is not NT partition\n"); return -ENODEV; @@ -1120,7 +1120,7 @@ dev_dbg(&sndev->stdev->dev, "Crosslink BAR%d addr: %llx\n", - i, bar_addr); + i*2, bar_addr); if (bar_addr != bar_space * i) continue; diff -Nru linux-4.19.98/drivers/nvdimm/bus.c linux-4.19.118/drivers/nvdimm/bus.c --- linux-4.19.98/drivers/nvdimm/bus.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvdimm/bus.c 2020-04-23 08:30:24.000000000 +0000 @@ -984,8 +984,10 @@ return -EFAULT; } - if (!desc || (desc->out_num + desc->in_num == 0) || - !test_bit(cmd, &cmd_mask)) + if (!desc || + (desc->out_num + desc->in_num == 0) || + cmd > ND_CMD_CALL || + !test_bit(cmd, &cmd_mask)) return -ENOTTY; /* fail write commands (when read-only) */ diff -Nru linux-4.19.98/drivers/nvme/host/core.c linux-4.19.118/drivers/nvme/host/core.c --- linux-4.19.98/drivers/nvme/host/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvme/host/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -1058,8 +1058,8 @@ static int nvme_set_features(struct nvme_ctrl *dev, unsigned fid, unsigned dword11, void *buffer, size_t buflen, u32 *result) { + union nvme_result res = { 0 }; struct nvme_command c; - union nvme_result res; int ret; memset(&c, 0, sizeof(c)); @@ -2200,6 +2200,17 @@ lockdep_assert_held(&nvme_subsystems_lock); + /* + * Fail matches for discovery subsystems. This results + * in each discovery controller bound to a unique subsystem. + * This avoids issues with validating controller values + * that can only be true when there is a single unique subsystem. + * There may be multiple and completely independent entities + * that provide discovery controllers. + */ + if (!strcmp(subsysnqn, NVME_DISC_SUBSYS_NAME)) + return NULL; + list_for_each_entry(subsys, &nvme_subsystems, entry) { if (strcmp(subsys->subnqn, subsysnqn)) continue; @@ -3449,7 +3460,7 @@ if (!log) return; - if (nvme_get_log(ctrl, NVME_NSID_ALL, 0, NVME_LOG_FW_SLOT, log, + if (nvme_get_log(ctrl, NVME_NSID_ALL, NVME_LOG_FW_SLOT, 0, log, sizeof(*log), 0)) dev_warn(ctrl->device, "Get FW SLOT INFO log error\n"); kfree(log); diff -Nru linux-4.19.98/drivers/nvme/host/fc.c linux-4.19.118/drivers/nvme/host/fc.c --- linux-4.19.98/drivers/nvme/host/fc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvme/host/fc.c 2020-04-23 08:30:24.000000000 +0000 @@ -342,8 +342,7 @@ !template->ls_req || !template->fcp_io || !template->ls_abort || !template->fcp_abort || !template->max_hw_queues || !template->max_sgl_segments || - !template->max_dif_sgl_segments || !template->dma_boundary || - !template->module) { + !template->max_dif_sgl_segments || !template->dma_boundary) { ret = -EINVAL; goto out_reghost_failed; } @@ -1987,7 +1986,6 @@ { struct nvme_fc_ctrl *ctrl = container_of(ref, struct nvme_fc_ctrl, ref); - struct nvme_fc_lport *lport = ctrl->lport; unsigned long flags; if (ctrl->ctrl.tagset) { @@ -2013,7 +2011,6 @@ if (ctrl->ctrl.opts) nvmf_free_options(ctrl->ctrl.opts); kfree(ctrl); - module_put(lport->ops->module); } static void @@ -3055,15 +3052,10 @@ goto out_fail; } - if (!try_module_get(lport->ops->module)) { - ret = -EUNATCH; - goto out_free_ctrl; - } - idx = ida_simple_get(&nvme_fc_ctrl_cnt, 0, 0, GFP_KERNEL); if (idx < 0) { ret = -ENOSPC; - goto out_mod_put; + goto out_free_ctrl; } ctrl->ctrl.opts = opts; @@ -3205,8 +3197,6 @@ out_free_ida: put_device(ctrl->dev); ida_simple_remove(&nvme_fc_ctrl_cnt, ctrl->cnum); -out_mod_put: - module_put(lport->ops->module); out_free_ctrl: kfree(ctrl); out_fail: diff -Nru linux-4.19.98/drivers/nvme/host/multipath.c linux-4.19.118/drivers/nvme/host/multipath.c --- linux-4.19.98/drivers/nvme/host/multipath.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvme/host/multipath.c 2020-04-23 08:30:24.000000000 +0000 @@ -569,6 +569,7 @@ } INIT_WORK(&ctrl->ana_work, nvme_ana_work); + kfree(ctrl->ana_log_buf); ctrl->ana_log_buf = kmalloc(ctrl->ana_log_size, GFP_KERNEL); if (!ctrl->ana_log_buf) { error = -ENOMEM; diff -Nru linux-4.19.98/drivers/nvme/host/pci.c linux-4.19.118/drivers/nvme/host/pci.c --- linux-4.19.98/drivers/nvme/host/pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvme/host/pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -2396,7 +2396,7 @@ static int nvme_pci_reg_read64(struct nvme_ctrl *ctrl, u32 off, u64 *val) { - *val = readq(to_nvme_dev(ctrl)->bar + off); + *val = lo_hi_readq(to_nvme_dev(ctrl)->bar + off); return 0; } diff -Nru linux-4.19.98/drivers/nvme/host/rdma.c linux-4.19.118/drivers/nvme/host/rdma.c --- linux-4.19.98/drivers/nvme/host/rdma.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvme/host/rdma.c 2020-04-23 08:30:24.000000000 +0000 @@ -815,9 +815,11 @@ if (new) nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.admin_tagset); out_free_async_qe: - nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, - sizeof(struct nvme_command), DMA_TO_DEVICE); - ctrl->async_event_sqe.data = NULL; + if (ctrl->async_event_sqe.data) { + nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe, + sizeof(struct nvme_command), DMA_TO_DEVICE); + ctrl->async_event_sqe.data = NULL; + } out_free_queue: nvme_rdma_free_queue(&ctrl->queues[0]); return error; diff -Nru linux-4.19.98/drivers/nvme/target/fcloop.c linux-4.19.118/drivers/nvme/target/fcloop.c --- linux-4.19.98/drivers/nvme/target/fcloop.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvme/target/fcloop.c 2020-04-23 08:30:24.000000000 +0000 @@ -825,7 +825,6 @@ #define FCLOOP_DMABOUND_4G 0xFFFFFFFF static struct nvme_fc_port_template fctemplate = { - .module = THIS_MODULE, .localport_delete = fcloop_localport_delete, .remoteport_delete = fcloop_remoteport_delete, .create_queue = fcloop_create_queue, diff -Nru linux-4.19.98/drivers/nvmem/imx-ocotp.c linux-4.19.118/drivers/nvmem/imx-ocotp.c --- linux-4.19.98/drivers/nvmem/imx-ocotp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/nvmem/imx-ocotp.c 2020-04-23 08:30:24.000000000 +0000 @@ -50,7 +50,9 @@ #define IMX_OCOTP_BM_CTRL_ERROR 0x00000200 #define IMX_OCOTP_BM_CTRL_REL_SHADOWS 0x00000400 -#define DEF_RELAX 20 /* > 16.5ns */ +#define TIMING_STROBE_PROG_US 10 /* Min time to blow a fuse */ +#define TIMING_STROBE_READ_NS 37 /* Min time before read */ +#define TIMING_RELAX_NS 17 #define DEF_FSOURCE 1001 /* > 1000 ns */ #define DEF_STROBE_PROG 10000 /* IPG clocks */ #define IMX_OCOTP_WR_UNLOCK 0x3E770000 @@ -182,14 +184,41 @@ * fields with timing values to match the current frequency of the * ipg_clk. OTP writes will work at maximum bus frequencies as long * as the HW_OCOTP_TIMING parameters are set correctly. + * + * Note: there are minimum timings required to ensure an OTP fuse burns + * correctly that are independent of the ipg_clk. Those values are not + * formally documented anywhere however, working from the minimum + * timings given in u-boot we can say: + * + * - Minimum STROBE_PROG time is 10 microseconds. Intuitively 10 + * microseconds feels about right as representative of a minimum time + * to physically burn out a fuse. + * + * - Minimum STROBE_READ i.e. the time to wait post OTP fuse burn before + * performing another read is 37 nanoseconds + * + * - Minimum RELAX timing is 17 nanoseconds. This final RELAX minimum + * timing is not entirely clear the documentation says "This + * count value specifies the time to add to all default timing + * parameters other than the Tpgm and Trd. It is given in number + * of ipg_clk periods." where Tpgm and Trd refer to STROBE_PROG + * and STROBE_READ respectively. What the other timing parameters + * are though, is not specified. Experience shows a zero RELAX + * value will mess up a re-load of the shadow registers post OTP + * burn. */ clk_rate = clk_get_rate(priv->clk); - relax = clk_rate / (1000000000 / DEF_RELAX) - 1; - strobe_prog = clk_rate / (1000000000 / 10000) + 2 * (DEF_RELAX + 1) - 1; - strobe_read = clk_rate / (1000000000 / 40) + 2 * (DEF_RELAX + 1) - 1; + relax = DIV_ROUND_UP(clk_rate * TIMING_RELAX_NS, 1000000000) - 1; + strobe_read = DIV_ROUND_UP(clk_rate * TIMING_STROBE_READ_NS, + 1000000000); + strobe_read += 2 * (relax + 1) - 1; + strobe_prog = DIV_ROUND_CLOSEST(clk_rate * TIMING_STROBE_PROG_US, + 1000000); + strobe_prog += 2 * (relax + 1) - 1; - timing = strobe_prog & 0x00000FFF; + timing = readl(priv->base + IMX_OCOTP_ADDR_TIMING) & 0x0FC00000; + timing |= strobe_prog & 0x00000FFF; timing |= (relax << 12) & 0x0000F000; timing |= (strobe_read << 16) & 0x003F0000; diff -Nru linux-4.19.98/drivers/of/Kconfig linux-4.19.118/drivers/of/Kconfig --- linux-4.19.98/drivers/of/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/of/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -103,4 +103,8 @@ config OF_NUMA bool +config OF_DMA_DEFAULT_COHERENT + # arches should select this if DMA is coherent by default for OF devices + bool + endif # OF diff -Nru linux-4.19.98/drivers/of/address.c linux-4.19.118/drivers/of/address.c --- linux-4.19.98/drivers/of/address.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/of/address.c 2020-04-23 08:30:24.000000000 +0000 @@ -970,12 +970,16 @@ * @np: device node * * It returns true if "dma-coherent" property was found - * for this device in DT. + * for this device in the DT, or if DMA is coherent by + * default for OF devices on the current platform. */ bool of_dma_is_coherent(struct device_node *np) { struct device_node *node = of_node_get(np); + if (IS_ENABLED(CONFIG_OF_DMA_DEFAULT_COHERENT)) + return true; + while (node) { if (of_property_read_bool(node, "dma-coherent")) { of_node_put(node); diff -Nru linux-4.19.98/drivers/of/of_mdio.c linux-4.19.118/drivers/of/of_mdio.c --- linux-4.19.98/drivers/of/of_mdio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/of/of_mdio.c 2020-04-23 08:30:24.000000000 +0000 @@ -270,6 +270,7 @@ rc = of_mdiobus_register_phy(mdio, child, addr); if (rc && rc != -ENODEV) goto unregister; + break; } } } @@ -370,7 +371,7 @@ int ret; iface = of_get_phy_mode(np); - if (iface < 0) + if ((int)iface < 0) return NULL; if (of_phy_is_fixed_link(np)) { ret = of_phy_register_fixed_link(np); diff -Nru linux-4.19.98/drivers/of/overlay.c linux-4.19.118/drivers/of/overlay.c --- linux-4.19.98/drivers/of/overlay.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/of/overlay.c 2020-04-23 08:30:24.000000000 +0000 @@ -261,6 +261,8 @@ of_property_set_flag(new_prop, OF_DYNAMIC); + kfree(target_path); + return new_prop; err_free_new_prop: diff -Nru linux-4.19.98/drivers/of/unittest.c linux-4.19.118/drivers/of/unittest.c --- linux-4.19.98/drivers/of/unittest.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/of/unittest.c 2020-04-23 08:30:24.000000000 +0000 @@ -772,6 +772,10 @@ unittest(!of_changeset_revert(&chgset), "revert failed\n"); of_changeset_destroy(&chgset); + + of_node_put(n1); + of_node_put(n2); + of_node_put(n21); #endif } @@ -1055,10 +1059,13 @@ of_platform_populate(np, match, NULL, &test_bus->dev); for_each_child_of_node(np, child) { - for_each_child_of_node(child, grandchild) - unittest(of_find_device_by_node(grandchild), + for_each_child_of_node(child, grandchild) { + pdev = of_find_device_by_node(grandchild); + unittest(pdev, "Could not create device for node '%pOFn'\n", grandchild); + of_dev_put(pdev); + } } of_platform_depopulate(&test_bus->dev); @@ -2441,8 +2448,11 @@ goto err_unlock; } if (__of_add_property(of_symbols, new_prop)) { + kfree(new_prop->name); + kfree(new_prop->value); + kfree(new_prop); /* "name" auto-generated by unflatten */ - if (!strcmp(new_prop->name, "name")) + if (!strcmp(prop->name, "name")) continue; unittest(0, "duplicate property '%s' in overlay_base node __symbols__", prop->name); diff -Nru linux-4.19.98/drivers/opp/core.c linux-4.19.118/drivers/opp/core.c --- linux-4.19.98/drivers/opp/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/opp/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -793,6 +793,9 @@ INIT_LIST_HEAD(&opp_table->dev_list); + /* Mark regulator count uninitialized */ + opp_table->regulator_count = -1; + opp_dev = _add_opp_dev(dev, opp_table); if (!opp_dev) { kfree(opp_table); @@ -955,7 +958,7 @@ int count, supply_size; /* Allocate space for at least one supply */ - count = table->regulator_count ? table->regulator_count : 1; + count = table->regulator_count > 0 ? table->regulator_count : 1; supply_size = sizeof(*opp->supplies) * count; /* allocate new OPP node and supplies structures */ @@ -1363,7 +1366,7 @@ kfree(opp_table->regulators); opp_table->regulators = NULL; - opp_table->regulator_count = 0; + opp_table->regulator_count = -1; err: dev_pm_opp_put_opp_table(opp_table); @@ -1392,7 +1395,7 @@ kfree(opp_table->regulators); opp_table->regulators = NULL; - opp_table->regulator_count = 0; + opp_table->regulator_count = -1; put_opp_table: dev_pm_opp_put_opp_table(opp_table); @@ -1545,6 +1548,9 @@ if (!opp_table) return -ENOMEM; + /* Fix regulator count for dynamic OPPs */ + opp_table->regulator_count = 1; + ret = _opp_add_v1(opp_table, dev, freq, u_volt, true); dev_pm_opp_put_opp_table(opp_table); diff -Nru linux-4.19.98/drivers/opp/of.c linux-4.19.118/drivers/opp/of.c --- linux-4.19.98/drivers/opp/of.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/opp/of.c 2020-04-23 08:30:24.000000000 +0000 @@ -113,12 +113,10 @@ struct opp_table *opp_table) { u32 *microvolt, *microamp = NULL; - int supplies, vcount, icount, ret, i, j; + int supplies = opp_table->regulator_count, vcount, icount, ret, i, j; struct property *prop = NULL; char name[NAME_MAX]; - supplies = opp_table->regulator_count ? opp_table->regulator_count : 1; - /* Search for "opp-microvolt-" */ if (opp_table->prop_name) { snprintf(name, sizeof(name), "opp-microvolt-%s", @@ -133,7 +131,13 @@ /* Missing property isn't a problem, but an invalid entry is */ if (!prop) { - if (!opp_table->regulator_count) + if (unlikely(supplies == -1)) { + /* Initialize regulator_count */ + opp_table->regulator_count = 0; + return 0; + } + + if (!supplies) return 0; dev_err(dev, "%s: opp-microvolt missing although OPP managing regulators\n", @@ -142,6 +146,14 @@ } } + if (unlikely(supplies == -1)) { + /* Initialize regulator_count */ + supplies = opp_table->regulator_count = 1; + } else if (unlikely(!supplies)) { + dev_err(dev, "%s: opp-microvolt wasn't expected\n", __func__); + return -EINVAL; + } + vcount = of_property_count_u32_elems(opp->np, name); if (vcount < 0) { dev_err(dev, "%s: Invalid %s property (%d)\n", diff -Nru linux-4.19.98/drivers/opp/opp.h linux-4.19.118/drivers/opp/opp.h --- linux-4.19.98/drivers/opp/opp.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/opp/opp.h 2020-04-23 08:30:24.000000000 +0000 @@ -136,7 +136,9 @@ * @prop_name: A name to postfix to many DT properties, while parsing them. * @clk: Device's clock handle * @regulators: Supply regulators - * @regulator_count: Number of power supply regulators + * @regulator_count: Number of power supply regulators. Its value can be -1 + * (uninitialized), 0 (no opp-microvolt property) or > 0 (has opp-microvolt + * property). * @genpd_performance_state: Device's power domain support performance state. * @set_opp: Platform specific set_opp callback * @set_opp_data: Data to be passed to set_opp callback @@ -172,7 +174,7 @@ const char *prop_name; struct clk *clk; struct regulator **regulators; - unsigned int regulator_count; + int regulator_count; bool genpd_performance_state; int (*set_opp)(struct dev_pm_set_opp_data *data); diff -Nru linux-4.19.98/drivers/pci/controller/dwc/pci-keystone-dw.c linux-4.19.118/drivers/pci/controller/dwc/pci-keystone-dw.c --- linux-4.19.98/drivers/pci/controller/dwc/pci-keystone-dw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/controller/dwc/pci-keystone-dw.c 2020-04-23 08:30:24.000000000 +0000 @@ -425,7 +425,7 @@ /* Disable Link training */ val = ks_dw_app_readl(ks_pcie, CMD_STATUS); val &= ~LTSSM_EN_VAL; - ks_dw_app_writel(ks_pcie, CMD_STATUS, LTSSM_EN_VAL | val); + ks_dw_app_writel(ks_pcie, CMD_STATUS, val); /* Initiate Link Training */ val = ks_dw_app_readl(ks_pcie, CMD_STATUS); diff -Nru linux-4.19.98/drivers/pci/controller/dwc/pcie-designware-ep.c linux-4.19.118/drivers/pci/controller/dwc/pcie-designware-ep.c --- linux-4.19.98/drivers/pci/controller/dwc/pcie-designware-ep.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/controller/dwc/pcie-designware-ep.c 2020-04-23 08:30:24.000000000 +0000 @@ -46,16 +46,19 @@ u8 cap_id, next_cap_ptr; u16 reg; + if (!cap_ptr) + return 0; + reg = dw_pcie_readw_dbi(pci, cap_ptr); - next_cap_ptr = (reg & 0xff00) >> 8; cap_id = (reg & 0x00ff); - if (!next_cap_ptr || cap_id > PCI_CAP_ID_MAX) + if (cap_id > PCI_CAP_ID_MAX) return 0; if (cap_id == cap) return cap_ptr; + next_cap_ptr = (reg & 0xff00) >> 8; return __dw_pcie_ep_find_next_cap(pci, next_cap_ptr, cap); } @@ -67,9 +70,6 @@ reg = dw_pcie_readw_dbi(pci, PCI_CAPABILITY_LIST); next_cap_ptr = (reg & 0x00ff); - if (!next_cap_ptr) - return 0; - return __dw_pcie_ep_find_next_cap(pci, next_cap_ptr, cap); } diff -Nru linux-4.19.98/drivers/pci/controller/pci-tegra.c linux-4.19.118/drivers/pci/controller/pci-tegra.c --- linux-4.19.98/drivers/pci/controller/pci-tegra.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/controller/pci-tegra.c 2020-04-23 08:30:24.000000000 +0000 @@ -2398,7 +2398,7 @@ pm_runtime_enable(pcie->dev); err = pm_runtime_get_sync(pcie->dev); - if (err) { + if (err < 0) { dev_err(dev, "fail to enable pcie controller: %d\n", err); goto teardown_msi; } diff -Nru linux-4.19.98/drivers/pci/controller/pcie-iproc.c linux-4.19.118/drivers/pci/controller/pcie-iproc.c --- linux-4.19.98/drivers/pci/controller/pcie-iproc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/controller/pcie-iproc.c 2020-04-23 08:30:24.000000000 +0000 @@ -630,14 +630,6 @@ return (pcie->base + offset); } - /* - * PAXC is connected to an internally emulated EP within the SoC. It - * allows only one device. - */ - if (pcie->ep_is_internal) - if (slot > 0) - return NULL; - return iproc_pcie_map_ep_cfg_reg(pcie, busno, slot, fn, where); } @@ -1355,7 +1347,6 @@ break; case IPROC_PCIE_PAXB: regs = iproc_pcie_reg_paxb; - pcie->iproc_cfg_read = true; pcie->has_apb_err_disable = true; if (pcie->need_ob_cfg) { pcie->ob_map = paxb_ob_map; @@ -1364,6 +1355,7 @@ break; case IPROC_PCIE_PAXB_V2: regs = iproc_pcie_reg_paxb_v2; + pcie->iproc_cfg_read = true; pcie->has_apb_err_disable = true; if (pcie->need_ob_cfg) { pcie->ob_map = paxb_v2_ob_map; @@ -1534,6 +1526,30 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd804, quirk_paxc_disable_msi_parsing); +static void quirk_paxc_bridge(struct pci_dev *pdev) +{ + /* + * The PCI config space is shared with the PAXC root port and the first + * Ethernet device. So, we need to workaround this by telling the PCI + * code that the bridge is not an Ethernet device. + */ + if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE) + pdev->class = PCI_CLASS_BRIDGE_PCI << 8; + + /* + * MPSS is not being set properly (as it is currently 0). This is + * because that area of the PCI config space is hard coded to zero, and + * is not modifiable by firmware. Set this to 2 (e.g., 512 byte MPS) + * so that the MPS can be set to the real max value. + */ + pdev->pcie_mpss = 2; +} +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x16cd, quirk_paxc_bridge); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x16f0, quirk_paxc_bridge); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd750, quirk_paxc_bridge); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd802, quirk_paxc_bridge); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd804, quirk_paxc_bridge); + MODULE_AUTHOR("Ray Jui "); MODULE_DESCRIPTION("Broadcom iPROC PCIe common driver"); MODULE_LICENSE("GPL v2"); diff -Nru linux-4.19.98/drivers/pci/controller/pcie-mobiveil.c linux-4.19.118/drivers/pci/controller/pcie-mobiveil.c --- linux-4.19.98/drivers/pci/controller/pcie-mobiveil.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/controller/pcie-mobiveil.c 2020-04-23 08:30:24.000000000 +0000 @@ -174,7 +174,7 @@ * Do not read more than one device on the bus directly * attached to RC */ - if ((bus->primary == pcie->root_bus_nr) && (devfn > 0)) + if ((bus->primary == pcie->root_bus_nr) && (PCI_SLOT(devfn) > 0)) return false; return true; @@ -395,7 +395,7 @@ int amap_ctrl_dw; u64 size64 = ~(size - 1); - if ((pcie->ib_wins_configured + 1) > pcie->ppio_wins) { + if (win_num >= pcie->ppio_wins) { dev_err(&pcie->pdev->dev, "ERROR: max inbound windows reached !\n"); return; @@ -429,7 +429,7 @@ u32 value, type; u64 size64 = ~(size - 1); - if ((pcie->ob_wins_configured + 1) > pcie->apio_wins) { + if (win_num >= pcie->apio_wins) { dev_err(&pcie->pdev->dev, "ERROR: max outbound windows reached !\n"); return; @@ -643,7 +643,7 @@ static struct msi_domain_info mobiveil_msi_domain_info = { .flags = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | - MSI_FLAG_MULTI_PCI_MSI | MSI_FLAG_PCI_MSIX), + MSI_FLAG_PCI_MSIX), .chip = &mobiveil_msi_irq_chip, }; diff -Nru linux-4.19.98/drivers/pci/controller/pcie-rockchip-ep.c linux-4.19.118/drivers/pci/controller/pcie-rockchip-ep.c --- linux-4.19.98/drivers/pci/controller/pcie-rockchip-ep.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/controller/pcie-rockchip-ep.c 2020-04-23 08:30:24.000000000 +0000 @@ -350,7 +350,7 @@ struct rockchip_pcie *rockchip = &ep->rockchip; u32 r = ep->max_regions - 1; u32 offset; - u16 status; + u32 status; u8 msg_code; if (unlikely(ep->irq_pci_addr != ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR || diff -Nru linux-4.19.98/drivers/pci/endpoint/functions/pci-epf-test.c linux-4.19.118/drivers/pci/endpoint/functions/pci-epf-test.c --- linux-4.19.98/drivers/pci/endpoint/functions/pci-epf-test.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/endpoint/functions/pci-epf-test.c 2020-04-23 08:30:24.000000000 +0000 @@ -175,7 +175,7 @@ goto err_map_addr; } - memcpy(buf, src_addr, reg->size); + memcpy_fromio(buf, src_addr, reg->size); crc32 = crc32_le(~0, buf, reg->size); if (crc32 != reg->checksum) @@ -230,7 +230,7 @@ get_random_bytes(buf, reg->size); reg->checksum = crc32_le(~0, buf, reg->size); - memcpy(dst_addr, buf, reg->size); + memcpy_toio(dst_addr, buf, reg->size); /* * wait 1ms inorder for the write to complete. Without this delay L3 diff -Nru linux-4.19.98/drivers/pci/endpoint/pci-epc-mem.c linux-4.19.118/drivers/pci/endpoint/pci-epc-mem.c --- linux-4.19.98/drivers/pci/endpoint/pci-epc-mem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/endpoint/pci-epc-mem.c 2020-04-23 08:30:24.000000000 +0000 @@ -79,6 +79,7 @@ mem->page_size = page_size; mem->pages = pages; mem->size = size; + mutex_init(&mem->lock); epc->mem = mem; @@ -122,7 +123,7 @@ phys_addr_t *phys_addr, size_t size) { int pageno; - void __iomem *virt_addr; + void __iomem *virt_addr = NULL; struct pci_epc_mem *mem = epc->mem; unsigned int page_shift = ilog2(mem->page_size); int order; @@ -130,15 +131,18 @@ size = ALIGN(size, mem->page_size); order = pci_epc_mem_get_order(mem, size); + mutex_lock(&mem->lock); pageno = bitmap_find_free_region(mem->bitmap, mem->pages, order); if (pageno < 0) - return NULL; + goto ret; *phys_addr = mem->phys_base + (pageno << page_shift); virt_addr = ioremap(*phys_addr, size); if (!virt_addr) bitmap_release_region(mem->bitmap, pageno, order); +ret: + mutex_unlock(&mem->lock); return virt_addr; } EXPORT_SYMBOL_GPL(pci_epc_mem_alloc_addr); @@ -164,7 +168,9 @@ pageno = (phys_addr - mem->phys_base) >> page_shift; size = ALIGN(size, mem->page_size); order = pci_epc_mem_get_order(mem, size); + mutex_lock(&mem->lock); bitmap_release_region(mem->bitmap, pageno, order); + mutex_unlock(&mem->lock); } EXPORT_SYMBOL_GPL(pci_epc_mem_free_addr); diff -Nru linux-4.19.98/drivers/pci/hotplug/pciehp_hpc.c linux-4.19.118/drivers/pci/hotplug/pciehp_hpc.c --- linux-4.19.98/drivers/pci/hotplug/pciehp_hpc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/hotplug/pciehp_hpc.c 2020-04-23 08:30:24.000000000 +0000 @@ -627,17 +627,15 @@ if (atomic_fetch_and(~RERUN_ISR, &ctrl->pending_events) & RERUN_ISR) { ret = pciehp_isr(irq, dev_id); enable_irq(irq); - if (ret != IRQ_WAKE_THREAD) { - pci_config_pm_runtime_put(pdev); - return ret; - } + if (ret != IRQ_WAKE_THREAD) + goto out; } synchronize_hardirq(irq); events = atomic_xchg(&ctrl->pending_events, 0); if (!events) { - pci_config_pm_runtime_put(pdev); - return IRQ_NONE; + ret = IRQ_NONE; + goto out; } /* Check Attention Button Pressed */ @@ -666,10 +664,12 @@ pciehp_handle_presence_or_link_change(slot, events); up_read(&ctrl->reset_lock); + ret = IRQ_HANDLED; +out: pci_config_pm_runtime_put(pdev); ctrl->ist_running = false; wake_up(&ctrl->requester); - return IRQ_HANDLED; + return ret; } static int pciehp_poll(void *data) diff -Nru linux-4.19.98/drivers/pci/iov.c linux-4.19.118/drivers/pci/iov.c --- linux-4.19.98/drivers/pci/iov.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/iov.c 2020-04-23 08:30:24.000000000 +0000 @@ -188,10 +188,10 @@ sprintf(buf, "virtfn%u", id); rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf); if (rc) - goto failed2; + goto failed1; rc = sysfs_create_link(&virtfn->dev.kobj, &dev->dev.kobj, "physfn"); if (rc) - goto failed3; + goto failed2; kobject_uevent(&virtfn->dev.kobj, KOBJ_CHANGE); @@ -199,11 +199,10 @@ return 0; -failed3: - sysfs_remove_link(&dev->dev.kobj, buf); failed2: - pci_stop_and_remove_bus_device(virtfn); + sysfs_remove_link(&dev->dev.kobj, buf); failed1: + pci_stop_and_remove_bus_device(virtfn); pci_dev_put(dev); failed0: virtfn_remove_bus(dev->bus, bus); diff -Nru linux-4.19.98/drivers/pci/pci-driver.c linux-4.19.118/drivers/pci/pci-driver.c --- linux-4.19.98/drivers/pci/pci-driver.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/pci-driver.c 2020-04-23 08:30:24.000000000 +0000 @@ -959,15 +959,15 @@ } /* - * This used to be done in pci_pm_prepare() for all devices and some - * drivers may depend on it, so do it here. Ideally, runtime-suspended - * devices should not be touched during freeze/thaw transitions, - * however. + * Resume all runtime-suspended devices before creating a snapshot + * image of system memory, because the restore kernel generally cannot + * be expected to always handle them consistently and they need to be + * put into the runtime-active metastate during system resume anyway, + * so it is better to ensure that the state saved in the image will be + * always consistent with that. */ - if (!dev_pm_smart_suspend_and_suspended(dev)) { - pm_runtime_resume(dev); - pci_dev->state_saved = false; - } + pm_runtime_resume(dev); + pci_dev->state_saved = false; if (pm->freeze) { int error; diff -Nru linux-4.19.98/drivers/pci/pci.c linux-4.19.118/drivers/pci/pci.c --- linux-4.19.98/drivers/pci/pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -5039,39 +5039,42 @@ return 0; } -/* Save and disable devices from the top of the tree down */ -static void pci_bus_save_and_disable(struct pci_bus *bus) +/* + * Save and disable devices from the top of the tree down while holding + * the @dev mutex lock for the entire tree. + */ +static void pci_bus_save_and_disable_locked(struct pci_bus *bus) { struct pci_dev *dev; list_for_each_entry(dev, &bus->devices, bus_list) { - pci_dev_lock(dev); pci_dev_save_and_disable(dev); - pci_dev_unlock(dev); if (dev->subordinate) - pci_bus_save_and_disable(dev->subordinate); + pci_bus_save_and_disable_locked(dev->subordinate); } } /* - * Restore devices from top of the tree down - parent bridges need to be - * restored before we can get to subordinate devices. + * Restore devices from top of the tree down while holding @dev mutex lock + * for the entire tree. Parent bridges need to be restored before we can + * get to subordinate devices. */ -static void pci_bus_restore(struct pci_bus *bus) +static void pci_bus_restore_locked(struct pci_bus *bus) { struct pci_dev *dev; list_for_each_entry(dev, &bus->devices, bus_list) { - pci_dev_lock(dev); pci_dev_restore(dev); - pci_dev_unlock(dev); if (dev->subordinate) - pci_bus_restore(dev->subordinate); + pci_bus_restore_locked(dev->subordinate); } } -/* Save and disable devices from the top of the tree down */ -static void pci_slot_save_and_disable(struct pci_slot *slot) +/* + * Save and disable devices from the top of the tree down while holding + * the @dev mutex lock for the entire tree. + */ +static void pci_slot_save_and_disable_locked(struct pci_slot *slot) { struct pci_dev *dev; @@ -5080,26 +5083,25 @@ continue; pci_dev_save_and_disable(dev); if (dev->subordinate) - pci_bus_save_and_disable(dev->subordinate); + pci_bus_save_and_disable_locked(dev->subordinate); } } /* - * Restore devices from top of the tree down - parent bridges need to be - * restored before we can get to subordinate devices. + * Restore devices from top of the tree down while holding @dev mutex lock + * for the entire tree. Parent bridges need to be restored before we can + * get to subordinate devices. */ -static void pci_slot_restore(struct pci_slot *slot) +static void pci_slot_restore_locked(struct pci_slot *slot) { struct pci_dev *dev; list_for_each_entry(dev, &slot->bus->devices, bus_list) { if (!dev->slot || dev->slot != slot) continue; - pci_dev_lock(dev); pci_dev_restore(dev); - pci_dev_unlock(dev); if (dev->subordinate) - pci_bus_restore(dev->subordinate); + pci_bus_restore_locked(dev->subordinate); } } @@ -5158,17 +5160,15 @@ if (rc) return rc; - pci_slot_save_and_disable(slot); - if (pci_slot_trylock(slot)) { + pci_slot_save_and_disable_locked(slot); might_sleep(); rc = pci_reset_hotplug_slot(slot->hotplug, 0); + pci_slot_restore_locked(slot); pci_slot_unlock(slot); } else rc = -EAGAIN; - pci_slot_restore(slot); - return rc; } @@ -5254,17 +5254,15 @@ if (rc) return rc; - pci_bus_save_and_disable(bus); - if (pci_bus_trylock(bus)) { + pci_bus_save_and_disable_locked(bus); might_sleep(); rc = pci_bridge_secondary_bus_reset(bus->self); + pci_bus_restore_locked(bus); pci_bus_unlock(bus); } else rc = -EAGAIN; - pci_bus_restore(bus); - return rc; } diff -Nru linux-4.19.98/drivers/pci/pcie/aspm.c linux-4.19.118/drivers/pci/pcie/aspm.c --- linux-4.19.98/drivers/pci/pcie/aspm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/pcie/aspm.c 2020-04-23 08:30:24.000000000 +0000 @@ -747,9 +747,9 @@ /* Enable what we need to enable */ pci_clear_and_set_dword(parent, up_cap_ptr + PCI_L1SS_CTL1, - PCI_L1SS_CAP_L1_PM_SS, val); + PCI_L1SS_CTL1_L1SS_MASK, val); pci_clear_and_set_dword(child, dw_cap_ptr + PCI_L1SS_CTL1, - PCI_L1SS_CAP_L1_PM_SS, val); + PCI_L1SS_CTL1_L1SS_MASK, val); } static void pcie_config_aspm_dev(struct pci_dev *pdev, u32 val) diff -Nru linux-4.19.98/drivers/pci/quirks.c linux-4.19.118/drivers/pci/quirks.c --- linux-4.19.98/drivers/pci/quirks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/quirks.c 2020-04-23 08:30:24.000000000 +0000 @@ -1848,19 +1848,40 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); +static void quirk_d3hot_delay(struct pci_dev *dev, unsigned int delay) +{ + if (dev->d3_delay >= delay) + return; + + dev->d3_delay = delay; + pci_info(dev, "extending delay after power-on from D3hot to %d msec\n", + dev->d3_delay); +} + static void quirk_radeon_pm(struct pci_dev *dev) { if (dev->subsystem_vendor == PCI_VENDOR_ID_APPLE && - dev->subsystem_device == 0x00e2) { - if (dev->d3_delay < 20) { - dev->d3_delay = 20; - pci_info(dev, "extending delay after power-on from D3 to %d msec\n", - dev->d3_delay); - } - } + dev->subsystem_device == 0x00e2) + quirk_d3hot_delay(dev, 20); } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6741, quirk_radeon_pm); +/* + * Ryzen5/7 XHCI controllers fail upon resume from runtime suspend or s2idle. + * https://bugzilla.kernel.org/show_bug.cgi?id=205587 + * + * The kernel attempts to transition these devices to D3cold, but that seems + * to be ineffective on the platforms in question; the PCI device appears to + * remain on in D3hot state. The D3hot-to-D0 transition then requires an + * extended delay in order to succeed. + */ +static void quirk_ryzen_xhci_d3hot(struct pci_dev *dev) +{ + quirk_d3hot_delay(dev, 20); +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e0, quirk_ryzen_xhci_d3hot); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, 0x15e1, quirk_ryzen_xhci_d3hot); + #ifdef CONFIG_X86_IO_APIC static int dmi_disable_ioapicreroute(const struct dmi_system_id *d) { @@ -1926,26 +1947,92 @@ /* * IO-APIC1 on 6300ESB generates boot interrupts, see Intel order no * 300641-004US, section 5.7.3. + * + * Core IO on Xeon E5 1600/2600/4600, see Intel order no 326509-003. + * Core IO on Xeon E5 v2, see Intel order no 329188-003. + * Core IO on Xeon E7 v2, see Intel order no 329595-002. + * Core IO on Xeon E5 v3, see Intel order no 330784-003. + * Core IO on Xeon E7 v3, see Intel order no 332315-001US. + * Core IO on Xeon E5 v4, see Intel order no 333810-002US. + * Core IO on Xeon E7 v4, see Intel order no 332315-001US. + * Core IO on Xeon D-1500, see Intel order no 332051-001. + * Core IO on Xeon Scalable, see Intel order no 610950. */ -#define INTEL_6300_IOAPIC_ABAR 0x40 +#define INTEL_6300_IOAPIC_ABAR 0x40 /* Bus 0, Dev 29, Func 5 */ #define INTEL_6300_DISABLE_BOOT_IRQ (1<<14) +#define INTEL_CIPINTRC_CFG_OFFSET 0x14C /* Bus 0, Dev 5, Func 0 */ +#define INTEL_CIPINTRC_DIS_INTX_ICH (1<<25) + static void quirk_disable_intel_boot_interrupt(struct pci_dev *dev) { u16 pci_config_word; + u32 pci_config_dword; if (noioapicquirk) return; - pci_read_config_word(dev, INTEL_6300_IOAPIC_ABAR, &pci_config_word); - pci_config_word |= INTEL_6300_DISABLE_BOOT_IRQ; - pci_write_config_word(dev, INTEL_6300_IOAPIC_ABAR, pci_config_word); - + switch (dev->device) { + case PCI_DEVICE_ID_INTEL_ESB_10: + pci_read_config_word(dev, INTEL_6300_IOAPIC_ABAR, + &pci_config_word); + pci_config_word |= INTEL_6300_DISABLE_BOOT_IRQ; + pci_write_config_word(dev, INTEL_6300_IOAPIC_ABAR, + pci_config_word); + break; + case 0x3c28: /* Xeon E5 1600/2600/4600 */ + case 0x0e28: /* Xeon E5/E7 V2 */ + case 0x2f28: /* Xeon E5/E7 V3,V4 */ + case 0x6f28: /* Xeon D-1500 */ + case 0x2034: /* Xeon Scalable Family */ + pci_read_config_dword(dev, INTEL_CIPINTRC_CFG_OFFSET, + &pci_config_dword); + pci_config_dword |= INTEL_CIPINTRC_DIS_INTX_ICH; + pci_write_config_dword(dev, INTEL_CIPINTRC_CFG_OFFSET, + pci_config_dword); + break; + default: + return; + } pci_info(dev, "disabled boot interrupts on device [%04x:%04x]\n", dev->vendor, dev->device); } -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_10, quirk_disable_intel_boot_interrupt); -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_10, quirk_disable_intel_boot_interrupt); +/* + * Device 29 Func 5 Device IDs of IO-APIC + * containing ABAR—APIC1 Alternate Base Address Register + */ +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_10, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_10, + quirk_disable_intel_boot_interrupt); + +/* + * Device 5 Func 0 Device IDs of Core IO modules/hubs + * containing Coherent Interface Protocol Interrupt Control + * + * Device IDs obtained from volume 2 datasheets of commented + * families above. + */ +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x3c28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0e28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2f28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x6f28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2034, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, 0x3c28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, 0x0e28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, 0x2f28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, 0x6f28, + quirk_disable_intel_boot_interrupt); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, 0x2034, + quirk_disable_intel_boot_interrupt); /* Disable boot interrupts on HT-1000 */ #define BC_HT1000_FEATURE_REG 0x64 @@ -2358,32 +2445,6 @@ PCI_DEVICE_ID_TIGON3_5719, quirk_brcm_5719_limit_mrrs); -#ifdef CONFIG_PCIE_IPROC_PLATFORM -static void quirk_paxc_bridge(struct pci_dev *pdev) -{ - /* - * The PCI config space is shared with the PAXC root port and the first - * Ethernet device. So, we need to workaround this by telling the PCI - * code that the bridge is not an Ethernet device. - */ - if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE) - pdev->class = PCI_CLASS_BRIDGE_PCI << 8; - - /* - * MPSS is not being set properly (as it is currently 0). This is - * because that area of the PCI config space is hard coded to zero, and - * is not modifiable by firmware. Set this to 2 (e.g., 512 byte MPS) - * so that the MPS can be set to the real max value. - */ - pdev->pcie_mpss = 2; -} -DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x16cd, quirk_paxc_bridge); -DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x16f0, quirk_paxc_bridge); -DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd750, quirk_paxc_bridge); -DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd802, quirk_paxc_bridge); -DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0xd804, quirk_paxc_bridge); -#endif - /* * Originally in EDAC sources for i82875P: Intel tells BIOS developers to * hide device 6 which configures the overflow device access containing the @@ -3987,6 +4048,40 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2264, quirk_mic_x200_dma_alias); /* + * Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices + * exposing computational units via Non Transparent Bridges (NTB, PEX 87xx). + * + * Similarly to MIC x200, we need to add DMA aliases to allow buffer access + * when IOMMU is enabled. These aliases allow computational unit access to + * host memory. These aliases mark the whole VCA device as one IOMMU + * group. + * + * All possible slot numbers (0x20) are used, since we are unable to tell + * what slot is used on other side. This quirk is intended for both host + * and computational unit sides. The VCA devices have up to five functions + * (four for DMA channels and one additional). + */ +static void quirk_pex_vca_alias(struct pci_dev *pdev) +{ + const unsigned int num_pci_slots = 0x20; + unsigned int slot; + + for (slot = 0; slot < num_pci_slots; slot++) { + pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x0)); + pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x1)); + pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x2)); + pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x3)); + pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x4)); + } +} +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2954, quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2955, quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2956, quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2958, quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2959, quirk_pex_vca_alias); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x295A, quirk_pex_vca_alias); + +/* * The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are * associated not at the root bus, but at a bridge below. This quirk avoids * generating invalid DMA aliases. @@ -4891,18 +4986,25 @@ #ifdef CONFIG_PCI_ATS /* - * Some devices have a broken ATS implementation causing IOMMU stalls. - * Don't use ATS for those devices. + * Some devices require additional driver setup to enable ATS. Don't use + * ATS for those devices as ATS will be enabled before the driver has had a + * chance to load and configure the device. */ -static void quirk_no_ats(struct pci_dev *pdev) +static void quirk_amd_harvest_no_ats(struct pci_dev *pdev) { - pci_info(pdev, "disabling ATS (broken on this device)\n"); + if (pdev->device == 0x7340 && pdev->revision != 0xc5) + return; + + pci_info(pdev, "disabling ATS\n"); pdev->ats_cap = 0; } /* AMD Stoney platform GPU */ -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x98e4, quirk_no_ats); -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6900, quirk_no_ats); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x98e4, quirk_amd_harvest_no_ats); +/* AMD Iceland dGPU */ +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6900, quirk_amd_harvest_no_ats); +/* AMD Navi14 dGPU */ +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7340, quirk_amd_harvest_no_ats); #endif /* CONFIG_PCI_ATS */ /* Freescale PCIe doesn't support MSI in RC mode */ diff -Nru linux-4.19.98/drivers/pci/setup-bus.c linux-4.19.118/drivers/pci/setup-bus.c --- linux-4.19.98/drivers/pci/setup-bus.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/setup-bus.c 2020-04-23 08:30:24.000000000 +0000 @@ -1820,12 +1820,18 @@ /* restore size and flags */ list_for_each_entry(fail_res, &fail_head, list) { struct resource *res = fail_res->res; + int idx; res->start = fail_res->start; res->end = fail_res->end; res->flags = fail_res->flags; - if (fail_res->dev->subordinate) - res->flags = 0; + + if (pci_is_bridge(fail_res->dev)) { + idx = res - &fail_res->dev->resource[0]; + if (idx >= PCI_BRIDGE_RESOURCES && + idx <= PCI_BRIDGE_RESOURCE_END) + res->flags = 0; + } } free_list(&fail_head); @@ -2066,12 +2072,18 @@ /* restore size and flags */ list_for_each_entry(fail_res, &fail_head, list) { struct resource *res = fail_res->res; + int idx; res->start = fail_res->start; res->end = fail_res->end; res->flags = fail_res->flags; - if (fail_res->dev->subordinate) - res->flags = 0; + + if (pci_is_bridge(fail_res->dev)) { + idx = res - &fail_res->dev->resource[0]; + if (idx >= PCI_BRIDGE_RESOURCES && + idx <= PCI_BRIDGE_RESOURCE_END) + res->flags = 0; + } } free_list(&fail_head); diff -Nru linux-4.19.98/drivers/pci/switch/switchtec.c linux-4.19.118/drivers/pci/switch/switchtec.c --- linux-4.19.98/drivers/pci/switch/switchtec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pci/switch/switchtec.c 2020-04-23 08:30:24.000000000 +0000 @@ -134,10 +134,6 @@ stuser->data, stuser->data_len); iowrite32(stuser->cmd, &stdev->mmio_mrpc->cmd); - stuser->status = ioread32(&stdev->mmio_mrpc->status); - if (stuser->status != SWITCHTEC_MRPC_STATUS_INPROGRESS) - mrpc_complete_cmd(stdev); - schedule_delayed_work(&stdev->mrpc_timeout, msecs_to_jiffies(500)); } @@ -151,7 +147,7 @@ kref_get(&stuser->kref); stuser->read_len = sizeof(stuser->data); stuser_set_state(stuser, MRPC_QUEUED); - init_completion(&stuser->comp); + reinit_completion(&stuser->comp); list_add_tail(&stuser->list, &stdev->mrpc_queue); mrpc_cmd_submit(stdev); @@ -1190,7 +1186,7 @@ if (nvecs < 0) return nvecs; - event_irq = ioread32(&stdev->mmio_part_cfg->vep_vector_number); + event_irq = ioread16(&stdev->mmio_part_cfg->vep_vector_number); if (event_irq < 0 || event_irq >= nvecs) return -EFAULT; diff -Nru linux-4.19.98/drivers/perf/arm_pmu_acpi.c linux-4.19.118/drivers/perf/arm_pmu_acpi.c --- linux-4.19.98/drivers/perf/arm_pmu_acpi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/perf/arm_pmu_acpi.c 2020-04-23 08:30:24.000000000 +0000 @@ -27,8 +27,6 @@ int gsi, trigger; gicc = acpi_cpu_get_madt_gicc(cpu); - if (WARN_ON(!gicc)) - return -EINVAL; gsi = gicc->performance_interrupt; @@ -67,11 +65,10 @@ int gsi; gicc = acpi_cpu_get_madt_gicc(cpu); - if (!gicc) - return; gsi = gicc->performance_interrupt; - acpi_unregister_gsi(gsi); + if (gsi) + acpi_unregister_gsi(gsi); } static int arm_pmu_acpi_parse_irqs(void) diff -Nru linux-4.19.98/drivers/phy/broadcom/phy-brcm-usb.c linux-4.19.118/drivers/phy/broadcom/phy-brcm-usb.c --- linux-4.19.98/drivers/phy/broadcom/phy-brcm-usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/phy/broadcom/phy-brcm-usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -378,6 +378,13 @@ return 0; } +static int brcm_usb_phy_remove(struct platform_device *pdev) +{ + sysfs_remove_group(&pdev->dev.kobj, &brcm_usb_phy_group); + + return 0; +} + #ifdef CONFIG_PM_SLEEP static int brcm_usb_phy_suspend(struct device *dev) { @@ -443,6 +450,7 @@ static struct platform_driver brcm_usb_driver = { .probe = brcm_usb_phy_probe, + .remove = brcm_usb_phy_remove, .driver = { .name = "brcmstb-usb-phy", .owner = THIS_MODULE, diff -Nru linux-4.19.98/drivers/phy/motorola/phy-cpcap-usb.c linux-4.19.118/drivers/phy/motorola/phy-cpcap-usb.c --- linux-4.19.98/drivers/phy/motorola/phy-cpcap-usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/phy/motorola/phy-cpcap-usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -115,7 +115,7 @@ enum cpcap_gpio_mode { CPCAP_DM_DP, CPCAP_MDM_RX_TX, - CPCAP_UNKNOWN, + CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */ CPCAP_OTG_DM_DP, }; @@ -379,7 +379,8 @@ { int error; - error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); + /* Disable lines to prevent glitches from waking up mdm6600 */ + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); if (error) goto out_err; @@ -406,6 +407,11 @@ if (error) goto out_err; + /* Enable UART mode */ + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); + if (error) + goto out_err; + return 0; out_err: @@ -418,7 +424,8 @@ { int error; - error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); + /* Disable lines to prevent glitches from waking up mdm6600 */ + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); if (error) return error; @@ -458,6 +465,11 @@ if (error) goto out_err; + /* Enable USB mode */ + error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); + if (error) + goto out_err; + return 0; out_err: diff -Nru linux-4.19.98/drivers/phy/motorola/phy-mapphone-mdm6600.c linux-4.19.118/drivers/phy/motorola/phy-mapphone-mdm6600.c --- linux-4.19.98/drivers/phy/motorola/phy-mapphone-mdm6600.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/phy/motorola/phy-mapphone-mdm6600.c 2020-04-23 08:30:24.000000000 +0000 @@ -19,6 +19,7 @@ #define PHY_MDM6600_PHY_DELAY_MS 4000 /* PHY enable 2.2s to 3.5s */ #define PHY_MDM6600_ENABLED_DELAY_MS 8000 /* 8s more total for MDM6600 */ +#define PHY_MDM6600_WAKE_KICK_MS 600 /* time on after GPIO toggle */ #define MDM6600_MODEM_IDLE_DELAY_MS 1000 /* modem after USB suspend */ #define MDM6600_MODEM_WAKE_DELAY_MS 200 /* modem response after idle */ @@ -224,10 +225,24 @@ { struct phy_mdm6600 *ddata = data; struct gpio_desc *mode_gpio1; + int error, wakeup; mode_gpio1 = ddata->mode_gpios->desc[PHY_MDM6600_MODE1]; - dev_dbg(ddata->dev, "OOB wake on mode_gpio1: %i\n", - gpiod_get_value(mode_gpio1)); + wakeup = gpiod_get_value(mode_gpio1); + if (!wakeup) + return IRQ_NONE; + + dev_dbg(ddata->dev, "OOB wake on mode_gpio1: %i\n", wakeup); + error = pm_runtime_get_sync(ddata->dev); + if (error < 0) { + pm_runtime_put_noidle(ddata->dev); + + return IRQ_NONE; + } + + /* Just wake-up and kick the autosuspend timer */ + pm_runtime_mark_last_busy(ddata->dev); + pm_runtime_put_autosuspend(ddata->dev); return IRQ_HANDLED; } @@ -477,8 +492,14 @@ ddata = container_of(work, struct phy_mdm6600, modem_wake_work.work); phy_mdm6600_wake_modem(ddata); + + /* + * The modem does not always stay awake 1.2 seconds after toggling + * the wake GPIO, and sometimes it idles after about some 600 ms + * making writes time out. + */ schedule_delayed_work(&ddata->modem_wake_work, - msecs_to_jiffies(MDM6600_MODEM_IDLE_DELAY_MS)); + msecs_to_jiffies(PHY_MDM6600_WAKE_KICK_MS)); } static int __maybe_unused phy_mdm6600_runtime_suspend(struct device *dev) diff -Nru linux-4.19.98/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c linux-4.19.118/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c --- linux-4.19.98/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/phy/qualcomm/phy-qcom-apq8064-sata.c 2020-04-23 08:30:24.000000000 +0000 @@ -88,7 +88,7 @@ if (readl_relaxed(addr) & mask) return 0; - usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50); + usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50); } while (!time_after(jiffies, timeout)); return (readl_relaxed(addr) & mask) ? 0 : -ETIMEDOUT; diff -Nru linux-4.19.98/drivers/phy/qualcomm/phy-qcom-qmp.c linux-4.19.118/drivers/phy/qualcomm/phy-qcom-qmp.c --- linux-4.19.98/drivers/phy/qualcomm/phy-qcom-qmp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/phy/qualcomm/phy-qcom-qmp.c 2020-04-23 08:30:24.000000000 +0000 @@ -66,7 +66,7 @@ /* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */ #define CLAMP_EN BIT(0) /* enables i/o clamp_n */ -#define PHY_INIT_COMPLETE_TIMEOUT 1000 +#define PHY_INIT_COMPLETE_TIMEOUT 10000 #define POWER_DOWN_DELAY_US_MIN 10 #define POWER_DOWN_DELAY_US_MAX 11 diff -Nru linux-4.19.98/drivers/phy/qualcomm/phy-qcom-qusb2.c linux-4.19.118/drivers/phy/qualcomm/phy-qcom-qusb2.c --- linux-4.19.98/drivers/phy/qualcomm/phy-qcom-qusb2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/phy/qualcomm/phy-qcom-qusb2.c 2020-04-23 08:30:24.000000000 +0000 @@ -526,7 +526,7 @@ } if (!qphy->has_se_clk_scheme) { - clk_prepare_enable(qphy->ref_clk); + ret = clk_prepare_enable(qphy->ref_clk); if (ret) { dev_err(dev, "failed to enable ref clk, %d\n", ret); goto disable_ahb_clk; diff -Nru linux-4.19.98/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c linux-4.19.118/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c --- linux-4.19.98/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c 2020-04-23 08:30:24.000000000 +0000 @@ -54,8 +54,12 @@ /* drive strength control for ASIU GPIO */ #define IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET 0x58 -/* drive strength control for CCM/CRMU (AON) GPIO */ -#define IPROC_GPIO_DRV0_CTRL_OFFSET 0x00 +/* pinconf for CCM GPIO */ +#define IPROC_GPIO_PULL_DN_OFFSET 0x10 +#define IPROC_GPIO_PULL_UP_OFFSET 0x14 + +/* pinconf for CRMU(aon) GPIO and CCM GPIO*/ +#define IPROC_GPIO_DRV_CTRL_OFFSET 0x00 #define GPIO_BANK_SIZE 0x200 #define NGPIOS_PER_BANK 32 @@ -76,6 +80,12 @@ IPROC_PINCON_MAX, }; +enum iproc_pinconf_ctrl_type { + IOCTRL_TYPE_AON = 1, + IOCTRL_TYPE_CDRU, + IOCTRL_TYPE_INVALID, +}; + /* * Iproc GPIO core * @@ -100,6 +110,7 @@ void __iomem *base; void __iomem *io_ctrl; + enum iproc_pinconf_ctrl_type io_ctrl_type; raw_spinlock_t lock; @@ -461,20 +472,44 @@ static int iproc_gpio_set_pull(struct iproc_gpio *chip, unsigned gpio, bool disable, bool pull_up) { + void __iomem *base; unsigned long flags; + unsigned int shift; + u32 val_1, val_2; raw_spin_lock_irqsave(&chip->lock, flags); + if (chip->io_ctrl_type == IOCTRL_TYPE_CDRU) { + base = chip->io_ctrl; + shift = IPROC_GPIO_SHIFT(gpio); - if (disable) { - iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, false); + val_1 = readl(base + IPROC_GPIO_PULL_UP_OFFSET); + val_2 = readl(base + IPROC_GPIO_PULL_DN_OFFSET); + if (disable) { + /* no pull-up or pull-down */ + val_1 &= ~BIT(shift); + val_2 &= ~BIT(shift); + } else if (pull_up) { + val_1 |= BIT(shift); + val_2 &= ~BIT(shift); + } else { + val_1 &= ~BIT(shift); + val_2 |= BIT(shift); + } + writel(val_1, base + IPROC_GPIO_PULL_UP_OFFSET); + writel(val_2, base + IPROC_GPIO_PULL_DN_OFFSET); } else { - iproc_set_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio, - pull_up); - iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, true); + if (disable) { + iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, + false); + } else { + iproc_set_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio, + pull_up); + iproc_set_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio, + true); + } } raw_spin_unlock_irqrestore(&chip->lock, flags); - dev_dbg(chip->dev, "gpio:%u set pullup:%d\n", gpio, pull_up); return 0; @@ -483,14 +518,35 @@ static void iproc_gpio_get_pull(struct iproc_gpio *chip, unsigned gpio, bool *disable, bool *pull_up) { + void __iomem *base; unsigned long flags; + unsigned int shift; + u32 val_1, val_2; raw_spin_lock_irqsave(&chip->lock, flags); - *disable = !iproc_get_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio); - *pull_up = iproc_get_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio); + if (chip->io_ctrl_type == IOCTRL_TYPE_CDRU) { + base = chip->io_ctrl; + shift = IPROC_GPIO_SHIFT(gpio); + + val_1 = readl(base + IPROC_GPIO_PULL_UP_OFFSET) & BIT(shift); + val_2 = readl(base + IPROC_GPIO_PULL_DN_OFFSET) & BIT(shift); + + *pull_up = val_1 ? true : false; + *disable = (val_1 | val_2) ? false : true; + + } else { + *disable = !iproc_get_bit(chip, IPROC_GPIO_RES_EN_OFFSET, gpio); + *pull_up = iproc_get_bit(chip, IPROC_GPIO_PAD_RES_OFFSET, gpio); + } raw_spin_unlock_irqrestore(&chip->lock, flags); } +#define DRV_STRENGTH_OFFSET(gpio, bit, type) ((type) == IOCTRL_TYPE_AON ? \ + ((2 - (bit)) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \ + ((type) == IOCTRL_TYPE_CDRU) ? \ + ((bit) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \ + ((bit) * 4 + IPROC_GPIO_REG(gpio, IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET))) + static int iproc_gpio_set_strength(struct iproc_gpio *chip, unsigned gpio, unsigned strength) { @@ -505,11 +561,8 @@ if (chip->io_ctrl) { base = chip->io_ctrl; - offset = IPROC_GPIO_DRV0_CTRL_OFFSET; } else { base = chip->base; - offset = IPROC_GPIO_REG(gpio, - IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET); } shift = IPROC_GPIO_SHIFT(gpio); @@ -520,11 +573,11 @@ raw_spin_lock_irqsave(&chip->lock, flags); strength = (strength / 2) - 1; for (i = 0; i < GPIO_DRV_STRENGTH_BITS; i++) { + offset = DRV_STRENGTH_OFFSET(gpio, i, chip->io_ctrl_type); val = readl(base + offset); val &= ~BIT(shift); val |= ((strength >> i) & 0x1) << shift; writel(val, base + offset); - offset += 4; } raw_spin_unlock_irqrestore(&chip->lock, flags); @@ -541,11 +594,8 @@ if (chip->io_ctrl) { base = chip->io_ctrl; - offset = IPROC_GPIO_DRV0_CTRL_OFFSET; } else { base = chip->base; - offset = IPROC_GPIO_REG(gpio, - IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET); } shift = IPROC_GPIO_SHIFT(gpio); @@ -553,10 +603,10 @@ raw_spin_lock_irqsave(&chip->lock, flags); *strength = 0; for (i = 0; i < GPIO_DRV_STRENGTH_BITS; i++) { + offset = DRV_STRENGTH_OFFSET(gpio, i, chip->io_ctrl_type); val = readl(base + offset) & BIT(shift); val >>= shift; *strength += (val << i); - offset += 4; } /* convert to mA */ @@ -734,6 +784,7 @@ u32 ngpios, pinconf_disable_mask = 0; int irq, ret; bool no_pinconf = false; + enum iproc_pinconf_ctrl_type io_ctrl_type = IOCTRL_TYPE_INVALID; /* NSP does not support drive strength config */ if (of_device_is_compatible(dev->of_node, "brcm,iproc-nsp-gpio")) @@ -764,8 +815,15 @@ dev_err(dev, "unable to map I/O memory\n"); return PTR_ERR(chip->io_ctrl); } + if (of_device_is_compatible(dev->of_node, + "brcm,cygnus-ccm-gpio")) + io_ctrl_type = IOCTRL_TYPE_CDRU; + else + io_ctrl_type = IOCTRL_TYPE_AON; } + chip->io_ctrl_type = io_ctrl_type; + if (of_property_read_u32(dev->of_node, "ngpios", &ngpios)) { dev_err(&pdev->dev, "missing ngpios DT property\n"); return -ENODEV; diff -Nru linux-4.19.98/drivers/pinctrl/core.c linux-4.19.118/drivers/pinctrl/core.c --- linux-4.19.98/drivers/pinctrl/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -2008,7 +2008,6 @@ return PTR_ERR(pctldev->p); } - kref_get(&pctldev->p->users); pctldev->hog_default = pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); if (IS_ERR(pctldev->hog_default)) { diff -Nru linux-4.19.98/drivers/pinctrl/intel/pinctrl-baytrail.c linux-4.19.118/drivers/pinctrl/intel/pinctrl-baytrail.c --- linux-4.19.98/drivers/pinctrl/intel/pinctrl-baytrail.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/intel/pinctrl-baytrail.c 2020-04-23 08:30:24.000000000 +0000 @@ -950,7 +950,13 @@ raw_spin_lock_irqsave(&byt_lock, flags); value = readl(reg); - value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL); + + /* Do not clear direct-irq enabled IRQs (from gpio_disable_free) */ + if (value & BYT_DIRECT_IRQ_EN) + /* nothing to do */ ; + else + value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL); + writel(value, reg); raw_spin_unlock_irqrestore(&byt_lock, flags); } diff -Nru linux-4.19.98/drivers/pinctrl/meson/pinctrl-meson-gxl.c linux-4.19.118/drivers/pinctrl/meson/pinctrl-meson-gxl.c --- linux-4.19.98/drivers/pinctrl/meson/pinctrl-meson-gxl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/meson/pinctrl-meson-gxl.c 2020-04-23 08:30:24.000000000 +0000 @@ -153,8 +153,8 @@ static const unsigned int sdio_d1_pins[] = { GPIOX_1 }; static const unsigned int sdio_d2_pins[] = { GPIOX_2 }; static const unsigned int sdio_d3_pins[] = { GPIOX_3 }; -static const unsigned int sdio_cmd_pins[] = { GPIOX_4 }; -static const unsigned int sdio_clk_pins[] = { GPIOX_5 }; +static const unsigned int sdio_clk_pins[] = { GPIOX_4 }; +static const unsigned int sdio_cmd_pins[] = { GPIOX_5 }; static const unsigned int sdio_irq_pins[] = { GPIOX_7 }; static const unsigned int nand_ce0_pins[] = { BOOT_8 }; @@ -239,13 +239,9 @@ static const unsigned int eth_act_led_pins[] = { GPIOZ_15 }; static const unsigned int tsin_a_d0_pins[] = { GPIODV_0 }; -static const unsigned int tsin_a_d0_x_pins[] = { GPIOX_10 }; static const unsigned int tsin_a_clk_pins[] = { GPIODV_8 }; -static const unsigned int tsin_a_clk_x_pins[] = { GPIOX_11 }; static const unsigned int tsin_a_sop_pins[] = { GPIODV_9 }; -static const unsigned int tsin_a_sop_x_pins[] = { GPIOX_8 }; static const unsigned int tsin_a_d_valid_pins[] = { GPIODV_10 }; -static const unsigned int tsin_a_d_valid_x_pins[] = { GPIOX_9 }; static const unsigned int tsin_a_fail_pins[] = { GPIODV_11 }; static const unsigned int tsin_a_dp_pins[] = { GPIODV_1, GPIODV_2, GPIODV_3, GPIODV_4, GPIODV_5, GPIODV_6, GPIODV_7, @@ -432,10 +428,6 @@ GROUP(spi_miso, 5, 2), GROUP(spi_ss0, 5, 1), GROUP(spi_sclk, 5, 0), - GROUP(tsin_a_sop_x, 6, 3), - GROUP(tsin_a_d_valid_x, 6, 2), - GROUP(tsin_a_d0_x, 6, 1), - GROUP(tsin_a_clk_x, 6, 0), /* Bank Z */ GROUP(eth_mdio, 4, 23), @@ -698,8 +690,8 @@ }; static const char * const tsin_a_groups[] = { - "tsin_a_clk", "tsin_a_clk_x", "tsin_a_sop", "tsin_a_sop_x", - "tsin_a_d_valid", "tsin_a_d_valid_x", "tsin_a_d0", "tsin_a_d0_x", + "tsin_a_clk", "tsin_a_sop", + "tsin_a_d_valid", "tsin_a_d0", "tsin_a_dp", "tsin_a_fail", }; diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-emev2.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-emev2.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-emev2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-emev2.c 2020-04-23 08:30:24.000000000 +0000 @@ -1263,6 +1263,14 @@ "dtv_b", }; +static const char * const err_rst_reqb_groups[] = { + "err_rst_reqb", +}; + +static const char * const ext_clki_groups[] = { + "ext_clki", +}; + static const char * const iic0_groups[] = { "iic0", }; @@ -1285,6 +1293,10 @@ "yuv3", }; +static const char * const lowpwr_groups[] = { + "lowpwr", +}; + static const char * const ntsc_groups[] = { "ntsc_clk", "ntsc_data", @@ -1298,6 +1310,10 @@ "pwm1", }; +static const char * const ref_clko_groups[] = { + "ref_clko", +}; + static const char * const sd_groups[] = { "sd_cki", }; @@ -1391,13 +1407,17 @@ SH_PFC_FUNCTION(cam), SH_PFC_FUNCTION(cf), SH_PFC_FUNCTION(dtv), + SH_PFC_FUNCTION(err_rst_reqb), + SH_PFC_FUNCTION(ext_clki), SH_PFC_FUNCTION(iic0), SH_PFC_FUNCTION(iic1), SH_PFC_FUNCTION(jtag), SH_PFC_FUNCTION(lcd), + SH_PFC_FUNCTION(lowpwr), SH_PFC_FUNCTION(ntsc), SH_PFC_FUNCTION(pwm0), SH_PFC_FUNCTION(pwm1), + SH_PFC_FUNCTION(ref_clko), SH_PFC_FUNCTION(sd), SH_PFC_FUNCTION(sdi0), SH_PFC_FUNCTION(sdi1), diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7740.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7740.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7740.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7740.c 2020-04-23 08:30:24.000000000 +0000 @@ -1982,7 +1982,7 @@ */ 185, 186, 187, 188, 189, 190, 191, 192, 174, 161, 204, 171, 170, 169, 168, 167, 166, 173, 172, 176, 184, 183, 203, - 205, 163, 206, 207, + 205, 163, 206, 207, 158, }; static const unsigned int gether_gmii_mux[] = { ET_ERXD0_MARK, ET_ERXD1_MARK, ET_ERXD2_MARK, ET_ERXD3_MARK, @@ -2154,6 +2154,7 @@ LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK, LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK, LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK, + LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK, LCD0_D16_MARK, LCD0_D17_MARK, LCD0_D18_PORT163_MARK, LCD0_D19_PORT162_MARK, LCD0_D20_PORT161_MARK, LCD0_D21_PORT158_MARK, LCD0_D22_PORT160_MARK, LCD0_D23_PORT159_MARK, diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7778.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7778.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7778.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7778.c 2020-04-23 08:30:24.000000000 +0000 @@ -2325,7 +2325,7 @@ FN_ATAG0_A, 0, FN_REMOCON_B, 0, /* IP0_11_8 [4] */ FN_SD1_DAT2_A, FN_MMC_D2, 0, FN_BS, - FN_ATADIR0_A, 0, FN_SDSELF_B, 0, + FN_ATADIR0_A, 0, FN_SDSELF_A, 0, FN_PWM4_B, 0, 0, 0, 0, 0, 0, 0, /* IP0_7_5 [3] */ @@ -2367,7 +2367,7 @@ FN_TS_SDAT0_A, 0, 0, 0, 0, 0, 0, 0, /* IP1_10_8 [3] */ - FN_SD1_CLK_B, FN_MMC_D6, 0, FN_A24, + FN_SD1_CD_A, FN_MMC_D6, 0, FN_A24, FN_DREQ1_A, 0, FN_HRX0_B, FN_TS_SPSYNC0_A, /* IP1_7_5 [3] */ FN_A23, FN_HTX0_B, FN_TX2_B, FN_DACK2_A, diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7791.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7791.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7791.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7791.c 2020-04-23 08:30:24.000000000 +0000 @@ -3220,8 +3220,7 @@ RCAR_GP_PIN(6, 4), }; static const unsigned int qspi_data4_b_mux[] = { - SPCLK_B_MARK, MOSI_IO0_B_MARK, MISO_IO1_B_MARK, - IO2_B_MARK, IO3_B_MARK, SSL_B_MARK, + MOSI_IO0_B_MARK, MISO_IO1_B_MARK, IO2_B_MARK, IO3_B_MARK, }; /* - SCIF0 ------------------------------------------------------------------ */ static const unsigned int scif0_data_pins[] = { @@ -4375,17 +4374,14 @@ }; static const unsigned int vin1_b_data18_mux[] = { /* B */ - VI1_DATA0_B_MARK, VI1_DATA1_B_MARK, VI1_DATA2_B_MARK, VI1_DATA3_B_MARK, VI1_DATA4_B_MARK, VI1_DATA5_B_MARK, VI1_DATA6_B_MARK, VI1_DATA7_B_MARK, /* G */ - VI1_G0_B_MARK, VI1_G1_B_MARK, VI1_G2_B_MARK, VI1_G3_B_MARK, VI1_G4_B_MARK, VI1_G5_B_MARK, VI1_G6_B_MARK, VI1_G7_B_MARK, /* R */ - VI1_R0_B_MARK, VI1_R1_B_MARK, VI1_R2_B_MARK, VI1_R3_B_MARK, VI1_R4_B_MARK, VI1_R5_B_MARK, VI1_R6_B_MARK, VI1_R7_B_MARK, @@ -5243,7 +5239,7 @@ "scifb2_data_b", "scifb2_clk_b", "scifb2_ctrl_b", - "scifb0_data_c", + "scifb2_data_c", "scifb2_clk_c", "scifb2_data_d", }; diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7792.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7792.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7792.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7792.c 2020-04-23 08:30:24.000000000 +0000 @@ -1916,6 +1916,7 @@ "vin1_data8", "vin1_data24_b", "vin1_data20_b", + "vin1_data18_b", "vin1_data16_b", "vin1_sync", "vin1_field", diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7794.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7794.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a7794.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a7794.c 2020-04-23 08:30:24.000000000 +0000 @@ -5215,7 +5215,7 @@ FN_AVB_MDC, FN_SSI_SDATA6_B, 0, 0, } }, { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32, - 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3) { + 1, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3) { /* IP9_31 [1] */ 0, 0, /* IP9_30_28 [3] */ diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a77970.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a77970.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a77970.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a77970.c 2020-04-23 08:30:24.000000000 +0000 @@ -2354,7 +2354,7 @@ #define F_(x, y) x, #define FM(x) FN_##x, { PINMUX_CFG_REG_VAR("MOD_SEL0", 0xe6060500, 32, - 4, 4, 4, 4, + 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) { /* RESERVED 31, 30, 29, 28 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a77980.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a77980.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a77980.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a77980.c 2020-04-23 08:30:24.000000000 +0000 @@ -2751,7 +2751,7 @@ #define F_(x, y) x, #define FM(x) FN_##x, { PINMUX_CFG_REG_VAR("MOD_SEL0", 0xe6060500, 32, - 4, 4, 4, 4, + 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) { /* RESERVED 31, 30, 29, 28 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a77995.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a77995.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-r8a77995.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-r8a77995.c 2020-04-23 08:30:24.000000000 +0000 @@ -391,10 +391,10 @@ #define MOD_SEL0_27 FM(SEL_MSIOF3_0) FM(SEL_MSIOF3_1) #define MOD_SEL0_26 FM(SEL_HSCIF3_0) FM(SEL_HSCIF3_1) #define MOD_SEL0_25 FM(SEL_SCIF4_0) FM(SEL_SCIF4_1) -#define MOD_SEL0_24_23 FM(SEL_PWM0_0) FM(SEL_PWM0_1) FM(SEL_PWM0_2) FM(SEL_PWM0_3) -#define MOD_SEL0_22_21 FM(SEL_PWM1_0) FM(SEL_PWM1_1) FM(SEL_PWM1_2) FM(SEL_PWM1_3) -#define MOD_SEL0_20_19 FM(SEL_PWM2_0) FM(SEL_PWM2_1) FM(SEL_PWM2_2) FM(SEL_PWM2_3) -#define MOD_SEL0_18_17 FM(SEL_PWM3_0) FM(SEL_PWM3_1) FM(SEL_PWM3_2) FM(SEL_PWM3_3) +#define MOD_SEL0_24_23 FM(SEL_PWM0_0) FM(SEL_PWM0_1) FM(SEL_PWM0_2) F_(0, 0) +#define MOD_SEL0_22_21 FM(SEL_PWM1_0) FM(SEL_PWM1_1) FM(SEL_PWM1_2) F_(0, 0) +#define MOD_SEL0_20_19 FM(SEL_PWM2_0) FM(SEL_PWM2_1) FM(SEL_PWM2_2) F_(0, 0) +#define MOD_SEL0_18_17 FM(SEL_PWM3_0) FM(SEL_PWM3_1) FM(SEL_PWM3_2) F_(0, 0) #define MOD_SEL0_15 FM(SEL_IRQ_0_0) FM(SEL_IRQ_0_1) #define MOD_SEL0_14 FM(SEL_IRQ_1_0) FM(SEL_IRQ_1_1) #define MOD_SEL0_13 FM(SEL_IRQ_2_0) FM(SEL_IRQ_2_1) diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh7264.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh7264.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh7264.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh7264.c 2020-04-23 08:30:24.000000000 +0000 @@ -500,17 +500,15 @@ SD_WP_MARK, SD_CLK_MARK, SD_CMD_MARK, CRX0_MARK, CRX1_MARK, CTX0_MARK, CTX1_MARK, + CRX0_CRX1_MARK, CTX0_CTX1_MARK, PWM1A_MARK, PWM1B_MARK, PWM1C_MARK, PWM1D_MARK, PWM1E_MARK, PWM1F_MARK, PWM1G_MARK, PWM1H_MARK, PWM2A_MARK, PWM2B_MARK, PWM2C_MARK, PWM2D_MARK, PWM2E_MARK, PWM2F_MARK, PWM2G_MARK, PWM2H_MARK, IERXD_MARK, IETXD_MARK, - CRX0_CRX1_MARK, WDTOVF_MARK, - CRX0X1_MARK, - /* DMAC */ TEND0_MARK, DACK0_MARK, DREQ0_MARK, TEND1_MARK, DACK1_MARK, DREQ1_MARK, @@ -998,12 +996,12 @@ PINMUX_DATA(PJ3_DATA, PJ3MD_00), PINMUX_DATA(CRX1_MARK, PJ3MD_01), - PINMUX_DATA(CRX0X1_MARK, PJ3MD_10), + PINMUX_DATA(CRX0_CRX1_MARK, PJ3MD_10), PINMUX_DATA(IRQ1_PJ_MARK, PJ3MD_11), PINMUX_DATA(PJ2_DATA, PJ2MD_000), PINMUX_DATA(CTX1_MARK, PJ2MD_001), - PINMUX_DATA(CRX0_CRX1_MARK, PJ2MD_010), + PINMUX_DATA(CTX0_CTX1_MARK, PJ2MD_010), PINMUX_DATA(CS2_MARK, PJ2MD_011), PINMUX_DATA(SCK0_MARK, PJ2MD_100), PINMUX_DATA(LCD_M_DISP_MARK, PJ2MD_101), @@ -1248,6 +1246,7 @@ GPIO_FN(CTX1), GPIO_FN(CRX1), GPIO_FN(CTX0), + GPIO_FN(CTX0_CTX1), GPIO_FN(CRX0), GPIO_FN(CRX0_CRX1), diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh7269.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh7269.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh7269.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh7269.c 2020-04-23 08:30:24.000000000 +0000 @@ -740,13 +740,12 @@ CRX0_MARK, CTX0_MARK, CRX1_MARK, CTX1_MARK, CRX2_MARK, CTX2_MARK, - CRX0_CRX1_MARK, - CRX0_CRX1_CRX2_MARK, - CTX0CTX1CTX2_MARK, + CRX0_CRX1_MARK, CTX0_CTX1_MARK, + CRX0_CRX1_CRX2_MARK, CTX0_CTX1_CTX2_MARK, CRX1_PJ22_MARK, CTX1_PJ23_MARK, CRX2_PJ20_MARK, CTX2_PJ21_MARK, - CRX0CRX1_PJ22_MARK, - CRX0CRX1CRX2_PJ20_MARK, + CRX0_CRX1_PJ22_MARK, CTX0_CTX1_PJ23_MARK, + CRX0_CRX1_CRX2_PJ20_MARK, CTX0_CTX1_CTX2_PJ21_MARK, /* VDC */ DV_CLK_MARK, @@ -824,6 +823,7 @@ PINMUX_DATA(CS3_MARK, PC8MD_001), PINMUX_DATA(TXD7_MARK, PC8MD_010), PINMUX_DATA(CTX1_MARK, PC8MD_011), + PINMUX_DATA(CTX0_CTX1_MARK, PC8MD_100), PINMUX_DATA(PC7_DATA, PC7MD_000), PINMUX_DATA(CKE_MARK, PC7MD_001), @@ -836,11 +836,12 @@ PINMUX_DATA(CAS_MARK, PC6MD_001), PINMUX_DATA(SCK7_MARK, PC6MD_010), PINMUX_DATA(CTX0_MARK, PC6MD_011), + PINMUX_DATA(CTX0_CTX1_CTX2_MARK, PC6MD_100), PINMUX_DATA(PC5_DATA, PC5MD_000), PINMUX_DATA(RAS_MARK, PC5MD_001), PINMUX_DATA(CRX0_MARK, PC5MD_011), - PINMUX_DATA(CTX0CTX1CTX2_MARK, PC5MD_100), + PINMUX_DATA(CTX0_CTX1_CTX2_MARK, PC5MD_100), PINMUX_DATA(IRQ0_PC_MARK, PC5MD_101), PINMUX_DATA(PC4_DATA, PC4MD_00), @@ -1292,30 +1293,32 @@ PINMUX_DATA(LCD_DATA23_PJ23_MARK, PJ23MD_010), PINMUX_DATA(LCD_TCON6_MARK, PJ23MD_011), PINMUX_DATA(IRQ3_PJ_MARK, PJ23MD_100), - PINMUX_DATA(CTX1_MARK, PJ23MD_101), + PINMUX_DATA(CTX1_PJ23_MARK, PJ23MD_101), + PINMUX_DATA(CTX0_CTX1_PJ23_MARK, PJ23MD_110), PINMUX_DATA(PJ22_DATA, PJ22MD_000), PINMUX_DATA(DV_DATA22_MARK, PJ22MD_001), PINMUX_DATA(LCD_DATA22_PJ22_MARK, PJ22MD_010), PINMUX_DATA(LCD_TCON5_MARK, PJ22MD_011), PINMUX_DATA(IRQ2_PJ_MARK, PJ22MD_100), - PINMUX_DATA(CRX1_MARK, PJ22MD_101), - PINMUX_DATA(CRX0_CRX1_MARK, PJ22MD_110), + PINMUX_DATA(CRX1_PJ22_MARK, PJ22MD_101), + PINMUX_DATA(CRX0_CRX1_PJ22_MARK, PJ22MD_110), PINMUX_DATA(PJ21_DATA, PJ21MD_000), PINMUX_DATA(DV_DATA21_MARK, PJ21MD_001), PINMUX_DATA(LCD_DATA21_PJ21_MARK, PJ21MD_010), PINMUX_DATA(LCD_TCON4_MARK, PJ21MD_011), PINMUX_DATA(IRQ1_PJ_MARK, PJ21MD_100), - PINMUX_DATA(CTX2_MARK, PJ21MD_101), + PINMUX_DATA(CTX2_PJ21_MARK, PJ21MD_101), + PINMUX_DATA(CTX0_CTX1_CTX2_PJ21_MARK, PJ21MD_110), PINMUX_DATA(PJ20_DATA, PJ20MD_000), PINMUX_DATA(DV_DATA20_MARK, PJ20MD_001), PINMUX_DATA(LCD_DATA20_PJ20_MARK, PJ20MD_010), PINMUX_DATA(LCD_TCON3_MARK, PJ20MD_011), PINMUX_DATA(IRQ0_PJ_MARK, PJ20MD_100), - PINMUX_DATA(CRX2_MARK, PJ20MD_101), - PINMUX_DATA(CRX0CRX1CRX2_PJ20_MARK, PJ20MD_110), + PINMUX_DATA(CRX2_PJ20_MARK, PJ20MD_101), + PINMUX_DATA(CRX0_CRX1_CRX2_PJ20_MARK, PJ20MD_110), PINMUX_DATA(PJ19_DATA, PJ19MD_000), PINMUX_DATA(DV_DATA19_MARK, PJ19MD_001), @@ -1666,12 +1669,24 @@ GPIO_FN(WDTOVF), /* CAN */ + GPIO_FN(CTX2), + GPIO_FN(CRX2), GPIO_FN(CTX1), GPIO_FN(CRX1), GPIO_FN(CTX0), GPIO_FN(CRX0), + GPIO_FN(CTX0_CTX1), GPIO_FN(CRX0_CRX1), + GPIO_FN(CTX0_CTX1_CTX2), GPIO_FN(CRX0_CRX1_CRX2), + GPIO_FN(CTX2_PJ21), + GPIO_FN(CRX2_PJ20), + GPIO_FN(CTX1_PJ23), + GPIO_FN(CRX1_PJ22), + GPIO_FN(CTX0_CTX1_PJ23), + GPIO_FN(CRX0_CRX1_PJ22), + GPIO_FN(CTX0_CTX1_CTX2_PJ21), + GPIO_FN(CRX0_CRX1_CRX2_PJ20), /* DMAC */ GPIO_FN(TEND0), @@ -2119,7 +2134,7 @@ }, { PINMUX_CFG_REG("PCIOR0", 0xfffe3852, 16, 1) { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, PC8_IN, PC8_OUT, PC7_IN, PC7_OUT, PC6_IN, PC6_OUT, diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh73a0.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh73a0.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh73a0.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh73a0.c 2020-04-23 08:30:24.000000000 +0000 @@ -3086,6 +3086,7 @@ }; static const unsigned int tpu4_to3_pins[] = { /* TO */ + PIN_NUMBER(6, 26), }; static const unsigned int tpu4_to3_mux[] = { TPU4TO3_MARK, @@ -3366,7 +3367,8 @@ "fsic_sclk_out", "fsic_data_in", "fsic_data_out", - "fsic_spdif", + "fsic_spdif_0", + "fsic_spdif_1", }; static const char * const fsid_groups[] = { diff -Nru linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh7734.c linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh7734.c --- linux-4.19.98/drivers/pinctrl/sh-pfc/pfc-sh7734.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pinctrl/sh-pfc/pfc-sh7734.c 2020-04-23 08:30:24.000000000 +0000 @@ -2231,13 +2231,13 @@ FN_LCD_CL1_B, 0, 0, /* IP10_5_3 [3] */ FN_SSI_WS23, FN_VI1_5_B, FN_TX1_D, FN_HSCK0_C, FN_FALE_B, - FN_LCD_DON_B, 0, 0, 0, + FN_LCD_DON_B, 0, 0, /* IP10_2_0 [3] */ FN_SSI_SCK23, FN_VI1_4_B, FN_RX1_D, FN_FCLE_B, FN_LCD_DATA15_B, 0, 0, 0 } }, { PINMUX_CFG_REG_VAR("IPSR11", 0xFFFC0048, 32, - 3, 1, 2, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { + 3, 1, 2, 3, 2, 2, 3, 3, 1, 2, 3, 3, 1, 1, 1, 1) { /* IP11_31_29 [3] */ 0, 0, 0, 0, 0, 0, 0, 0, /* IP11_28 [1] */ diff -Nru linux-4.19.98/drivers/platform/mips/cpu_hwmon.c linux-4.19.118/drivers/platform/mips/cpu_hwmon.c --- linux-4.19.98/drivers/platform/mips/cpu_hwmon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/mips/cpu_hwmon.c 2020-04-23 08:30:24.000000000 +0000 @@ -159,7 +159,7 @@ cpu_hwmon_dev = hwmon_device_register(NULL); if (IS_ERR(cpu_hwmon_dev)) { - ret = -ENOMEM; + ret = PTR_ERR(cpu_hwmon_dev); pr_err("hwmon_device_register fail!\n"); goto fail_hwmon_device_register; } diff -Nru linux-4.19.98/drivers/platform/x86/alienware-wmi.c linux-4.19.118/drivers/platform/x86/alienware-wmi.c --- linux-4.19.98/drivers/platform/x86/alienware-wmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/x86/alienware-wmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -522,23 +522,22 @@ input.length = (acpi_size) sizeof(*in_args); input.pointer = in_args; - if (out_data != NULL) { + if (out_data) { output.length = ACPI_ALLOCATE_BUFFER; output.pointer = NULL; status = wmi_evaluate_method(WMAX_CONTROL_GUID, 0, command, &input, &output); - } else + if (ACPI_SUCCESS(status)) { + obj = (union acpi_object *)output.pointer; + if (obj && obj->type == ACPI_TYPE_INTEGER) + *out_data = (u32)obj->integer.value; + } + kfree(output.pointer); + } else { status = wmi_evaluate_method(WMAX_CONTROL_GUID, 0, command, &input, NULL); - - if (ACPI_SUCCESS(status) && out_data != NULL) { - obj = (union acpi_object *)output.pointer; - if (obj && obj->type == ACPI_TYPE_INTEGER) - *out_data = (u32) obj->integer.value; } - kfree(output.pointer); return status; - } /* @@ -588,7 +587,7 @@ return scnprintf(buf, PAGE_SIZE, "input [gpu] unknown\n"); } - pr_err("alienware-wmi: unknown HDMI source status: %d\n", out_data); + pr_err("alienware-wmi: unknown HDMI source status: %u\n", status); return scnprintf(buf, PAGE_SIZE, "input gpu [unknown]\n"); } diff -Nru linux-4.19.98/drivers/platform/x86/dell-laptop.c linux-4.19.118/drivers/platform/x86/dell-laptop.c --- linux-4.19.98/drivers/platform/x86/dell-laptop.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/x86/dell-laptop.c 2020-04-23 08:30:24.000000000 +0000 @@ -37,6 +37,7 @@ struct quirk_entry { bool touchpad_led; + bool kbd_led_not_present; bool kbd_led_levels_off_1; bool kbd_missing_ac_tag; @@ -77,6 +78,10 @@ .kbd_led_levels_off_1 = true, }; +static struct quirk_entry quirk_dell_inspiron_1012 = { + .kbd_led_not_present = true, +}; + static struct platform_driver platform_driver = { .driver = { .name = "dell-laptop", @@ -314,6 +319,24 @@ }, .driver_data = &quirk_dell_latitude_e6410, }, + { + .callback = dmi_matched, + .ident = "Dell Inspiron 1012", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"), + }, + .driver_data = &quirk_dell_inspiron_1012, + }, + { + .callback = dmi_matched, + .ident = "Dell Inspiron 1018", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1018"), + }, + .driver_data = &quirk_dell_inspiron_1012, + }, { } }; @@ -1497,6 +1520,9 @@ { int ret; + if (quirks && quirks->kbd_led_not_present) + return; + ret = kbd_init_info(); kbd_init_tokens(); diff -Nru linux-4.19.98/drivers/platform/x86/gpd-pocket-fan.c linux-4.19.118/drivers/platform/x86/gpd-pocket-fan.c --- linux-4.19.98/drivers/platform/x86/gpd-pocket-fan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/x86/gpd-pocket-fan.c 2020-04-23 08:30:24.000000000 +0000 @@ -127,7 +127,7 @@ int i; for (i = 0; i < ARRAY_SIZE(temp_limits); i++) { - if (temp_limits[i] < 40000 || temp_limits[i] > 70000) { + if (temp_limits[i] < 20000 || temp_limits[i] > 90000) { dev_err(&pdev->dev, "Invalid temp-limit %d (must be between 40000 and 70000)\n", temp_limits[i]); temp_limits[0] = TEMP_LIMIT0_DEFAULT; diff -Nru linux-4.19.98/drivers/platform/x86/intel_mid_powerbtn.c linux-4.19.118/drivers/platform/x86/intel_mid_powerbtn.c --- linux-4.19.98/drivers/platform/x86/intel_mid_powerbtn.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/x86/intel_mid_powerbtn.c 2020-04-23 08:30:24.000000000 +0000 @@ -158,9 +158,10 @@ input_set_capability(input, EV_KEY, KEY_POWER); - ddata = (struct mid_pb_ddata *)id->driver_data; + ddata = devm_kmemdup(&pdev->dev, (void *)id->driver_data, + sizeof(*ddata), GFP_KERNEL); if (!ddata) - return -ENODATA; + return -ENOMEM; ddata->dev = &pdev->dev; ddata->irq = irq; diff -Nru linux-4.19.98/drivers/platform/x86/intel_scu_ipc.c linux-4.19.118/drivers/platform/x86/intel_scu_ipc.c --- linux-4.19.98/drivers/platform/x86/intel_scu_ipc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/x86/intel_scu_ipc.c 2020-04-23 08:30:24.000000000 +0000 @@ -69,26 +69,22 @@ struct intel_scu_ipc_pdata_t { u32 i2c_base; u32 i2c_len; - u8 irq_mode; }; static const struct intel_scu_ipc_pdata_t intel_scu_ipc_lincroft_pdata = { .i2c_base = 0xff12b000, .i2c_len = 0x10, - .irq_mode = 0, }; /* Penwell and Cloverview */ static const struct intel_scu_ipc_pdata_t intel_scu_ipc_penwell_pdata = { .i2c_base = 0xff12b000, .i2c_len = 0x10, - .irq_mode = 1, }; static const struct intel_scu_ipc_pdata_t intel_scu_ipc_tangier_pdata = { .i2c_base = 0xff00d000, .i2c_len = 0x10, - .irq_mode = 0, }; struct intel_scu_ipc_dev { @@ -101,6 +97,9 @@ static struct intel_scu_ipc_dev ipcdev; /* Only one for now */ +#define IPC_STATUS 0x04 +#define IPC_STATUS_IRQ BIT(2) + /* * IPC Read Buffer (Read Only): * 16 byte buffer for receiving data from SCU, if IPC command @@ -122,11 +121,8 @@ */ static inline void ipc_command(struct intel_scu_ipc_dev *scu, u32 cmd) { - if (scu->irq_mode) { - reinit_completion(&scu->cmd_complete); - writel(cmd | IPC_IOC, scu->ipc_base); - } - writel(cmd, scu->ipc_base); + reinit_completion(&scu->cmd_complete); + writel(cmd | IPC_IOC, scu->ipc_base); } /* @@ -612,9 +608,10 @@ static irqreturn_t ioc(int irq, void *dev_id) { struct intel_scu_ipc_dev *scu = dev_id; + int status = ipc_read_status(scu); - if (scu->irq_mode) - complete(&scu->cmd_complete); + writel(status | IPC_STATUS_IRQ, scu->ipc_base + IPC_STATUS); + complete(&scu->cmd_complete); return IRQ_HANDLED; } @@ -640,8 +637,6 @@ if (!pdata) return -ENODEV; - scu->irq_mode = pdata->irq_mode; - err = pcim_enable_device(pdev); if (err) return err; diff -Nru linux-4.19.98/drivers/platform/x86/pmc_atom.c linux-4.19.118/drivers/platform/x86/pmc_atom.c --- linux-4.19.98/drivers/platform/x86/pmc_atom.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/x86/pmc_atom.c 2020-04-23 08:30:24.000000000 +0000 @@ -415,6 +415,14 @@ }, { /* pmc_plt_clk* - are used for ethernet controllers */ + .ident = "Lex 2I385SW", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Lex BayTrail"), + DMI_MATCH(DMI_PRODUCT_NAME, "2I385SW"), + }, + }, + { + /* pmc_plt_clk* - are used for ethernet controllers */ .ident = "Beckhoff CB3163", .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Beckhoff Automation"), diff -Nru linux-4.19.98/drivers/platform/x86/wmi.c linux-4.19.118/drivers/platform/x86/wmi.c --- linux-4.19.98/drivers/platform/x86/wmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/platform/x86/wmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -768,6 +768,9 @@ struct wmi_block *wblock = dev_to_wblock(dev); const struct wmi_device_id *id = wmi_driver->id_table; + if (id == NULL) + return 0; + while (id->guid_string) { uuid_le driver_guid; diff -Nru linux-4.19.98/drivers/power/supply/axp288_charger.c linux-4.19.118/drivers/power/supply/axp288_charger.c --- linux-4.19.98/drivers/power/supply/axp288_charger.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/power/supply/axp288_charger.c 2020-04-23 08:30:24.000000000 +0000 @@ -28,6 +28,7 @@ #include #include #include +#include #define PS_STAT_VBUS_TRIGGER (1 << 0) #define PS_STAT_BAT_CHRG_DIR (1 << 2) @@ -552,6 +553,49 @@ return IRQ_HANDLED; } +/* + * The HP Pavilion x2 10 series comes in a number of variants: + * Bay Trail SoC + AXP288 PMIC, DMI_BOARD_NAME: "815D" + * Cherry Trail SoC + AXP288 PMIC, DMI_BOARD_NAME: "813E" + * Cherry Trail SoC + TI PMIC, DMI_BOARD_NAME: "827C" or "82F4" + * + * The variants with the AXP288 PMIC are all kinds of special: + * + * 1. All variants use a Type-C connector which the AXP288 does not support, so + * when using a Type-C charger it is not recognized. Unlike most AXP288 devices, + * this model actually has mostly working ACPI AC / Battery code, the ACPI code + * "solves" this by simply setting the input_current_limit to 3A. + * There are still some issues with the ACPI code, so we use this native driver, + * and to solve the charging not working (500mA is not enough) issue we hardcode + * the 3A input_current_limit like the ACPI code does. + * + * 2. If no charger is connected the machine boots with the vbus-path disabled. + * Normally this is done when a 5V boost converter is active to avoid the PMIC + * trying to charge from the 5V boost converter's output. This is done when + * an OTG host cable is inserted and the ID pin on the micro-B receptacle is + * pulled low and the ID pin has an ACPI event handler associated with it + * which re-enables the vbus-path when the ID pin is pulled high when the + * OTG host cable is removed. The Type-C connector has no ID pin, there is + * no ID pin handler and there appears to be no 5V boost converter, so we + * end up not charging because the vbus-path is disabled, until we unplug + * the charger which automatically clears the vbus-path disable bit and then + * on the second plug-in of the adapter we start charging. To solve the not + * charging on first charger plugin we unconditionally enable the vbus-path at + * probe on this model, which is safe since there is no 5V boost converter. + */ +static const struct dmi_system_id axp288_hp_x2_dmi_ids[] = { + { + /* + * Bay Trail model has "Hewlett-Packard" as sys_vendor, Cherry + * Trail model has "HP", so we only match on product_name. + */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"), + }, + }, + {} /* Terminating entry */ +}; + static void axp288_charger_extcon_evt_worker(struct work_struct *work) { struct axp288_chrg_info *info = @@ -575,7 +619,11 @@ } /* Determine cable/charger type */ - if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) { + if (dmi_check_system(axp288_hp_x2_dmi_ids)) { + /* See comment above axp288_hp_x2_dmi_ids declaration */ + dev_dbg(&info->pdev->dev, "HP X2 with Type-C, setting inlmt to 3A\n"); + current_limit = 3000000; + } else if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) { dev_dbg(&info->pdev->dev, "USB SDP charger is connected\n"); current_limit = 500000; } else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) { @@ -692,6 +740,13 @@ return ret; } + if (dmi_check_system(axp288_hp_x2_dmi_ids)) { + /* See comment above axp288_hp_x2_dmi_ids declaration */ + ret = axp288_charger_vbus_path_select(info, true); + if (ret < 0) + return ret; + } + /* Read current charge voltage and current limit */ ret = regmap_read(info->regmap, AXP20X_CHRG_CTRL1, &val); if (ret < 0) { diff -Nru linux-4.19.98/drivers/power/supply/axp288_fuel_gauge.c linux-4.19.118/drivers/power/supply/axp288_fuel_gauge.c --- linux-4.19.98/drivers/power/supply/axp288_fuel_gauge.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/power/supply/axp288_fuel_gauge.c 2020-04-23 08:30:24.000000000 +0000 @@ -718,14 +718,14 @@ { /* Intel Cherry Trail Compute Stick, Windows version */ .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), + DMI_MATCH(DMI_SYS_VENDOR, "Intel"), DMI_MATCH(DMI_PRODUCT_NAME, "STK1AW32SC"), }, }, { /* Intel Cherry Trail Compute Stick, version without an OS */ .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), + DMI_MATCH(DMI_SYS_VENDOR, "Intel"), DMI_MATCH(DMI_PRODUCT_NAME, "STK1A32SC"), }, }, diff -Nru linux-4.19.98/drivers/power/supply/bq27xxx_battery.c linux-4.19.118/drivers/power/supply/bq27xxx_battery.c --- linux-4.19.98/drivers/power/supply/bq27xxx_battery.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/power/supply/bq27xxx_battery.c 2020-04-23 08:30:24.000000000 +0000 @@ -1887,7 +1887,10 @@ di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg); if (IS_ERR(di->bat)) { - dev_err(di->dev, "failed to register battery\n"); + if (PTR_ERR(di->bat) == -EPROBE_DEFER) + dev_dbg(di->dev, "failed to register battery, deferring probe\n"); + else + dev_err(di->dev, "failed to register battery\n"); return PTR_ERR(di->bat); } diff -Nru linux-4.19.98/drivers/power/supply/ltc2941-battery-gauge.c linux-4.19.118/drivers/power/supply/ltc2941-battery-gauge.c --- linux-4.19.98/drivers/power/supply/ltc2941-battery-gauge.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/power/supply/ltc2941-battery-gauge.c 2020-04-23 08:30:24.000000000 +0000 @@ -448,7 +448,7 @@ { struct ltc294x_info *info = i2c_get_clientdata(client); - cancel_delayed_work(&info->work); + cancel_delayed_work_sync(&info->work); power_supply_unregister(info->supply); return 0; } diff -Nru linux-4.19.98/drivers/power/supply/power_supply_core.c linux-4.19.118/drivers/power/supply/power_supply_core.c --- linux-4.19.98/drivers/power/supply/power_supply_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/power/supply/power_supply_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -902,14 +902,14 @@ } spin_lock_init(&psy->changed_lock); - rc = device_init_wakeup(dev, ws); - if (rc) - goto wakeup_init_failed; - rc = device_add(dev); if (rc) goto device_add_failed; + rc = device_init_wakeup(dev, ws); + if (rc) + goto wakeup_init_failed; + rc = psy_register_thermal(psy); if (rc) goto register_thermal_failed; @@ -946,8 +946,8 @@ psy_unregister_thermal(psy); register_thermal_failed: device_del(dev); -device_add_failed: wakeup_init_failed: +device_add_failed: check_supplies_failed: dev_set_name_failed: put_device(dev); diff -Nru linux-4.19.98/drivers/pwm/pwm-lpss.c linux-4.19.118/drivers/pwm/pwm-lpss.c --- linux-4.19.98/drivers/pwm/pwm-lpss.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pwm/pwm-lpss.c 2020-04-23 08:30:24.000000000 +0000 @@ -216,6 +216,12 @@ int pwm_lpss_remove(struct pwm_lpss_chip *lpwm) { + int i; + + for (i = 0; i < lpwm->info->npwm; i++) { + if (pwm_is_enabled(&lpwm->chip.pwms[i])) + pm_runtime_put(lpwm->chip.dev); + } return pwmchip_remove(&lpwm->chip); } EXPORT_SYMBOL_GPL(pwm_lpss_remove); diff -Nru linux-4.19.98/drivers/pwm/pwm-meson.c linux-4.19.118/drivers/pwm/pwm-meson.c --- linux-4.19.98/drivers/pwm/pwm-meson.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pwm/pwm-meson.c 2020-04-23 08:30:24.000000000 +0000 @@ -188,7 +188,7 @@ do_div(fin_ps, fin_freq); /* Calc pre_div with the period */ - for (pre_div = 0; pre_div < MISC_CLK_DIV_MASK; pre_div++) { + for (pre_div = 0; pre_div <= MISC_CLK_DIV_MASK; pre_div++) { cnt = DIV_ROUND_CLOSEST_ULL((u64)period * 1000, fin_ps * (pre_div + 1)); dev_dbg(meson->chip.dev, "fin_ps=%llu pre_div=%u cnt=%u\n", @@ -197,7 +197,7 @@ break; } - if (pre_div == MISC_CLK_DIV_MASK) { + if (pre_div > MISC_CLK_DIV_MASK) { dev_err(meson->chip.dev, "unable to get period pre_div\n"); return -EINVAL; } @@ -325,11 +325,6 @@ if (state->period != channel->state.period || state->duty_cycle != channel->state.duty_cycle || state->polarity != channel->state.polarity) { - if (channel->state.enabled) { - meson_pwm_disable(meson, pwm->hwpwm); - channel->state.enabled = false; - } - if (state->polarity != channel->state.polarity) { if (state->polarity == PWM_POLARITY_NORMAL) meson->inverter_mask |= BIT(pwm->hwpwm); diff -Nru linux-4.19.98/drivers/pwm/pwm-omap-dmtimer.c linux-4.19.118/drivers/pwm/pwm-omap-dmtimer.c --- linux-4.19.98/drivers/pwm/pwm-omap-dmtimer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pwm/pwm-omap-dmtimer.c 2020-04-23 08:30:24.000000000 +0000 @@ -259,7 +259,7 @@ if (!timer_pdev) { dev_err(&pdev->dev, "Unable to find Timer pdev\n"); ret = -ENODEV; - goto put; + goto err_find_timer_pdev; } timer_pdata = dev_get_platdata(&timer_pdev->dev); @@ -267,7 +267,7 @@ dev_dbg(&pdev->dev, "dmtimer pdata structure NULL, deferring probe\n"); ret = -EPROBE_DEFER; - goto put; + goto err_platdata; } pdata = timer_pdata->timer_ops; @@ -286,30 +286,25 @@ !pdata->write_counter) { dev_err(&pdev->dev, "Incomplete dmtimer pdata structure\n"); ret = -EINVAL; - goto put; + goto err_platdata; } if (!of_get_property(timer, "ti,timer-pwm", NULL)) { dev_err(&pdev->dev, "Missing ti,timer-pwm capability\n"); ret = -ENODEV; - goto put; + goto err_timer_property; } dm_timer = pdata->request_by_node(timer); if (!dm_timer) { ret = -EPROBE_DEFER; - goto put; + goto err_request_timer; } -put: - of_node_put(timer); - if (ret < 0) - return ret; - omap = devm_kzalloc(&pdev->dev, sizeof(*omap), GFP_KERNEL); if (!omap) { - pdata->free(dm_timer); - return -ENOMEM; + ret = -ENOMEM; + goto err_alloc_omap; } omap->pdata = pdata; @@ -342,27 +337,56 @@ ret = pwmchip_add(&omap->chip); if (ret < 0) { dev_err(&pdev->dev, "failed to register PWM\n"); - omap->pdata->free(omap->dm_timer); - return ret; + goto err_pwmchip_add; } + of_node_put(timer); + platform_set_drvdata(pdev, omap); return 0; + +err_pwmchip_add: + + /* + * *omap is allocated using devm_kzalloc, + * so no free necessary here + */ +err_alloc_omap: + + pdata->free(dm_timer); +err_request_timer: + +err_timer_property: +err_platdata: + + put_device(&timer_pdev->dev); +err_find_timer_pdev: + + of_node_put(timer); + + return ret; } static int pwm_omap_dmtimer_remove(struct platform_device *pdev) { struct pwm_omap_dmtimer_chip *omap = platform_get_drvdata(pdev); + int ret; + + ret = pwmchip_remove(&omap->chip); + if (ret) + return ret; if (pm_runtime_active(&omap->dm_timer_pdev->dev)) omap->pdata->stop(omap->dm_timer); omap->pdata->free(omap->dm_timer); + put_device(&omap->dm_timer_pdev->dev); + mutex_destroy(&omap->mutex); - return pwmchip_remove(&omap->chip); + return 0; } static const struct of_device_id pwm_omap_dmtimer_of_match[] = { diff -Nru linux-4.19.98/drivers/pwm/pwm-pca9685.c linux-4.19.118/drivers/pwm/pwm-pca9685.c --- linux-4.19.98/drivers/pwm/pwm-pca9685.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/pwm/pwm-pca9685.c 2020-04-23 08:30:24.000000000 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include /* * Because the PCA9685 has only one prescaler per chip, changing the period of @@ -85,6 +86,7 @@ #if IS_ENABLED(CONFIG_GPIOLIB) struct mutex lock; struct gpio_chip gpio; + DECLARE_BITMAP(pwms_inuse, PCA9685_MAXCHAN + 1); #endif }; @@ -94,51 +96,51 @@ } #if IS_ENABLED(CONFIG_GPIOLIB) -static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int offset) +static bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca, int pwm_idx) { - struct pca9685 *pca = gpiochip_get_data(gpio); - struct pwm_device *pwm; + bool is_inuse; mutex_lock(&pca->lock); - - pwm = &pca->chip.pwms[offset]; - - if (pwm->flags & (PWMF_REQUESTED | PWMF_EXPORTED)) { - mutex_unlock(&pca->lock); - return -EBUSY; + if (pwm_idx >= PCA9685_MAXCHAN) { + /* + * "all LEDs" channel: + * pretend already in use if any of the PWMs are requested + */ + if (!bitmap_empty(pca->pwms_inuse, PCA9685_MAXCHAN)) { + is_inuse = true; + goto out; + } + } else { + /* + * regular channel: + * pretend already in use if the "all LEDs" channel is requested + */ + if (test_bit(PCA9685_MAXCHAN, pca->pwms_inuse)) { + is_inuse = true; + goto out; + } } - - pwm_set_chip_data(pwm, (void *)1); - + is_inuse = test_and_set_bit(pwm_idx, pca->pwms_inuse); +out: mutex_unlock(&pca->lock); - pm_runtime_get_sync(pca->chip.dev); - return 0; + return is_inuse; } -static bool pca9685_pwm_is_gpio(struct pca9685 *pca, struct pwm_device *pwm) +static void pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx) { - bool is_gpio = false; - mutex_lock(&pca->lock); + clear_bit(pwm_idx, pca->pwms_inuse); + mutex_unlock(&pca->lock); +} - if (pwm->hwpwm >= PCA9685_MAXCHAN) { - unsigned int i; - - /* - * Check if any of the GPIOs are requested and in that case - * prevent using the "all LEDs" channel. - */ - for (i = 0; i < pca->gpio.ngpio; i++) - if (gpiochip_is_requested(&pca->gpio, i)) { - is_gpio = true; - break; - } - } else if (pwm_get_chip_data(pwm)) { - is_gpio = true; - } +static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int offset) +{ + struct pca9685 *pca = gpiochip_get_data(gpio); - mutex_unlock(&pca->lock); - return is_gpio; + if (pca9685_pwm_test_and_set_inuse(pca, offset)) + return -EBUSY; + pm_runtime_get_sync(pca->chip.dev); + return 0; } static int pca9685_pwm_gpio_get(struct gpio_chip *gpio, unsigned int offset) @@ -170,13 +172,10 @@ static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset) { struct pca9685 *pca = gpiochip_get_data(gpio); - struct pwm_device *pwm; pca9685_pwm_gpio_set(gpio, offset, 0); pm_runtime_put(pca->chip.dev); - mutex_lock(&pca->lock); - pwm = &pca->chip.pwms[offset]; - mutex_unlock(&pca->lock); + pca9685_pwm_clear_inuse(pca, offset); } static int pca9685_pwm_gpio_get_direction(struct gpio_chip *chip, @@ -228,12 +227,17 @@ return devm_gpiochip_add_data(dev, &pca->gpio, pca); } #else -static inline bool pca9685_pwm_is_gpio(struct pca9685 *pca, - struct pwm_device *pwm) +static inline bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca, + int pwm_idx) { return false; } +static inline void +pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx) +{ +} + static inline int pca9685_pwm_gpio_probe(struct pca9685 *pca) { return 0; @@ -417,7 +421,7 @@ { struct pca9685 *pca = to_pca(chip); - if (pca9685_pwm_is_gpio(pca, pwm)) + if (pca9685_pwm_test_and_set_inuse(pca, pwm->hwpwm)) return -EBUSY; pm_runtime_get_sync(chip->dev); @@ -426,8 +430,11 @@ static void pca9685_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) { + struct pca9685 *pca = to_pca(chip); + pca9685_pwm_disable(chip, pwm); pm_runtime_put(chip->dev); + pca9685_pwm_clear_inuse(pca, pwm->hwpwm); } static const struct pwm_ops pca9685_pwm_ops = { diff -Nru linux-4.19.98/drivers/rapidio/rio_cm.c linux-4.19.118/drivers/rapidio/rio_cm.c --- linux-4.19.98/drivers/rapidio/rio_cm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rapidio/rio_cm.c 2020-04-23 08:30:24.000000000 +0000 @@ -1215,7 +1215,9 @@ riocm_debug(CHOP, "(ch_%d)", ch_id); ch = riocm_get_channel(ch_id); - if (!ch || !riocm_cmp_exch(ch, RIO_CM_CHAN_BOUND, RIO_CM_LISTEN)) + if (!ch) + return -EINVAL; + if (!riocm_cmp_exch(ch, RIO_CM_CHAN_BOUND, RIO_CM_LISTEN)) ret = -EINVAL; riocm_put_channel(ch); return ret; diff -Nru linux-4.19.98/drivers/regulator/lp87565-regulator.c linux-4.19.118/drivers/regulator/lp87565-regulator.c --- linux-4.19.98/drivers/regulator/lp87565-regulator.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/regulator/lp87565-regulator.c 2020-04-23 08:30:24.000000000 +0000 @@ -193,7 +193,7 @@ struct lp87565 *lp87565 = dev_get_drvdata(pdev->dev.parent); struct regulator_config config = { }; struct regulator_dev *rdev; - int i, min_idx = LP87565_BUCK_1, max_idx = LP87565_BUCK_3; + int i, min_idx = LP87565_BUCK_0, max_idx = LP87565_BUCK_3; platform_set_drvdata(pdev, lp87565); diff -Nru linux-4.19.98/drivers/regulator/pv88060-regulator.c linux-4.19.118/drivers/regulator/pv88060-regulator.c --- linux-4.19.98/drivers/regulator/pv88060-regulator.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/regulator/pv88060-regulator.c 2020-04-23 08:30:24.000000000 +0000 @@ -135,7 +135,7 @@ int i; /* search for closest to maximum */ - for (i = info->n_current_limits; i >= 0; i--) { + for (i = info->n_current_limits - 1; i >= 0; i--) { if (min <= info->current_limits[i] && max >= info->current_limits[i]) { return regmap_update_bits(rdev->regmap, diff -Nru linux-4.19.98/drivers/regulator/pv88080-regulator.c linux-4.19.118/drivers/regulator/pv88080-regulator.c --- linux-4.19.98/drivers/regulator/pv88080-regulator.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/regulator/pv88080-regulator.c 2020-04-23 08:30:24.000000000 +0000 @@ -279,7 +279,7 @@ int i; /* search for closest to maximum */ - for (i = info->n_current_limits; i >= 0; i--) { + for (i = info->n_current_limits - 1; i >= 0; i--) { if (min <= info->current_limits[i] && max >= info->current_limits[i]) { return regmap_update_bits(rdev->regmap, diff -Nru linux-4.19.98/drivers/regulator/pv88090-regulator.c linux-4.19.118/drivers/regulator/pv88090-regulator.c --- linux-4.19.98/drivers/regulator/pv88090-regulator.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/regulator/pv88090-regulator.c 2020-04-23 08:30:24.000000000 +0000 @@ -157,7 +157,7 @@ int i; /* search for closest to maximum */ - for (i = info->n_current_limits; i >= 0; i--) { + for (i = info->n_current_limits - 1; i >= 0; i--) { if (min <= info->current_limits[i] && max >= info->current_limits[i]) { return regmap_update_bits(rdev->regmap, diff -Nru linux-4.19.98/drivers/regulator/rk808-regulator.c linux-4.19.118/drivers/regulator/rk808-regulator.c --- linux-4.19.98/drivers/regulator/rk808-regulator.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/regulator/rk808-regulator.c 2020-04-23 08:30:24.000000000 +0000 @@ -714,7 +714,7 @@ } if (!pdata->dvs_gpio[i]) { - dev_warn(dev, "there is no dvs%d gpio\n", i); + dev_info(dev, "there is no dvs%d gpio\n", i); continue; } diff -Nru linux-4.19.98/drivers/regulator/tps65086-regulator.c linux-4.19.118/drivers/regulator/tps65086-regulator.c --- linux-4.19.98/drivers/regulator/tps65086-regulator.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/regulator/tps65086-regulator.c 2020-04-23 08:30:24.000000000 +0000 @@ -90,8 +90,8 @@ static const struct regulator_linear_range tps65086_ldoa1_ranges[] = { REGULATOR_LINEAR_RANGE(1350000, 0x0, 0x0, 0), REGULATOR_LINEAR_RANGE(1500000, 0x1, 0x7, 100000), - REGULATOR_LINEAR_RANGE(2300000, 0x8, 0xA, 100000), - REGULATOR_LINEAR_RANGE(2700000, 0xB, 0xD, 150000), + REGULATOR_LINEAR_RANGE(2300000, 0x8, 0xB, 100000), + REGULATOR_LINEAR_RANGE(2850000, 0xC, 0xD, 150000), REGULATOR_LINEAR_RANGE(3300000, 0xE, 0xE, 0), }; diff -Nru linux-4.19.98/drivers/regulator/wm831x-dcdc.c linux-4.19.118/drivers/regulator/wm831x-dcdc.c --- linux-4.19.98/drivers/regulator/wm831x-dcdc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/regulator/wm831x-dcdc.c 2020-04-23 08:30:24.000000000 +0000 @@ -327,8 +327,8 @@ } /* Current limit options */ -static u16 wm831x_dcdc_ilim[] = { - 125, 250, 375, 500, 625, 750, 875, 1000 +static const unsigned int wm831x_dcdc_ilim[] = { + 125000, 250000, 375000, 500000, 625000, 750000, 875000, 1000000 }; static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev, diff -Nru linux-4.19.98/drivers/remoteproc/qcom_q6v5_pil.c linux-4.19.118/drivers/remoteproc/qcom_q6v5_pil.c --- linux-4.19.98/drivers/remoteproc/qcom_q6v5_pil.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/remoteproc/qcom_q6v5_pil.c 2020-04-23 08:30:24.000000000 +0000 @@ -1268,16 +1268,26 @@ static const struct rproc_hexagon_res msm8996_mss = { .hexagon_mba_image = "mba.mbn", + .proxy_supply = (struct qcom_mss_reg_res[]) { + { + .supply = "pll", + .uA = 100000, + }, + {} + }, .proxy_clk_names = (char*[]){ "xo", "pnoc", + "qdss", NULL }, .active_clk_names = (char*[]){ "iface", "bus", "mem", - "gpll0_mss_clk", + "gpll0_mss", + "snoc_axi", + "mnoc_axi", NULL }, .need_mem_protection = true, diff -Nru linux-4.19.98/drivers/remoteproc/remoteproc_core.c linux-4.19.118/drivers/remoteproc/remoteproc_core.c --- linux-4.19.98/drivers/remoteproc/remoteproc_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/remoteproc/remoteproc_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -1786,7 +1786,7 @@ return 0; } -module_init(remoteproc_init); +subsys_initcall(remoteproc_init); static void __exit remoteproc_exit(void) { diff -Nru linux-4.19.98/drivers/reset/reset-uniphier.c linux-4.19.118/drivers/reset/reset-uniphier.c --- linux-4.19.98/drivers/reset/reset-uniphier.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/reset/reset-uniphier.c 2020-04-23 08:30:24.000000000 +0000 @@ -202,8 +202,8 @@ #define UNIPHIER_PERI_RESET_FI2C(id, ch) \ UNIPHIER_RESETX((id), 0x114, 24 + (ch)) -#define UNIPHIER_PERI_RESET_SCSSI(id) \ - UNIPHIER_RESETX((id), 0x110, 17) +#define UNIPHIER_PERI_RESET_SCSSI(id, ch) \ + UNIPHIER_RESETX((id), 0x110, 17 + (ch)) #define UNIPHIER_PERI_RESET_MCSSI(id) \ UNIPHIER_RESETX((id), 0x114, 14) @@ -218,7 +218,7 @@ UNIPHIER_PERI_RESET_I2C(6, 2), UNIPHIER_PERI_RESET_I2C(7, 3), UNIPHIER_PERI_RESET_I2C(8, 4), - UNIPHIER_PERI_RESET_SCSSI(11), + UNIPHIER_PERI_RESET_SCSSI(11, 0), UNIPHIER_RESET_END, }; @@ -234,8 +234,11 @@ UNIPHIER_PERI_RESET_FI2C(8, 4), UNIPHIER_PERI_RESET_FI2C(9, 5), UNIPHIER_PERI_RESET_FI2C(10, 6), - UNIPHIER_PERI_RESET_SCSSI(11), - UNIPHIER_PERI_RESET_MCSSI(12), + UNIPHIER_PERI_RESET_SCSSI(11, 0), + UNIPHIER_PERI_RESET_SCSSI(12, 1), + UNIPHIER_PERI_RESET_SCSSI(13, 2), + UNIPHIER_PERI_RESET_SCSSI(14, 3), + UNIPHIER_PERI_RESET_MCSSI(15), UNIPHIER_RESET_END, }; diff -Nru linux-4.19.98/drivers/rpmsg/qcom_glink_native.c linux-4.19.118/drivers/rpmsg/qcom_glink_native.c --- linux-4.19.98/drivers/rpmsg/qcom_glink_native.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rpmsg/qcom_glink_native.c 2020-04-23 08:30:24.000000000 +0000 @@ -813,9 +813,6 @@ return -EAGAIN; } - if (WARN(chunk_size % 4, "Incoming data must be word aligned\n")) - return -EINVAL; - rcid = le16_to_cpu(hdr.msg.param1); spin_lock_irqsave(&glink->idr_lock, flags); channel = idr_find(&glink->rcids, rcid); diff -Nru linux-4.19.98/drivers/rtc/Kconfig linux-4.19.118/drivers/rtc/Kconfig --- linux-4.19.98/drivers/rtc/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -314,6 +314,7 @@ config RTC_DRV_MAX8907 tristate "Maxim MAX8907" depends on MFD_MAX8907 || COMPILE_TEST + select REGMAP_IRQ help If you say yes here you will get support for the RTC of Maxim MAX8907 PMIC. diff -Nru linux-4.19.98/drivers/rtc/rtc-88pm80x.c linux-4.19.118/drivers/rtc/rtc-88pm80x.c --- linux-4.19.98/drivers/rtc/rtc-88pm80x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-88pm80x.c 2020-04-23 08:30:24.000000000 +0000 @@ -114,12 +114,14 @@ unsigned char buf[4]; unsigned long ticks, base, data; regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); - base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); /* load 32-bit read-only counter */ regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -137,7 +139,8 @@ /* load 32-bit read-only counter */ regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; base = ticks - data; dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -158,11 +161,13 @@ int ret; regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); - base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -185,12 +190,14 @@ regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0); regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4); - base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]); /* load 32-bit read-only counter */ regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); diff -Nru linux-4.19.98/drivers/rtc/rtc-88pm860x.c linux-4.19.118/drivers/rtc/rtc-88pm860x.c --- linux-4.19.98/drivers/rtc/rtc-88pm860x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-88pm860x.c 2020-04-23 08:30:24.000000000 +0000 @@ -115,11 +115,13 @@ pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); - base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; + base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | + (buf[5] << 8) | buf[7]; /* load 32-bit read-only counter */ pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -145,7 +147,8 @@ /* load 32-bit read-only counter */ pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; base = ticks - data; dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -170,10 +173,12 @@ pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); - base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; + base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | + (buf[5] << 8) | buf[7]; pm860x_bulk_read(info->i2c, PM8607_RTC_EXPIRE1, 4, buf); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -198,11 +203,13 @@ pm860x_page_bulk_read(info->i2c, REG0_ADDR, 8, buf); dev_dbg(info->dev, "%x-%x-%x-%x-%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); - base = (buf[1] << 24) | (buf[3] << 16) | (buf[5] << 8) | buf[7]; + base = ((unsigned long)buf[1] << 24) | (buf[3] << 16) | + (buf[5] << 8) | buf[7]; /* load 32-bit read-only counter */ pm860x_bulk_read(info->i2c, PM8607_RTC_COUNTER1, 4, buf); - data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; ticks = base + data; dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n", base, data, ticks); @@ -334,6 +341,10 @@ info->dev = &pdev->dev; dev_set_drvdata(&pdev->dev, info); + info->rtc_dev = devm_rtc_allocate_device(&pdev->dev); + if (IS_ERR(info->rtc_dev)) + return PTR_ERR(info->rtc_dev); + ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, rtc_update_handler, IRQF_ONESHOT, "rtc", info); @@ -375,13 +386,11 @@ } } - info->rtc_dev = devm_rtc_device_register(&pdev->dev, "88pm860x-rtc", - &pm860x_rtc_ops, THIS_MODULE); - ret = PTR_ERR(info->rtc_dev); - if (IS_ERR(info->rtc_dev)) { - dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret); + info->rtc_dev->ops = &pm860x_rtc_ops; + + ret = rtc_register_device(info->rtc_dev); + if (ret) return ret; - } /* * enable internal XO instead of internal 3.25MHz clock since it can diff -Nru linux-4.19.98/drivers/rtc/rtc-cmos.c linux-4.19.118/drivers/rtc/rtc-cmos.c --- linux-4.19.98/drivers/rtc/rtc-cmos.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-cmos.c 2020-04-23 08:30:24.000000000 +0000 @@ -854,7 +854,7 @@ rtc_cmos_int_handler = cmos_interrupt; retval = request_irq(rtc_irq, rtc_cmos_int_handler, - IRQF_SHARED, dev_name(&cmos_rtc.rtc->dev), + 0, dev_name(&cmos_rtc.rtc->dev), cmos_rtc.rtc); if (retval < 0) { dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); diff -Nru linux-4.19.98/drivers/rtc/rtc-ds1307.c linux-4.19.118/drivers/rtc/rtc-ds1307.c --- linux-4.19.98/drivers/rtc/rtc-ds1307.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-ds1307.c 2020-04-23 08:30:24.000000000 +0000 @@ -749,8 +749,8 @@ if (ret < 0) return ret; - ctl[0] &= ~RX8130_REG_EXTENSION_WADA; - ctl[1] |= RX8130_REG_FLAG_AF; + ctl[0] &= RX8130_REG_EXTENSION_WADA; + ctl[1] &= ~RX8130_REG_FLAG_AF; ctl[2] &= ~RX8130_REG_CONTROL0_AIE; ret = regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, @@ -773,8 +773,7 @@ ctl[2] |= RX8130_REG_CONTROL0_AIE; - return regmap_bulk_write(ds1307->regmap, RX8130_REG_EXTENSION, ctl, - sizeof(ctl)); + return regmap_write(ds1307->regmap, RX8130_REG_CONTROL0, ctl[2]); } static int rx8130_alarm_irq_enable(struct device *dev, unsigned int enabled) diff -Nru linux-4.19.98/drivers/rtc/rtc-ds1672.c linux-4.19.118/drivers/rtc/rtc-ds1672.c --- linux-4.19.98/drivers/rtc/rtc-ds1672.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-ds1672.c 2020-04-23 08:30:24.000000000 +0000 @@ -58,7 +58,8 @@ "%s: raw read data - counters=%02x,%02x,%02x,%02x\n", __func__, buf[0], buf[1], buf[2], buf[3]); - time = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + time = ((unsigned long)buf[3] << 24) | (buf[2] << 16) | + (buf[1] << 8) | buf[0]; rtc_time_to_tm(time, tm); diff -Nru linux-4.19.98/drivers/rtc/rtc-hym8563.c linux-4.19.118/drivers/rtc/rtc-hym8563.c --- linux-4.19.98/drivers/rtc/rtc-hym8563.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-hym8563.c 2020-04-23 08:30:24.000000000 +0000 @@ -105,7 +105,7 @@ if (!hym8563->valid) { dev_warn(&client->dev, "no valid clock/calendar values available\n"); - return -EPERM; + return -EINVAL; } ret = i2c_smbus_read_i2c_block_data(client, HYM8563_SEC, 7, buf); diff -Nru linux-4.19.98/drivers/rtc/rtc-mc146818-lib.c linux-4.19.118/drivers/rtc/rtc-mc146818-lib.c --- linux-4.19.98/drivers/rtc/rtc-mc146818-lib.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-mc146818-lib.c 2020-04-23 08:30:24.000000000 +0000 @@ -82,7 +82,7 @@ time->tm_year += real_year - 72; #endif - if (century) + if (century > 20) time->tm_year += (century - 19) * 100; /* diff -Nru linux-4.19.98/drivers/rtc/rtc-mt6397.c linux-4.19.118/drivers/rtc/rtc-mt6397.c --- linux-4.19.98/drivers/rtc/rtc-mt6397.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-mt6397.c 2020-04-23 08:30:24.000000000 +0000 @@ -362,7 +362,7 @@ if (ret) { dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", rtc->irq, ret); - goto out_dispose_irq; + return ret; } device_init_wakeup(&pdev->dev, 1); @@ -378,9 +378,7 @@ return 0; out_free_irq: - free_irq(rtc->irq, rtc->rtc_dev); -out_dispose_irq: - irq_dispose_mapping(rtc->irq); + free_irq(rtc->irq, rtc); return ret; } @@ -388,8 +386,7 @@ { struct mt6397_rtc *rtc = platform_get_drvdata(pdev); - free_irq(rtc->irq, rtc->rtc_dev); - irq_dispose_mapping(rtc->irq); + free_irq(rtc->irq, rtc); return 0; } diff -Nru linux-4.19.98/drivers/rtc/rtc-omap.c linux-4.19.118/drivers/rtc/rtc-omap.c --- linux-4.19.98/drivers/rtc/rtc-omap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-omap.c 2020-04-23 08:30:24.000000000 +0000 @@ -561,9 +561,7 @@ .dt_free_map = pinconf_generic_dt_free_map, }; -enum rtc_pin_config_param { - PIN_CONFIG_ACTIVE_HIGH = PIN_CONFIG_END + 1, -}; +#define PIN_CONFIG_ACTIVE_HIGH (PIN_CONFIG_END + 1) static const struct pinconf_generic_params rtc_params[] = { {"ti,active-high", PIN_CONFIG_ACTIVE_HIGH, 0}, diff -Nru linux-4.19.98/drivers/rtc/rtc-pcf2127.c linux-4.19.118/drivers/rtc/rtc-pcf2127.c --- linux-4.19.98/drivers/rtc/rtc-pcf2127.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-pcf2127.c 2020-04-23 08:30:24.000000000 +0000 @@ -57,20 +57,14 @@ struct pcf2127 *pcf2127 = dev_get_drvdata(dev); unsigned char buf[10]; int ret; - int i; - for (i = 0; i <= PCF2127_REG_CTRL3; i++) { - ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1 + i, - (unsigned int *)(buf + i)); - if (ret) { - dev_err(dev, "%s: read error\n", __func__); - return ret; - } - } - - ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_SC, - (buf + PCF2127_REG_SC), - ARRAY_SIZE(buf) - PCF2127_REG_SC); + /* + * Avoid reading CTRL2 register as it causes WD_VAL register + * value to reset to 0 which means watchdog is stopped. + */ + ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL3, + (buf + PCF2127_REG_CTRL3), + ARRAY_SIZE(buf) - PCF2127_REG_CTRL3); if (ret) { dev_err(dev, "%s: read error\n", __func__); return ret; @@ -91,14 +85,12 @@ } dev_dbg(dev, - "%s: raw data is cr1=%02x, cr2=%02x, cr3=%02x, " - "sec=%02x, min=%02x, hr=%02x, " + "%s: raw data is cr3=%02x, sec=%02x, min=%02x, hr=%02x, " "mday=%02x, wday=%02x, mon=%02x, year=%02x\n", - __func__, - buf[0], buf[1], buf[2], - buf[3], buf[4], buf[5], - buf[6], buf[7], buf[8], buf[9]); - + __func__, buf[PCF2127_REG_CTRL3], buf[PCF2127_REG_SC], + buf[PCF2127_REG_MN], buf[PCF2127_REG_HR], + buf[PCF2127_REG_DM], buf[PCF2127_REG_DW], + buf[PCF2127_REG_MO], buf[PCF2127_REG_YR]); tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F); tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F); diff -Nru linux-4.19.98/drivers/rtc/rtc-pcf8563.c linux-4.19.118/drivers/rtc/rtc-pcf8563.c --- linux-4.19.98/drivers/rtc/rtc-pcf8563.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-pcf8563.c 2020-04-23 08:30:24.000000000 +0000 @@ -563,7 +563,6 @@ struct pcf8563 *pcf8563; int err; unsigned char buf; - unsigned char alm_pending; dev_dbg(&client->dev, "%s\n", __func__); @@ -587,13 +586,13 @@ return err; } - err = pcf8563_get_alarm_mode(client, NULL, &alm_pending); - if (err) { - dev_err(&client->dev, "%s: read error\n", __func__); + /* Clear flags and disable interrupts */ + buf = 0; + err = pcf8563_write_block_data(client, PCF8563_REG_ST2, 1, &buf); + if (err < 0) { + dev_err(&client->dev, "%s: write error\n", __func__); return err; } - if (alm_pending) - pcf8563_set_alarm_mode(client, 0); pcf8563->rtc = devm_rtc_device_register(&client->dev, pcf8563_driver.driver.name, @@ -605,7 +604,7 @@ if (client->irq > 0) { err = devm_request_threaded_irq(&client->dev, client->irq, NULL, pcf8563_irq, - IRQF_SHARED|IRQF_ONESHOT|IRQF_TRIGGER_FALLING, + IRQF_SHARED | IRQF_ONESHOT | IRQF_TRIGGER_LOW, pcf8563_driver.driver.name, client); if (err) { dev_err(&client->dev, "unable to request IRQ %d\n", diff -Nru linux-4.19.98/drivers/rtc/rtc-pm8xxx.c linux-4.19.118/drivers/rtc/rtc-pm8xxx.c --- linux-4.19.98/drivers/rtc/rtc-pm8xxx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-pm8xxx.c 2020-04-23 08:30:24.000000000 +0000 @@ -213,7 +213,8 @@ } } - secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); + secs = value[0] | (value[1] << 8) | (value[2] << 16) | + ((unsigned long)value[3] << 24); rtc_time_to_tm(secs, tm); @@ -288,7 +289,8 @@ return rc; } - secs = value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); + secs = value[0] | (value[1] << 8) | (value[2] << 16) | + ((unsigned long)value[3] << 24); rtc_time_to_tm(secs, &alarm->time); diff -Nru linux-4.19.98/drivers/rtc/rtc-rv3029c2.c linux-4.19.118/drivers/rtc/rtc-rv3029c2.c --- linux-4.19.98/drivers/rtc/rtc-rv3029c2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/rtc/rtc-rv3029c2.c 2020-04-23 08:30:24.000000000 +0000 @@ -282,13 +282,13 @@ static int rv3029_eeprom_write(struct device *dev, u8 reg, u8 const buf[], size_t len) { - int ret; + int ret, err; size_t i; u8 tmp; - ret = rv3029_eeprom_enter(dev); - if (ret < 0) - return ret; + err = rv3029_eeprom_enter(dev); + if (err < 0) + return err; for (i = 0; i < len; i++, reg++) { ret = rv3029_read_regs(dev, reg, &tmp, 1); @@ -304,11 +304,11 @@ break; } - ret = rv3029_eeprom_exit(dev); - if (ret < 0) - return ret; + err = rv3029_eeprom_exit(dev); + if (err < 0) + return err; - return 0; + return ret; } static int rv3029_eeprom_update_bits(struct device *dev, diff -Nru linux-4.19.98/drivers/s390/cio/blacklist.c linux-4.19.118/drivers/s390/cio/blacklist.c --- linux-4.19.98/drivers/s390/cio/blacklist.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/cio/blacklist.c 2020-04-23 08:30:24.000000000 +0000 @@ -303,8 +303,10 @@ cio_ignore_proc_seq_next(struct seq_file *s, void *it, loff_t *offset) { struct ccwdev_iter *iter; + loff_t p = *offset; - if (*offset >= (__MAX_SUBCHANNEL + 1) * (__MAX_SSID + 1)) + (*offset)++; + if (p >= (__MAX_SUBCHANNEL + 1) * (__MAX_SSID + 1)) return NULL; iter = it; if (iter->devno == __MAX_SUBCHANNEL) { @@ -314,7 +316,6 @@ return NULL; } else iter->devno++; - (*offset)++; return iter; } diff -Nru linux-4.19.98/drivers/s390/cio/qdio_setup.c linux-4.19.118/drivers/s390/cio/qdio_setup.c --- linux-4.19.98/drivers/s390/cio/qdio_setup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/cio/qdio_setup.c 2020-04-23 08:30:24.000000000 +0000 @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "cio.h" @@ -208,7 +209,7 @@ /* fill in sl */ for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++) - q->sl->element[j].sbal = (unsigned long)q->sbal[j]; + q->sl->element[j].sbal = virt_to_phys(q->sbal[j]); } static void setup_queues(struct qdio_irq *irq_ptr, diff -Nru linux-4.19.98/drivers/s390/crypto/ap_bus.h linux-4.19.118/drivers/s390/crypto/ap_bus.h --- linux-4.19.98/drivers/s390/crypto/ap_bus.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/crypto/ap_bus.h 2020-04-23 08:30:24.000000000 +0000 @@ -158,7 +158,7 @@ unsigned int functions; /* AP device function bitfield. */ int queue_depth; /* AP queue depth.*/ int id; /* AP card number. */ - atomic_t total_request_count; /* # requests ever for this AP device.*/ + atomic64_t total_request_count; /* # requests ever for this AP device.*/ }; #define to_ap_card(x) container_of((x), struct ap_card, ap_dev.device) @@ -175,7 +175,7 @@ enum ap_state state; /* State of the AP device. */ int pendingq_count; /* # requests on pendingq list. */ int requestq_count; /* # requests on requestq list. */ - int total_request_count; /* # requests ever for this AP device.*/ + u64 total_request_count; /* # requests ever for this AP device.*/ int request_timeout; /* Request timeout in jiffies. */ struct timer_list timeout; /* Timer for request timeouts. */ struct list_head pendingq; /* List of message sent to AP queue. */ diff -Nru linux-4.19.98/drivers/s390/crypto/ap_card.c linux-4.19.118/drivers/s390/crypto/ap_card.c --- linux-4.19.98/drivers/s390/crypto/ap_card.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/crypto/ap_card.c 2020-04-23 08:30:24.000000000 +0000 @@ -63,13 +63,13 @@ char *buf) { struct ap_card *ac = to_ap_card(dev); - unsigned int req_cnt; + u64 req_cnt; req_cnt = 0; spin_lock_bh(&ap_list_lock); - req_cnt = atomic_read(&ac->total_request_count); + req_cnt = atomic64_read(&ac->total_request_count); spin_unlock_bh(&ap_list_lock); - return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt); + return snprintf(buf, PAGE_SIZE, "%llu\n", req_cnt); } static ssize_t request_count_store(struct device *dev, @@ -83,7 +83,7 @@ for_each_ap_queue(aq, ac) aq->total_request_count = 0; spin_unlock_bh(&ap_list_lock); - atomic_set(&ac->total_request_count, 0); + atomic64_set(&ac->total_request_count, 0); return count; } diff -Nru linux-4.19.98/drivers/s390/crypto/ap_queue.c linux-4.19.118/drivers/s390/crypto/ap_queue.c --- linux-4.19.98/drivers/s390/crypto/ap_queue.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/crypto/ap_queue.c 2020-04-23 08:30:24.000000000 +0000 @@ -470,12 +470,12 @@ char *buf) { struct ap_queue *aq = to_ap_queue(dev); - unsigned int req_cnt; + u64 req_cnt; spin_lock_bh(&aq->lock); req_cnt = aq->total_request_count; spin_unlock_bh(&aq->lock); - return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt); + return snprintf(buf, PAGE_SIZE, "%llu\n", req_cnt); } static ssize_t request_count_store(struct device *dev, @@ -667,7 +667,7 @@ list_add_tail(&ap_msg->list, &aq->requestq); aq->requestq_count++; aq->total_request_count++; - atomic_inc(&aq->card->total_request_count); + atomic64_inc(&aq->card->total_request_count); /* Send/receive as many request from the queue as possible. */ ap_wait(ap_sm_event_loop(aq, AP_EVENT_POLL)); spin_unlock_bh(&aq->lock); diff -Nru linux-4.19.98/drivers/s390/crypto/zcrypt_api.c linux-4.19.118/drivers/s390/crypto/zcrypt_api.c --- linux-4.19.98/drivers/s390/crypto/zcrypt_api.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/crypto/zcrypt_api.c 2020-04-23 08:30:24.000000000 +0000 @@ -190,8 +190,8 @@ weight += atomic_read(&zc->load); pref_weight += atomic_read(&pref_zc->load); if (weight == pref_weight) - return atomic_read(&zc->card->total_request_count) > - atomic_read(&pref_zc->card->total_request_count); + return atomic64_read(&zc->card->total_request_count) > + atomic64_read(&pref_zc->card->total_request_count); return weight > pref_weight; } @@ -719,11 +719,12 @@ spin_unlock(&zcrypt_list_lock); } -static void zcrypt_perdev_reqcnt(int reqcnt[], size_t max_adapters) +static void zcrypt_perdev_reqcnt(u32 reqcnt[], size_t max_adapters) { struct zcrypt_card *zc; struct zcrypt_queue *zq; int card; + u64 cnt; memset(reqcnt, 0, sizeof(int) * max_adapters); spin_lock(&zcrypt_list_lock); @@ -735,8 +736,9 @@ || card >= max_adapters) continue; spin_lock(&zq->queue->lock); - reqcnt[card] = zq->queue->total_request_count; + cnt = zq->queue->total_request_count; spin_unlock(&zq->queue->lock); + reqcnt[card] = (cnt < UINT_MAX) ? (u32) cnt : UINT_MAX; } } local_bh_enable(); @@ -907,9 +909,9 @@ return 0; } case ZCRYPT_PERDEV_REQCNT: { - int *reqcnt; + u32 *reqcnt; - reqcnt = kcalloc(AP_DEVICES, sizeof(int), GFP_KERNEL); + reqcnt = kcalloc(AP_DEVICES, sizeof(u32), GFP_KERNEL); if (!reqcnt) return -ENOMEM; zcrypt_perdev_reqcnt(reqcnt, AP_DEVICES); @@ -966,7 +968,7 @@ } case Z90STAT_PERDEV_REQCNT: { /* the old ioctl supports only 64 adapters */ - int reqcnt[MAX_ZDEV_CARDIDS]; + u32 reqcnt[MAX_ZDEV_CARDIDS]; zcrypt_perdev_reqcnt(reqcnt, MAX_ZDEV_CARDIDS); if (copy_to_user((int __user *) arg, reqcnt, sizeof(reqcnt))) diff -Nru linux-4.19.98/drivers/s390/net/qeth_core_main.c linux-4.19.118/drivers/s390/net/qeth_core_main.c --- linux-4.19.98/drivers/s390/net/qeth_core_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/net/qeth_core_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2811,12 +2811,12 @@ buf->rx_skb = netdev_alloc_skb(card->dev, QETH_RX_PULL_LEN + ETH_HLEN); if (!buf->rx_skb) - return 1; + return -ENOMEM; } pool_entry = qeth_find_free_buffer_pool_entry(card); if (!pool_entry) - return 1; + return -ENOBUFS; /* * since the buffer is accessed only from the input_tasklet @@ -2848,10 +2848,15 @@ /* inbound queue */ qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q); memset(&card->rx, 0, sizeof(struct qeth_rx)); + qeth_initialize_working_pool_list(card); /*give only as many buffers to hardware as we have buffer pool entries*/ - for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i) - qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]); + for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; i++) { + rc = qeth_init_input_buffer(card, &card->qdio.in_q->bufs[i]); + if (rc) + return rc; + } + card->qdio.in_q->next_buf_to_init = card->qdio.in_buf_pool.buf_count - 1; rc = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0, 0, @@ -4929,10 +4934,10 @@ if (card->options.cq == QETH_CQ_ENABLED) { int offset = QDIO_MAX_BUFFERS_PER_Q * (card->qdio.no_in_queues - 1); - for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) { - in_sbal_ptrs[offset + i] = (struct qdio_buffer *) - virt_to_phys(card->qdio.c_q->bufs[i].buffer); - } + + for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) + in_sbal_ptrs[offset + i] = + card->qdio.c_q->bufs[i].buffer; queue_start_poll[card->qdio.no_in_queues - 1] = NULL; } @@ -4967,10 +4972,9 @@ rc = -ENOMEM; goto out_free_qib_param; } - for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; ++i) { - in_sbal_ptrs[i] = (struct qdio_buffer *) - virt_to_phys(card->qdio.in_q->bufs[i].buffer); - } + + for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) + in_sbal_ptrs[i] = card->qdio.in_q->bufs[i].buffer; queue_start_poll = kcalloc(card->qdio.no_in_queues, sizeof(void *), GFP_KERNEL); @@ -4991,11 +4995,11 @@ rc = -ENOMEM; goto out_free_queue_start_poll; } + for (i = 0, k = 0; i < card->qdio.no_out_queues; ++i) - for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j, ++k) { - out_sbal_ptrs[k] = (struct qdio_buffer *)virt_to_phys( - card->qdio.out_qs[i]->bufs[j]->buffer); - } + for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; j++, k++) + out_sbal_ptrs[k] = + card->qdio.out_qs[i]->bufs[j]->buffer; memset(&init_data, 0, sizeof(struct qdio_initialize)); init_data.cdev = CARD_DDEV(card); diff -Nru linux-4.19.98/drivers/s390/net/qeth_l2_main.c linux-4.19.118/drivers/s390/net/qeth_l2_main.c --- linux-4.19.98/drivers/s390/net/qeth_l2_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/net/qeth_l2_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2148,15 +2148,14 @@ QETH_CARD_TEXT(card, 2, "vniccsch"); - /* do not change anything if BridgePort is enabled */ - if (qeth_bridgeport_is_in_use(card)) - return -EBUSY; - /* check if characteristic and enable/disable are supported */ if (!(card->options.vnicc.sup_chars & vnicc) || !(card->options.vnicc.set_char_sup & vnicc)) return -EOPNOTSUPP; + if (qeth_bridgeport_is_in_use(card)) + return -EBUSY; + /* set enable/disable command and store wanted characteristic */ if (state) { cmd = IPA_VNICC_ENABLE; @@ -2202,14 +2201,13 @@ QETH_CARD_TEXT(card, 2, "vniccgch"); - /* do not get anything if BridgePort is enabled */ - if (qeth_bridgeport_is_in_use(card)) - return -EBUSY; - /* check if characteristic is supported */ if (!(card->options.vnicc.sup_chars & vnicc)) return -EOPNOTSUPP; + if (qeth_bridgeport_is_in_use(card)) + return -EBUSY; + /* if card is ready, query current VNICC state */ if (qeth_card_hw_is_reachable(card)) rc = qeth_l2_vnicc_query_chars(card); @@ -2227,15 +2225,14 @@ QETH_CARD_TEXT(card, 2, "vniccsto"); - /* do not change anything if BridgePort is enabled */ - if (qeth_bridgeport_is_in_use(card)) - return -EBUSY; - /* check if characteristic and set_timeout are supported */ if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) return -EOPNOTSUPP; + if (qeth_bridgeport_is_in_use(card)) + return -EBUSY; + /* do we need to do anything? */ if (card->options.vnicc.learning_timeout == timeout) return rc; @@ -2264,14 +2261,14 @@ QETH_CARD_TEXT(card, 2, "vniccgto"); - /* do not get anything if BridgePort is enabled */ - if (qeth_bridgeport_is_in_use(card)) - return -EBUSY; - /* check if characteristic and get_timeout are supported */ if (!(card->options.vnicc.sup_chars & QETH_VNICC_LEARNING) || !(card->options.vnicc.getset_timeout_sup & QETH_VNICC_LEARNING)) return -EOPNOTSUPP; + + if (qeth_bridgeport_is_in_use(card)) + return -EBUSY; + /* if card is ready, get timeout. Otherwise, just return stored value */ *timeout = card->options.vnicc.learning_timeout; if (qeth_card_hw_is_reachable(card)) @@ -2330,10 +2327,10 @@ static void qeth_l2_vnicc_init(struct qeth_card *card) { u32 *timeout = &card->options.vnicc.learning_timeout; + bool enable, error = false; unsigned int chars_len, i; unsigned long chars_tmp; u32 sup_cmds, vnicc; - bool enable, error; QETH_CARD_TEXT(card, 2, "vniccini"); /* reset rx_bcast */ @@ -2354,17 +2351,24 @@ chars_len = sizeof(card->options.vnicc.sup_chars) * BITS_PER_BYTE; for_each_set_bit(i, &chars_tmp, chars_len) { vnicc = BIT(i); - qeth_l2_vnicc_query_cmds(card, vnicc, &sup_cmds); - if (!(sup_cmds & IPA_VNICC_SET_TIMEOUT) || - !(sup_cmds & IPA_VNICC_GET_TIMEOUT)) + if (qeth_l2_vnicc_query_cmds(card, vnicc, &sup_cmds)) { + sup_cmds = 0; + error = true; + } + if ((sup_cmds & IPA_VNICC_SET_TIMEOUT) && + (sup_cmds & IPA_VNICC_GET_TIMEOUT)) + card->options.vnicc.getset_timeout_sup |= vnicc; + else card->options.vnicc.getset_timeout_sup &= ~vnicc; - if (!(sup_cmds & IPA_VNICC_ENABLE) || - !(sup_cmds & IPA_VNICC_DISABLE)) + if ((sup_cmds & IPA_VNICC_ENABLE) && + (sup_cmds & IPA_VNICC_DISABLE)) + card->options.vnicc.set_char_sup |= vnicc; + else card->options.vnicc.set_char_sup &= ~vnicc; } /* enforce assumed default values and recover settings, if changed */ - error = qeth_l2_vnicc_recover_timeout(card, QETH_VNICC_LEARNING, - timeout); + error |= qeth_l2_vnicc_recover_timeout(card, QETH_VNICC_LEARNING, + timeout); chars_tmp = card->options.vnicc.wanted_chars ^ QETH_VNICC_DEFAULT; chars_len = sizeof(card->options.vnicc.wanted_chars) * BITS_PER_BYTE; for_each_set_bit(i, &chars_tmp, chars_len) { diff -Nru linux-4.19.98/drivers/s390/scsi/zfcp_erp.c linux-4.19.118/drivers/s390/scsi/zfcp_erp.c --- linux-4.19.98/drivers/s390/scsi/zfcp_erp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/s390/scsi/zfcp_erp.c 2020-04-23 08:30:24.000000000 +0000 @@ -738,7 +738,7 @@ adapter->peer_d_id); if (IS_ERR(port)) /* error or port already attached */ return; - _zfcp_erp_port_reopen(port, 0, "ereptp1"); + zfcp_erp_port_reopen(port, 0, "ereptp1"); } static int zfcp_erp_adapter_strat_fsf_xconf(struct zfcp_erp_action *erp_action) diff -Nru linux-4.19.98/drivers/scsi/aic7xxx/aic7xxx_core.c linux-4.19.118/drivers/scsi/aic7xxx/aic7xxx_core.c --- linux-4.19.98/drivers/scsi/aic7xxx/aic7xxx_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/aic7xxx/aic7xxx_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -2321,7 +2321,7 @@ * At some speeds, we only support * ST transfers. */ - if ((syncrate->sxfr_u2 & ST_SXFR) != 0) + if ((syncrate->sxfr_u2 & ST_SXFR) != 0) *ppr_options &= ~MSG_EXT_PPR_DT_REQ; break; } diff -Nru linux-4.19.98/drivers/scsi/csiostor/csio_scsi.c linux-4.19.118/drivers/scsi/csiostor/csio_scsi.c --- linux-4.19.98/drivers/scsi/csiostor/csio_scsi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/csiostor/csio_scsi.c 2020-04-23 08:30:24.000000000 +0000 @@ -1383,7 +1383,7 @@ return -EINVAL; /* Delete NPIV lnodes */ - csio_lnodes_exit(hw, 1); + csio_lnodes_exit(hw, 1); /* Block upper IOs */ csio_lnodes_block_request(hw); diff -Nru linux-4.19.98/drivers/scsi/fnic/fnic_isr.c linux-4.19.118/drivers/scsi/fnic/fnic_isr.c --- linux-4.19.98/drivers/scsi/fnic/fnic_isr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/fnic/fnic_isr.c 2020-04-23 08:30:24.000000000 +0000 @@ -254,7 +254,7 @@ int vecs = n + m + o + 1; if (pci_alloc_irq_vectors(fnic->pdev, vecs, vecs, - PCI_IRQ_MSIX) < 0) { + PCI_IRQ_MSIX) == vecs) { fnic->rq_count = n; fnic->raw_wq_count = m; fnic->wq_copy_count = o; @@ -280,7 +280,7 @@ fnic->wq_copy_count >= 1 && fnic->cq_count >= 3 && fnic->intr_count >= 1 && - pci_alloc_irq_vectors(fnic->pdev, 1, 1, PCI_IRQ_MSI) < 0) { + pci_alloc_irq_vectors(fnic->pdev, 1, 1, PCI_IRQ_MSI) == 1) { fnic->rq_count = 1; fnic->raw_wq_count = 1; fnic->wq_copy_count = 1; diff -Nru linux-4.19.98/drivers/scsi/fnic/fnic_scsi.c linux-4.19.118/drivers/scsi/fnic/fnic_scsi.c --- linux-4.19.98/drivers/scsi/fnic/fnic_scsi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/fnic/fnic_scsi.c 2020-04-23 08:30:24.000000000 +0000 @@ -446,6 +446,9 @@ if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED))) return SCSI_MLQUEUE_HOST_BUSY; + if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET))) + return SCSI_MLQUEUE_HOST_BUSY; + rport = starget_to_rport(scsi_target(sc->device)); if (!rport) { FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, diff -Nru linux-4.19.98/drivers/scsi/ipr.c linux-4.19.118/drivers/scsi/ipr.c --- linux-4.19.98/drivers/scsi/ipr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/ipr.c 2020-04-23 08:30:24.000000000 +0000 @@ -9958,6 +9958,7 @@ ioa_cfg->max_devs_supported = ipr_max_devs; if (ioa_cfg->sis64) { + host->max_channel = IPR_MAX_SIS64_BUSES; host->max_id = IPR_MAX_SIS64_TARGETS_PER_BUS; host->max_lun = IPR_MAX_SIS64_LUNS_PER_TARGET; if (ipr_max_devs > IPR_MAX_SIS64_DEVS) @@ -9966,6 +9967,7 @@ + ((sizeof(struct ipr_config_table_entry64) * ioa_cfg->max_devs_supported))); } else { + host->max_channel = IPR_VSET_BUS; host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS; host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET; if (ipr_max_devs > IPR_MAX_PHYSICAL_DEVS) @@ -9975,7 +9977,6 @@ * ioa_cfg->max_devs_supported))); } - host->max_channel = IPR_VSET_BUS; host->unique_id = host->host_no; host->max_cmd_len = IPR_MAX_CDB_LEN; host->can_queue = ioa_cfg->max_cmds; diff -Nru linux-4.19.98/drivers/scsi/ipr.h linux-4.19.118/drivers/scsi/ipr.h --- linux-4.19.98/drivers/scsi/ipr.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/ipr.h 2020-04-23 08:30:24.000000000 +0000 @@ -1313,6 +1313,7 @@ #define IPR_ARRAY_VIRTUAL_BUS 0x1 #define IPR_VSET_VIRTUAL_BUS 0x2 #define IPR_IOAFP_VIRTUAL_BUS 0x3 +#define IPR_MAX_SIS64_BUSES 0x4 #define IPR_GET_RES_PHYS_LOC(res) \ (((res)->bus << 24) | ((res)->target << 8) | (res)->lun) diff -Nru linux-4.19.98/drivers/scsi/iscsi_tcp.c linux-4.19.118/drivers/scsi/iscsi_tcp.c --- linux-4.19.98/drivers/scsi/iscsi_tcp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/iscsi_tcp.c 2020-04-23 08:30:24.000000000 +0000 @@ -892,6 +892,10 @@ static void iscsi_sw_tcp_session_destroy(struct iscsi_cls_session *cls_session) { struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); + struct iscsi_session *session = cls_session->dd_data; + + if (WARN_ON_ONCE(session->leadconn)) + return; iscsi_tcp_r2tpool_free(cls_session->dd_data); iscsi_session_teardown(cls_session); diff -Nru linux-4.19.98/drivers/scsi/libfc/fc_disc.c linux-4.19.118/drivers/scsi/libfc/fc_disc.c --- linux-4.19.98/drivers/scsi/libfc/fc_disc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/libfc/fc_disc.c 2020-04-23 08:30:24.000000000 +0000 @@ -640,6 +640,8 @@ } out: kref_put(&rdata->kref, fc_rport_destroy); + if (!IS_ERR(fp)) + fc_frame_free(fp); } /** diff -Nru linux-4.19.98/drivers/scsi/libfc/fc_exch.c linux-4.19.118/drivers/scsi/libfc/fc_exch.c --- linux-4.19.98/drivers/scsi/libfc/fc_exch.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/libfc/fc_exch.c 2020-04-23 08:30:24.000000000 +0000 @@ -2603,7 +2603,7 @@ /* lport lock ? */ if (!lport || lport->state == LPORT_ST_DISABLED) { - FC_LPORT_DBG(lport, "Receiving frames for an lport that " + FC_LIBFC_DBG("Receiving frames for an lport that " "has not been initialized correctly\n"); fc_frame_free(fp); return; diff -Nru linux-4.19.98/drivers/scsi/lpfc/lpfc_nvme.c linux-4.19.118/drivers/scsi/lpfc/lpfc_nvme.c --- linux-4.19.98/drivers/scsi/lpfc/lpfc_nvme.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/lpfc/lpfc_nvme.c 2020-04-23 08:30:24.000000000 +0000 @@ -1903,8 +1903,6 @@ /* Declare and initialization an instance of the FC NVME template. */ static struct nvme_fc_port_template lpfc_nvme_template = { - .module = THIS_MODULE, - /* initiator-based functions */ .localport_delete = lpfc_nvme_localport_delete, .remoteport_delete = lpfc_nvme_remoteport_delete, diff -Nru linux-4.19.98/drivers/scsi/megaraid/megaraid_sas_base.c linux-4.19.118/drivers/scsi/megaraid/megaraid_sas_base.c --- linux-4.19.98/drivers/scsi/megaraid/megaraid_sas_base.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/megaraid/megaraid_sas_base.c 2020-04-23 08:30:24.000000000 +0000 @@ -3894,12 +3894,12 @@ /* * The cur_state should not last for more than max_wait secs */ - for (i = 0; i < max_wait; i++) { + for (i = 0; i < max_wait * 50; i++) { curr_abs_state = instance->instancet-> read_fw_status_reg(instance->reg_set); if (abs_state == curr_abs_state) { - msleep(1000); + msleep(20); } else break; } @@ -4177,7 +4177,8 @@ if (instance->adapter_type == MFI_SERIES) return KILL_ADAPTER; else if (instance->unload || - test_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags)) + test_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, + &instance->reset_flags)) return IGNORE_TIMEOUT; else return INITIATE_OCR; diff -Nru linux-4.19.98/drivers/scsi/megaraid/megaraid_sas_fusion.c linux-4.19.118/drivers/scsi/megaraid/megaraid_sas_fusion.c --- linux-4.19.98/drivers/scsi/megaraid/megaraid_sas_fusion.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/megaraid/megaraid_sas_fusion.c 2020-04-23 08:30:24.000000000 +0000 @@ -530,7 +530,8 @@ fusion->io_request_frames = dma_pool_alloc(fusion->io_request_frames_pool, - GFP_KERNEL, &fusion->io_request_frames_phys); + GFP_KERNEL | __GFP_NOWARN, + &fusion->io_request_frames_phys); if (!fusion->io_request_frames) { if (instance->max_fw_cmds >= (MEGASAS_REDUCE_QD_COUNT * 2)) { instance->max_fw_cmds -= MEGASAS_REDUCE_QD_COUNT; @@ -568,7 +569,7 @@ fusion->io_request_frames = dma_pool_alloc(fusion->io_request_frames_pool, - GFP_KERNEL, + GFP_KERNEL | __GFP_NOWARN, &fusion->io_request_frames_phys); if (!fusion->io_request_frames) { @@ -4558,6 +4559,7 @@ if (instance->requestorId && !instance->skip_heartbeat_timer_del) del_timer_sync(&instance->sriov_heartbeat_timer); set_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); + set_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_POLLING); instance->instancet->disable_intr(instance); megasas_sync_irqs((unsigned long)instance); @@ -4747,7 +4749,7 @@ atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL); } out: - clear_bit(MEGASAS_FUSION_IN_RESET, &instance->reset_flags); + clear_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE, &instance->reset_flags); mutex_unlock(&instance->reset_mutex); return retval; } diff -Nru linux-4.19.98/drivers/scsi/megaraid/megaraid_sas_fusion.h linux-4.19.118/drivers/scsi/megaraid/megaraid_sas_fusion.h --- linux-4.19.98/drivers/scsi/megaraid/megaraid_sas_fusion.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/megaraid/megaraid_sas_fusion.h 2020-04-23 08:30:24.000000000 +0000 @@ -102,6 +102,7 @@ #define MEGASAS_FP_CMD_LEN 16 #define MEGASAS_FUSION_IN_RESET 0 +#define MEGASAS_FUSION_OCR_NOT_POSSIBLE 1 #define THRESHOLD_REPLY_COUNT 50 #define RAID_1_PEER_CMDS 2 #define JBOD_MAPS_COUNT 2 diff -Nru linux-4.19.98/drivers/scsi/mpt3sas/mpt3sas_scsih.c linux-4.19.118/drivers/scsi/mpt3sas/mpt3sas_scsih.c --- linux-4.19.98/drivers/scsi/mpt3sas/mpt3sas_scsih.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/mpt3sas/mpt3sas_scsih.c 2020-04-23 08:30:24.000000000 +0000 @@ -9841,8 +9841,8 @@ ioc->remove_host = 1; - mpt3sas_wait_for_commands_to_complete(ioc); - _scsih_flush_running_cmds(ioc); + if (!pci_device_is_present(pdev)) + _scsih_flush_running_cmds(ioc); _scsih_fw_event_cleanup_queue(ioc); @@ -9919,8 +9919,8 @@ ioc->remove_host = 1; - mpt3sas_wait_for_commands_to_complete(ioc); - _scsih_flush_running_cmds(ioc); + if (!pci_device_is_present(pdev)) + _scsih_flush_running_cmds(ioc); _scsih_fw_event_cleanup_queue(ioc); diff -Nru linux-4.19.98/drivers/scsi/pm8001/pm8001_sas.c linux-4.19.118/drivers/scsi/pm8001/pm8001_sas.c --- linux-4.19.98/drivers/scsi/pm8001/pm8001_sas.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/pm8001/pm8001_sas.c 2020-04-23 08:30:24.000000000 +0000 @@ -866,6 +866,8 @@ spin_unlock_irqrestore(&pm8001_ha->lock, flags); pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev , dev, 1, 0); + while (pm8001_dev->running_req) + msleep(20); spin_lock_irqsave(&pm8001_ha->lock, flags); } PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id); @@ -1238,8 +1240,10 @@ PM8001_MSG_DBG(pm8001_ha, pm8001_printk("Waiting for Port reset\n")); wait_for_completion(&completion_reset); - if (phy->port_reset_status) + if (phy->port_reset_status) { + pm8001_dev_gone_notify(dev); goto out; + } /* * 4. SATA Abort ALL diff -Nru linux-4.19.98/drivers/scsi/pm8001/pm80xx_hwi.c linux-4.19.118/drivers/scsi/pm8001/pm80xx_hwi.c --- linux-4.19.98/drivers/scsi/pm8001/pm80xx_hwi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/pm8001/pm80xx_hwi.c 2020-04-23 08:30:24.000000000 +0000 @@ -604,7 +604,7 @@ pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &= 0x0000ffff; pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |= - 0x140000; + CHIP_8006_PORT_RECOVERY_TIMEOUT; } pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER, pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer); diff -Nru linux-4.19.98/drivers/scsi/pm8001/pm80xx_hwi.h linux-4.19.118/drivers/scsi/pm8001/pm80xx_hwi.h --- linux-4.19.98/drivers/scsi/pm8001/pm80xx_hwi.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/pm8001/pm80xx_hwi.h 2020-04-23 08:30:24.000000000 +0000 @@ -228,6 +228,8 @@ #define SAS_MAX_AIP 0x200000 #define IT_NEXUS_TIMEOUT 0x7D0 #define PORT_RECOVERY_TIMEOUT ((IT_NEXUS_TIMEOUT/100) + 30) +/* Port recovery timeout, 10000 ms for PM8006 controller */ +#define CHIP_8006_PORT_RECOVERY_TIMEOUT 0x640000 #ifdef __LITTLE_ENDIAN_BITFIELD struct sas_identify_frame_local { diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_dbg.c linux-4.19.118/drivers/scsi/qla2xxx/qla_dbg.c --- linux-4.19.98/drivers/scsi/qla2xxx/qla_dbg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_dbg.c 2020-04-23 08:30:24.000000000 +0000 @@ -2520,12 +2520,6 @@ /* Driver Debug Functions. */ /****************************************************************************/ -static inline int -ql_mask_match(uint32_t level) -{ - return (level & ql2xextended_error_logging) == level; -} - /* * This function is for formatting and logging debug information. * It is to be used when vha is available. It formats the message diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_dbg.h linux-4.19.118/drivers/scsi/qla2xxx/qla_dbg.h --- linux-4.19.98/drivers/scsi/qla2xxx/qla_dbg.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_dbg.h 2020-04-23 08:30:24.000000000 +0000 @@ -374,3 +374,9 @@ extern void qla24xx_pause_risc(struct device_reg_24xx __iomem *, struct qla_hw_data *); extern int qla24xx_soft_reset(struct qla_hw_data *); + +static inline int +ql_mask_match(uint level) +{ + return (level & ql2xextended_error_logging) == level; +} diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_isr.c linux-4.19.118/drivers/scsi/qla2xxx/qla_isr.c --- linux-4.19.98/drivers/scsi/qla2xxx/qla_isr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_isr.c 2020-04-23 08:30:24.000000000 +0000 @@ -1876,6 +1876,18 @@ inbuf = (uint32_t *)&sts->nvme_ersp_data; outbuf = (uint32_t *)fd->rspaddr; iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len); + if (unlikely(iocb->u.nvme.rsp_pyld_len > + sizeof(struct nvme_fc_ersp_iu))) { + if (ql_mask_match(ql_dbg_io)) { + WARN_ONCE(1, "Unexpected response payload length %u.\n", + iocb->u.nvme.rsp_pyld_len); + ql_log(ql_log_warn, fcport->vha, 0x5100, + "Unexpected response payload length %u.\n", + iocb->u.nvme.rsp_pyld_len); + } + iocb->u.nvme.rsp_pyld_len = + sizeof(struct nvme_fc_ersp_iu); + } iter = iocb->u.nvme.rsp_pyld_len >> 2; for (; iter; iter--) *outbuf++ = swab32(*inbuf++); diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_mbx.c linux-4.19.118/drivers/scsi/qla2xxx/qla_mbx.c --- linux-4.19.98/drivers/scsi/qla2xxx/qla_mbx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_mbx.c 2020-04-23 08:30:24.000000000 +0000 @@ -5994,9 +5994,8 @@ mcp->mb[7] = LSW(MSD(req_dma)); mcp->mb[8] = MSW(addr); /* Setting RAM ID to valid */ - mcp->mb[10] |= BIT_7; /* For MCTP RAM ID is 0x40 */ - mcp->mb[10] |= 0x40; + mcp->mb[10] = BIT_7 | 0x40; mcp->out_mb |= MBX_10|MBX_8|MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1| MBX_0; diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_nvme.c linux-4.19.118/drivers/scsi/qla2xxx/qla_nvme.c --- linux-4.19.98/drivers/scsi/qla2xxx/qla_nvme.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_nvme.c 2020-04-23 08:30:24.000000000 +0000 @@ -560,7 +560,6 @@ } static struct nvme_fc_port_template qla_nvme_fc_transport = { - .module = THIS_MODULE, .localport_delete = qla_nvme_localport_delete, .remoteport_delete = qla_nvme_remoteport_delete, .create_queue = qla_nvme_alloc_queue, diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_nx.c linux-4.19.118/drivers/scsi/qla2xxx/qla_nx.c --- linux-4.19.98/drivers/scsi/qla2xxx/qla_nx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_nx.c 2020-04-23 08:30:24.000000000 +0000 @@ -1605,8 +1605,7 @@ return (u8 *)&ha->hablob->fw->data[offset]; } -static __le32 -qla82xx_get_fw_size(struct qla_hw_data *ha) +static u32 qla82xx_get_fw_size(struct qla_hw_data *ha) { struct qla82xx_uri_data_desc *uri_desc = NULL; @@ -1617,7 +1616,7 @@ return cpu_to_le32(uri_desc->size); } - return cpu_to_le32(*(u32 *)&ha->hablob->fw->data[FW_SIZE_OFFSET]); + return get_unaligned_le32(&ha->hablob->fw->data[FW_SIZE_OFFSET]); } static u8 * @@ -1808,7 +1807,7 @@ } flashaddr = FLASH_ADDR_START; - size = (__force u32)qla82xx_get_fw_size(ha) / 8; + size = qla82xx_get_fw_size(ha) / 8; ptr64 = (u64 *)qla82xx_get_fw_offs(ha); for (i = 0; i < size; i++) { diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_os.c linux-4.19.118/drivers/scsi/qla2xxx/qla_os.c --- linux-4.19.98/drivers/scsi/qla2xxx/qla_os.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_os.c 2020-04-23 08:30:24.000000000 +0000 @@ -6967,8 +6967,7 @@ /* Initialize target kmem_cache and mem_pools */ ret = qlt_init(); if (ret < 0) { - kmem_cache_destroy(srb_cachep); - return ret; + goto destroy_cache; } else if (ret > 0) { /* * If initiator mode is explictly disabled by qlt_init(), @@ -6989,11 +6988,10 @@ qla2xxx_transport_template = fc_attach_transport(&qla2xxx_transport_functions); if (!qla2xxx_transport_template) { - kmem_cache_destroy(srb_cachep); ql_log(ql_log_fatal, NULL, 0x0002, "fc_attach_transport failed...Failing load!.\n"); - qlt_exit(); - return -ENODEV; + ret = -ENODEV; + goto qlt_exit; } apidev_major = register_chrdev(0, QLA2XXX_APIDEV, &apidev_fops); @@ -7005,27 +7003,37 @@ qla2xxx_transport_vport_template = fc_attach_transport(&qla2xxx_transport_vport_functions); if (!qla2xxx_transport_vport_template) { - kmem_cache_destroy(srb_cachep); - qlt_exit(); - fc_release_transport(qla2xxx_transport_template); ql_log(ql_log_fatal, NULL, 0x0004, "fc_attach_transport vport failed...Failing load!.\n"); - return -ENODEV; + ret = -ENODEV; + goto unreg_chrdev; } ql_log(ql_log_info, NULL, 0x0005, "QLogic Fibre Channel HBA Driver: %s.\n", qla2x00_version_str); ret = pci_register_driver(&qla2xxx_pci_driver); if (ret) { - kmem_cache_destroy(srb_cachep); - qlt_exit(); - fc_release_transport(qla2xxx_transport_template); - fc_release_transport(qla2xxx_transport_vport_template); ql_log(ql_log_fatal, NULL, 0x0006, "pci_register_driver failed...ret=%d Failing load!.\n", ret); + goto release_vport_transport; } return ret; + +release_vport_transport: + fc_release_transport(qla2xxx_transport_vport_template); + +unreg_chrdev: + if (apidev_major >= 0) + unregister_chrdev(apidev_major, QLA2XXX_APIDEV); + fc_release_transport(qla2xxx_transport_template); + +qlt_exit: + qlt_exit(); + +destroy_cache: + kmem_cache_destroy(srb_cachep); + return ret; } /** diff -Nru linux-4.19.98/drivers/scsi/qla2xxx/qla_target.c linux-4.19.118/drivers/scsi/qla2xxx/qla_target.c --- linux-4.19.98/drivers/scsi/qla2xxx/qla_target.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla2xxx/qla_target.c 2020-04-23 08:30:24.000000000 +0000 @@ -2233,14 +2233,14 @@ ctio->u.status1.scsi_status |= cpu_to_le16(SS_RESIDUAL_UNDER); - /* Response code and sense key */ - put_unaligned_le32(((0x70 << 24) | (sense_key << 8)), - (&ctio->u.status1.sense_data)[0]); + /* Fixed format sense data. */ + ctio->u.status1.sense_data[0] = 0x70; + ctio->u.status1.sense_data[2] = sense_key; /* Additional sense length */ - put_unaligned_le32(0x0a, (&ctio->u.status1.sense_data)[1]); + ctio->u.status1.sense_data[7] = 0xa; /* ASC and ASCQ */ - put_unaligned_le32(((asc << 24) | (ascq << 16)), - (&ctio->u.status1.sense_data)[3]); + ctio->u.status1.sense_data[12] = asc; + ctio->u.status1.sense_data[13] = ascq; /* Memory Barrier */ wmb(); @@ -2290,7 +2290,7 @@ mcmd->orig_iocb.imm_ntfy.u.isp24.status_subcode == ELS_TPRLO) { ql_dbg(ql_dbg_disc, vha, 0x2106, - "TM response logo %phC status %#x state %#x", + "TM response logo %8phC status %#x state %#x", mcmd->sess->port_name, mcmd->fc_tm_rsp, mcmd->flags); qlt_schedule_sess_for_deletion(mcmd->sess); @@ -5334,11 +5334,7 @@ se_sess = sess->se_sess; tag = sbitmap_queue_get(&se_sess->sess_tag_pool, &cpu); - if (tag < 0) - return; - - cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag]; - if (!cmd) { + if (tag < 0) { ql_dbg(ql_dbg_io, vha, 0x3009, "qla_target(%d): %s: Allocation of cmd failed\n", vha->vp_idx, __func__); @@ -5353,6 +5349,7 @@ return; } + cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag]; memset(cmd, 0, sizeof(struct qla_tgt_cmd)); qlt_incr_num_pend_cmds(vha); diff -Nru linux-4.19.98/drivers/scsi/qla4xxx/ql4_os.c linux-4.19.118/drivers/scsi/qla4xxx/ql4_os.c --- linux-4.19.98/drivers/scsi/qla4xxx/ql4_os.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/qla4xxx/ql4_os.c 2020-04-23 08:30:24.000000000 +0000 @@ -4146,7 +4146,7 @@ dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues, ha->queues_dma); - if (ha->fw_dump) + if (ha->fw_dump) vfree(ha->fw_dump); ha->queues_len = 0; diff -Nru linux-4.19.98/drivers/scsi/scsi_transport_iscsi.c linux-4.19.118/drivers/scsi/scsi_transport_iscsi.c --- linux-4.19.98/drivers/scsi/scsi_transport_iscsi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/scsi_transport_iscsi.c 2020-04-23 08:30:24.000000000 +0000 @@ -37,6 +37,8 @@ #define ISCSI_TRANSPORT_VERSION "2.0-870" +#define ISCSI_SEND_MAX_ALLOWED 10 + static int dbg_session; module_param_named(debug_session, dbg_session, int, S_IRUGO | S_IWUSR); @@ -2943,6 +2945,24 @@ return err; } +static int iscsi_session_has_conns(int sid) +{ + struct iscsi_cls_conn *conn; + unsigned long flags; + int found = 0; + + spin_lock_irqsave(&connlock, flags); + list_for_each_entry(conn, &connlist, conn_list) { + if (iscsi_conn_get_sid(conn) == sid) { + found = 1; + break; + } + } + spin_unlock_irqrestore(&connlock, flags); + + return found; +} + static int iscsi_set_iface_params(struct iscsi_transport *transport, struct iscsi_uevent *ev, uint32_t len) @@ -3520,10 +3540,12 @@ break; case ISCSI_UEVENT_DESTROY_SESSION: session = iscsi_session_lookup(ev->u.d_session.sid); - if (session) - transport->destroy_session(session); - else + if (!session) err = -EINVAL; + else if (iscsi_session_has_conns(ev->u.d_session.sid)) + err = -EBUSY; + else + transport->destroy_session(session); break; case ISCSI_UEVENT_UNBIND_SESSION: session = iscsi_session_lookup(ev->u.d_session.sid); @@ -3680,6 +3702,7 @@ struct nlmsghdr *nlh; struct iscsi_uevent *ev; uint32_t group; + int retries = ISCSI_SEND_MAX_ALLOWED; nlh = nlmsg_hdr(skb); if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) || @@ -3710,6 +3733,10 @@ break; err = iscsi_if_send_reply(portid, nlh->nlmsg_type, ev, sizeof(*ev)); + if (err == -EAGAIN && --retries < 0) { + printk(KERN_WARNING "Send reply failed, error %d\n", err); + break; + } } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH); skb_pull(skb, rlen); } diff -Nru linux-4.19.98/drivers/scsi/sd.c linux-4.19.118/drivers/scsi/sd.c --- linux-4.19.98/drivers/scsi/sd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/sd.c 2020-04-23 08:30:24.000000000 +0000 @@ -1969,9 +1969,13 @@ } break; case REQ_OP_ZONE_REPORT: + /* To avoid that the block layer performs an incorrect + * bio_advance() call and restart of the remainder of + * incomplete report zone BIOs, always indicate a full + * completion of REQ_OP_ZONE_REPORT. + */ if (!result) { - good_bytes = scsi_bufflen(SCpnt) - - scsi_get_resid(SCpnt); + good_bytes = scsi_bufflen(SCpnt); scsi_set_resid(SCpnt, 0); } else { good_bytes = 0; @@ -3206,9 +3210,11 @@ if (sd_validate_opt_xfer_size(sdkp, dev_max)) { q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks); rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks); - } else + } else { + q->limits.io_opt = 0; rw_max = min_not_zero(logical_to_sectors(sdp, dev_max), (sector_t)BLK_DEF_MAX_SECTORS); + } /* Do not exceed controller limit */ rw_max = min(rw_max, queue_max_hw_sectors(q)); diff -Nru linux-4.19.98/drivers/scsi/sg.c linux-4.19.118/drivers/scsi/sg.c --- linux-4.19.98/drivers/scsi/sg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/sg.c 2020-04-23 08:30:24.000000000 +0000 @@ -808,8 +808,10 @@ "sg_common_write: scsi opcode=0x%02x, cmd_size=%d\n", (int) cmnd[0], (int) hp->cmd_len)); - if (hp->dxfer_len >= SZ_256M) + if (hp->dxfer_len >= SZ_256M) { + sg_remove_request(sfp, srp); return -EINVAL; + } k = sg_start_req(srp, cmnd); if (k) { diff -Nru linux-4.19.98/drivers/scsi/ufs/ufshcd.c linux-4.19.118/drivers/scsi/ufs/ufshcd.c --- linux-4.19.98/drivers/scsi/ufs/ufshcd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/ufs/ufshcd.c 2020-04-23 08:30:24.000000000 +0000 @@ -1563,6 +1563,11 @@ */ if (ufshcd_can_hibern8_during_gating(hba) && ufshcd_is_link_hibern8(hba)) { + if (async) { + rc = -EAGAIN; + hba->clk_gating.active_reqs--; + break; + } spin_unlock_irqrestore(hba->host->host_lock, flags); flush_work(&hba->clk_gating.ungate_work); spin_lock_irqsave(hba->host->host_lock, flags); @@ -4809,7 +4814,7 @@ break; } /* end of switch */ - if (host_byte(result) != DID_OK) + if ((host_byte(result) != DID_OK) && !hba->silence_err_logs) ufshcd_print_trs(hba, 1 << lrbp->task_tag, true); return result; } @@ -5044,6 +5049,7 @@ hba->auto_bkops_enabled = false; trace_ufshcd_auto_bkops_state(dev_name(hba->dev), "Disabled"); + hba->is_urgent_bkops_lvl_checked = false; out: return err; } @@ -5068,6 +5074,7 @@ hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS; ufshcd_disable_auto_bkops(hba); } + hba->is_urgent_bkops_lvl_checked = false; } static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status) @@ -5114,6 +5121,7 @@ err = ufshcd_enable_auto_bkops(hba); else err = ufshcd_disable_auto_bkops(hba); + hba->urgent_bkops_lvl = curr_status; out: return err; } @@ -5338,8 +5346,8 @@ /* * if host reset is required then skip clearing the pending - * transfers forcefully because they will automatically get - * cleared after link startup. + * transfers forcefully because they will get cleared during + * host reset and restore */ if (needs_reset) goto skip_pending_xfer_clear; @@ -5993,9 +6001,15 @@ int err; unsigned long flags; - /* Reset the host controller */ + /* + * Stop the host controller and complete the requests + * cleared by h/w + */ spin_lock_irqsave(hba->host->host_lock, flags); ufshcd_hba_stop(hba, false); + hba->silence_err_logs = true; + ufshcd_complete_requests(hba); + hba->silence_err_logs = false; spin_unlock_irqrestore(hba->host->host_lock, flags); /* scale up clocks to max frequency before full reinitialization */ @@ -6029,22 +6043,12 @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba) { int err = 0; - unsigned long flags; int retries = MAX_HOST_RESET_RETRIES; do { err = ufshcd_host_reset_and_restore(hba); } while (err && --retries); - /* - * After reset the door-bell might be cleared, complete - * outstanding requests in s/w here. - */ - spin_lock_irqsave(hba->host->host_lock, flags); - ufshcd_transfer_req_compl(hba); - ufshcd_tmc_handler(hba); - spin_unlock_irqrestore(hba->host->host_lock, flags); - return err; } @@ -6682,7 +6686,8 @@ ufshcd_init_icc_levels(hba); /* Add required well known logical units to scsi mid layer */ - if (ufshcd_scsi_add_wlus(hba)) + ret = ufshcd_scsi_add_wlus(hba); + if (ret) goto out; /* Initialize devfreq after UFS device is detected */ diff -Nru linux-4.19.98/drivers/scsi/ufs/ufshcd.h linux-4.19.118/drivers/scsi/ufs/ufshcd.h --- linux-4.19.98/drivers/scsi/ufs/ufshcd.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/scsi/ufs/ufshcd.h 2020-04-23 08:30:24.000000000 +0000 @@ -489,6 +489,7 @@ * @uic_error: UFS interconnect layer error status * @saved_err: sticky error mask * @saved_uic_err: sticky UIC error mask + * @silence_err_logs: flag to silence error logs * @dev_cmd: ufs device management command information * @last_dme_cmd_tstamp: time stamp of the last completed DME command * @auto_bkops_enabled: to track whether bkops is enabled in device @@ -645,6 +646,7 @@ u32 saved_err; u32 saved_uic_err; struct ufs_stats ufs_stats; + bool silence_err_logs; /* Device management request data */ struct ufs_dev_cmd dev_cmd; diff -Nru linux-4.19.98/drivers/soc/amlogic/meson-gx-pwrc-vpu.c linux-4.19.118/drivers/soc/amlogic/meson-gx-pwrc-vpu.c --- linux-4.19.98/drivers/soc/amlogic/meson-gx-pwrc-vpu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/amlogic/meson-gx-pwrc-vpu.c 2020-04-23 08:30:24.000000000 +0000 @@ -54,12 +54,12 @@ /* Power Down Memories */ for (i = 0; i < 32; i += 2) { regmap_update_bits(pd->regmap_hhi, HHI_VPU_MEM_PD_REG0, - 0x2 << i, 0x3 << i); + 0x3 << i, 0x3 << i); udelay(5); } for (i = 0; i < 32; i += 2) { regmap_update_bits(pd->regmap_hhi, HHI_VPU_MEM_PD_REG1, - 0x2 << i, 0x3 << i); + 0x3 << i, 0x3 << i); udelay(5); } for (i = 8; i < 16; i++) { @@ -108,13 +108,13 @@ /* Power Up Memories */ for (i = 0; i < 32; i += 2) { regmap_update_bits(pd->regmap_hhi, HHI_VPU_MEM_PD_REG0, - 0x2 << i, 0); + 0x3 << i, 0); udelay(5); } for (i = 0; i < 32; i += 2) { regmap_update_bits(pd->regmap_hhi, HHI_VPU_MEM_PD_REG1, - 0x2 << i, 0); + 0x3 << i, 0); udelay(5); } diff -Nru linux-4.19.98/drivers/soc/amlogic/meson-gx-socinfo.c linux-4.19.118/drivers/soc/amlogic/meson-gx-socinfo.c --- linux-4.19.98/drivers/soc/amlogic/meson-gx-socinfo.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/amlogic/meson-gx-socinfo.c 2020-04-23 08:30:24.000000000 +0000 @@ -43,20 +43,21 @@ const char *name; unsigned int major_id; unsigned int pack_id; + unsigned int pack_mask; } soc_packages[] = { - { "S905", 0x1f, 0 }, - { "S905H", 0x1f, 0x13 }, - { "S905M", 0x1f, 0x20 }, - { "S905D", 0x21, 0 }, - { "S905X", 0x21, 0x80 }, - { "S905W", 0x21, 0xa0 }, - { "S905L", 0x21, 0xc0 }, - { "S905M2", 0x21, 0xe0 }, - { "S912", 0x22, 0 }, - { "962X", 0x24, 0x10 }, - { "962E", 0x24, 0x20 }, - { "A113X", 0x25, 0x37 }, - { "A113D", 0x25, 0x22 }, + { "S905", 0x1f, 0, 0x20 }, /* pack_id != 0x20 */ + { "S905H", 0x1f, 0x3, 0xf }, /* pack_id & 0xf == 0x3 */ + { "S905M", 0x1f, 0x20, 0xf0 }, /* pack_id == 0x20 */ + { "S905D", 0x21, 0, 0xf0 }, + { "S905X", 0x21, 0x80, 0xf0 }, + { "S905W", 0x21, 0xa0, 0xf0 }, + { "S905L", 0x21, 0xc0, 0xf0 }, + { "S905M2", 0x21, 0xe0, 0xf0 }, + { "S912", 0x22, 0, 0x0 }, /* Only S912 is known for GXM */ + { "962X", 0x24, 0x10, 0xf0 }, + { "962E", 0x24, 0x20, 0xf0 }, + { "A113X", 0x25, 0x37, 0xff }, + { "A113D", 0x25, 0x22, 0xff }, }; static inline unsigned int socinfo_to_major(u32 socinfo) @@ -81,13 +82,14 @@ static const char *socinfo_to_package_id(u32 socinfo) { - unsigned int pack = socinfo_to_pack(socinfo) & 0xf0; + unsigned int pack = socinfo_to_pack(socinfo); unsigned int major = socinfo_to_major(socinfo); int i; for (i = 0 ; i < ARRAY_SIZE(soc_packages) ; ++i) { if (soc_packages[i].major_id == major && - soc_packages[i].pack_id == pack) + soc_packages[i].pack_id == + (pack & soc_packages[i].pack_mask)) return soc_packages[i].name; } diff -Nru linux-4.19.98/drivers/soc/fsl/qe/gpio.c linux-4.19.118/drivers/soc/fsl/qe/gpio.c --- linux-4.19.98/drivers/soc/fsl/qe/gpio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/fsl/qe/gpio.c 2020-04-23 08:30:24.000000000 +0000 @@ -179,8 +179,10 @@ if (err < 0) goto err0; gc = gpio_to_chip(err); - if (WARN_ON(!gc)) + if (WARN_ON(!gc)) { + err = -ENODEV; goto err0; + } if (!of_device_is_compatible(gc->of_node, "fsl,mpc8323-qe-pario-bank")) { pr_debug("%s: tried to get a non-qe pin\n", __func__); diff -Nru linux-4.19.98/drivers/soc/imx/gpc.c linux-4.19.118/drivers/soc/imx/gpc.c --- linux-4.19.98/drivers/soc/imx/gpc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/imx/gpc.c 2020-04-23 08:30:24.000000000 +0000 @@ -93,8 +93,8 @@ static int imx6_pm_domain_power_on(struct generic_pm_domain *genpd) { struct imx_pm_domain *pd = to_imx_pm_domain(genpd); - int i, ret, sw, sw2iso; - u32 val; + int i, ret; + u32 val, req; if (pd->supply) { ret = regulator_enable(pd->supply); @@ -113,17 +113,18 @@ regmap_update_bits(pd->regmap, pd->reg_offs + GPC_PGC_CTRL_OFFS, 0x1, 0x1); - /* Read ISO and ISO2SW power up delays */ - regmap_read(pd->regmap, pd->reg_offs + GPC_PGC_PUPSCR_OFFS, &val); - sw = val & 0x3f; - sw2iso = (val >> 8) & 0x3f; - /* Request GPC to power up domain */ - val = BIT(pd->cntr_pdn_bit + 1); - regmap_update_bits(pd->regmap, GPC_CNTR, val, val); + req = BIT(pd->cntr_pdn_bit + 1); + regmap_update_bits(pd->regmap, GPC_CNTR, req, req); + + /* Wait for the PGC to handle the request */ + ret = regmap_read_poll_timeout(pd->regmap, GPC_CNTR, val, !(val & req), + 1, 50); + if (ret) + pr_err("powerup request on domain %s timed out\n", genpd->name); - /* Wait ISO + ISO2SW IPG clock cycles */ - udelay(DIV_ROUND_UP(sw + sw2iso, pd->ipg_rate_mhz)); + /* Wait for reset to propagate through peripherals */ + usleep_range(5, 10); /* Disable reset clocks for all devices in the domain */ for (i = 0; i < pd->num_clks; i++) @@ -345,6 +346,7 @@ .rd_table = &access_table, .wr_table = &access_table, .max_register = 0x2ac, + .fast_io = true, }; static struct generic_pm_domain *imx_gpc_onecell_domains[] = { diff -Nru linux-4.19.98/drivers/soc/qcom/cmd-db.c linux-4.19.118/drivers/soc/qcom/cmd-db.c --- linux-4.19.98/drivers/soc/qcom/cmd-db.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/qcom/cmd-db.c 2020-04-23 08:30:24.000000000 +0000 @@ -283,8 +283,8 @@ } cmd_db_header = memremap(rmem->base, rmem->size, MEMREMAP_WB); - if (IS_ERR_OR_NULL(cmd_db_header)) { - ret = PTR_ERR(cmd_db_header); + if (!cmd_db_header) { + ret = -ENOMEM; cmd_db_header = NULL; return ret; } diff -Nru linux-4.19.98/drivers/soc/tegra/fuse/fuse-tegra30.c linux-4.19.118/drivers/soc/tegra/fuse/fuse-tegra30.c --- linux-4.19.98/drivers/soc/tegra/fuse/fuse-tegra30.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/tegra/fuse/fuse-tegra30.c 2020-04-23 08:30:24.000000000 +0000 @@ -47,7 +47,8 @@ defined(CONFIG_ARCH_TEGRA_124_SOC) || \ defined(CONFIG_ARCH_TEGRA_132_SOC) || \ defined(CONFIG_ARCH_TEGRA_210_SOC) || \ - defined(CONFIG_ARCH_TEGRA_186_SOC) + defined(CONFIG_ARCH_TEGRA_186_SOC) || \ + defined(CONFIG_ARCH_TEGRA_194_SOC) static u32 tegra30_fuse_read_early(struct tegra_fuse *fuse, unsigned int offset) { if (WARN_ON(!fuse->base)) diff -Nru linux-4.19.98/drivers/soc/tegra/fuse/tegra-apbmisc.c linux-4.19.118/drivers/soc/tegra/fuse/tegra-apbmisc.c --- linux-4.19.98/drivers/soc/tegra/fuse/tegra-apbmisc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/tegra/fuse/tegra-apbmisc.c 2020-04-23 08:30:24.000000000 +0000 @@ -135,7 +135,7 @@ apbmisc.flags = IORESOURCE_MEM; /* strapping options */ - if (tegra_get_chip_id() == TEGRA124) { + if (of_machine_is_compatible("nvidia,tegra124")) { straps.start = 0x7000e864; straps.end = 0x7000e867; } else { diff -Nru linux-4.19.98/drivers/soc/ti/wkup_m3_ipc.c linux-4.19.118/drivers/soc/ti/wkup_m3_ipc.c --- linux-4.19.98/drivers/soc/ti/wkup_m3_ipc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/soc/ti/wkup_m3_ipc.c 2020-04-23 08:30:24.000000000 +0000 @@ -426,6 +426,8 @@ ret = rproc_boot(m3_ipc->rproc); if (ret) dev_err(dev, "rproc_boot failed\n"); + else + m3_ipc_state = m3_ipc; do_exit(0); } @@ -512,8 +514,6 @@ goto err_put_rproc; } - m3_ipc_state = m3_ipc; - return 0; err_put_rproc: diff -Nru linux-4.19.98/drivers/spi/spi-bcm-qspi.c linux-4.19.118/drivers/spi/spi-bcm-qspi.c --- linux-4.19.98/drivers/spi/spi-bcm-qspi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-bcm-qspi.c 2020-04-23 08:30:24.000000000 +0000 @@ -354,7 +354,7 @@ { int bpc = 0, bpp = 0; u8 command = op->cmd.opcode; - int width = op->cmd.buswidth ? op->cmd.buswidth : SPI_NBITS_SINGLE; + int width = op->data.buswidth ? op->data.buswidth : SPI_NBITS_SINGLE; int addrlen = op->addr.nbytes; int flex_mode = 1; @@ -992,7 +992,7 @@ if (mspi_read) return bcm_qspi_mspi_exec_mem_op(spi, op); - ret = bcm_qspi_bspi_set_mode(qspi, op, -1); + ret = bcm_qspi_bspi_set_mode(qspi, op, 0); if (!ret) ret = bcm_qspi_bspi_exec_mem_op(spi, op); diff -Nru linux-4.19.98/drivers/spi/spi-bcm2835aux.c linux-4.19.118/drivers/spi/spi-bcm2835aux.c --- linux-4.19.98/drivers/spi/spi-bcm2835aux.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-bcm2835aux.c 2020-04-23 08:30:24.000000000 +0000 @@ -416,7 +416,18 @@ platform_set_drvdata(pdev, master); master->mode_bits = (SPI_CPOL | SPI_CS_HIGH | SPI_NO_CS); master->bits_per_word_mask = SPI_BPW_MASK(8); - master->num_chipselect = -1; + /* even though the driver never officially supported native CS + * allow a single native CS for legacy DT support purposes when + * no cs-gpio is configured. + * Known limitations for native cs are: + * * multiple chip-selects: cs0-cs2 are all simultaniously asserted + * whenever there is a transfer - this even includes SPI_NO_CS + * * SPI_CS_HIGH: is ignores - cs are always asserted low + * * cs_change: cs is deasserted after each spi_transfer + * * cs_delay_usec: cs is always deasserted one SCK cycle after + * a spi_transfer + */ + master->num_chipselect = 1; master->transfer_one = bcm2835aux_spi_transfer_one; master->handle_err = bcm2835aux_spi_handle_err; master->prepare_message = bcm2835aux_spi_prepare_message; diff -Nru linux-4.19.98/drivers/spi/spi-bcm63xx-hsspi.c linux-4.19.118/drivers/spi/spi-bcm63xx-hsspi.c --- linux-4.19.98/drivers/spi/spi-bcm63xx-hsspi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-bcm63xx-hsspi.c 2020-04-23 08:30:24.000000000 +0000 @@ -371,7 +371,6 @@ goto out_disable_clk; rate = clk_get_rate(pll_clk); - clk_disable_unprepare(pll_clk); if (!rate) { ret = -EINVAL; goto out_disable_pll_clk; diff -Nru linux-4.19.98/drivers/spi/spi-cadence.c linux-4.19.118/drivers/spi/spi-cadence.c --- linux-4.19.98/drivers/spi/spi-cadence.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-cadence.c 2020-04-23 08:30:24.000000000 +0000 @@ -584,11 +584,6 @@ goto clk_dis_apb; } - pm_runtime_use_autosuspend(&pdev->dev); - pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT); - pm_runtime_set_active(&pdev->dev); - pm_runtime_enable(&pdev->dev); - ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs); if (ret < 0) master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS; @@ -603,8 +598,10 @@ /* SPI controller initializations */ cdns_spi_init_hw(xspi); - pm_runtime_mark_last_busy(&pdev->dev); - pm_runtime_put_autosuspend(&pdev->dev); + pm_runtime_set_active(&pdev->dev); + pm_runtime_enable(&pdev->dev); + pm_runtime_use_autosuspend(&pdev->dev); + pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT); irq = platform_get_irq(pdev, 0); if (irq <= 0) { diff -Nru linux-4.19.98/drivers/spi/spi-dw.c linux-4.19.118/drivers/spi/spi-dw.c --- linux-4.19.98/drivers/spi/spi-dw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-dw.c 2020-04-23 08:30:24.000000000 +0000 @@ -179,9 +179,11 @@ static void dw_writer(struct dw_spi *dws) { - u32 max = tx_max(dws); + u32 max; u16 txw = 0; + spin_lock(&dws->buf_lock); + max = tx_max(dws); while (max--) { /* Set the tx word if the transfer's original "tx" is not null */ if (dws->tx_end - dws->len) { @@ -193,13 +195,16 @@ dw_write_io_reg(dws, DW_SPI_DR, txw); dws->tx += dws->n_bytes; } + spin_unlock(&dws->buf_lock); } static void dw_reader(struct dw_spi *dws) { - u32 max = rx_max(dws); + u32 max; u16 rxw; + spin_lock(&dws->buf_lock); + max = rx_max(dws); while (max--) { rxw = dw_read_io_reg(dws, DW_SPI_DR); /* Care rx only if the transfer's original "rx" is not null */ @@ -211,6 +216,7 @@ } dws->rx += dws->n_bytes; } + spin_unlock(&dws->buf_lock); } static void int_error_stop(struct dw_spi *dws, const char *msg) @@ -283,18 +289,20 @@ { struct dw_spi *dws = spi_controller_get_devdata(master); struct chip_data *chip = spi_get_ctldata(spi); + unsigned long flags; u8 imask = 0; u16 txlevel = 0; u32 cr0; int ret; dws->dma_mapped = 0; - + spin_lock_irqsave(&dws->buf_lock, flags); dws->tx = (void *)transfer->tx_buf; dws->tx_end = dws->tx + transfer->len; dws->rx = transfer->rx_buf; dws->rx_end = dws->rx + transfer->len; dws->len = transfer->len; + spin_unlock_irqrestore(&dws->buf_lock, flags); spi_enable_chip(dws, 0); @@ -485,6 +493,7 @@ dws->type = SSI_MOTO_SPI; dws->dma_inited = 0; dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR); + spin_lock_init(&dws->buf_lock); spi_controller_set_devdata(master, dws); diff -Nru linux-4.19.98/drivers/spi/spi-dw.h linux-4.19.118/drivers/spi/spi-dw.h --- linux-4.19.98/drivers/spi/spi-dw.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-dw.h 2020-04-23 08:30:24.000000000 +0000 @@ -118,6 +118,7 @@ size_t len; void *tx; void *tx_end; + spinlock_t buf_lock; void *rx; void *rx_end; int dma_mapped; diff -Nru linux-4.19.98/drivers/spi/spi-fsl-spi.c linux-4.19.118/drivers/spi/spi-fsl-spi.c --- linux-4.19.98/drivers/spi/spi-fsl-spi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-fsl-spi.c 2020-04-23 08:30:24.000000000 +0000 @@ -407,7 +407,6 @@ } m->status = status; - spi_finalize_current_message(master); if (status || !cs_change) { ndelay(nsecs); @@ -415,6 +414,7 @@ } fsl_spi_setup_transfer(spi, NULL); + spi_finalize_current_message(master); return 0; } diff -Nru linux-4.19.98/drivers/spi/spi-mem.c linux-4.19.118/drivers/spi/spi-mem.c --- linux-4.19.98/drivers/spi/spi-mem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-mem.c 2020-04-23 08:30:24.000000000 +0000 @@ -12,6 +12,8 @@ #include "internals.h" +#define SPI_MEM_MAX_BUSWIDTH 4 + /** * spi_controller_dma_map_mem_op_data() - DMA-map the buffer attached to a * memory operation @@ -149,6 +151,44 @@ } EXPORT_SYMBOL_GPL(spi_mem_default_supports_op); +static bool spi_mem_buswidth_is_valid(u8 buswidth) +{ + if (hweight8(buswidth) > 1 || buswidth > SPI_MEM_MAX_BUSWIDTH) + return false; + + return true; +} + +static int spi_mem_check_op(const struct spi_mem_op *op) +{ + if (!op->cmd.buswidth) + return -EINVAL; + + if ((op->addr.nbytes && !op->addr.buswidth) || + (op->dummy.nbytes && !op->dummy.buswidth) || + (op->data.nbytes && !op->data.buswidth)) + return -EINVAL; + + if (!spi_mem_buswidth_is_valid(op->cmd.buswidth) || + !spi_mem_buswidth_is_valid(op->addr.buswidth) || + !spi_mem_buswidth_is_valid(op->dummy.buswidth) || + !spi_mem_buswidth_is_valid(op->data.buswidth)) + return -EINVAL; + + return 0; +} + +static bool spi_mem_internal_supports_op(struct spi_mem *mem, + const struct spi_mem_op *op) +{ + struct spi_controller *ctlr = mem->spi->controller; + + if (ctlr->mem_ops && ctlr->mem_ops->supports_op) + return ctlr->mem_ops->supports_op(mem, op); + + return spi_mem_default_supports_op(mem, op); +} + /** * spi_mem_supports_op() - Check if a memory device and the controller it is * connected to support a specific memory operation @@ -166,12 +206,10 @@ */ bool spi_mem_supports_op(struct spi_mem *mem, const struct spi_mem_op *op) { - struct spi_controller *ctlr = mem->spi->controller; - - if (ctlr->mem_ops && ctlr->mem_ops->supports_op) - return ctlr->mem_ops->supports_op(mem, op); + if (spi_mem_check_op(op)) + return false; - return spi_mem_default_supports_op(mem, op); + return spi_mem_internal_supports_op(mem, op); } EXPORT_SYMBOL_GPL(spi_mem_supports_op); @@ -196,7 +234,11 @@ u8 *tmpbuf; int ret; - if (!spi_mem_supports_op(mem, op)) + ret = spi_mem_check_op(op); + if (ret) + return ret; + + if (!spi_mem_internal_supports_op(mem, op)) return -ENOTSUPP; if (ctlr->mem_ops) { diff -Nru linux-4.19.98/drivers/spi/spi-pxa2xx.c linux-4.19.118/drivers/spi/spi-pxa2xx.c --- linux-4.19.98/drivers/spi/spi-pxa2xx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-pxa2xx.c 2020-04-23 08:30:24.000000000 +0000 @@ -76,6 +76,10 @@ #define LPSS_CAPS_CS_EN_SHIFT 9 #define LPSS_CAPS_CS_EN_MASK (0xf << LPSS_CAPS_CS_EN_SHIFT) +#define LPSS_PRIV_CLOCK_GATE 0x38 +#define LPSS_PRIV_CLOCK_GATE_CLK_CTL_MASK 0x3 +#define LPSS_PRIV_CLOCK_GATE_CLK_CTL_FORCE_ON 0x3 + struct lpss_config { /* LPSS offset from drv_data->ioaddr */ unsigned offset; @@ -92,6 +96,8 @@ unsigned cs_sel_shift; unsigned cs_sel_mask; unsigned cs_num; + /* Quirks */ + unsigned cs_clk_stays_gated : 1; }; /* Keep these sorted with enum pxa_ssp_type */ @@ -162,6 +168,7 @@ .tx_threshold_hi = 56, .cs_sel_shift = 8, .cs_sel_mask = 3 << 8, + .cs_clk_stays_gated = true, }, }; @@ -389,6 +396,22 @@ else value |= LPSS_CS_CONTROL_CS_HIGH; __lpss_ssp_write_priv(drv_data, config->reg_cs_ctrl, value); + if (config->cs_clk_stays_gated) { + u32 clkgate; + + /* + * Changing CS alone when dynamic clock gating is on won't + * actually flip CS at that time. This ruins SPI transfers + * that specify delays, or have no data. Toggle the clock mode + * to force on briefly to poke the CS pin to move. + */ + clkgate = __lpss_ssp_read_priv(drv_data, LPSS_PRIV_CLOCK_GATE); + value = (clkgate & ~LPSS_PRIV_CLOCK_GATE_CLK_CTL_MASK) | + LPSS_PRIV_CLOCK_GATE_CLK_CTL_FORCE_ON; + + __lpss_ssp_write_priv(drv_data, LPSS_PRIV_CLOCK_GATE, value); + __lpss_ssp_write_priv(drv_data, LPSS_PRIV_CLOCK_GATE, clkgate); + } } static void cs_assert(struct spi_device *spi) diff -Nru linux-4.19.98/drivers/spi/spi-qup.c linux-4.19.118/drivers/spi/spi-qup.c --- linux-4.19.98/drivers/spi/spi-qup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-qup.c 2020-04-23 08:30:24.000000000 +0000 @@ -1190,6 +1190,11 @@ struct spi_qup *controller = spi_master_get_devdata(master); int ret; + if (pm_runtime_suspended(device)) { + ret = spi_qup_pm_resume_runtime(device); + if (ret) + return ret; + } ret = spi_master_suspend(master); if (ret) return ret; @@ -1198,10 +1203,8 @@ if (ret) return ret; - if (!pm_runtime_suspended(device)) { - clk_disable_unprepare(controller->cclk); - clk_disable_unprepare(controller->iclk); - } + clk_disable_unprepare(controller->cclk); + clk_disable_unprepare(controller->iclk); return 0; } diff -Nru linux-4.19.98/drivers/spi/spi-tegra114.c linux-4.19.118/drivers/spi/spi-tegra114.c --- linux-4.19.98/drivers/spi/spi-tegra114.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-tegra114.c 2020-04-23 08:30:24.000000000 +0000 @@ -307,10 +307,16 @@ x |= (u32)(*tx_buf++) << (i * 8); tegra_spi_writel(tspi, x, SPI_TX_FIFO); } + + tspi->cur_tx_pos += written_words * tspi->bytes_per_word; } else { + unsigned int write_bytes; max_n_32bit = min(tspi->curr_dma_words, tx_empty_count); written_words = max_n_32bit; nbytes = written_words * tspi->bytes_per_word; + if (nbytes > t->len - tspi->cur_pos) + nbytes = t->len - tspi->cur_pos; + write_bytes = nbytes; for (count = 0; count < max_n_32bit; count++) { u32 x = 0; @@ -319,8 +325,10 @@ x |= (u32)(*tx_buf++) << (i * 8); tegra_spi_writel(tspi, x, SPI_TX_FIFO); } + + tspi->cur_tx_pos += write_bytes; } - tspi->cur_tx_pos += written_words * tspi->bytes_per_word; + return written_words; } @@ -344,20 +352,27 @@ for (i = 0; len && (i < 4); i++, len--) *rx_buf++ = (x >> i*8) & 0xFF; } - tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; read_words += tspi->curr_dma_words; + tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; } else { u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; + u8 bytes_per_word = tspi->bytes_per_word; + unsigned int read_bytes; + len = rx_full_count * bytes_per_word; + if (len > t->len - tspi->cur_pos) + len = t->len - tspi->cur_pos; + read_bytes = len; for (count = 0; count < rx_full_count; count++) { u32 x = tegra_spi_readl(tspi, SPI_RX_FIFO) & rx_mask; - for (i = 0; (i < tspi->bytes_per_word); i++) + for (i = 0; len && (i < bytes_per_word); i++, len--) *rx_buf++ = (x >> (i*8)) & 0xFF; } - tspi->cur_rx_pos += rx_full_count * tspi->bytes_per_word; read_words += rx_full_count; + tspi->cur_rx_pos += read_bytes; } + return read_words; } @@ -372,12 +387,17 @@ unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; memcpy(tspi->tx_dma_buf, t->tx_buf + tspi->cur_pos, len); + tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; } else { unsigned int i; unsigned int count; u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; + unsigned int write_bytes; + if (consume > t->len - tspi->cur_pos) + consume = t->len - tspi->cur_pos; + write_bytes = consume; for (count = 0; count < tspi->curr_dma_words; count++) { u32 x = 0; @@ -386,8 +406,9 @@ x |= (u32)(*tx_buf++) << (i * 8); tspi->tx_dma_buf[count] = x; } + + tspi->cur_tx_pos += write_bytes; } - tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; /* Make the dma buffer to read by dma */ dma_sync_single_for_device(tspi->dev, tspi->tx_dma_phys, @@ -405,20 +426,28 @@ unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; memcpy(t->rx_buf + tspi->cur_rx_pos, tspi->rx_dma_buf, len); + tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; } else { unsigned int i; unsigned int count; unsigned char *rx_buf = t->rx_buf + tspi->cur_rx_pos; u32 rx_mask = ((u32)1 << t->bits_per_word) - 1; + unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; + unsigned int read_bytes; + if (consume > t->len - tspi->cur_pos) + consume = t->len - tspi->cur_pos; + read_bytes = consume; for (count = 0; count < tspi->curr_dma_words; count++) { u32 x = tspi->rx_dma_buf[count] & rx_mask; - for (i = 0; (i < tspi->bytes_per_word); i++) + for (i = 0; consume && (i < tspi->bytes_per_word); + i++, consume--) *rx_buf++ = (x >> (i*8)) & 0xFF; } + + tspi->cur_rx_pos += read_bytes; } - tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; /* Make the dma buffer to read by dma */ dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, @@ -470,22 +499,39 @@ return 0; } -static int tegra_spi_start_dma_based_transfer( - struct tegra_spi_data *tspi, struct spi_transfer *t) +static int tegra_spi_flush_fifos(struct tegra_spi_data *tspi) { - u32 val; - unsigned int len; - int ret = 0; + unsigned long timeout = jiffies + HZ; u32 status; - /* Make sure that Rx and Tx fifo are empty */ status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); if ((status & SPI_FIFO_EMPTY) != SPI_FIFO_EMPTY) { - dev_err(tspi->dev, "Rx/Tx fifo are not empty status 0x%08x\n", - (unsigned)status); - return -EIO; + status |= SPI_RX_FIFO_FLUSH | SPI_TX_FIFO_FLUSH; + tegra_spi_writel(tspi, status, SPI_FIFO_STATUS); + while ((status & SPI_FIFO_EMPTY) != SPI_FIFO_EMPTY) { + status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); + if (time_after(jiffies, timeout)) { + dev_err(tspi->dev, + "timeout waiting for fifo flush\n"); + return -EIO; + } + + udelay(1); + } } + return 0; +} + +static int tegra_spi_start_dma_based_transfer( + struct tegra_spi_data *tspi, struct spi_transfer *t) +{ + u32 val; + unsigned int len; + int ret = 0; + u8 dma_burst; + struct dma_slave_config dma_sconfig = {0}; + val = SPI_DMA_BLK_SET(tspi->curr_dma_words - 1); tegra_spi_writel(tspi, val, SPI_DMA_BLK); @@ -496,12 +542,16 @@ len = tspi->curr_dma_words * 4; /* Set attention level based on length of transfer */ - if (len & 0xF) + if (len & 0xF) { val |= SPI_TX_TRIG_1 | SPI_RX_TRIG_1; - else if (((len) >> 4) & 0x1) + dma_burst = 1; + } else if (((len) >> 4) & 0x1) { val |= SPI_TX_TRIG_4 | SPI_RX_TRIG_4; - else + dma_burst = 4; + } else { val |= SPI_TX_TRIG_8 | SPI_RX_TRIG_8; + dma_burst = 8; + } if (tspi->cur_direction & DATA_DIR_TX) val |= SPI_IE_TX; @@ -512,7 +562,18 @@ tegra_spi_writel(tspi, val, SPI_DMA_CTL); tspi->dma_control_reg = val; + dma_sconfig.device_fc = true; if (tspi->cur_direction & DATA_DIR_TX) { + dma_sconfig.dst_addr = tspi->phys + SPI_TX_FIFO; + dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; + dma_sconfig.dst_maxburst = dma_burst; + ret = dmaengine_slave_config(tspi->tx_dma_chan, &dma_sconfig); + if (ret < 0) { + dev_err(tspi->dev, + "DMA slave config failed: %d\n", ret); + return ret; + } + tegra_spi_copy_client_txbuf_to_spi_txbuf(tspi, t); ret = tegra_spi_start_tx_dma(tspi, len); if (ret < 0) { @@ -523,6 +584,16 @@ } if (tspi->cur_direction & DATA_DIR_RX) { + dma_sconfig.src_addr = tspi->phys + SPI_RX_FIFO; + dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; + dma_sconfig.src_maxburst = dma_burst; + ret = dmaengine_slave_config(tspi->rx_dma_chan, &dma_sconfig); + if (ret < 0) { + dev_err(tspi->dev, + "DMA slave config failed: %d\n", ret); + return ret; + } + /* Make the dma buffer to read by dma */ dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, tspi->dma_buf_size, DMA_FROM_DEVICE); @@ -582,7 +653,6 @@ u32 *dma_buf; dma_addr_t dma_phys; int ret; - struct dma_slave_config dma_sconfig; dma_chan = dma_request_slave_channel_reason(tspi->dev, dma_to_memory ? "rx" : "tx"); @@ -603,19 +673,6 @@ } if (dma_to_memory) { - dma_sconfig.src_addr = tspi->phys + SPI_RX_FIFO; - dma_sconfig.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - dma_sconfig.src_maxburst = 0; - } else { - dma_sconfig.dst_addr = tspi->phys + SPI_TX_FIFO; - dma_sconfig.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - dma_sconfig.dst_maxburst = 0; - } - - ret = dmaengine_slave_config(dma_chan, &dma_sconfig); - if (ret) - goto scrub; - if (dma_to_memory) { tspi->rx_dma_chan = dma_chan; tspi->rx_dma_buf = dma_buf; tspi->rx_dma_phys = dma_phys; @@ -625,11 +682,6 @@ tspi->tx_dma_phys = dma_phys; } return 0; - -scrub: - dma_free_coherent(tspi->dev, tspi->dma_buf_size, dma_buf, dma_phys); - dma_release_channel(dma_chan); - return ret; } static void tegra_spi_deinit_dma_param(struct tegra_spi_data *tspi, @@ -730,6 +782,8 @@ if (tspi->is_packed) command1 |= SPI_PACKED; + else + command1 &= ~SPI_PACKED; command1 &= ~(SPI_CS_SEL_MASK | SPI_TX_EN | SPI_RX_EN); tspi->cur_direction = 0; @@ -748,6 +802,9 @@ dev_dbg(tspi->dev, "The def 0x%x and written 0x%x\n", tspi->def_command1_reg, (unsigned)command1); + ret = tegra_spi_flush_fifos(tspi); + if (ret < 0) + return ret; if (total_fifo_words > SPI_FIFO_DEPTH) ret = tegra_spi_start_dma_based_transfer(tspi, t); else @@ -838,7 +895,17 @@ if (WARN_ON(ret == 0)) { dev_err(tspi->dev, "spi transfer timeout, err %d\n", ret); + if (tspi->is_curr_dma_xfer && + (tspi->cur_direction & DATA_DIR_TX)) + dmaengine_terminate_all(tspi->tx_dma_chan); + if (tspi->is_curr_dma_xfer && + (tspi->cur_direction & DATA_DIR_RX)) + dmaengine_terminate_all(tspi->rx_dma_chan); ret = -EIO; + tegra_spi_flush_fifos(tspi); + reset_control_assert(tspi->rst); + udelay(2); + reset_control_deassert(tspi->rst); goto complete_xfer; } @@ -889,6 +956,7 @@ tspi->status_reg); dev_err(tspi->dev, "CpuXfer 0x%08x:0x%08x\n", tspi->command1_reg, tspi->dma_control_reg); + tegra_spi_flush_fifos(tspi); reset_control_assert(tspi->rst); udelay(2); reset_control_deassert(tspi->rst); @@ -961,6 +1029,7 @@ tspi->status_reg); dev_err(tspi->dev, "DmaXfer 0x%08x:0x%08x\n", tspi->command1_reg, tspi->dma_control_reg); + tegra_spi_flush_fifos(tspi); reset_control_assert(tspi->rst); udelay(2); reset_control_deassert(tspi->rst); diff -Nru linux-4.19.98/drivers/spi/spi-topcliff-pch.c linux-4.19.118/drivers/spi/spi-topcliff-pch.c --- linux-4.19.98/drivers/spi/spi-topcliff-pch.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-topcliff-pch.c 2020-04-23 08:30:24.000000000 +0000 @@ -1008,6 +1008,9 @@ /* RX */ dma->sg_rx_p = kcalloc(num, sizeof(*dma->sg_rx_p), GFP_ATOMIC); + if (!dma->sg_rx_p) + return; + sg_init_table(dma->sg_rx_p, num); /* Initialize SG table */ /* offset, length setting */ sg = dma->sg_rx_p; @@ -1068,6 +1071,9 @@ } dma->sg_tx_p = kcalloc(num, sizeof(*dma->sg_tx_p), GFP_ATOMIC); + if (!dma->sg_tx_p) + return; + sg_init_table(dma->sg_tx_p, num); /* Initialize SG table */ /* offset, length setting */ sg = dma->sg_tx_p; diff -Nru linux-4.19.98/drivers/spi/spi-zynqmp-gqspi.c linux-4.19.118/drivers/spi/spi-zynqmp-gqspi.c --- linux-4.19.98/drivers/spi/spi-zynqmp-gqspi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/spi/spi-zynqmp-gqspi.c 2020-04-23 08:30:24.000000000 +0000 @@ -403,9 +403,6 @@ zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, genfifoentry); - /* Dummy generic FIFO entry */ - zynqmp_gqspi_write(xqspi, GQSPI_GEN_FIFO_OFST, 0x0); - /* Manually start the generic FIFO command */ zynqmp_gqspi_write(xqspi, GQSPI_CONFIG_OFST, zynqmp_gqspi_read(xqspi, GQSPI_CONFIG_OFST) | diff -Nru linux-4.19.98/drivers/staging/android/ashmem.c linux-4.19.118/drivers/staging/android/ashmem.c --- linux-4.19.98/drivers/staging/android/ashmem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/android/ashmem.c 2020-04-23 08:30:24.000000000 +0000 @@ -350,8 +350,23 @@ _calc_vm_trans(prot, PROT_EXEC, VM_MAYEXEC); } +static int ashmem_vmfile_mmap(struct file *file, struct vm_area_struct *vma) +{ + /* do not allow to mmap ashmem backing shmem file directly */ + return -EPERM; +} + +static unsigned long +ashmem_vmfile_get_unmapped_area(struct file *file, unsigned long addr, + unsigned long len, unsigned long pgoff, + unsigned long flags) +{ + return current->mm->get_unmapped_area(file, addr, len, pgoff, flags); +} + static int ashmem_mmap(struct file *file, struct vm_area_struct *vma) { + static struct file_operations vmfile_fops; struct ashmem_area *asma = file->private_data; int ret = 0; @@ -392,6 +407,19 @@ } vmfile->f_mode |= FMODE_LSEEK; asma->file = vmfile; + /* + * override mmap operation of the vmfile so that it can't be + * remapped which would lead to creation of a new vma with no + * asma permission checks. Have to override get_unmapped_area + * as well to prevent VM_BUG_ON check for f_ops modification. + */ + if (!vmfile_fops.mmap) { + vmfile_fops = *vmfile->f_op; + vmfile_fops.mmap = ashmem_vmfile_mmap; + vmfile_fops.get_unmapped_area = + ashmem_vmfile_get_unmapped_area; + } + vmfile->f_op = &vmfile_fops; } get_file(asma->file); diff -Nru linux-4.19.98/drivers/staging/android/vsoc.c linux-4.19.118/drivers/staging/android/vsoc.c --- linux-4.19.98/drivers/staging/android/vsoc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/android/vsoc.c 2020-04-23 08:30:24.000000000 +0000 @@ -260,7 +260,8 @@ atomic_t *owner_ptr = NULL; struct vsoc_device_region *managed_region_p; - if (copy_from_user(&np->permission, &arg->perm, sizeof(*np)) || + if (copy_from_user(&np->permission, + &arg->perm, sizeof(np->permission)) || copy_from_user(&managed_fd, &arg->managed_region_fd, sizeof(managed_fd))) { return -EFAULT; diff -Nru linux-4.19.98/drivers/staging/comedi/drivers/ni_mio_common.c linux-4.19.118/drivers/staging/comedi/drivers/ni_mio_common.c --- linux-4.19.98/drivers/staging/comedi/drivers/ni_mio_common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/comedi/drivers/ni_mio_common.c 2020-04-23 08:30:24.000000000 +0000 @@ -4984,7 +4984,10 @@ case NI_RTSI_OUTPUT_G_SRC0: case NI_RTSI_OUTPUT_G_GATE0: case NI_RTSI_OUTPUT_RGOUT0: - case NI_RTSI_OUTPUT_RTSI_BRD_0: + case NI_RTSI_OUTPUT_RTSI_BRD(0): + case NI_RTSI_OUTPUT_RTSI_BRD(1): + case NI_RTSI_OUTPUT_RTSI_BRD(2): + case NI_RTSI_OUTPUT_RTSI_BRD(3): return 1; case NI_RTSI_OUTPUT_RTSI_OSC: return (devpriv->is_m_series) ? 1 : 0; @@ -5005,11 +5008,18 @@ devpriv->rtsi_trig_a_output_reg |= NISTC_RTSI_TRIG(chan, src); ni_stc_writew(dev, devpriv->rtsi_trig_a_output_reg, NISTC_RTSI_TRIGA_OUT_REG); - } else if (chan < 8) { + } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { devpriv->rtsi_trig_b_output_reg &= ~NISTC_RTSI_TRIG_MASK(chan); devpriv->rtsi_trig_b_output_reg |= NISTC_RTSI_TRIG(chan, src); ni_stc_writew(dev, devpriv->rtsi_trig_b_output_reg, NISTC_RTSI_TRIGB_OUT_REG); + } else if (chan != NISTC_RTSI_TRIG_OLD_CLK_CHAN) { + /* probably should never reach this, since the + * ni_valid_rtsi_output_source above errors out if chan is too + * high + */ + dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); + return -EINVAL; } return 2; } @@ -5025,12 +5035,12 @@ } else if (chan < NISTC_RTSI_TRIG_NUM_CHAN(devpriv->is_m_series)) { return NISTC_RTSI_TRIG_TO_SRC(chan, devpriv->rtsi_trig_b_output_reg); - } else { - if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) - return NI_RTSI_OUTPUT_RTSI_OSC; - dev_err(dev->class_dev, "bug! should never get here?\n"); - return 0; + } else if (chan == NISTC_RTSI_TRIG_OLD_CLK_CHAN) { + return NI_RTSI_OUTPUT_RTSI_OSC; } + + dev_err(dev->class_dev, "%s: unknown rtsi channel\n", __func__); + return -EINVAL; } static int ni_rtsi_insn_config(struct comedi_device *dev, diff -Nru linux-4.19.98/drivers/staging/erofs/utils.c linux-4.19.118/drivers/staging/erofs/utils.c --- linux-4.19.98/drivers/staging/erofs/utils.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/erofs/utils.c 2020-04-23 08:30:24.000000000 +0000 @@ -309,7 +309,7 @@ sbi->shrinker_run_no = run_no; #ifdef CONFIG_EROFS_FS_ZIP - freed += erofs_shrink_workstation(sbi, nr, false); + freed += erofs_shrink_workstation(sbi, nr - freed, false); #endif spin_lock(&erofs_sb_list_lock); diff -Nru linux-4.19.98/drivers/staging/greybus/audio_manager.c linux-4.19.118/drivers/staging/greybus/audio_manager.c --- linux-4.19.98/drivers/staging/greybus/audio_manager.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/greybus/audio_manager.c 2020-04-23 08:30:24.000000000 +0000 @@ -89,8 +89,8 @@ list_for_each_entry_safe(module, next, &modules_list, list) { list_del(&module->list); - kobject_put(&module->kobj); ida_simple_remove(&module_id, module->id); + kobject_put(&module->kobj); } is_empty = list_empty(&modules_list); diff -Nru linux-4.19.98/drivers/staging/greybus/light.c linux-4.19.118/drivers/staging/greybus/light.c --- linux-4.19.98/drivers/staging/greybus/light.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/greybus/light.c 2020-04-23 08:30:24.000000000 +0000 @@ -1098,21 +1098,21 @@ static void gb_lights_light_release(struct gb_light *light) { int i; - int count; light->ready = false; - count = light->channels_count; - if (light->has_flash) gb_lights_light_v4l2_unregister(light); + light->has_flash = false; - for (i = 0; i < count; i++) { + for (i = 0; i < light->channels_count; i++) gb_lights_channel_release(&light->channels[i]); - light->channels_count--; - } + light->channels_count = 0; + kfree(light->channels); + light->channels = NULL; kfree(light->name); + light->name = NULL; } static void gb_lights_release(struct gb_lights *glights) diff -Nru linux-4.19.98/drivers/staging/greybus/tools/loopback_test.c linux-4.19.118/drivers/staging/greybus/tools/loopback_test.c --- linux-4.19.98/drivers/staging/greybus/tools/loopback_test.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/greybus/tools/loopback_test.c 2020-04-23 08:30:24.000000000 +0000 @@ -21,6 +21,7 @@ #include #define MAX_NUM_DEVICES 10 +#define MAX_SYSFS_PREFIX 0x80 #define MAX_SYSFS_PATH 0x200 #define CSV_MAX_LINE 0x1000 #define SYSFS_MAX_INT 0x20 @@ -69,7 +70,7 @@ }; struct loopback_device { - char name[MAX_SYSFS_PATH]; + char name[MAX_STR_LEN]; char sysfs_entry[MAX_SYSFS_PATH]; char debugfs_entry[MAX_SYSFS_PATH]; struct loopback_results results; @@ -95,8 +96,8 @@ int stop_all; int poll_count; char test_name[MAX_STR_LEN]; - char sysfs_prefix[MAX_SYSFS_PATH]; - char debugfs_prefix[MAX_SYSFS_PATH]; + char sysfs_prefix[MAX_SYSFS_PREFIX]; + char debugfs_prefix[MAX_SYSFS_PREFIX]; struct timespec poll_timeout; struct loopback_device devices[MAX_NUM_DEVICES]; struct loopback_results aggregate_results; @@ -645,7 +646,7 @@ static int open_poll_files(struct loopback_test *t) { struct loopback_device *dev; - char buf[MAX_STR_LEN]; + char buf[MAX_SYSFS_PATH + MAX_STR_LEN]; char dummy; int fds_idx = 0; int i; @@ -663,7 +664,7 @@ goto err; } read(t->fds[fds_idx].fd, &dummy, 1); - t->fds[fds_idx].events = EPOLLERR|EPOLLPRI; + t->fds[fds_idx].events = POLLERR | POLLPRI; t->fds[fds_idx].revents = 0; fds_idx++; } @@ -756,7 +757,7 @@ } for (i = 0; i < t->poll_count; i++) { - if (t->fds[i].revents & EPOLLPRI) { + if (t->fds[i].revents & POLLPRI) { /* Dummy read to clear the event */ read(t->fds[i].fd, &dummy, 1); number_of_events++; @@ -915,10 +916,10 @@ t.iteration_max = atoi(optarg); break; case 'S': - snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", optarg); + snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); break; case 'D': - snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", optarg); + snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", optarg); break; case 'm': t.mask = atol(optarg); @@ -969,10 +970,10 @@ } if (!strcmp(t.sysfs_prefix, "")) - snprintf(t.sysfs_prefix, MAX_SYSFS_PATH, "%s", sysfs_prefix); + snprintf(t.sysfs_prefix, MAX_SYSFS_PREFIX, "%s", sysfs_prefix); if (!strcmp(t.debugfs_prefix, "")) - snprintf(t.debugfs_prefix, MAX_SYSFS_PATH, "%s", debugfs_prefix); + snprintf(t.debugfs_prefix, MAX_SYSFS_PREFIX, "%s", debugfs_prefix); ret = find_loopback_devices(&t); if (ret) diff -Nru linux-4.19.98/drivers/staging/most/cdev/cdev.c linux-4.19.118/drivers/staging/most/cdev/cdev.c --- linux-4.19.98/drivers/staging/most/cdev/cdev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/most/cdev/cdev.c 2020-04-23 08:30:24.000000000 +0000 @@ -453,7 +453,9 @@ c->devno = MKDEV(comp.major, current_minor); cdev_init(&c->cdev, &channel_fops); c->cdev.owner = THIS_MODULE; - cdev_add(&c->cdev, c->devno, 1); + retval = cdev_add(&c->cdev, c->devno, 1); + if (retval < 0) + goto err_free_c; c->iface = iface; c->cfg = cfg; c->channel_id = channel_id; @@ -485,6 +487,7 @@ list_del(&c->list); error_alloc_kfifo: cdev_del(&c->cdev); +err_free_c: kfree(c); error_alloc_channel: ida_simple_remove(&comp.minor_id, current_minor); diff -Nru linux-4.19.98/drivers/staging/most/net/net.c linux-4.19.118/drivers/staging/most/net/net.c --- linux-4.19.98/drivers/staging/most/net/net.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/most/net/net.c 2020-04-23 08:30:24.000000000 +0000 @@ -81,6 +81,11 @@ unsigned int payload_len = skb->len - ETH_HLEN; unsigned int mdp_len = payload_len + MDP_HDR_LEN; + if (mdp_len < skb->len) { + pr_err("drop: too large packet! (%u)\n", skb->len); + return -EINVAL; + } + if (mbo->buffer_length < mdp_len) { pr_err("drop: too small buffer! (%d for %d)\n", mbo->buffer_length, mdp_len); @@ -128,6 +133,11 @@ u8 *buff = mbo->virt_address; unsigned int mep_len = skb->len + MEP_HDR_LEN; + if (mep_len < skb->len) { + pr_err("drop: too large packet! (%u)\n", skb->len); + return -EINVAL; + } + if (mbo->buffer_length < mep_len) { pr_err("drop: too small buffer! (%d for %d)\n", mbo->buffer_length, mep_len); diff -Nru linux-4.19.98/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c linux-4.19.118/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c --- linux-4.19.98/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c 2020-04-23 08:30:24.000000000 +0000 @@ -229,18 +229,21 @@ /* parsing WPA/WPA2 IE */ { - u8 buf[MAX_WPA_IE_LEN]; + u8 *buf; u8 wpa_ie[255], rsn_ie[255]; u16 wpa_len = 0, rsn_len = 0; u8 *p; + buf = kzalloc(MAX_WPA_IE_LEN, GFP_ATOMIC); + if (!buf) + return start; + rtw_get_sec_ie(pnetwork->network.ies, pnetwork->network.ie_length, rsn_ie, &rsn_len, wpa_ie, &wpa_len); RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_wx_get_scan: ssid =%s\n", pnetwork->network.Ssid.Ssid)); RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_wx_get_scan: wpa_len =%d rsn_len =%d\n", wpa_len, rsn_len)); if (wpa_len > 0) { p = buf; - memset(buf, 0, MAX_WPA_IE_LEN); p += sprintf(p, "wpa_ie="); for (i = 0; i < wpa_len; i++) p += sprintf(p, "%02x", wpa_ie[i]); @@ -257,7 +260,6 @@ } if (rsn_len > 0) { p = buf; - memset(buf, 0, MAX_WPA_IE_LEN); p += sprintf(p, "rsn_ie="); for (i = 0; i < rsn_len; i++) p += sprintf(p, "%02x", rsn_ie[i]); @@ -271,6 +273,7 @@ iwe.u.data.length = rsn_len; start = iwe_stream_add_point(info, start, stop, &iwe, rsn_ie); } + kfree(buf); } {/* parsing WPS IE */ @@ -2023,7 +2026,7 @@ struct ieee_param *param; uint ret = 0; - if (p->length < sizeof(struct ieee_param) || !p->pointer) { + if (!p->pointer || p->length != sizeof(struct ieee_param)) { ret = -EINVAL; goto out; } @@ -2816,7 +2819,7 @@ goto out; } - if (!p->pointer) { + if (!p->pointer || p->length != sizeof(struct ieee_param)) { ret = -EINVAL; goto out; } diff -Nru linux-4.19.98/drivers/staging/rtl8188eu/os_dep/usb_intf.c linux-4.19.118/drivers/staging/rtl8188eu/os_dep/usb_intf.c --- linux-4.19.98/drivers/staging/rtl8188eu/os_dep/usb_intf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/rtl8188eu/os_dep/usb_intf.c 2020-04-23 08:30:24.000000000 +0000 @@ -32,12 +32,14 @@ /****** 8188EUS ********/ {USB_DEVICE(0x056e, 0x4008)}, /* Elecom WDC-150SU2M */ {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */ + {USB_DEVICE(0x0B05, 0x18F0)}, /* ASUS USB-N10 Nano B1 */ {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */ {USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */ {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */ {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */ {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */ + {USB_DEVICE(0x2C4E, 0x0102)}, /* MERCUSYS MW150US v2 */ {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */ {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */ {} /* Terminating entry */ diff -Nru linux-4.19.98/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c linux-4.19.118/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c --- linux-4.19.98/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/rtl8723bs/hal/rtl8723bs_xmit.c 2020-04-23 08:30:24.000000000 +0000 @@ -478,14 +478,13 @@ s32 ret; struct adapter *padapter; struct xmit_priv *pxmitpriv; - u8 thread_name[20] = "RTWHALXT"; - + u8 thread_name[20]; ret = _SUCCESS; padapter = context; pxmitpriv = &padapter->xmitpriv; - rtw_sprintf(thread_name, 20, "%s-"ADPT_FMT, thread_name, ADPT_ARG(padapter)); + rtw_sprintf(thread_name, 20, "RTWHALXT-" ADPT_FMT, ADPT_ARG(padapter)); thread_enter(thread_name); DBG_871X("start "FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter)); diff -Nru linux-4.19.98/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c linux-4.19.118/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c --- linux-4.19.98/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/rtl8723bs/os_dep/ioctl_linux.c 2020-04-23 08:30:24.000000000 +0000 @@ -3400,7 +3400,7 @@ /* down(&ieee->wx_sem); */ - if (p->length < sizeof(struct ieee_param) || !p->pointer) { + if (!p->pointer || p->length != sizeof(struct ieee_param)) { ret = -EINVAL; goto out; } @@ -4236,7 +4236,7 @@ /* if (p->length < sizeof(struct ieee_param) || !p->pointer) { */ - if (!p->pointer) { + if (!p->pointer || p->length != sizeof(*param)) { ret = -EINVAL; goto out; } diff -Nru linux-4.19.98/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c linux-4.19.118/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c --- linux-4.19.98/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_func_88xx.c 2020-04-23 08:30:24.000000000 +0000 @@ -2466,8 +2466,11 @@ segment_size = (u8)PSD_DATA_GET_SEGMENT_SIZE(c2h_buf); psd_set->data_size = total_size; - if (!psd_set->data) + if (!psd_set->data) { psd_set->data = kzalloc(psd_set->data_size, GFP_KERNEL); + if (!psd_set->data) + return HALMAC_RET_MALLOC_FAIL; + } if (segment_id == 0) psd_set->segment_size = segment_size; diff -Nru linux-4.19.98/drivers/staging/speakup/main.c linux-4.19.118/drivers/staging/speakup/main.c --- linux-4.19.98/drivers/staging/speakup/main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/speakup/main.c 2020-04-23 08:30:24.000000000 +0000 @@ -561,7 +561,7 @@ return 0; } else if (tmpx < vc->vc_cols - 2 && (ch == SPACE || ch == 0 || (ch < 0x100 && IS_WDLM(ch))) && - get_char(vc, (u_short *)&tmp_pos + 1, &temp) > SPACE) { + get_char(vc, (u_short *)tmp_pos + 1, &temp) > SPACE) { tmp_pos += 2; tmpx++; } else { diff -Nru linux-4.19.98/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c linux-4.19.118/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c --- linux-4.19.98/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c 2020-04-23 08:30:24.000000000 +0000 @@ -47,6 +47,7 @@ MODULE_AUTHOR("Vincent Sanders"); MODULE_LICENSE("GPL"); MODULE_VERSION(BM2835_MMAL_VERSION); +MODULE_ALIAS("platform:bcm2835-camera"); int bcm2835_v4l2_debug; module_param_named(debug, bcm2835_v4l2_debug, int, 0644); @@ -1854,6 +1855,12 @@ num_cameras = get_num_cameras(instance, resolutions, MAX_BCM2835_CAMERAS); + + if (num_cameras < 1) { + ret = -ENODEV; + goto cleanup_mmal; + } + if (num_cameras > MAX_BCM2835_CAMERAS) num_cameras = MAX_BCM2835_CAMERAS; @@ -1953,6 +1960,9 @@ pr_info("%s: error %d while loading driver\n", BM2835_MMAL_MODULE_NAME, ret); +cleanup_mmal: + vchiq_mmal_finalise(instance); + return ret; } diff -Nru linux-4.19.98/drivers/staging/vt6656/device.h linux-4.19.118/drivers/staging/vt6656/device.h --- linux-4.19.98/drivers/staging/vt6656/device.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/vt6656/device.h 2020-04-23 08:30:24.000000000 +0000 @@ -52,6 +52,8 @@ #define RATE_AUTO 12 #define MAX_RATE 12 +#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\ + BIT(RATE_5M) | BIT(RATE_11M)) /* * device specific diff -Nru linux-4.19.98/drivers/staging/vt6656/dpc.c linux-4.19.118/drivers/staging/vt6656/dpc.c --- linux-4.19.98/drivers/staging/vt6656/dpc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/vt6656/dpc.c 2020-04-23 08:30:24.000000000 +0000 @@ -130,7 +130,7 @@ vnt_rf_rssi_to_dbm(priv, *rssi, &rx_dbm); - priv->bb_pre_ed_rssi = (u8)rx_dbm + 1; + priv->bb_pre_ed_rssi = (u8)-rx_dbm + 1; priv->current_rssi = priv->bb_pre_ed_rssi; skb_pull(skb, 8); diff -Nru linux-4.19.98/drivers/staging/vt6656/int.c linux-4.19.118/drivers/staging/vt6656/int.c --- linux-4.19.98/drivers/staging/vt6656/int.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/vt6656/int.c 2020-04-23 08:30:24.000000000 +0000 @@ -97,9 +97,11 @@ info->status.rates[0].count = tx_retry; - if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { + if (!(tsr & TSR_TMO)) { info->status.rates[0].idx = idx; - info->flags |= IEEE80211_TX_STAT_ACK; + + if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) + info->flags |= IEEE80211_TX_STAT_ACK; } ieee80211_tx_status_irqsafe(priv->hw, context->skb); diff -Nru linux-4.19.98/drivers/staging/vt6656/main_usb.c linux-4.19.118/drivers/staging/vt6656/main_usb.c --- linux-4.19.98/drivers/staging/vt6656/main_usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/vt6656/main_usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -978,6 +978,7 @@ ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS); ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS); ieee80211_hw_set(priv->hw, SUPPORTS_PS); + ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK); priv->hw->max_signal = 100; diff -Nru linux-4.19.98/drivers/staging/vt6656/rxtx.c linux-4.19.118/drivers/staging/vt6656/rxtx.c --- linux-4.19.98/drivers/staging/vt6656/rxtx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/vt6656/rxtx.c 2020-04-23 08:30:24.000000000 +0000 @@ -278,11 +278,9 @@ PK_TYPE_11B, &buf->b); /* Get Duration and TimeStamp */ - if (ieee80211_is_pspoll(hdr->frame_control)) { - __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); - - buf->duration_a = dur; - buf->duration_b = dur; + if (ieee80211_is_nullfunc(hdr->frame_control)) { + buf->duration_a = hdr->duration_id; + buf->duration_b = hdr->duration_id; } else { buf->duration_a = vnt_get_duration_le(priv, tx_context->pkt_type, need_ack); @@ -371,10 +369,8 @@ tx_context->pkt_type, &buf->ab); /* Get Duration and TimeStampOff */ - if (ieee80211_is_pspoll(hdr->frame_control)) { - __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); - - buf->duration = dur; + if (ieee80211_is_nullfunc(hdr->frame_control)) { + buf->duration = hdr->duration_id; } else { buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, need_ack); @@ -815,10 +811,14 @@ if (info->band == NL80211_BAND_5GHZ) { pkt_type = PK_TYPE_11A; } else { - if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) - pkt_type = PK_TYPE_11GB; - else - pkt_type = PK_TYPE_11GA; + if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { + if (priv->basic_rates & VNT_B_RATES) + pkt_type = PK_TYPE_11GB; + else + pkt_type = PK_TYPE_11GA; + } else { + pkt_type = PK_TYPE_11A; + } } } else { pkt_type = PK_TYPE_11B; diff -Nru linux-4.19.98/drivers/staging/wlan-ng/hfa384x_usb.c linux-4.19.118/drivers/staging/wlan-ng/hfa384x_usb.c --- linux-4.19.98/drivers/staging/wlan-ng/hfa384x_usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/wlan-ng/hfa384x_usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -3494,6 +3494,8 @@ WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN)) { pr_debug("overlen frm: len=%zd\n", skblen - sizeof(struct p80211_caphdr)); + + return; } skb = dev_alloc_skb(skblen); diff -Nru linux-4.19.98/drivers/staging/wlan-ng/prism2mgmt.c linux-4.19.118/drivers/staging/wlan-ng/prism2mgmt.c --- linux-4.19.98/drivers/staging/wlan-ng/prism2mgmt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/wlan-ng/prism2mgmt.c 2020-04-23 08:30:24.000000000 +0000 @@ -959,7 +959,7 @@ } } - return 0; + return result; } /*---------------------------------------------------------------- diff -Nru linux-4.19.98/drivers/staging/wlan-ng/prism2usb.c linux-4.19.118/drivers/staging/wlan-ng/prism2usb.c --- linux-4.19.98/drivers/staging/wlan-ng/prism2usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/staging/wlan-ng/prism2usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -180,6 +180,7 @@ cancel_work_sync(&hw->link_bh); cancel_work_sync(&hw->commsqual_bh); + cancel_work_sync(&hw->usb_work); /* Now we complete any outstanding commands * and tell everyone who is waiting for their diff -Nru linux-4.19.98/drivers/target/iscsi/iscsi_target.c linux-4.19.118/drivers/target/iscsi/iscsi_target.c --- linux-4.19.98/drivers/target/iscsi/iscsi_target.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/target/iscsi/iscsi_target.c 2020-04-23 08:30:24.000000000 +0000 @@ -1157,9 +1157,7 @@ hdr->cmdsn, be32_to_cpu(hdr->data_length), payload_length, conn->cid); - if (target_get_sess_cmd(&cmd->se_cmd, true) < 0) - return iscsit_add_reject_cmd(cmd, - ISCSI_REASON_WAITING_FOR_LOGOUT, buf); + target_get_sess_cmd(&cmd->se_cmd, true); cmd->sense_reason = transport_lookup_cmd_lun(&cmd->se_cmd, scsilun_to_int(&hdr->lun)); @@ -2000,9 +1998,7 @@ conn->sess->se_sess, 0, DMA_NONE, TCM_SIMPLE_TAG, cmd->sense_buffer + 2); - if (target_get_sess_cmd(&cmd->se_cmd, true) < 0) - return iscsit_add_reject_cmd(cmd, - ISCSI_REASON_WAITING_FOR_LOGOUT, buf); + target_get_sess_cmd(&cmd->se_cmd, true); /* * TASK_REASSIGN for ERL=2 / connection stays inside of @@ -4208,8 +4204,6 @@ * must wait until they have completed. */ iscsit_check_conn_usage_count(conn); - target_sess_cmd_list_set_waiting(sess->se_sess); - target_wait_for_sess_cmds(sess->se_sess); ahash_request_free(conn->conn_tx_hash); if (conn->conn_rx_hash) { @@ -4281,30 +4275,37 @@ if (!atomic_read(&sess->session_reinstatement) && atomic_read(&sess->session_fall_back_to_erl0)) { spin_unlock_bh(&sess->conn_lock); + complete_all(&sess->session_wait_comp); iscsit_close_session(sess); return 0; } else if (atomic_read(&sess->session_logout)) { pr_debug("Moving to TARG_SESS_STATE_FREE.\n"); sess->session_state = TARG_SESS_STATE_FREE; - spin_unlock_bh(&sess->conn_lock); - if (atomic_read(&sess->sleep_on_sess_wait_comp)) - complete(&sess->session_wait_comp); + if (atomic_read(&sess->session_close)) { + spin_unlock_bh(&sess->conn_lock); + complete_all(&sess->session_wait_comp); + iscsit_close_session(sess); + } else { + spin_unlock_bh(&sess->conn_lock); + } return 0; } else { pr_debug("Moving to TARG_SESS_STATE_FAILED.\n"); sess->session_state = TARG_SESS_STATE_FAILED; - if (!atomic_read(&sess->session_continuation)) { - spin_unlock_bh(&sess->conn_lock); + if (!atomic_read(&sess->session_continuation)) iscsit_start_time2retain_handler(sess); - } else - spin_unlock_bh(&sess->conn_lock); - if (atomic_read(&sess->sleep_on_sess_wait_comp)) - complete(&sess->session_wait_comp); + if (atomic_read(&sess->session_close)) { + spin_unlock_bh(&sess->conn_lock); + complete_all(&sess->session_wait_comp); + iscsit_close_session(sess); + } else { + spin_unlock_bh(&sess->conn_lock); + } return 0; } @@ -4410,9 +4411,9 @@ complete(&conn->conn_logout_comp); iscsit_dec_conn_usage_count(conn); + atomic_set(&sess->session_close, 1); iscsit_stop_session(sess, sleep, sleep); iscsit_dec_session_usage_count(sess); - iscsit_close_session(sess); } static void iscsit_logout_post_handler_samecid( @@ -4547,49 +4548,6 @@ sess->session_state = TARG_SESS_STATE_FAILED; } -int iscsit_free_session(struct iscsi_session *sess) -{ - u16 conn_count = atomic_read(&sess->nconn); - struct iscsi_conn *conn, *conn_tmp = NULL; - int is_last; - - spin_lock_bh(&sess->conn_lock); - atomic_set(&sess->sleep_on_sess_wait_comp, 1); - - list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, - conn_list) { - if (conn_count == 0) - break; - - if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { - is_last = 1; - } else { - iscsit_inc_conn_usage_count(conn_tmp); - is_last = 0; - } - iscsit_inc_conn_usage_count(conn); - - spin_unlock_bh(&sess->conn_lock); - iscsit_cause_connection_reinstatement(conn, 1); - spin_lock_bh(&sess->conn_lock); - - iscsit_dec_conn_usage_count(conn); - if (is_last == 0) - iscsit_dec_conn_usage_count(conn_tmp); - - conn_count--; - } - - if (atomic_read(&sess->nconn)) { - spin_unlock_bh(&sess->conn_lock); - wait_for_completion(&sess->session_wait_comp); - } else - spin_unlock_bh(&sess->conn_lock); - - iscsit_close_session(sess); - return 0; -} - void iscsit_stop_session( struct iscsi_session *sess, int session_sleep, @@ -4600,8 +4558,6 @@ int is_last; spin_lock_bh(&sess->conn_lock); - if (session_sleep) - atomic_set(&sess->sleep_on_sess_wait_comp, 1); if (connection_sleep) { list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, @@ -4659,12 +4615,15 @@ spin_lock(&sess->conn_lock); if (atomic_read(&sess->session_fall_back_to_erl0) || atomic_read(&sess->session_logout) || + atomic_read(&sess->session_close) || (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) { spin_unlock(&sess->conn_lock); continue; } + iscsit_inc_session_usage_count(sess); atomic_set(&sess->session_reinstatement, 1); atomic_set(&sess->session_fall_back_to_erl0, 1); + atomic_set(&sess->session_close, 1); spin_unlock(&sess->conn_lock); list_move_tail(&se_sess->sess_list, &free_list); @@ -4674,7 +4633,9 @@ list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) { sess = (struct iscsi_session *)se_sess->fabric_sess_ptr; - iscsit_free_session(sess); + list_del_init(&se_sess->sess_list); + iscsit_stop_session(sess, 1, 1); + iscsit_dec_session_usage_count(sess); session_count++; } diff -Nru linux-4.19.98/drivers/target/iscsi/iscsi_target.h linux-4.19.118/drivers/target/iscsi/iscsi_target.h --- linux-4.19.98/drivers/target/iscsi/iscsi_target.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/target/iscsi/iscsi_target.h 2020-04-23 08:30:24.000000000 +0000 @@ -43,7 +43,6 @@ extern int iscsit_close_connection(struct iscsi_conn *); extern int iscsit_close_session(struct iscsi_session *); extern void iscsit_fail_session(struct iscsi_session *); -extern int iscsit_free_session(struct iscsi_session *); extern void iscsit_stop_session(struct iscsi_session *, int, int); extern int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *, int); diff -Nru linux-4.19.98/drivers/target/iscsi/iscsi_target_configfs.c linux-4.19.118/drivers/target/iscsi/iscsi_target_configfs.c --- linux-4.19.98/drivers/target/iscsi/iscsi_target_configfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/target/iscsi/iscsi_target_configfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -1501,20 +1501,23 @@ spin_lock(&sess->conn_lock); if (atomic_read(&sess->session_fall_back_to_erl0) || atomic_read(&sess->session_logout) || + atomic_read(&sess->session_close) || (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) { spin_unlock(&sess->conn_lock); spin_unlock_bh(&se_tpg->session_lock); return; } + iscsit_inc_session_usage_count(sess); atomic_set(&sess->session_reinstatement, 1); atomic_set(&sess->session_fall_back_to_erl0, 1); + atomic_set(&sess->session_close, 1); spin_unlock(&sess->conn_lock); iscsit_stop_time2retain_timer(sess); spin_unlock_bh(&se_tpg->session_lock); iscsit_stop_session(sess, 1, 1); - iscsit_close_session(sess); + iscsit_dec_session_usage_count(sess); } static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg) diff -Nru linux-4.19.98/drivers/target/iscsi/iscsi_target_login.c linux-4.19.118/drivers/target/iscsi/iscsi_target_login.c --- linux-4.19.98/drivers/target/iscsi/iscsi_target_login.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/target/iscsi/iscsi_target_login.c 2020-04-23 08:30:24.000000000 +0000 @@ -164,6 +164,7 @@ spin_lock(&sess_p->conn_lock); if (atomic_read(&sess_p->session_fall_back_to_erl0) || atomic_read(&sess_p->session_logout) || + atomic_read(&sess_p->session_close) || (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) { spin_unlock(&sess_p->conn_lock); continue; @@ -174,6 +175,7 @@ (sess_p->sess_ops->SessionType == sessiontype))) { atomic_set(&sess_p->session_reinstatement, 1); atomic_set(&sess_p->session_fall_back_to_erl0, 1); + atomic_set(&sess_p->session_close, 1); spin_unlock(&sess_p->conn_lock); iscsit_inc_session_usage_count(sess_p); iscsit_stop_time2retain_timer(sess_p); @@ -198,7 +200,6 @@ if (sess->session_state == TARG_SESS_STATE_FAILED) { spin_unlock_bh(&sess->conn_lock); iscsit_dec_session_usage_count(sess); - iscsit_close_session(sess); return 0; } spin_unlock_bh(&sess->conn_lock); @@ -206,7 +207,6 @@ iscsit_stop_session(sess, 1, 1); iscsit_dec_session_usage_count(sess); - iscsit_close_session(sess); return 0; } @@ -494,6 +494,7 @@ sess_p = (struct iscsi_session *)se_sess->fabric_sess_ptr; if (atomic_read(&sess_p->session_fall_back_to_erl0) || atomic_read(&sess_p->session_logout) || + atomic_read(&sess_p->session_close) || (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) continue; if (!memcmp(sess_p->isid, pdu->isid, 6) && diff -Nru linux-4.19.98/drivers/target/target_core_device.c linux-4.19.118/drivers/target/target_core_device.c --- linux-4.19.98/drivers/target/target_core_device.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/target/target_core_device.c 2020-04-23 08:30:24.000000000 +0000 @@ -85,7 +85,7 @@ goto out_unlock; } - se_cmd->se_lun = rcu_dereference(deve->se_lun); + se_cmd->se_lun = se_lun; se_cmd->pr_res_key = deve->pr_res_key; se_cmd->orig_fe_lun = unpacked_lun; se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD; @@ -176,7 +176,7 @@ goto out_unlock; } - se_cmd->se_lun = rcu_dereference(deve->se_lun); + se_cmd->se_lun = se_lun; se_cmd->pr_res_key = deve->pr_res_key; se_cmd->orig_fe_lun = unpacked_lun; se_cmd->se_cmd_flags |= SCF_SE_LUN_CMD; diff -Nru linux-4.19.98/drivers/tee/optee/Kconfig linux-4.19.118/drivers/tee/optee/Kconfig --- linux-4.19.98/drivers/tee/optee/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tee/optee/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -2,6 +2,7 @@ config OPTEE tristate "OP-TEE" depends on HAVE_ARM_SMCCC + depends on MMU help This implements the OP-TEE Trusted Execution Environment (TEE) driver. diff -Nru linux-4.19.98/drivers/thermal/broadcom/brcmstb_thermal.c linux-4.19.118/drivers/thermal/broadcom/brcmstb_thermal.c --- linux-4.19.98/drivers/thermal/broadcom/brcmstb_thermal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/thermal/broadcom/brcmstb_thermal.c 2020-04-23 08:30:24.000000000 +0000 @@ -58,7 +58,7 @@ #define AVS_TMON_TP_TEST_ENABLE 0x20 /* Default coefficients */ -#define AVS_TMON_TEMP_SLOPE -487 +#define AVS_TMON_TEMP_SLOPE 487 #define AVS_TMON_TEMP_OFFSET 410040 /* HW related temperature constants */ @@ -117,23 +117,12 @@ struct thermal_zone_device *thermal; }; -static void avs_tmon_get_coeffs(struct thermal_zone_device *tz, int *slope, - int *offset) -{ - *slope = thermal_zone_get_slope(tz); - *offset = thermal_zone_get_offset(tz); -} - /* Convert a HW code to a temperature reading (millidegree celsius) */ static inline int avs_tmon_code_to_temp(struct thermal_zone_device *tz, u32 code) { - const int val = code & AVS_TMON_TEMP_MASK; - int slope, offset; - - avs_tmon_get_coeffs(tz, &slope, &offset); - - return slope * val + offset; + return (AVS_TMON_TEMP_OFFSET - + (int)((code & AVS_TMON_TEMP_MAX) * AVS_TMON_TEMP_SLOPE)); } /* @@ -145,20 +134,18 @@ static inline u32 avs_tmon_temp_to_code(struct thermal_zone_device *tz, int temp, bool low) { - int slope, offset; - if (temp < AVS_TMON_TEMP_MIN) - return AVS_TMON_TEMP_MAX; /* Maximum code value */ - - avs_tmon_get_coeffs(tz, &slope, &offset); + return AVS_TMON_TEMP_MAX; /* Maximum code value */ - if (temp >= offset) + if (temp >= AVS_TMON_TEMP_OFFSET) return 0; /* Minimum code value */ if (low) - return (u32)(DIV_ROUND_UP(offset - temp, abs(slope))); + return (u32)(DIV_ROUND_UP(AVS_TMON_TEMP_OFFSET - temp, + AVS_TMON_TEMP_SLOPE)); else - return (u32)((offset - temp) / abs(slope)); + return (u32)((AVS_TMON_TEMP_OFFSET - temp) / + AVS_TMON_TEMP_SLOPE); } static int brcmstb_get_temp(void *data, int *temp) diff -Nru linux-4.19.98/drivers/thermal/cpu_cooling.c linux-4.19.118/drivers/thermal/cpu_cooling.c --- linux-4.19.98/drivers/thermal/cpu_cooling.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/thermal/cpu_cooling.c 2020-04-23 08:30:24.000000000 +0000 @@ -458,7 +458,7 @@ load = 0; total_load += load; - if (trace_thermal_power_cpu_limit_enabled() && load_cpu) + if (load_cpu) load_cpu[i] = load; i++; diff -Nru linux-4.19.98/drivers/thermal/mtk_thermal.c linux-4.19.118/drivers/thermal/mtk_thermal.c --- linux-4.19.98/drivers/thermal/mtk_thermal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/thermal/mtk_thermal.c 2020-04-23 08:30:24.000000000 +0000 @@ -431,7 +431,8 @@ u32 raw; for (i = 0; i < conf->bank_data[bank->id].num_sensors; i++) { - raw = readl(mt->thermal_base + conf->msr[i]); + raw = readl(mt->thermal_base + + conf->msr[conf->bank_data[bank->id].sensors[i]]); temp = raw_to_mcelsius(mt, conf->bank_data[bank->id].sensors[i], @@ -568,7 +569,8 @@ for (i = 0; i < conf->bank_data[num].num_sensors; i++) writel(conf->sensor_mux_values[conf->bank_data[num].sensors[i]], - mt->thermal_base + conf->adcpnp[i]); + mt->thermal_base + + conf->adcpnp[conf->bank_data[num].sensors[i]]); writel((1 << conf->bank_data[num].num_sensors) - 1, mt->thermal_base + TEMP_MONCTL0); diff -Nru linux-4.19.98/drivers/thermal/rcar_gen3_thermal.c linux-4.19.118/drivers/thermal/rcar_gen3_thermal.c --- linux-4.19.98/drivers/thermal/rcar_gen3_thermal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/thermal/rcar_gen3_thermal.c 2020-04-23 08:30:24.000000000 +0000 @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -81,7 +80,6 @@ struct rcar_gen3_thermal_priv { struct rcar_gen3_thermal_tsc *tscs[TSC_MAX_NUM]; unsigned int num_tscs; - spinlock_t lock; /* Protect interrupts on and off */ void (*thermal_init)(struct rcar_gen3_thermal_tsc *tsc); }; @@ -231,38 +229,16 @@ { struct rcar_gen3_thermal_priv *priv = data; u32 status; - int i, ret = IRQ_HANDLED; + int i; - spin_lock(&priv->lock); for (i = 0; i < priv->num_tscs; i++) { status = rcar_gen3_thermal_read(priv->tscs[i], REG_GEN3_IRQSTR); rcar_gen3_thermal_write(priv->tscs[i], REG_GEN3_IRQSTR, 0); if (status) - ret = IRQ_WAKE_THREAD; + thermal_zone_device_update(priv->tscs[i]->zone, + THERMAL_EVENT_UNSPECIFIED); } - if (ret == IRQ_WAKE_THREAD) - rcar_thermal_irq_set(priv, false); - - spin_unlock(&priv->lock); - - return ret; -} - -static irqreturn_t rcar_gen3_thermal_irq_thread(int irq, void *data) -{ - struct rcar_gen3_thermal_priv *priv = data; - unsigned long flags; - int i; - - for (i = 0; i < priv->num_tscs; i++) - thermal_zone_device_update(priv->tscs[i]->zone, - THERMAL_EVENT_UNSPECIFIED); - - spin_lock_irqsave(&priv->lock, flags); - rcar_thermal_irq_set(priv, true); - spin_unlock_irqrestore(&priv->lock, flags); - return IRQ_HANDLED; } @@ -364,8 +340,6 @@ if (soc_device_match(r8a7795es1)) priv->thermal_init = rcar_gen3_thermal_init_r8a7795es1; - spin_lock_init(&priv->lock); - platform_set_drvdata(pdev, priv); /* @@ -383,9 +357,9 @@ if (!irqname) return -ENOMEM; - ret = devm_request_threaded_irq(dev, irq, rcar_gen3_thermal_irq, - rcar_gen3_thermal_irq_thread, - IRQF_SHARED, irqname, priv); + ret = devm_request_threaded_irq(dev, irq, NULL, + rcar_gen3_thermal_irq, + IRQF_ONESHOT, irqname, priv); if (ret) return ret; } diff -Nru linux-4.19.98/drivers/thunderbolt/switch.c linux-4.19.118/drivers/thunderbolt/switch.c --- linux-4.19.98/drivers/thunderbolt/switch.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/thunderbolt/switch.c 2020-04-23 08:30:24.000000000 +0000 @@ -264,6 +264,12 @@ return ret; } +static int tb_switch_nvm_no_read(void *priv, unsigned int offset, void *val, + size_t bytes) +{ + return -EPERM; +} + static int tb_switch_nvm_write(void *priv, unsigned int offset, void *val, size_t bytes) { @@ -309,6 +315,7 @@ config.read_only = true; } else { config.name = "nvm_non_active"; + config.reg_read = tb_switch_nvm_no_read; config.reg_write = tb_switch_nvm_write; config.root_only = true; } diff -Nru linux-4.19.98/drivers/tty/ehv_bytechan.c linux-4.19.118/drivers/tty/ehv_bytechan.c --- linux-4.19.98/drivers/tty/ehv_bytechan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/ehv_bytechan.c 2020-04-23 08:30:24.000000000 +0000 @@ -136,6 +136,21 @@ return 1; } +static unsigned int local_ev_byte_channel_send(unsigned int handle, + unsigned int *count, + const char *p) +{ + char buffer[EV_BYTE_CHANNEL_MAX_BYTES]; + unsigned int c = *count; + + if (c < sizeof(buffer)) { + memcpy(buffer, p, c); + memset(&buffer[c], 0, sizeof(buffer) - c); + p = buffer; + } + return ev_byte_channel_send(handle, count, p); +} + /*************************** EARLY CONSOLE DRIVER ***************************/ #ifdef CONFIG_PPC_EARLY_DEBUG_EHV_BC @@ -154,7 +169,7 @@ do { count = 1; - ret = ev_byte_channel_send(CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE, + ret = local_ev_byte_channel_send(CONFIG_PPC_EARLY_DEBUG_EHV_BC_HANDLE, &count, &data); } while (ret == EV_EAGAIN); } @@ -221,7 +236,7 @@ while (count) { len = min_t(unsigned int, count, EV_BYTE_CHANNEL_MAX_BYTES); do { - ret = ev_byte_channel_send(handle, &len, s); + ret = local_ev_byte_channel_send(handle, &len, s); } while (ret == EV_EAGAIN); count -= len; s += len; @@ -401,7 +416,7 @@ CIRC_CNT_TO_END(bc->head, bc->tail, BUF_SIZE), EV_BYTE_CHANNEL_MAX_BYTES); - ret = ev_byte_channel_send(bc->handle, &len, bc->buf + bc->tail); + ret = local_ev_byte_channel_send(bc->handle, &len, bc->buf + bc->tail); /* 'len' is valid only if the return code is 0 or EV_EAGAIN */ if (!ret || (ret == EV_EAGAIN)) diff -Nru linux-4.19.98/drivers/tty/ipwireless/hardware.c linux-4.19.118/drivers/tty/ipwireless/hardware.c --- linux-4.19.98/drivers/tty/ipwireless/hardware.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/ipwireless/hardware.c 2020-04-23 08:30:24.000000000 +0000 @@ -1516,6 +1516,8 @@ sizeof(struct ipw_setup_get_version_query_packet), ADDR_SETUP_PROT, TL_PROTOCOLID_SETUP, TL_SETUP_SIGNO_GET_VERSION_QRY); + if (!ver_packet) + return; ver_packet->header.length = sizeof(struct tl_setup_get_version_qry); /* diff -Nru linux-4.19.98/drivers/tty/serdev/serdev-ttyport.c linux-4.19.118/drivers/tty/serdev/serdev-ttyport.c --- linux-4.19.98/drivers/tty/serdev/serdev-ttyport.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serdev/serdev-ttyport.c 2020-04-23 08:30:24.000000000 +0000 @@ -265,7 +265,6 @@ struct device *parent, struct tty_driver *drv, int idx) { - const struct tty_port_client_operations *old_ops; struct serdev_controller *ctrl; struct serport *serport; int ret; @@ -284,7 +283,6 @@ ctrl->ops = &ctrl_ops; - old_ops = port->client_ops; port->client_ops = &client_ops; port->client_data = ctrl; @@ -297,7 +295,7 @@ err_reset_data: port->client_data = NULL; - port->client_ops = old_ops; + port->client_ops = &tty_port_default_client_ops; serdev_controller_put(ctrl); return ERR_PTR(ret); @@ -312,8 +310,8 @@ return -ENODEV; serdev_controller_remove(ctrl); - port->client_ops = NULL; port->client_data = NULL; + port->client_ops = &tty_port_default_client_ops; serdev_controller_put(ctrl); return 0; diff -Nru linux-4.19.98/drivers/tty/serial/8250/8250_aspeed_vuart.c linux-4.19.118/drivers/tty/serial/8250/8250_aspeed_vuart.c --- linux-4.19.98/drivers/tty/serial/8250/8250_aspeed_vuart.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/8250/8250_aspeed_vuart.c 2020-04-23 08:30:24.000000000 +0000 @@ -375,7 +375,6 @@ port.port.line = rc; port.port.irq = irq_of_parse_and_map(np, 0); - port.port.irqflags = IRQF_SHARED; port.port.handle_irq = aspeed_vuart_handle_irq; port.port.iotype = UPIO_MEM; port.port.type = PORT_16550A; diff -Nru linux-4.19.98/drivers/tty/serial/8250/8250_bcm2835aux.c linux-4.19.118/drivers/tty/serial/8250/8250_bcm2835aux.c --- linux-4.19.98/drivers/tty/serial/8250/8250_bcm2835aux.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/8250/8250_bcm2835aux.c 2020-04-23 08:30:24.000000000 +0000 @@ -115,7 +115,7 @@ { struct bcm2835aux_data *data = platform_get_drvdata(pdev); - serial8250_unregister_port(data->uart.port.line); + serial8250_unregister_port(data->line); clk_disable_unprepare(data->clk); return 0; diff -Nru linux-4.19.98/drivers/tty/serial/8250/8250_core.c linux-4.19.118/drivers/tty/serial/8250/8250_core.c --- linux-4.19.98/drivers/tty/serial/8250/8250_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/8250/8250_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -177,7 +177,7 @@ struct hlist_head *h; struct hlist_node *n; struct irq_info *i; - int ret, irq_flags = up->port.flags & UPF_SHARE_IRQ ? IRQF_SHARED : 0; + int ret; mutex_lock(&hash_mutex); @@ -212,9 +212,8 @@ INIT_LIST_HEAD(&up->list); i->head = &up->list; spin_unlock_irq(&i->lock); - irq_flags |= up->port.irqflags; ret = request_irq(up->port.irq, serial8250_interrupt, - irq_flags, up->port.name, i); + up->port.irqflags, up->port.name, i); if (ret < 0) serial_do_unlink(i, up); } diff -Nru linux-4.19.98/drivers/tty/serial/8250/8250_exar.c linux-4.19.118/drivers/tty/serial/8250/8250_exar.c --- linux-4.19.98/drivers/tty/serial/8250/8250_exar.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/8250/8250_exar.c 2020-04-23 08:30:24.000000000 +0000 @@ -24,6 +24,14 @@ #include "8250.h" +#define PCI_DEVICE_ID_ACCES_COM_2S 0x1052 +#define PCI_DEVICE_ID_ACCES_COM_4S 0x105d +#define PCI_DEVICE_ID_ACCES_COM_8S 0x106c +#define PCI_DEVICE_ID_ACCES_COM232_8 0x10a8 +#define PCI_DEVICE_ID_ACCES_COM_2SM 0x10d2 +#define PCI_DEVICE_ID_ACCES_COM_4SM 0x10db +#define PCI_DEVICE_ID_ACCES_COM_8SM 0x10ea + #define PCI_DEVICE_ID_COMMTECH_4224PCI335 0x0002 #define PCI_DEVICE_ID_COMMTECH_4222PCI335 0x0004 #define PCI_DEVICE_ID_COMMTECH_2324PCI335 0x000a @@ -571,6 +579,22 @@ static SIMPLE_DEV_PM_OPS(exar_pci_pm, exar_suspend, exar_resume); +static const struct exar8250_board acces_com_2x = { + .num_ports = 2, + .setup = pci_xr17c154_setup, +}; + +static const struct exar8250_board acces_com_4x = { + .num_ports = 4, + .setup = pci_xr17c154_setup, +}; + +static const struct exar8250_board acces_com_8x = { + .num_ports = 8, + .setup = pci_xr17c154_setup, +}; + + static const struct exar8250_board pbn_fastcom335_2 = { .num_ports = 2, .setup = pci_fastcom335_setup, @@ -639,6 +663,15 @@ } static const struct pci_device_id exar_pci_tbl[] = { + EXAR_DEVICE(ACCESSIO, ACCES_COM_2S, acces_com_2x), + EXAR_DEVICE(ACCESSIO, ACCES_COM_4S, acces_com_4x), + EXAR_DEVICE(ACCESSIO, ACCES_COM_8S, acces_com_8x), + EXAR_DEVICE(ACCESSIO, ACCES_COM232_8, acces_com_8x), + EXAR_DEVICE(ACCESSIO, ACCES_COM_2SM, acces_com_2x), + EXAR_DEVICE(ACCESSIO, ACCES_COM_4SM, acces_com_4x), + EXAR_DEVICE(ACCESSIO, ACCES_COM_8SM, acces_com_8x), + + CONNECT_DEVICE(XR17C152, UART_2_232, pbn_connect), CONNECT_DEVICE(XR17C154, UART_4_232, pbn_connect), CONNECT_DEVICE(XR17C158, UART_8_232, pbn_connect), diff -Nru linux-4.19.98/drivers/tty/serial/8250/8250_of.c linux-4.19.118/drivers/tty/serial/8250/8250_of.c --- linux-4.19.98/drivers/tty/serial/8250/8250_of.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/8250/8250_of.c 2020-04-23 08:30:24.000000000 +0000 @@ -171,7 +171,6 @@ port->type = type; port->uartclk = clk; - port->irqflags |= IRQF_SHARED; if (of_property_read_bool(np, "no-loopback-test")) port->flags |= UPF_SKIP_TEST; diff -Nru linux-4.19.98/drivers/tty/serial/8250/8250_port.c linux-4.19.118/drivers/tty/serial/8250/8250_port.c --- linux-4.19.98/drivers/tty/serial/8250/8250_port.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/8250/8250_port.c 2020-04-23 08:30:24.000000000 +0000 @@ -2253,6 +2253,10 @@ } } + /* Check if we need to have shared IRQs */ + if (port->irq && (up->port.flags & UPF_SHARE_IRQ)) + up->port.irqflags |= IRQF_SHARED; + if (port->irq && !(up->port.flags & UPF_NO_THRE_TEST)) { unsigned char iir1; /* diff -Nru linux-4.19.98/drivers/tty/serial/ar933x_uart.c linux-4.19.118/drivers/tty/serial/ar933x_uart.c --- linux-4.19.98/drivers/tty/serial/ar933x_uart.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/ar933x_uart.c 2020-04-23 08:30:24.000000000 +0000 @@ -286,6 +286,10 @@ ar933x_uart_rmw_set(up, AR933X_UART_CS_REG, AR933X_UART_CS_HOST_INT_EN); + /* enable RX and TX ready overide */ + ar933x_uart_rmw_set(up, AR933X_UART_CS_REG, + AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE); + /* reenable the UART */ ar933x_uart_rmw(up, AR933X_UART_CS_REG, AR933X_UART_CS_IF_MODE_M << AR933X_UART_CS_IF_MODE_S, @@ -418,6 +422,10 @@ ar933x_uart_rmw_set(up, AR933X_UART_CS_REG, AR933X_UART_CS_HOST_INT_EN); + /* enable RX and TX ready overide */ + ar933x_uart_rmw_set(up, AR933X_UART_CS_REG, + AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE); + /* Enable RX interrupts */ up->ier = AR933X_UART_INT_RX_VALID; ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier); diff -Nru linux-4.19.98/drivers/tty/serial/atmel_serial.c linux-4.19.118/drivers/tty/serial/atmel_serial.c --- linux-4.19.98/drivers/tty/serial/atmel_serial.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/atmel_serial.c 2020-04-23 08:30:24.000000000 +0000 @@ -490,7 +490,8 @@ atmel_uart_writel(port, ATMEL_US_IDR, atmel_port->tx_done_mask); if (atmel_uart_is_half_duplex(port)) - atmel_start_rx(port); + if (!atomic_read(&atmel_port->tasklet_shutdown)) + atmel_start_rx(port); } diff -Nru linux-4.19.98/drivers/tty/serial/fsl_lpuart.c linux-4.19.118/drivers/tty/serial/fsl_lpuart.c --- linux-4.19.98/drivers/tty/serial/fsl_lpuart.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/fsl_lpuart.c 2020-04-23 08:30:24.000000000 +0000 @@ -528,26 +528,26 @@ spin_lock_irqsave(&sport->port.lock, flags); /* Disable Rx & Tx */ - writel(0, sport->port.membase + UARTCTRL); + lpuart32_write(&sport->port, UARTCTRL, 0); - temp = readl(sport->port.membase + UARTFIFO); + temp = lpuart32_read(&sport->port, UARTFIFO); /* Enable Rx and Tx FIFO */ - writel(temp | UARTFIFO_RXFE | UARTFIFO_TXFE, - sport->port.membase + UARTFIFO); + lpuart32_write(&sport->port, UARTFIFO, + temp | UARTFIFO_RXFE | UARTFIFO_TXFE); /* flush Tx and Rx FIFO */ - writel(UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH, - sport->port.membase + UARTFIFO); + lpuart32_write(&sport->port, UARTFIFO, + UARTFIFO_TXFLUSH | UARTFIFO_RXFLUSH); /* explicitly clear RDRF */ - if (readl(sport->port.membase + UARTSTAT) & UARTSTAT_RDRF) { - readl(sport->port.membase + UARTDATA); - writel(UARTFIFO_RXUF, sport->port.membase + UARTFIFO); + if (lpuart32_read(&sport->port, UARTSTAT) & UARTSTAT_RDRF) { + lpuart32_read(&sport->port, UARTDATA); + lpuart32_write(&sport->port, UARTFIFO, UARTFIFO_RXUF); } /* Enable Rx and Tx */ - writel(UARTCTRL_RE | UARTCTRL_TE, sport->port.membase + UARTCTRL); + lpuart32_write(&sport->port, UARTCTRL, UARTCTRL_RE | UARTCTRL_TE); spin_unlock_irqrestore(&sport->port.lock, flags); return 0; @@ -555,18 +555,18 @@ static void lpuart32_poll_put_char(struct uart_port *port, unsigned char c) { - while (!(readl(port->membase + UARTSTAT) & UARTSTAT_TDRE)) + while (!(lpuart32_read(port, UARTSTAT) & UARTSTAT_TDRE)) barrier(); - writel(c, port->membase + UARTDATA); + lpuart32_write(port, UARTDATA, c); } static int lpuart32_poll_get_char(struct uart_port *port) { - if (!(readl(port->membase + UARTSTAT) & UARTSTAT_RDRF)) + if (!(lpuart32_read(port, UARTSTAT) & UARTSTAT_RDRF)) return NO_POLL_CHAR; - return readl(port->membase + UARTDATA); + return lpuart32_read(port, UARTDATA); } #endif diff -Nru linux-4.19.98/drivers/tty/serial/imx.c linux-4.19.118/drivers/tty/serial/imx.c --- linux-4.19.98/drivers/tty/serial/imx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/imx.c 2020-04-23 08:30:24.000000000 +0000 @@ -608,7 +608,7 @@ sport->tx_bytes = uart_circ_chars_pending(xmit); - if (xmit->tail < xmit->head) { + if (xmit->tail < xmit->head || xmit->head == 0) { sport->dma_tx_nents = 1; sg_init_one(sgl, xmit->buf + xmit->tail, sport->tx_bytes); } else { diff -Nru linux-4.19.98/drivers/tty/serial/mvebu-uart.c linux-4.19.118/drivers/tty/serial/mvebu-uart.c --- linux-4.19.98/drivers/tty/serial/mvebu-uart.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/mvebu-uart.c 2020-04-23 08:30:24.000000000 +0000 @@ -840,7 +840,7 @@ port->membase = devm_ioremap_resource(&pdev->dev, reg); if (IS_ERR(port->membase)) - return -PTR_ERR(port->membase); + return PTR_ERR(port->membase); mvuart = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_uart), GFP_KERNEL); diff -Nru linux-4.19.98/drivers/tty/serial/qcom_geni_serial.c linux-4.19.118/drivers/tty/serial/qcom_geni_serial.c --- linux-4.19.98/drivers/tty/serial/qcom_geni_serial.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/qcom_geni_serial.c 2020-04-23 08:30:24.000000000 +0000 @@ -85,7 +85,7 @@ #define DEF_FIFO_DEPTH_WORDS 16 #define DEF_TX_WM 2 #define DEF_FIFO_WIDTH_BITS 32 -#define UART_CONSOLE_RX_WM 2 +#define UART_RX_WM 2 #define MAX_LOOPBACK_CFG 3 #ifdef CONFIG_CONSOLE_POLL @@ -101,10 +101,6 @@ u32 tx_fifo_depth; u32 tx_fifo_width; u32 rx_fifo_depth; - u32 tx_wm; - u32 rx_wm; - u32 rx_rfr; - enum geni_se_xfer_mode xfer_mode; bool setup; int (*handle_rx)(struct uart_port *uport, u32 bytes, bool drop); unsigned int baud; @@ -125,6 +121,7 @@ static int handle_rx_uart(struct uart_port *uport, u32 bytes, bool drop); static unsigned int qcom_geni_serial_tx_empty(struct uart_port *port); static void qcom_geni_serial_stop_rx(struct uart_port *uport); +static void qcom_geni_serial_handle_rx(struct uart_port *uport, bool drop); static const unsigned long root_freq[] = {7372800, 14745600, 19200000, 29491200, 32000000, 48000000, 64000000, 80000000, @@ -226,7 +223,7 @@ if (uart_console(uport)) { mctrl |= TIOCM_CTS; } else { - geni_ios = readl_relaxed(uport->membase + SE_GENI_IOS); + geni_ios = readl(uport->membase + SE_GENI_IOS); if (!(geni_ios & IO2_DATA_IN)) mctrl |= TIOCM_CTS; } @@ -244,7 +241,7 @@ if (!(mctrl & TIOCM_RTS)) uart_manual_rfr = UART_MANUAL_RFR_EN | UART_RFR_NOT_READY; - writel_relaxed(uart_manual_rfr, uport->membase + SE_UART_MANUAL_RFR); + writel(uart_manual_rfr, uport->membase + SE_UART_MANUAL_RFR); } static const char *qcom_geni_serial_get_type(struct uart_port *uport) @@ -273,9 +270,6 @@ unsigned int fifo_bits; unsigned long timeout_us = 20000; - /* Ensure polling is not re-ordered before the prior writes/reads */ - mb(); - if (uport->private_data) { port = to_dev_port(uport, uport); baud = port->baud; @@ -295,7 +289,7 @@ */ timeout_us = DIV_ROUND_UP(timeout_us, 10) * 10; while (timeout_us) { - reg = readl_relaxed(uport->membase + offset); + reg = readl(uport->membase + offset); if ((bool)(reg & field) == set) return true; udelay(10); @@ -308,7 +302,7 @@ { u32 m_cmd; - writel_relaxed(xmit_size, uport->membase + SE_UART_TX_TRANS_LEN); + writel(xmit_size, uport->membase + SE_UART_TX_TRANS_LEN); m_cmd = UART_START_TX << M_OPCODE_SHFT; writel(m_cmd, uport->membase + SE_GENI_M_CMD0); } @@ -321,13 +315,13 @@ done = qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_DONE_EN, true); if (!done) { - writel_relaxed(M_GENI_CMD_ABORT, uport->membase + + writel(M_GENI_CMD_ABORT, uport->membase + SE_GENI_M_CMD_CTRL_REG); irq_clear |= M_CMD_ABORT_EN; qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); } - writel_relaxed(irq_clear, uport->membase + SE_GENI_M_IRQ_CLEAR); + writel(irq_clear, uport->membase + SE_GENI_M_IRQ_CLEAR); } static void qcom_geni_serial_abort_rx(struct uart_port *uport) @@ -337,8 +331,8 @@ writel(S_GENI_CMD_ABORT, uport->membase + SE_GENI_S_CMD_CTRL_REG); qcom_geni_serial_poll_bit(uport, SE_GENI_S_CMD_CTRL_REG, S_GENI_CMD_ABORT, false); - writel_relaxed(irq_clear, uport->membase + SE_GENI_S_IRQ_CLEAR); - writel_relaxed(FORCE_DEFAULT, uport->membase + GENI_FORCE_DEFAULT_REG); + writel(irq_clear, uport->membase + SE_GENI_S_IRQ_CLEAR); + writel(FORCE_DEFAULT, uport->membase + GENI_FORCE_DEFAULT_REG); } #ifdef CONFIG_CONSOLE_POLL @@ -347,19 +341,13 @@ u32 rx_fifo; u32 status; - status = readl_relaxed(uport->membase + SE_GENI_M_IRQ_STATUS); - writel_relaxed(status, uport->membase + SE_GENI_M_IRQ_CLEAR); - - status = readl_relaxed(uport->membase + SE_GENI_S_IRQ_STATUS); - writel_relaxed(status, uport->membase + SE_GENI_S_IRQ_CLEAR); + status = readl(uport->membase + SE_GENI_M_IRQ_STATUS); + writel(status, uport->membase + SE_GENI_M_IRQ_CLEAR); - /* - * Ensure the writes to clear interrupts is not re-ordered after - * reading the data. - */ - mb(); + status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); + writel(status, uport->membase + SE_GENI_S_IRQ_CLEAR); - status = readl_relaxed(uport->membase + SE_GENI_RX_FIFO_STATUS); + status = readl(uport->membase + SE_GENI_RX_FIFO_STATUS); if (!(status & RX_FIFO_WC_MSK)) return NO_POLL_CHAR; @@ -370,15 +358,12 @@ static void qcom_geni_serial_poll_put_char(struct uart_port *uport, unsigned char c) { - struct qcom_geni_serial_port *port = to_dev_port(uport, uport); - - writel_relaxed(port->tx_wm, uport->membase + SE_GENI_TX_WATERMARK_REG); + writel(DEF_TX_WM, uport->membase + SE_GENI_TX_WATERMARK_REG); qcom_geni_serial_setup_tx(uport, 1); WARN_ON(!qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_TX_FIFO_WATERMARK_EN, true)); - writel_relaxed(c, uport->membase + SE_GENI_TX_FIFOn); - writel_relaxed(M_TX_FIFO_WATERMARK_EN, uport->membase + - SE_GENI_M_IRQ_CLEAR); + writel(c, uport->membase + SE_GENI_TX_FIFOn); + writel(M_TX_FIFO_WATERMARK_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); qcom_geni_serial_poll_tx_done(uport); } #endif @@ -386,7 +371,7 @@ #ifdef CONFIG_SERIAL_QCOM_GENI_CONSOLE static void qcom_geni_serial_wr_char(struct uart_port *uport, int ch) { - writel_relaxed(ch, uport->membase + SE_GENI_TX_FIFOn); + writel(ch, uport->membase + SE_GENI_TX_FIFOn); } static void @@ -405,7 +390,7 @@ bytes_to_send++; } - writel_relaxed(DEF_TX_WM, uport->membase + SE_GENI_TX_WATERMARK_REG); + writel(DEF_TX_WM, uport->membase + SE_GENI_TX_WATERMARK_REG); qcom_geni_serial_setup_tx(uport, bytes_to_send); for (i = 0; i < count; ) { size_t chars_to_write = 0; @@ -423,7 +408,7 @@ chars_to_write = min_t(size_t, count - i, avail / 2); uart_console_write(uport, s + i, chars_to_write, qcom_geni_serial_wr_char); - writel_relaxed(M_TX_FIFO_WATERMARK_EN, uport->membase + + writel(M_TX_FIFO_WATERMARK_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); i += chars_to_write; } @@ -438,6 +423,7 @@ bool locked = true; unsigned long flags; u32 geni_status; + u32 irq_en; WARN_ON(co->index < 0 || co->index >= GENI_UART_CONS_PORTS); @@ -451,7 +437,7 @@ else spin_lock_irqsave(&uport->lock, flags); - geni_status = readl_relaxed(uport->membase + SE_GENI_STATUS); + geni_status = readl(uport->membase + SE_GENI_STATUS); /* Cancel the current write to log the fault */ if (!locked) { @@ -461,17 +447,22 @@ geni_se_abort_m_cmd(&port->se); qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); - writel_relaxed(M_CMD_ABORT_EN, uport->membase + + writel(M_CMD_ABORT_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); } - writel_relaxed(M_CMD_CANCEL_EN, uport->membase + - SE_GENI_M_IRQ_CLEAR); + writel(M_CMD_CANCEL_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); } else if ((geni_status & M_GENI_CMD_ACTIVE) && !port->tx_remaining) { /* * It seems we can't interrupt existing transfers if all data * has been sent, in which case we need to look for done first. */ qcom_geni_serial_poll_tx_done(uport); + + if (uart_circ_chars_pending(&uport->state->xmit)) { + irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + writel(irq_en | M_TX_FIFO_WATERMARK_EN, + uport->membase + SE_GENI_M_IRQ_EN); + } } __qcom_geni_serial_console_write(uport, s, count); @@ -556,29 +547,20 @@ static void qcom_geni_serial_start_tx(struct uart_port *uport) { u32 irq_en; - struct qcom_geni_serial_port *port = to_dev_port(uport, uport); u32 status; - if (port->xfer_mode == GENI_SE_FIFO) { - /* - * readl ensures reading & writing of IRQ_EN register - * is not re-ordered before checking the status of the - * Serial Engine. - */ - status = readl(uport->membase + SE_GENI_STATUS); - if (status & M_GENI_CMD_ACTIVE) - return; - - if (!qcom_geni_serial_tx_empty(uport)) - return; - - irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN); - irq_en |= M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN; - - writel_relaxed(port->tx_wm, uport->membase + - SE_GENI_TX_WATERMARK_REG); - writel_relaxed(irq_en, uport->membase + SE_GENI_M_IRQ_EN); - } + status = readl(uport->membase + SE_GENI_STATUS); + if (status & M_GENI_CMD_ACTIVE) + return; + + if (!qcom_geni_serial_tx_empty(uport)) + return; + + irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + irq_en |= M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN; + + writel(DEF_TX_WM, uport->membase + SE_GENI_TX_WATERMARK_REG); + writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); } static void qcom_geni_serial_stop_tx(struct uart_port *uport) @@ -587,35 +569,24 @@ u32 status; struct qcom_geni_serial_port *port = to_dev_port(uport, uport); - irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN); - irq_en &= ~M_CMD_DONE_EN; - if (port->xfer_mode == GENI_SE_FIFO) { - irq_en &= ~M_TX_FIFO_WATERMARK_EN; - writel_relaxed(0, uport->membase + - SE_GENI_TX_WATERMARK_REG); - } - writel_relaxed(irq_en, uport->membase + SE_GENI_M_IRQ_EN); - status = readl_relaxed(uport->membase + SE_GENI_STATUS); + irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + irq_en &= ~(M_CMD_DONE_EN | M_TX_FIFO_WATERMARK_EN); + writel(0, uport->membase + SE_GENI_TX_WATERMARK_REG); + writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); + status = readl(uport->membase + SE_GENI_STATUS); /* Possible stop tx is called multiple times. */ if (!(status & M_GENI_CMD_ACTIVE)) return; - /* - * Ensure cancel command write is not re-ordered before checking - * the status of the Primary Sequencer. - */ - mb(); - geni_se_cancel_m_cmd(&port->se); if (!qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_CANCEL_EN, true)) { geni_se_abort_m_cmd(&port->se); qcom_geni_serial_poll_bit(uport, SE_GENI_M_IRQ_STATUS, M_CMD_ABORT_EN, true); - writel_relaxed(M_CMD_ABORT_EN, uport->membase + - SE_GENI_M_IRQ_CLEAR); + writel(M_CMD_ABORT_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); } - writel_relaxed(M_CMD_CANCEL_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); + writel(M_CMD_CANCEL_EN, uport->membase + SE_GENI_M_IRQ_CLEAR); } static void qcom_geni_serial_start_rx(struct uart_port *uport) @@ -624,27 +595,19 @@ u32 status; struct qcom_geni_serial_port *port = to_dev_port(uport, uport); - status = readl_relaxed(uport->membase + SE_GENI_STATUS); + status = readl(uport->membase + SE_GENI_STATUS); if (status & S_GENI_CMD_ACTIVE) qcom_geni_serial_stop_rx(uport); - /* - * Ensure setup command write is not re-ordered before checking - * the status of the Secondary Sequencer. - */ - mb(); - geni_se_setup_s_cmd(&port->se, UART_START_READ, 0); - if (port->xfer_mode == GENI_SE_FIFO) { - irq_en = readl_relaxed(uport->membase + SE_GENI_S_IRQ_EN); - irq_en |= S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN; - writel_relaxed(irq_en, uport->membase + SE_GENI_S_IRQ_EN); - - irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN); - irq_en |= M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN; - writel_relaxed(irq_en, uport->membase + SE_GENI_M_IRQ_EN); - } + irq_en = readl(uport->membase + SE_GENI_S_IRQ_EN); + irq_en |= S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN; + writel(irq_en, uport->membase + SE_GENI_S_IRQ_EN); + + irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + irq_en |= M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN; + writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); } static void qcom_geni_serial_stop_rx(struct uart_port *uport) @@ -652,34 +615,35 @@ u32 irq_en; u32 status; struct qcom_geni_serial_port *port = to_dev_port(uport, uport); - u32 irq_clear = S_CMD_DONE_EN; + u32 s_irq_status; - if (port->xfer_mode == GENI_SE_FIFO) { - irq_en = readl_relaxed(uport->membase + SE_GENI_S_IRQ_EN); - irq_en &= ~(S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN); - writel_relaxed(irq_en, uport->membase + SE_GENI_S_IRQ_EN); + irq_en = readl(uport->membase + SE_GENI_S_IRQ_EN); + irq_en &= ~(S_RX_FIFO_WATERMARK_EN | S_RX_FIFO_LAST_EN); + writel(irq_en, uport->membase + SE_GENI_S_IRQ_EN); - irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN); - irq_en &= ~(M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN); - writel_relaxed(irq_en, uport->membase + SE_GENI_M_IRQ_EN); - } + irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + irq_en &= ~(M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN); + writel(irq_en, uport->membase + SE_GENI_M_IRQ_EN); - status = readl_relaxed(uport->membase + SE_GENI_STATUS); + status = readl(uport->membase + SE_GENI_STATUS); /* Possible stop rx is called multiple times. */ if (!(status & S_GENI_CMD_ACTIVE)) return; + geni_se_cancel_s_cmd(&port->se); + qcom_geni_serial_poll_bit(uport, SE_GENI_S_IRQ_STATUS, + S_CMD_CANCEL_EN, true); /* - * Ensure cancel command write is not re-ordered before checking - * the status of the Secondary Sequencer. + * If timeout occurs secondary engine remains active + * and Abort sequence is executed. */ - mb(); + s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); + /* Flush the Rx buffer */ + if (s_irq_status & S_RX_FIFO_LAST_EN) + qcom_geni_serial_handle_rx(uport, true); + writel(s_irq_status, uport->membase + SE_GENI_S_IRQ_CLEAR); - geni_se_cancel_s_cmd(&port->se); - qcom_geni_serial_poll_bit(uport, SE_GENI_S_CMD_CTRL_REG, - S_GENI_CMD_CANCEL, false); - status = readl_relaxed(uport->membase + SE_GENI_STATUS); - writel_relaxed(irq_clear, uport->membase + SE_GENI_S_IRQ_CLEAR); + status = readl(uport->membase + SE_GENI_STATUS); if (status & S_GENI_CMD_ACTIVE) qcom_geni_serial_abort_rx(uport); } @@ -693,7 +657,7 @@ u32 total_bytes; struct qcom_geni_serial_port *port = to_dev_port(uport, uport); - status = readl_relaxed(uport->membase + SE_GENI_RX_FIFO_STATUS); + status = readl(uport->membase + SE_GENI_RX_FIFO_STATUS); word_cnt = status & RX_FIFO_WC_MSK; last_word_partial = status & RX_LAST; last_word_byte_cnt = (status & RX_LAST_BYTE_VALID_MSK) >> @@ -719,10 +683,11 @@ size_t pending; int i; u32 status; + u32 irq_en; unsigned int chunk; int tail; - status = readl_relaxed(uport->membase + SE_GENI_TX_FIFO_STATUS); + status = readl(uport->membase + SE_GENI_TX_FIFO_STATUS); /* Complete the current tx command before taking newly added data */ if (active) @@ -747,6 +712,11 @@ if (!port->tx_remaining) { qcom_geni_serial_setup_tx(uport, pending); port->tx_remaining = pending; + + irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + if (!(irq_en & M_TX_FIFO_WATERMARK_EN)) + writel(irq_en | M_TX_FIFO_WATERMARK_EN, + uport->membase + SE_GENI_M_IRQ_EN); } remaining = chunk; @@ -770,7 +740,23 @@ } xmit->tail = tail & (UART_XMIT_SIZE - 1); + + /* + * The tx fifo watermark is level triggered and latched. Though we had + * cleared it in qcom_geni_serial_isr it will have already reasserted + * so we must clear it again here after our writes. + */ + writel(M_TX_FIFO_WATERMARK_EN, + uport->membase + SE_GENI_M_IRQ_CLEAR); + out_write_wakeup: + if (!port->tx_remaining) { + irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + if (irq_en & M_TX_FIFO_WATERMARK_EN) + writel(irq_en & ~M_TX_FIFO_WATERMARK_EN, + uport->membase + SE_GENI_M_IRQ_EN); + } + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) uart_write_wakeup(uport); } @@ -791,12 +777,12 @@ return IRQ_NONE; spin_lock_irqsave(&uport->lock, flags); - m_irq_status = readl_relaxed(uport->membase + SE_GENI_M_IRQ_STATUS); - s_irq_status = readl_relaxed(uport->membase + SE_GENI_S_IRQ_STATUS); - geni_status = readl_relaxed(uport->membase + SE_GENI_STATUS); - m_irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN); - writel_relaxed(m_irq_status, uport->membase + SE_GENI_M_IRQ_CLEAR); - writel_relaxed(s_irq_status, uport->membase + SE_GENI_S_IRQ_CLEAR); + m_irq_status = readl(uport->membase + SE_GENI_M_IRQ_STATUS); + s_irq_status = readl(uport->membase + SE_GENI_S_IRQ_STATUS); + geni_status = readl(uport->membase + SE_GENI_STATUS); + m_irq_en = readl(uport->membase + SE_GENI_M_IRQ_EN); + writel(m_irq_status, uport->membase + SE_GENI_M_IRQ_CLEAR); + writel(s_irq_status, uport->membase + SE_GENI_S_IRQ_CLEAR); if (WARN_ON(m_irq_status & M_ILLEGAL_CMD_EN)) goto out_unlock; @@ -806,8 +792,7 @@ tty_insert_flip_char(tport, 0, TTY_OVERRUN); } - if (m_irq_status & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN) && - m_irq_en & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN)) + if (m_irq_status & m_irq_en & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN)) qcom_geni_serial_handle_tx(uport, m_irq_status & M_CMD_DONE_EN, geni_status & M_GENI_CMD_ACTIVE); @@ -842,17 +827,6 @@ (port->tx_fifo_depth * port->tx_fifo_width) / BITS_PER_BYTE; } -static void set_rfr_wm(struct qcom_geni_serial_port *port) -{ - /* - * Set RFR (Flow off) to FIFO_DEPTH - 2. - * RX WM level at 10% RX_FIFO_DEPTH. - * TX WM level at 10% TX_FIFO_DEPTH. - */ - port->rx_rfr = port->rx_fifo_depth - 2; - port->rx_wm = UART_CONSOLE_RX_WM; - port->tx_wm = DEF_TX_WM; -} static void qcom_geni_serial_shutdown(struct uart_port *uport) { @@ -891,21 +865,19 @@ get_tx_fifo_size(port); - set_rfr_wm(port); - writel_relaxed(rxstale, uport->membase + SE_UART_RX_STALE_CNT); + writel(rxstale, uport->membase + SE_UART_RX_STALE_CNT); /* * Make an unconditional cancel on the main sequencer to reset * it else we could end up in data loss scenarios. */ - port->xfer_mode = GENI_SE_FIFO; if (uart_console(uport)) qcom_geni_serial_poll_tx_done(uport); geni_se_config_packing(&port->se, BITS_PER_BYTE, port->tx_bytes_pw, false, true, false); geni_se_config_packing(&port->se, BITS_PER_BYTE, port->rx_bytes_pw, false, false, true); - geni_se_init(&port->se, port->rx_wm, port->rx_rfr); - geni_se_select_mode(&port->se, port->xfer_mode); + geni_se_init(&port->se, UART_RX_WM, port->rx_fifo_depth - 2); + geni_se_select_mode(&port->se, GENI_SE_FIFO); if (!uart_console(uport)) { port->rx_fifo = devm_kcalloc(uport->dev, port->rx_fifo_depth, sizeof(u32), GFP_KERNEL); @@ -996,10 +968,10 @@ ser_clk_cfg |= clk_div << CLK_DIV_SHFT; /* parity */ - tx_trans_cfg = readl_relaxed(uport->membase + SE_UART_TX_TRANS_CFG); - tx_parity_cfg = readl_relaxed(uport->membase + SE_UART_TX_PARITY_CFG); - rx_trans_cfg = readl_relaxed(uport->membase + SE_UART_RX_TRANS_CFG); - rx_parity_cfg = readl_relaxed(uport->membase + SE_UART_RX_PARITY_CFG); + tx_trans_cfg = readl(uport->membase + SE_UART_TX_TRANS_CFG); + tx_parity_cfg = readl(uport->membase + SE_UART_TX_PARITY_CFG); + rx_trans_cfg = readl(uport->membase + SE_UART_RX_TRANS_CFG); + rx_parity_cfg = readl(uport->membase + SE_UART_RX_PARITY_CFG); if (termios->c_cflag & PARENB) { tx_trans_cfg |= UART_TX_PAR_EN; rx_trans_cfg |= UART_RX_PAR_EN; @@ -1055,17 +1027,17 @@ uart_update_timeout(uport, termios->c_cflag, baud); if (!uart_console(uport)) - writel_relaxed(port->loopback, + writel(port->loopback, uport->membase + SE_UART_LOOPBACK_CFG); - writel_relaxed(tx_trans_cfg, uport->membase + SE_UART_TX_TRANS_CFG); - writel_relaxed(tx_parity_cfg, uport->membase + SE_UART_TX_PARITY_CFG); - writel_relaxed(rx_trans_cfg, uport->membase + SE_UART_RX_TRANS_CFG); - writel_relaxed(rx_parity_cfg, uport->membase + SE_UART_RX_PARITY_CFG); - writel_relaxed(bits_per_char, uport->membase + SE_UART_TX_WORD_LEN); - writel_relaxed(bits_per_char, uport->membase + SE_UART_RX_WORD_LEN); - writel_relaxed(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN); - writel_relaxed(ser_clk_cfg, uport->membase + GENI_SER_M_CLK_CFG); - writel_relaxed(ser_clk_cfg, uport->membase + GENI_SER_S_CLK_CFG); + writel(tx_trans_cfg, uport->membase + SE_UART_TX_TRANS_CFG); + writel(tx_parity_cfg, uport->membase + SE_UART_TX_PARITY_CFG); + writel(rx_trans_cfg, uport->membase + SE_UART_RX_TRANS_CFG); + writel(rx_parity_cfg, uport->membase + SE_UART_RX_PARITY_CFG); + writel(bits_per_char, uport->membase + SE_UART_TX_WORD_LEN); + writel(bits_per_char, uport->membase + SE_UART_RX_WORD_LEN); + writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN); + writel(ser_clk_cfg, uport->membase + GENI_SER_M_CLK_CFG); + writel(ser_clk_cfg, uport->membase + GENI_SER_S_CLK_CFG); out_restart_rx: qcom_geni_serial_start_rx(uport); } @@ -1156,13 +1128,13 @@ geni_se_init(&se, DEF_FIFO_DEPTH_WORDS / 2, DEF_FIFO_DEPTH_WORDS - 2); geni_se_select_mode(&se, GENI_SE_FIFO); - writel_relaxed(tx_trans_cfg, uport->membase + SE_UART_TX_TRANS_CFG); - writel_relaxed(tx_parity_cfg, uport->membase + SE_UART_TX_PARITY_CFG); - writel_relaxed(rx_trans_cfg, uport->membase + SE_UART_RX_TRANS_CFG); - writel_relaxed(rx_parity_cfg, uport->membase + SE_UART_RX_PARITY_CFG); - writel_relaxed(bits_per_char, uport->membase + SE_UART_TX_WORD_LEN); - writel_relaxed(bits_per_char, uport->membase + SE_UART_RX_WORD_LEN); - writel_relaxed(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN); + writel(tx_trans_cfg, uport->membase + SE_UART_TX_TRANS_CFG); + writel(tx_parity_cfg, uport->membase + SE_UART_TX_PARITY_CFG); + writel(rx_trans_cfg, uport->membase + SE_UART_RX_TRANS_CFG); + writel(rx_parity_cfg, uport->membase + SE_UART_RX_PARITY_CFG); + writel(bits_per_char, uport->membase + SE_UART_TX_WORD_LEN); + writel(bits_per_char, uport->membase + SE_UART_RX_WORD_LEN); + writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN); dev->con->write = qcom_geni_serial_earlycon_write; dev->con->setup = NULL; diff -Nru linux-4.19.98/drivers/tty/serial/stm32-usart.c linux-4.19.118/drivers/tty/serial/stm32-usart.c --- linux-4.19.98/drivers/tty/serial/stm32-usart.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/stm32-usart.c 2020-04-23 08:30:24.000000000 +0000 @@ -105,9 +105,7 @@ struct stm32_usart_config *cfg = &stm32_port->info->cfg; u32 usartdiv, baud, cr1, cr3; bool over8; - unsigned long flags; - spin_lock_irqsave(&port->lock, flags); stm32_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); port->rs485 = *rs485conf; @@ -147,7 +145,6 @@ } stm32_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); - spin_unlock_irqrestore(&port->lock, flags); return 0; } @@ -194,8 +191,8 @@ return 0; } -static unsigned long -stm32_get_char(struct uart_port *port, u32 *sr, int *last_res) +static unsigned long stm32_get_char(struct uart_port *port, u32 *sr, + int *last_res) { struct stm32_port *stm32_port = to_stm32_port(port); struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; @@ -205,10 +202,13 @@ c = stm32_port->rx_buf[RX_BUF_L - (*last_res)--]; if ((*last_res) == 0) *last_res = RX_BUF_L; - return c; } else { - return readl_relaxed(port->membase + ofs->rdr); + c = readl_relaxed(port->membase + ofs->rdr); + /* apply RDR data mask */ + c &= stm32_port->rdr_mask; } + + return c; } static void stm32_receive_chars(struct uart_port *port, bool threaded) @@ -225,35 +225,51 @@ while (stm32_pending_rx(port, &sr, &stm32_port->last_res, threaded)) { sr |= USART_SR_DUMMY_RX; - c = stm32_get_char(port, &sr, &stm32_port->last_res); flag = TTY_NORMAL; - port->icount.rx++; + /* + * Status bits has to be cleared before reading the RDR: + * In FIFO mode, reading the RDR will pop the next data + * (if any) along with its status bits into the SR. + * Not doing so leads to misalignement between RDR and SR, + * and clear status bits of the next rx data. + * + * Clear errors flags for stm32f7 and stm32h7 compatible + * devices. On stm32f4 compatible devices, the error bit is + * cleared by the sequence [read SR - read DR]. + */ + if ((sr & USART_SR_ERR_MASK) && ofs->icr != UNDEF_REG) + writel_relaxed(sr & USART_SR_ERR_MASK, + port->membase + ofs->icr); + + c = stm32_get_char(port, &sr, &stm32_port->last_res); + port->icount.rx++; if (sr & USART_SR_ERR_MASK) { - if (sr & USART_SR_LBD) { - port->icount.brk++; - if (uart_handle_break(port)) - continue; - } else if (sr & USART_SR_ORE) { - if (ofs->icr != UNDEF_REG) - writel_relaxed(USART_ICR_ORECF, - port->membase + - ofs->icr); + if (sr & USART_SR_ORE) { port->icount.overrun++; } else if (sr & USART_SR_PE) { port->icount.parity++; } else if (sr & USART_SR_FE) { - port->icount.frame++; + /* Break detection if character is null */ + if (!c) { + port->icount.brk++; + if (uart_handle_break(port)) + continue; + } else { + port->icount.frame++; + } } sr &= port->read_status_mask; - if (sr & USART_SR_LBD) - flag = TTY_BREAK; - else if (sr & USART_SR_PE) + if (sr & USART_SR_PE) { flag = TTY_PARITY; - else if (sr & USART_SR_FE) - flag = TTY_FRAME; + } else if (sr & USART_SR_FE) { + if (!c) + flag = TTY_BREAK; + else + flag = TTY_FRAME; + } } if (uart_handle_sysrq_char(port, c)) @@ -271,21 +287,6 @@ struct uart_port *port = arg; struct stm32_port *stm32port = to_stm32_port(port); struct stm32_usart_offsets *ofs = &stm32port->info->ofs; - unsigned int isr; - int ret; - - ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr, - isr, - (isr & USART_SR_TC), - 10, 100000); - - if (ret) - dev_err(port->dev, "terminal count not set\n"); - - if (ofs->icr == UNDEF_REG) - stm32_clr_bits(port, ofs->isr, USART_SR_TC); - else - stm32_set_bits(port, ofs->icr, USART_CR_TC); stm32_clr_bits(port, ofs->cr3, USART_CR3_DMAT); stm32port->tx_dma_busy = false; @@ -377,7 +378,6 @@ /* Issue pending DMA TX requests */ dma_async_issue_pending(stm32port->tx_ch); - stm32_clr_bits(port, ofs->isr, USART_SR_TC); stm32_set_bits(port, ofs->cr3, USART_CR3_DMAT); xmit->tail = (xmit->tail + count) & (UART_XMIT_SIZE - 1); @@ -401,15 +401,15 @@ return; } - if (uart_tx_stopped(port)) { - stm32_stop_tx(port); + if (uart_circ_empty(xmit) || uart_tx_stopped(port)) { + stm32_clr_bits(port, ofs->cr1, USART_CR1_TXEIE); return; } - if (uart_circ_empty(xmit)) { - stm32_stop_tx(port); - return; - } + if (ofs->icr == UNDEF_REG) + stm32_clr_bits(port, ofs->isr, USART_SR_TC); + else + writel_relaxed(USART_ICR_TCCF, port->membase + ofs->icr); if (stm32_port->tx_ch) stm32_transmit_chars_dma(port); @@ -420,7 +420,7 @@ uart_write_wakeup(port); if (uart_circ_empty(xmit)) - stm32_stop_tx(port); + stm32_clr_bits(port, ofs->cr1, USART_CR1_TXEIE); } static irqreturn_t stm32_interrupt(int irq, void *ptr) @@ -554,7 +554,6 @@ { struct stm32_port *stm32_port = to_stm32_port(port); struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; - struct stm32_usart_config *cfg = &stm32_port->info->cfg; const char *name = to_platform_device(port->dev)->name; u32 val; int ret; @@ -565,15 +564,6 @@ if (ret) return ret; - if (cfg->has_wakeup && stm32_port->wakeirq >= 0) { - ret = dev_pm_set_dedicated_wake_irq(port->dev, - stm32_port->wakeirq); - if (ret) { - free_irq(port->irq, port); - return ret; - } - } - val = USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; if (stm32_port->fifoen) val |= USART_CR1_FIFOEN; @@ -587,18 +577,56 @@ struct stm32_port *stm32_port = to_stm32_port(port); struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; struct stm32_usart_config *cfg = &stm32_port->info->cfg; - u32 val; + u32 val, isr; + int ret; val = USART_CR1_TXEIE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; val |= BIT(cfg->uart_enable_bit); if (stm32_port->fifoen) val |= USART_CR1_FIFOEN; + + ret = readl_relaxed_poll_timeout(port->membase + ofs->isr, + isr, (isr & USART_SR_TC), + 10, 100000); + + if (ret) + dev_err(port->dev, "transmission complete not set\n"); + stm32_clr_bits(port, ofs->cr1, val); - dev_pm_clear_wake_irq(port->dev); free_irq(port->irq, port); } +unsigned int stm32_get_databits(struct ktermios *termios) +{ + unsigned int bits; + + tcflag_t cflag = termios->c_cflag; + + switch (cflag & CSIZE) { + /* + * CSIZE settings are not necessarily supported in hardware. + * CSIZE unsupported configurations are handled here to set word length + * to 8 bits word as default configuration and to print debug message. + */ + case CS5: + bits = 5; + break; + case CS6: + bits = 6; + break; + case CS7: + bits = 7; + break; + /* default including CS8 */ + default: + bits = 8; + break; + } + + return bits; +} + static void stm32_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old) { @@ -606,7 +634,7 @@ struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; struct stm32_usart_config *cfg = &stm32_port->info->cfg; struct serial_rs485 *rs485conf = &port->rs485; - unsigned int baud; + unsigned int baud, bits; u32 usartdiv, mantissa, fraction, oversampling; tcflag_t cflag = termios->c_cflag; u32 cr1, cr2, cr3; @@ -632,16 +660,29 @@ if (cflag & CSTOPB) cr2 |= USART_CR2_STOP_2B; + bits = stm32_get_databits(termios); + stm32_port->rdr_mask = (BIT(bits) - 1); + if (cflag & PARENB) { + bits++; cr1 |= USART_CR1_PCE; - if ((cflag & CSIZE) == CS8) { - if (cfg->has_7bits_data) - cr1 |= USART_CR1_M0; - else - cr1 |= USART_CR1_M; - } } + /* + * Word length configuration: + * CS8 + parity, 9 bits word aka [M1:M0] = 0b01 + * CS7 or (CS6 + parity), 7 bits word aka [M1:M0] = 0b10 + * CS8 or (CS7 + parity), 8 bits word aka [M1:M0] = 0b00 + * M0 and M1 already cleared by cr1 initialization. + */ + if (bits == 9) + cr1 |= USART_CR1_M0; + else if ((bits == 7) && cfg->has_7bits_data) + cr1 |= USART_CR1_M1; + else if (bits != 8) + dev_dbg(port->dev, "Unsupported data bits config: %u bits\n" + , bits); + if (cflag & PARODD) cr1 |= USART_CR1_PS; @@ -679,14 +720,14 @@ if (termios->c_iflag & INPCK) port->read_status_mask |= USART_SR_PE | USART_SR_FE; if (termios->c_iflag & (IGNBRK | BRKINT | PARMRK)) - port->read_status_mask |= USART_SR_LBD; + port->read_status_mask |= USART_SR_FE; /* Characters to ignore */ port->ignore_status_mask = 0; if (termios->c_iflag & IGNPAR) port->ignore_status_mask = USART_SR_PE | USART_SR_FE; if (termios->c_iflag & IGNBRK) { - port->ignore_status_mask |= USART_SR_LBD; + port->ignore_status_mask |= USART_SR_FE; /* * If we're ignoring parity and break indicators, * ignore overruns too (for real raw support). @@ -1024,11 +1065,18 @@ ret = device_init_wakeup(&pdev->dev, true); if (ret) goto err_uninit; + + ret = dev_pm_set_dedicated_wake_irq(&pdev->dev, + stm32port->wakeirq); + if (ret) + goto err_nowup; + + device_set_wakeup_enable(&pdev->dev, false); } ret = uart_add_one_port(&stm32_usart_driver, &stm32port->port); if (ret) - goto err_nowup; + goto err_wirq; ret = stm32_of_dma_rx_probe(stm32port, pdev); if (ret) @@ -1042,6 +1090,10 @@ return 0; +err_wirq: + if (stm32port->info->cfg.has_wakeup && stm32port->wakeirq >= 0) + dev_pm_clear_wake_irq(&pdev->dev); + err_nowup: if (stm32port->info->cfg.has_wakeup && stm32port->wakeirq >= 0) device_init_wakeup(&pdev->dev, false); @@ -1079,8 +1131,10 @@ TX_BUF_L, stm32_port->tx_buf, stm32_port->tx_dma_buf); - if (cfg->has_wakeup && stm32_port->wakeirq >= 0) + if (cfg->has_wakeup && stm32_port->wakeirq >= 0) { + dev_pm_clear_wake_irq(&pdev->dev); device_init_wakeup(&pdev->dev, false); + } clk_disable_unprepare(stm32_port->clk); diff -Nru linux-4.19.98/drivers/tty/serial/stm32-usart.h linux-4.19.118/drivers/tty/serial/stm32-usart.h --- linux-4.19.98/drivers/tty/serial/stm32-usart.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/stm32-usart.h 2020-04-23 08:30:24.000000000 +0000 @@ -108,7 +108,6 @@ #define USART_SR_RXNE BIT(5) #define USART_SR_TC BIT(6) #define USART_SR_TXE BIT(7) -#define USART_SR_LBD BIT(8) #define USART_SR_CTSIF BIT(9) #define USART_SR_CTS BIT(10) /* F7 */ #define USART_SR_RTOF BIT(11) /* F7 */ @@ -120,8 +119,7 @@ #define USART_SR_SBKF BIT(18) /* F7 */ #define USART_SR_WUF BIT(20) /* H7 */ #define USART_SR_TEACK BIT(21) /* F7 */ -#define USART_SR_ERR_MASK (USART_SR_LBD | USART_SR_ORE | \ - USART_SR_FE | USART_SR_PE) +#define USART_SR_ERR_MASK (USART_SR_ORE | USART_SR_FE | USART_SR_PE) /* Dummy bits */ #define USART_SR_DUMMY_RX BIT(16) @@ -151,8 +149,7 @@ #define USART_CR1_PS BIT(9) #define USART_CR1_PCE BIT(10) #define USART_CR1_WAKE BIT(11) -#define USART_CR1_M BIT(12) -#define USART_CR1_M0 BIT(12) /* F7 */ +#define USART_CR1_M0 BIT(12) /* F7 (CR1_M for F4) */ #define USART_CR1_MME BIT(13) /* F7 */ #define USART_CR1_CMIE BIT(14) /* F7 */ #define USART_CR1_OVER8 BIT(15) @@ -169,8 +166,6 @@ /* USART_CR2 */ #define USART_CR2_ADD_MASK GENMASK(3, 0) /* F4 */ #define USART_CR2_ADDM7 BIT(4) /* F7 */ -#define USART_CR2_LBDL BIT(5) -#define USART_CR2_LBDIE BIT(6) #define USART_CR2_LBCL BIT(8) #define USART_CR2_CPHA BIT(9) #define USART_CR2_CPOL BIT(10) @@ -227,12 +222,10 @@ /* USART_ICR */ #define USART_ICR_PECF BIT(0) /* F7 */ -#define USART_ICR_FFECF BIT(1) /* F7 */ -#define USART_ICR_NCF BIT(2) /* F7 */ +#define USART_ICR_FECF BIT(1) /* F7 */ #define USART_ICR_ORECF BIT(3) /* F7 */ #define USART_ICR_IDLECF BIT(4) /* F7 */ #define USART_ICR_TCCF BIT(6) /* F7 */ -#define USART_ICR_LBDCF BIT(8) /* F7 */ #define USART_ICR_CTSCF BIT(9) /* F7 */ #define USART_ICR_RTOCF BIT(11) /* F7 */ #define USART_ICR_EOBCF BIT(12) /* F7 */ @@ -261,6 +254,7 @@ bool hw_flow_control; bool fifoen; int wakeirq; + int rdr_mask; /* receive data register mask */ }; static struct stm32_port stm32_ports[STM32_MAX_PORTS]; diff -Nru linux-4.19.98/drivers/tty/serial/xilinx_uartps.c linux-4.19.118/drivers/tty/serial/xilinx_uartps.c --- linux-4.19.98/drivers/tty/serial/xilinx_uartps.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/serial/xilinx_uartps.c 2020-04-23 08:30:24.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include #define CDNS_UART_TTY_NAME "ttyPS" #define CDNS_UART_NAME "xuartps" @@ -34,6 +35,7 @@ #define CDNS_UART_NR_PORTS 2 #define CDNS_UART_FIFO_SIZE 64 /* FIFO size */ #define CDNS_UART_REGISTER_SPACE 0x1000 +#define TX_TIMEOUT 500000 /* Rx Trigger level */ static int rx_trigger_level = 56; @@ -681,18 +683,21 @@ unsigned int cval = 0; unsigned int baud, minbaud, maxbaud; unsigned long flags; - unsigned int ctrl_reg, mode_reg; - - spin_lock_irqsave(&port->lock, flags); + unsigned int ctrl_reg, mode_reg, val; + int err; /* Wait for the transmit FIFO to empty before making changes */ if (!(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_TX_DIS)) { - while (!(readl(port->membase + CDNS_UART_SR) & - CDNS_UART_SR_TXEMPTY)) { - cpu_relax(); + err = readl_poll_timeout(port->membase + CDNS_UART_SR, + val, (val & CDNS_UART_SR_TXEMPTY), + 1000, TX_TIMEOUT); + if (err) { + dev_err(port->dev, "timed out waiting for tx empty"); + return; } } + spin_lock_irqsave(&port->lock, flags); /* Disable the TX and RX to set baud rate */ ctrl_reg = readl(port->membase + CDNS_UART_CR); diff -Nru linux-4.19.98/drivers/tty/synclink_gt.c linux-4.19.118/drivers/tty/synclink_gt.c --- linux-4.19.98/drivers/tty/synclink_gt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/synclink_gt.c 2020-04-23 08:30:24.000000000 +0000 @@ -1335,10 +1335,10 @@ DBGINFO(("%s throttle\n", info->device_name)); if (I_IXOFF(tty)) send_xchar(tty, STOP_CHAR(tty)); - if (C_CRTSCTS(tty)) { + if (C_CRTSCTS(tty)) { spin_lock_irqsave(&info->lock,flags); info->signals &= ~SerialSignal_RTS; - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); } } @@ -1360,10 +1360,10 @@ else send_xchar(tty, START_CHAR(tty)); } - if (C_CRTSCTS(tty)) { + if (C_CRTSCTS(tty)) { spin_lock_irqsave(&info->lock,flags); info->signals |= SerialSignal_RTS; - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); } } @@ -2561,8 +2561,8 @@ info->read_status_mask = IRQ_RXOVER; if (I_INPCK(info->port.tty)) info->read_status_mask |= MASK_PARITY | MASK_FRAMING; - if (I_BRKINT(info->port.tty) || I_PARMRK(info->port.tty)) - info->read_status_mask |= MASK_BREAK; + if (I_BRKINT(info->port.tty) || I_PARMRK(info->port.tty)) + info->read_status_mask |= MASK_BREAK; if (I_IGNPAR(info->port.tty)) info->ignore_status_mask |= MASK_PARITY | MASK_FRAMING; if (I_IGNBRK(info->port.tty)) { @@ -3193,7 +3193,7 @@ info->signals &= ~SerialSignal_DTR; spin_lock_irqsave(&info->lock,flags); - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); return 0; } @@ -3204,7 +3204,7 @@ struct slgt_info *info = container_of(port, struct slgt_info, port); spin_lock_irqsave(&info->lock,flags); - get_signals(info); + get_signals(info); spin_unlock_irqrestore(&info->lock,flags); return (info->signals & SerialSignal_DCD) ? 1 : 0; } @@ -3219,7 +3219,7 @@ info->signals |= SerialSignal_RTS | SerialSignal_DTR; else info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR); - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); } diff -Nru linux-4.19.98/drivers/tty/synclinkmp.c linux-4.19.118/drivers/tty/synclinkmp.c --- linux-4.19.98/drivers/tty/synclinkmp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/synclinkmp.c 2020-04-23 08:30:24.000000000 +0000 @@ -1454,10 +1454,10 @@ if (I_IXOFF(tty)) send_xchar(tty, STOP_CHAR(tty)); - if (C_CRTSCTS(tty)) { + if (C_CRTSCTS(tty)) { spin_lock_irqsave(&info->lock,flags); info->serial_signals &= ~SerialSignal_RTS; - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); } } @@ -1483,10 +1483,10 @@ send_xchar(tty, START_CHAR(tty)); } - if (C_CRTSCTS(tty)) { + if (C_CRTSCTS(tty)) { spin_lock_irqsave(&info->lock,flags); info->serial_signals |= SerialSignal_RTS; - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); } } @@ -2471,7 +2471,7 @@ if (status & SerialSignal_CTS) { if ( debug_level >= DEBUG_LEVEL_ISR ) printk("CTS tx start..."); - info->port.tty->hw_stopped = 0; + info->port.tty->hw_stopped = 0; tx_start(info); info->pending_bh |= BH_TRANSMIT; return; @@ -2480,7 +2480,7 @@ if (!(status & SerialSignal_CTS)) { if ( debug_level >= DEBUG_LEVEL_ISR ) printk("CTS tx stop..."); - info->port.tty->hw_stopped = 1; + info->port.tty->hw_stopped = 1; tx_stop(info); } } @@ -2807,8 +2807,8 @@ info->read_status_mask2 = OVRN; if (I_INPCK(info->port.tty)) info->read_status_mask2 |= PE | FRME; - if (I_BRKINT(info->port.tty) || I_PARMRK(info->port.tty)) - info->read_status_mask1 |= BRKD; + if (I_BRKINT(info->port.tty) || I_PARMRK(info->port.tty)) + info->read_status_mask1 |= BRKD; if (I_IGNPAR(info->port.tty)) info->ignore_status_mask2 |= PE | FRME; if (I_IGNBRK(info->port.tty)) { @@ -3178,7 +3178,7 @@ unsigned long flags; spin_lock_irqsave(&info->lock,flags); - get_signals(info); + get_signals(info); spin_unlock_irqrestore(&info->lock,flags); result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS : 0) | @@ -3216,7 +3216,7 @@ info->serial_signals &= ~SerialSignal_DTR; spin_lock_irqsave(&info->lock,flags); - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); return 0; @@ -3228,7 +3228,7 @@ unsigned long flags; spin_lock_irqsave(&info->lock,flags); - get_signals(info); + get_signals(info); spin_unlock_irqrestore(&info->lock,flags); return (info->serial_signals & SerialSignal_DCD) ? 1 : 0; @@ -3244,7 +3244,7 @@ info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR; else info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR); - set_signals(info); + set_signals(info); spin_unlock_irqrestore(&info->lock,flags); } diff -Nru linux-4.19.98/drivers/tty/sysrq.c linux-4.19.118/drivers/tty/sysrq.c --- linux-4.19.98/drivers/tty/sysrq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/sysrq.c 2020-04-23 08:30:24.000000000 +0000 @@ -546,7 +546,6 @@ */ orig_log_level = console_loglevel; console_loglevel = CONSOLE_LOGLEVEL_DEFAULT; - pr_info("SysRq : "); op_p = __sysrq_get_key_op(key); if (op_p) { @@ -555,14 +554,15 @@ * should not) and is the invoked operation enabled? */ if (!check_mask || sysrq_on_mask(op_p->enable_mask)) { - pr_cont("%s\n", op_p->action_msg); + pr_info("%s\n", op_p->action_msg); console_loglevel = orig_log_level; op_p->handler(key); } else { - pr_cont("This sysrq operation is disabled.\n"); + pr_info("This sysrq operation is disabled.\n"); + console_loglevel = orig_log_level; } } else { - pr_cont("HELP : "); + pr_info("HELP : "); /* Only print the help msg once per handler */ for (i = 0; i < ARRAY_SIZE(sysrq_key_table); i++) { if (sysrq_key_table[i]) { diff -Nru linux-4.19.98/drivers/tty/tty_port.c linux-4.19.118/drivers/tty/tty_port.c --- linux-4.19.98/drivers/tty/tty_port.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/tty_port.c 2020-04-23 08:30:24.000000000 +0000 @@ -52,10 +52,11 @@ } } -static const struct tty_port_client_operations default_client_ops = { +const struct tty_port_client_operations tty_port_default_client_ops = { .receive_buf = tty_port_default_receive_buf, .write_wakeup = tty_port_default_wakeup, }; +EXPORT_SYMBOL_GPL(tty_port_default_client_ops); void tty_port_init(struct tty_port *port) { @@ -68,7 +69,7 @@ spin_lock_init(&port->lock); port->close_delay = (50 * HZ) / 100; port->closing_wait = (3000 * HZ) / 100; - port->client_ops = &default_client_ops; + port->client_ops = &tty_port_default_client_ops; kref_init(&port->kref); } EXPORT_SYMBOL(tty_port_init); diff -Nru linux-4.19.98/drivers/tty/vt/selection.c linux-4.19.118/drivers/tty/vt/selection.c --- linux-4.19.98/drivers/tty/vt/selection.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/vt/selection.c 2020-04-23 08:30:24.000000000 +0000 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,8 @@ #include #include +#include + /* Don't take this from : 011-015 on the screen aren't spaces */ #define isspace(c) ((c) == ' ') @@ -41,6 +44,7 @@ static int sel_end; static int sel_buffer_lth; static char *sel_buffer; +static DEFINE_MUTEX(sel_lock); /* clear_selection, highlight and highlight_pointer can be called from interrupt (via scrollback/front) */ @@ -81,6 +85,11 @@ } } +bool vc_is_sel(struct vc_data *vc) +{ + return vc == sel_cons; +} + /* * User settable table: what characters are to be considered alphabetic? * 128 bits. Locked by the console lock. @@ -163,7 +172,7 @@ * The entire selection process is managed under the console_lock. It's * a lot under the lock but its hardly a performance path */ -int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty) +static int __set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty) { struct vc_data *vc = vc_cons[fg_console].d; int new_sel_start, new_sel_end, spc; @@ -171,7 +180,7 @@ char *bp, *obp; int i, ps, pe, multiplier; u32 c; - int mode; + int mode, ret = 0; poke_blanked_console(); if (copy_from_user(&v, sel, sizeof(*sel))) @@ -320,7 +329,21 @@ } } sel_buffer_lth = bp - sel_buffer; - return 0; + + return ret; +} + +int set_selection(const struct tiocl_selection __user *v, struct tty_struct *tty) +{ + int ret; + + mutex_lock(&sel_lock); + console_lock(); + ret = __set_selection(v, tty); + console_unlock(); + mutex_unlock(&sel_lock); + + return ret; } /* Insert the contents of the selection buffer into the @@ -337,6 +360,7 @@ unsigned int count; struct tty_ldisc *ld; DECLARE_WAITQUEUE(wait, current); + int ret = 0; console_lock(); poke_blanked_console(); @@ -348,10 +372,17 @@ tty_buffer_lock_exclusive(&vc->port); add_wait_queue(&vc->paste_wait, &wait); + mutex_lock(&sel_lock); while (sel_buffer && sel_buffer_lth > pasted) { set_current_state(TASK_INTERRUPTIBLE); + if (signal_pending(current)) { + ret = -EINTR; + break; + } if (tty_throttled(tty)) { + mutex_unlock(&sel_lock); schedule(); + mutex_lock(&sel_lock); continue; } __set_current_state(TASK_RUNNING); @@ -360,10 +391,11 @@ count); pasted += count; } + mutex_unlock(&sel_lock); remove_wait_queue(&vc->paste_wait, &wait); __set_current_state(TASK_RUNNING); tty_buffer_unlock_exclusive(&vc->port); tty_ldisc_deref(ld); - return 0; + return ret; } diff -Nru linux-4.19.98/drivers/tty/vt/vt.c linux-4.19.118/drivers/tty/vt/vt.c --- linux-4.19.98/drivers/tty/vt/vt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/vt/vt.c 2020-04-23 08:30:24.000000000 +0000 @@ -890,8 +890,9 @@ static void hide_cursor(struct vc_data *vc) { - if (vc == sel_cons) + if (vc_is_sel(vc)) clear_selection(); + vc->vc_sw->con_cursor(vc, CM_ERASE); hide_softcursor(vc); } @@ -901,7 +902,7 @@ if (!con_is_fg(vc) || console_blanked || vc->vc_mode == KD_GRAPHICS) return; if (vc->vc_deccm) { - if (vc == sel_cons) + if (vc_is_sel(vc)) clear_selection(); add_softcursor(vc); if ((vc->vc_cursor_type & 0x0f) != 1) @@ -936,10 +937,21 @@ WARN_CONSOLE_UNLOCKED(); set_origin(vc); - if (vc->vc_sw->con_flush_scrollback) + if (vc->vc_sw->con_flush_scrollback) { vc->vc_sw->con_flush_scrollback(vc); - else + } else if (con_is_visible(vc)) { + /* + * When no con_flush_scrollback method is provided then the + * legacy way for flushing the scrollback buffer is to use + * a side effect of the con_switch method. We do it only on + * the foreground console as background consoles have no + * scrollback buffers in that case and we obviously don't + * want to switch to them. + */ + hide_cursor(vc); vc->vc_sw->con_switch(vc); + set_cursor(vc); + } } /* @@ -1066,6 +1078,17 @@ module_put(vc->vc_sw->owner); } +static void vc_port_destruct(struct tty_port *port) +{ + struct vc_data *vc = container_of(port, struct vc_data, port); + + kfree(vc); +} + +static const struct tty_port_operations vc_port_ops = { + .destruct = vc_port_destruct, +}; + int vc_allocate(unsigned int currcons) /* return 0 on success */ { struct vt_notifier_param param; @@ -1091,6 +1114,7 @@ vc_cons[currcons].d = vc; tty_port_init(&vc->port); + vc->port.ops = &vc_port_ops; INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK); visual_init(vc, currcons, 1); @@ -1199,7 +1223,7 @@ } } - if (vc == sel_cons) + if (vc_is_sel(vc)) clear_selection(); old_rows = vc->vc_rows; @@ -3011,9 +3035,7 @@ switch (type) { case TIOCL_SETSEL: - console_lock(); ret = set_selection((struct tiocl_selection __user *)(p+1), tty); - console_unlock(); break; case TIOCL_PASTESEL: ret = paste_selection(tty); @@ -3219,6 +3241,7 @@ tty->driver_data = vc; vc->port.tty = tty; + tty_port_get(&vc->port); if (!tty->winsize.ws_row && !tty->winsize.ws_col) { tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; @@ -3254,6 +3277,13 @@ console_unlock(); } +static void con_cleanup(struct tty_struct *tty) +{ + struct vc_data *vc = tty->driver_data; + + tty_port_put(&vc->port); +} + static int default_color = 7; /* white */ static int default_italic_color = 2; // green (ASCII) static int default_underline_color = 3; // cyan (ASCII) @@ -3378,7 +3408,8 @@ .throttle = con_throttle, .unthrottle = con_unthrottle, .resize = vt_resize, - .shutdown = con_shutdown + .shutdown = con_shutdown, + .cleanup = con_cleanup, }; static struct cdev vc0_cdev; diff -Nru linux-4.19.98/drivers/tty/vt/vt_ioctl.c linux-4.19.118/drivers/tty/vt/vt_ioctl.c --- linux-4.19.98/drivers/tty/vt/vt_ioctl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/tty/vt/vt_ioctl.c 2020-04-23 08:30:24.000000000 +0000 @@ -39,11 +39,32 @@ #include #include -char vt_dont_switch; -extern struct tty_driver *console_driver; +bool vt_dont_switch; -#define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count) -#define VT_BUSY(i) (VT_IS_IN_USE(i) || i == fg_console || vc_cons[i].d == sel_cons) +static inline bool vt_in_use(unsigned int i) +{ + const struct vc_data *vc = vc_cons[i].d; + + /* + * console_lock must be held to prevent the vc from being deallocated + * while we're checking whether it's in-use. + */ + WARN_CONSOLE_UNLOCKED(); + + return vc && kref_read(&vc->port.kref) > 1; +} + +static inline bool vt_busy(int i) +{ + if (vt_in_use(i)) + return true; + if (i == fg_console) + return true; + if (vc_is_sel(vc_cons[i].d)) + return true; + + return false; +} /* * Console (vt and kd) routines, as defined by USL SVR4 manual, and by @@ -289,16 +310,14 @@ int ret = 0; console_lock(); - if (VT_BUSY(vc_num)) + if (vt_busy(vc_num)) ret = -EBUSY; else if (vc_num) vc = vc_deallocate(vc_num); console_unlock(); - if (vc && vc_num >= MIN_NR_CONSOLES) { - tty_port_destroy(&vc->port); - kfree(vc); - } + if (vc && vc_num >= MIN_NR_CONSOLES) + tty_port_put(&vc->port); return ret; } @@ -311,17 +330,15 @@ console_lock(); for (i = 1; i < MAX_NR_CONSOLES; i++) - if (!VT_BUSY(i)) + if (!vt_busy(i)) vc[i] = vc_deallocate(i); else vc[i] = NULL; console_unlock(); for (i = 1; i < MAX_NR_CONSOLES; i++) { - if (vc[i] && i >= MIN_NR_CONSOLES) { - tty_port_destroy(&vc[i]->port); - kfree(vc[i]); - } + if (vc[i] && i >= MIN_NR_CONSOLES) + tty_port_put(&vc[i]->port); } } @@ -335,22 +352,13 @@ { struct vc_data *vc = tty->driver_data; struct console_font_op op; /* used in multiple places here */ - unsigned int console; + unsigned int console = vc->vc_num; unsigned char ucval; unsigned int uival; void __user *up = (void __user *)arg; int i, perm; int ret = 0; - console = vc->vc_num; - - - if (!vc_cons_allocated(console)) { /* impossible? */ - ret = -ENOIOCTLCMD; - goto out; - } - - /* * To have permissions to do most of the vt ioctls, we either have * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG. @@ -641,15 +649,16 @@ struct vt_stat __user *vtstat = up; unsigned short state, mask; - /* Review: FIXME: Console lock ? */ if (put_user(fg_console + 1, &vtstat->v_active)) ret = -EFAULT; else { state = 1; /* /dev/tty0 is always open */ + console_lock(); /* required by vt_in_use() */ for (i = 0, mask = 2; i < MAX_NR_CONSOLES && mask; ++i, mask <<= 1) - if (VT_IS_IN_USE(i)) + if (vt_in_use(i)) state |= mask; + console_unlock(); ret = put_user(state, &vtstat->v_state); } break; @@ -659,10 +668,11 @@ * Returns the first available (non-opened) console. */ case VT_OPENQRY: - /* FIXME: locking ? - but then this is a stupid API */ + console_lock(); /* required by vt_in_use() */ for (i = 0; i < MAX_NR_CONSOLES; ++i) - if (! VT_IS_IN_USE(i)) + if (!vt_in_use(i)) break; + console_unlock(); uival = i < MAX_NR_CONSOLES ? (i+1) : -1; goto setint; @@ -876,15 +886,20 @@ return -EINVAL; for (i = 0; i < MAX_NR_CONSOLES; i++) { + struct vc_data *vcp; + if (!vc_cons[i].d) continue; console_lock(); - if (v.v_vlin) - vc_cons[i].d->vc_scan_lines = v.v_vlin; - if (v.v_clin) - vc_cons[i].d->vc_font.height = v.v_clin; - vc_cons[i].d->vc_resize_user = 1; - vc_resize(vc_cons[i].d, v.v_cols, v.v_rows); + vcp = vc_cons[i].d; + if (vcp) { + if (v.v_vlin) + vcp->vc_scan_lines = v.v_vlin; + if (v.v_clin) + vcp->vc_font.height = v.v_clin; + vcp->vc_resize_user = 1; + vc_resize(vcp, v.v_cols, v.v_rows); + } console_unlock(); } break; @@ -1006,12 +1021,12 @@ case VT_LOCKSWITCH: if (!capable(CAP_SYS_TTY_CONFIG)) return -EPERM; - vt_dont_switch = 1; + vt_dont_switch = true; break; case VT_UNLOCKSWITCH: if (!capable(CAP_SYS_TTY_CONFIG)) return -EPERM; - vt_dont_switch = 0; + vt_dont_switch = false; break; case VT_GETHIFONTMASK: ret = put_user(vc->vc_hi_font_mask, @@ -1175,18 +1190,10 @@ { struct vc_data *vc = tty->driver_data; struct console_font_op op; /* used in multiple places here */ - unsigned int console; void __user *up = (void __user *)arg; int perm; int ret = 0; - console = vc->vc_num; - - if (!vc_cons_allocated(console)) { /* impossible? */ - ret = -ENOIOCTLCMD; - goto out; - } - /* * To have permissions to do most of the vt ioctls, we either have * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG. @@ -1246,7 +1253,7 @@ arg = (unsigned long)compat_ptr(arg); goto fallback; } -out: + return ret; fallback: diff -Nru linux-4.19.98/drivers/uio/uio.c linux-4.19.118/drivers/uio/uio.c --- linux-4.19.98/drivers/uio/uio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/uio/uio.c 2020-04-23 08:30:24.000000000 +0000 @@ -938,9 +938,12 @@ atomic_set(&idev->event, 0); ret = uio_get_minor(idev); - if (ret) + if (ret) { + kfree(idev); return ret; + } + device_initialize(&idev->dev); idev->dev.devt = MKDEV(uio_major, idev->minor); idev->dev.class = &uio_class; idev->dev.parent = parent; @@ -951,7 +954,7 @@ if (ret) goto err_device_create; - ret = device_register(&idev->dev); + ret = device_add(&idev->dev); if (ret) goto err_device_create; @@ -983,9 +986,10 @@ err_request_irq: uio_dev_del_attributes(idev); err_uio_dev_add_attributes: - device_unregister(&idev->dev); + device_del(&idev->dev); err_device_create: uio_free_minor(idev); + put_device(&idev->dev); return ret; } EXPORT_SYMBOL_GPL(__uio_register_device); diff -Nru linux-4.19.98/drivers/uio/uio_dmem_genirq.c linux-4.19.118/drivers/uio/uio_dmem_genirq.c --- linux-4.19.98/drivers/uio/uio_dmem_genirq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/uio/uio_dmem_genirq.c 2020-04-23 08:30:24.000000000 +0000 @@ -135,11 +135,13 @@ if (irq_on) { if (test_and_clear_bit(0, &priv->flags)) enable_irq(dev_info->irq); + spin_unlock_irqrestore(&priv->lock, flags); } else { - if (!test_and_set_bit(0, &priv->flags)) + if (!test_and_set_bit(0, &priv->flags)) { + spin_unlock_irqrestore(&priv->lock, flags); disable_irq(dev_info->irq); + } } - spin_unlock_irqrestore(&priv->lock, flags); return 0; } diff -Nru linux-4.19.98/drivers/usb/class/cdc-acm.c linux-4.19.118/drivers/usb/class/cdc-acm.c --- linux-4.19.98/drivers/usb/class/cdc-acm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/class/cdc-acm.c 2020-04-23 08:30:24.000000000 +0000 @@ -914,10 +914,10 @@ memset(&tmp, 0, sizeof(tmp)); tmp.xmit_fifo_size = acm->writesize; tmp.baud_base = le32_to_cpu(acm->line.dwDTERate); - tmp.close_delay = acm->port.close_delay / 10; + tmp.close_delay = jiffies_to_msecs(acm->port.close_delay) / 10; tmp.closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE : - acm->port.closing_wait / 10; + jiffies_to_msecs(acm->port.closing_wait) / 10; if (copy_to_user(info, &tmp, sizeof(tmp))) return -EFAULT; @@ -930,20 +930,28 @@ { struct serial_struct new_serial; unsigned int closing_wait, close_delay; + unsigned int old_closing_wait, old_close_delay; int retval = 0; if (copy_from_user(&new_serial, newinfo, sizeof(new_serial))) return -EFAULT; - close_delay = new_serial.close_delay * 10; + close_delay = msecs_to_jiffies(new_serial.close_delay * 10); closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? - ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10; + ASYNC_CLOSING_WAIT_NONE : + msecs_to_jiffies(new_serial.closing_wait * 10); + + /* we must redo the rounding here, so that the values match */ + old_close_delay = jiffies_to_msecs(acm->port.close_delay) / 10; + old_closing_wait = acm->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? + ASYNC_CLOSING_WAIT_NONE : + jiffies_to_msecs(acm->port.closing_wait) / 10; mutex_lock(&acm->port.mutex); if (!capable(CAP_SYS_ADMIN)) { - if ((close_delay != acm->port.close_delay) || - (closing_wait != acm->port.closing_wait)) + if ((new_serial.close_delay != old_close_delay) || + (new_serial.closing_wait != old_closing_wait)) retval = -EPERM; else retval = -EOPNOTSUPP; diff -Nru linux-4.19.98/drivers/usb/class/cdc-wdm.c linux-4.19.118/drivers/usb/class/cdc-wdm.c --- linux-4.19.98/drivers/usb/class/cdc-wdm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/class/cdc-wdm.c 2020-04-23 08:30:24.000000000 +0000 @@ -1107,7 +1107,7 @@ rv = recover_from_urb_loss(desc); mutex_unlock(&desc->wlock); mutex_unlock(&desc->rlock); - return 0; + return rv; } static struct usb_driver wdm_driver = { diff -Nru linux-4.19.98/drivers/usb/core/config.c linux-4.19.118/drivers/usb/core/config.c --- linux-4.19.98/drivers/usb/core/config.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/core/config.c 2020-04-23 08:30:24.000000000 +0000 @@ -256,6 +256,7 @@ struct usb_host_interface *ifp, int num_ep, unsigned char *buffer, int size) { + struct usb_device *udev = to_usb_device(ddev); unsigned char *buffer0 = buffer; struct usb_endpoint_descriptor *d; struct usb_host_endpoint *endpoint; @@ -297,6 +298,16 @@ goto skip_to_next_endpoint_or_interface_descriptor; } + /* Ignore blacklisted endpoints */ + if (udev->quirks & USB_QUIRK_ENDPOINT_BLACKLIST) { + if (usb_endpoint_is_blacklisted(udev, ifp, d)) { + dev_warn(ddev, "config %d interface %d altsetting %d has a blacklisted endpoint with address 0x%X, skipping\n", + cfgno, inum, asnum, + d->bEndpointAddress); + goto skip_to_next_endpoint_or_interface_descriptor; + } + } + endpoint = &ifp->endpoint[ifp->desc.bNumEndpoints]; ++ifp->desc.bNumEndpoints; diff -Nru linux-4.19.98/drivers/usb/core/hub.c linux-4.19.118/drivers/usb/core/hub.c --- linux-4.19.98/drivers/usb/core/hub.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/core/hub.c 2020-04-23 08:30:24.000000000 +0000 @@ -36,7 +36,9 @@ #include "otg_whitelist.h" #define USB_VENDOR_GENESYS_LOGIC 0x05e3 +#define USB_VENDOR_SMSC 0x0424 #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 +#define HUB_QUIRK_DISABLE_AUTOSUSPEND 0x02 #define USB_TP_TRANSMISSION_DELAY 40 /* ns */ #define USB_TP_TRANSMISSION_DELAY_MAX 65535 /* ns */ @@ -959,13 +961,17 @@ { struct usb_hub *hub; struct usb_interface *intf; + int ret; if (!udev->parent) /* Can't remove a root hub */ return -EINVAL; hub = usb_hub_to_struct_hub(udev->parent); intf = to_usb_interface(hub->intfdev); - usb_autopm_get_interface(intf); + ret = usb_autopm_get_interface(intf); + if (ret < 0) + return ret; + set_bit(udev->portnum, hub->removed_bits); hub_port_logical_disconnect(hub, udev->portnum); usb_autopm_put_interface(intf); @@ -1190,11 +1196,6 @@ #ifdef CONFIG_PM udev->reset_resume = 1; #endif - /* Don't set the change_bits when the device - * was powered off. - */ - if (test_bit(port1, hub->power_bits)) - set_bit(port1, hub->change_bits); } else { /* The power session is gone; tell hub_wq */ @@ -1700,6 +1701,10 @@ kfree(hub->buffer); pm_suspend_ignore_children(&intf->dev, false); + + if (hub->quirk_disable_autosuspend) + usb_autopm_put_interface(intf); + kref_put(&hub->kref, hub_release); } @@ -1830,6 +1835,11 @@ if (id->driver_info & HUB_QUIRK_CHECK_PORT_AUTOSUSPEND) hub->quirk_check_port_auto_suspend = 1; + if (id->driver_info & HUB_QUIRK_DISABLE_AUTOSUSPEND) { + hub->quirk_disable_autosuspend = 1; + usb_autopm_get_interface_no_resume(intf); + } + if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) return 0; @@ -5410,6 +5420,10 @@ } static const struct usb_device_id hub_id_table[] = { + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_CLASS, + .idVendor = USB_VENDOR_SMSC, + .bInterfaceClass = USB_CLASS_HUB, + .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND}, { .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_CLASS, .idVendor = USB_VENDOR_GENESYS_LOGIC, diff -Nru linux-4.19.98/drivers/usb/core/hub.h linux-4.19.118/drivers/usb/core/hub.h --- linux-4.19.98/drivers/usb/core/hub.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/core/hub.h 2020-04-23 08:30:24.000000000 +0000 @@ -61,6 +61,7 @@ unsigned quiescing:1; unsigned disconnected:1; unsigned in_reset:1; + unsigned quirk_disable_autosuspend:1; unsigned quirk_check_port_auto_suspend:1; diff -Nru linux-4.19.98/drivers/usb/core/port.c linux-4.19.118/drivers/usb/core/port.c --- linux-4.19.98/drivers/usb/core/port.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/core/port.c 2020-04-23 08:30:24.000000000 +0000 @@ -203,7 +203,10 @@ if (!port_dev->is_superspeed && peer) pm_runtime_get_sync(&peer->dev); - usb_autopm_get_interface(intf); + retval = usb_autopm_get_interface(intf); + if (retval < 0) + return retval; + retval = usb_hub_set_port_power(hdev, hub, port1, true); msleep(hub_power_on_good_delay(hub)); if (udev && !retval) { @@ -256,7 +259,10 @@ if (usb_port_block_power_off) return -EBUSY; - usb_autopm_get_interface(intf); + retval = usb_autopm_get_interface(intf); + if (retval < 0) + return retval; + retval = usb_hub_set_port_power(hdev, hub, port1, false); usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_CONNECTION); if (!port_dev->is_superspeed) diff -Nru linux-4.19.98/drivers/usb/core/quirks.c linux-4.19.118/drivers/usb/core/quirks.c --- linux-4.19.98/drivers/usb/core/quirks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/core/quirks.c 2020-04-23 08:30:24.000000000 +0000 @@ -231,6 +231,9 @@ /* Logitech PTZ Pro Camera */ { USB_DEVICE(0x046d, 0x0853), .driver_info = USB_QUIRK_DELAY_INIT }, + /* Logitech Screen Share */ + { USB_DEVICE(0x046d, 0x086c), .driver_info = USB_QUIRK_NO_LPM }, + /* Logitech Quickcam Fusion */ { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME }, @@ -354,6 +357,10 @@ { USB_DEVICE(0x0904, 0x6103), .driver_info = USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL }, + /* Sound Devices USBPre2 */ + { USB_DEVICE(0x0926, 0x0202), .driver_info = + USB_QUIRK_ENDPOINT_BLACKLIST }, + /* Keytouch QWERTY Panel keyboard */ { USB_DEVICE(0x0926, 0x3333), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS }, @@ -371,6 +378,12 @@ { USB_DEVICE(0x0b05, 0x17e0), .driver_info = USB_QUIRK_IGNORE_REMOTE_WAKEUP }, + /* Realtek hub in Dell WD19 (Type-C) */ + { USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM }, + + /* Generic RTL8153 based ethernet adapters */ + { USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM }, + /* Action Semiconductor flash disk */ { USB_DEVICE(0x10d6, 0x2200), .driver_info = USB_QUIRK_STRING_FETCH_255 }, @@ -445,6 +458,9 @@ /* INTEL VALUE SSD */ { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, + /* novation SoundControl XL */ + { USB_DEVICE(0x1235, 0x0061), .driver_info = USB_QUIRK_RESET_RESUME }, + { } /* terminating entry must be last */ }; @@ -472,6 +488,39 @@ { } /* terminating entry must be last */ }; +/* + * Entries for blacklisted endpoints that should be ignored when parsing + * configuration descriptors. + * + * Matched for devices with USB_QUIRK_ENDPOINT_BLACKLIST. + */ +static const struct usb_device_id usb_endpoint_blacklist[] = { + { USB_DEVICE_INTERFACE_NUMBER(0x0926, 0x0202, 1), .driver_info = 0x85 }, + { } +}; + +bool usb_endpoint_is_blacklisted(struct usb_device *udev, + struct usb_host_interface *intf, + struct usb_endpoint_descriptor *epd) +{ + const struct usb_device_id *id; + unsigned int address; + + for (id = usb_endpoint_blacklist; id->match_flags; ++id) { + if (!usb_match_device(udev, id)) + continue; + + if (!usb_match_one_id_intf(udev, intf, id)) + continue; + + address = id->driver_info; + if (address == epd->bEndpointAddress) + return true; + } + + return false; +} + static bool usb_match_any_interface(struct usb_device *udev, const struct usb_device_id *id) { diff -Nru linux-4.19.98/drivers/usb/core/usb.h linux-4.19.118/drivers/usb/core/usb.h --- linux-4.19.98/drivers/usb/core/usb.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/core/usb.h 2020-04-23 08:30:24.000000000 +0000 @@ -37,6 +37,9 @@ extern void usb_detect_quirks(struct usb_device *udev); extern void usb_detect_interface_quirks(struct usb_device *udev); extern void usb_release_quirk_list(void); +extern bool usb_endpoint_is_blacklisted(struct usb_device *udev, + struct usb_host_interface *intf, + struct usb_endpoint_descriptor *epd); extern int usb_remove_device(struct usb_device *udev); extern int usb_get_device_descriptor(struct usb_device *dev, diff -Nru linux-4.19.98/drivers/usb/dwc2/gadget.c linux-4.19.118/drivers/usb/dwc2/gadget.c --- linux-4.19.98/drivers/usb/dwc2/gadget.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/dwc2/gadget.c 2020-04-23 08:30:24.000000000 +0000 @@ -1004,11 +1004,6 @@ else packets = 1; /* send one packet if length is zero. */ - if (hs_ep->isochronous && length > (hs_ep->mc * hs_ep->ep.maxpacket)) { - dev_err(hsotg->dev, "req length > maxpacket*mc\n"); - return; - } - if (dir_in && index != 0) if (hs_ep->isochronous) epsize = DXEPTSIZ_MC(packets); @@ -1312,6 +1307,13 @@ req->actual = 0; req->status = -EINPROGRESS; + /* Don't queue ISOC request if length greater than mps*mc */ + if (hs_ep->isochronous && + req->length > (hs_ep->mc * hs_ep->ep.maxpacket)) { + dev_err(hs->dev, "req length > maxpacket*mc\n"); + return -EINVAL; + } + /* In DDMA mode for ISOC's don't queue request if length greater * than descriptor limits. */ @@ -1542,6 +1544,7 @@ struct dwc2_hsotg_ep *ep0 = hsotg->eps_out[0]; struct dwc2_hsotg_ep *ep; __le16 reply; + u16 status; int ret; dev_dbg(hsotg->dev, "%s: USB_REQ_GET_STATUS\n", __func__); @@ -1553,11 +1556,10 @@ switch (ctrl->bRequestType & USB_RECIP_MASK) { case USB_RECIP_DEVICE: - /* - * bit 0 => self powered - * bit 1 => remote wakeup - */ - reply = cpu_to_le16(0); + status = 1 << USB_DEVICE_SELF_POWERED; + status |= hsotg->remote_wakeup_allowed << + USB_DEVICE_REMOTE_WAKEUP; + reply = cpu_to_le16(status); break; case USB_RECIP_INTERFACE: @@ -1668,7 +1670,10 @@ case USB_RECIP_DEVICE: switch (wValue) { case USB_DEVICE_REMOTE_WAKEUP: - hsotg->remote_wakeup_allowed = 1; + if (set) + hsotg->remote_wakeup_allowed = 1; + else + hsotg->remote_wakeup_allowed = 0; break; case USB_DEVICE_TEST_MODE: @@ -1678,16 +1683,17 @@ return -EINVAL; hsotg->test_mode = wIndex >> 8; - ret = dwc2_hsotg_send_reply(hsotg, ep0, NULL, 0); - if (ret) { - dev_err(hsotg->dev, - "%s: failed to send reply\n", __func__); - return ret; - } break; default: return -ENOENT; } + + ret = dwc2_hsotg_send_reply(hsotg, ep0, NULL, 0); + if (ret) { + dev_err(hsotg->dev, + "%s: failed to send reply\n", __func__); + return ret; + } break; case USB_RECIP_ENDPOINT: @@ -2230,6 +2236,7 @@ if (status & DEV_DMA_STS_MASK) dev_err(hsotg->dev, "descriptor %d closed with %x\n", i, status & DEV_DMA_STS_MASK); + desc++; } return bytes_rem; @@ -3917,11 +3924,12 @@ * a unique tx-fifo even if it is non-periodic. */ if (dir_in && hsotg->dedicated_fifos) { + unsigned fifo_count = dwc2_hsotg_tx_fifo_count(hsotg); u32 fifo_index = 0; u32 fifo_size = UINT_MAX; size = hs_ep->ep.maxpacket * hs_ep->mc; - for (i = 1; i < hsotg->num_of_eps; ++i) { + for (i = 1; i <= fifo_count; ++i) { if (hsotg->fifo_map & (1 << i)) continue; val = dwc2_readl(hsotg, DPTXFSIZN(i)); diff -Nru linux-4.19.98/drivers/usb/dwc3/Kconfig linux-4.19.118/drivers/usb/dwc3/Kconfig --- linux-4.19.98/drivers/usb/dwc3/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/dwc3/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -52,7 +52,8 @@ config USB_DWC3_OMAP tristate "Texas Instruments OMAP5 and similar Platforms" - depends on EXTCON && (ARCH_OMAP2PLUS || COMPILE_TEST) + depends on ARCH_OMAP2PLUS || COMPILE_TEST + depends on EXTCON || !EXTCON depends on OF default USB_DWC3 help @@ -114,6 +115,7 @@ config USB_DWC3_QCOM tristate "Qualcomm Platform" depends on ARCH_QCOM || COMPILE_TEST + depends on EXTCON || !EXTCON depends on OF default USB_DWC3 help diff -Nru linux-4.19.98/drivers/usb/dwc3/core.c linux-4.19.118/drivers/usb/dwc3/core.c --- linux-4.19.98/drivers/usb/dwc3/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/dwc3/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -981,6 +981,9 @@ if (dwc->dis_tx_ipgap_linecheck_quirk) reg |= DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS; + if (dwc->parkmode_disable_ss_quirk) + reg |= DWC3_GUCTL1_PARKMODE_DISABLE_SS; + dwc3_writel(dwc->regs, DWC3_GUCTL1, reg); } @@ -1199,6 +1202,9 @@ /* do nothing */ break; } + + /* de-assert DRVVBUS for HOST and OTG mode */ + dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE); } static void dwc3_get_properties(struct dwc3 *dwc) @@ -1284,6 +1290,8 @@ "snps,dis-del-phy-power-chg-quirk"); dwc->dis_tx_ipgap_linecheck_quirk = device_property_read_bool(dev, "snps,dis-tx-ipgap-linecheck-quirk"); + dwc->parkmode_disable_ss_quirk = device_property_read_bool(dev, + "snps,parkmode-disable-ss-quirk"); dwc->tx_de_emphasis_quirk = device_property_read_bool(dev, "snps,tx_de_emphasis_quirk"); diff -Nru linux-4.19.98/drivers/usb/dwc3/core.h linux-4.19.118/drivers/usb/dwc3/core.h --- linux-4.19.98/drivers/usb/dwc3/core.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/dwc3/core.h 2020-04-23 08:30:24.000000000 +0000 @@ -242,6 +242,7 @@ #define DWC3_GUCTL_HSTINAUTORETRY BIT(14) /* Global User Control 1 Register */ +#define DWC3_GUCTL1_PARKMODE_DISABLE_SS BIT(17) #define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28) #define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW BIT(24) @@ -992,6 +993,8 @@ * change quirk. * @dis_tx_ipgap_linecheck_quirk: set if we disable u2mac linestate * check during HS transmit. + * @parkmode_disable_ss_quirk: set if we need to disable all SuperSpeed + * instances in park mode. * @tx_de_emphasis_quirk: set if we enable Tx de-emphasis quirk * @tx_de_emphasis: Tx de-emphasis value * 0 - -6dB de-emphasis @@ -1163,6 +1166,7 @@ unsigned dis_u2_freeclk_exists_quirk:1; unsigned dis_del_phy_power_chg_quirk:1; unsigned dis_tx_ipgap_linecheck_quirk:1; + unsigned parkmode_disable_ss_quirk:1; unsigned tx_de_emphasis_quirk:1; unsigned tx_de_emphasis:2; diff -Nru linux-4.19.98/drivers/usb/dwc3/dwc3-pci.c linux-4.19.118/drivers/usb/dwc3/dwc3-pci.c --- linux-4.19.98/drivers/usb/dwc3/dwc3-pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/dwc3/dwc3-pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -34,6 +34,7 @@ #define PCI_DEVICE_ID_INTEL_GLK 0x31aa #define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e +#define PCI_DEVICE_ID_INTEL_CNPV 0xa3b0 #define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee #define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511" @@ -340,6 +341,9 @@ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPH), (kernel_ulong_t) &dwc3_pci_intel_properties, }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPV), + (kernel_ulong_t) &dwc3_pci_intel_properties, }, + { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICLLP), (kernel_ulong_t) &dwc3_pci_intel_properties, }, diff -Nru linux-4.19.98/drivers/usb/dwc3/gadget.c linux-4.19.118/drivers/usb/dwc3/gadget.c --- linux-4.19.98/drivers/usb/dwc3/gadget.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/dwc3/gadget.c 2020-04-23 08:30:24.000000000 +0000 @@ -688,12 +688,13 @@ return 0; } -static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force); +static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, + bool interrupt); static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) { struct dwc3_request *req; - dwc3_stop_active_transfer(dep, true); + dwc3_stop_active_transfer(dep, true, false); /* - giveback all requests to gadget driver */ while (!list_empty(&dep->started_list)) { @@ -1067,7 +1068,14 @@ unsigned int rem = length % maxp; unsigned chain = true; - if (sg_is_last(s)) + /* + * IOMMU driver is coalescing the list of sgs which shares a + * page boundary into one and giving it to USB driver. With + * this the number of sgs mapped is not equal to the number of + * sgs passed. So mark the chain bit to false if it isthe last + * mapped sg. + */ + if (i == remaining - 1) chain = false; if (rem && usb_endpoint_dir_out(dep->endpoint.desc) && !chain) { @@ -1362,7 +1370,7 @@ for (i = 0; i < req->num_trbs; i++) { struct dwc3_trb *trb; - trb = req->trb + i; + trb = &dep->trb_pool[dep->trb_dequeue]; trb->ctrl &= ~DWC3_TRB_CTRL_HWO; dwc3_ep_inc_deq(dep); } @@ -1409,7 +1417,7 @@ } if (r == req) { /* wait until it is processed */ - dwc3_stop_active_transfer(dep, true); + dwc3_stop_active_transfer(dep, true, true); if (!r->trb) goto out0; @@ -2224,7 +2232,8 @@ if (event->status & DEPEVT_STATUS_SHORT && !chain) return 1; - if (event->status & DEPEVT_STATUS_IOC) + if ((trb->ctrl & DWC3_TRB_CTRL_IOC) || + (trb->ctrl & DWC3_TRB_CTRL_LST)) return 1; return 0; @@ -2357,10 +2366,8 @@ dwc3_gadget_ep_cleanup_completed_requests(dep, event, status); - if (stop) { - dwc3_stop_active_transfer(dep, true); - dep->flags = DWC3_EP_ENABLED; - } + if (stop) + dwc3_stop_active_transfer(dep, true, true); /* * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround. @@ -2480,7 +2487,8 @@ } } -static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force) +static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, + bool interrupt) { struct dwc3 *dwc = dep->dwc; struct dwc3_gadget_ep_cmd_params params; @@ -2524,7 +2532,7 @@ cmd = DWC3_DEPCMD_ENDTRANSFER; cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0; - cmd |= DWC3_DEPCMD_CMDIOC; + cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0; cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); memset(¶ms, 0, sizeof(params)); ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms); @@ -3158,7 +3166,6 @@ dwc->gadget.speed = USB_SPEED_UNKNOWN; dwc->gadget.sg_supported = true; dwc->gadget.name = "dwc3-gadget"; - dwc->gadget.is_otg = dwc->dr_mode == USB_DR_MODE_OTG; /* * FIXME We might be setting max_speed to MaxPower ? c->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW; + if (gadget->speed < USB_SPEED_SUPER) + power = min(power, 500U); + else + power = min(power, 900U); done: + if (power <= USB_SELF_POWER_VBUS_MAX_DRAW) + usb_gadget_set_selfpowered(gadget); + else + usb_gadget_clear_selfpowered(gadget); + usb_gadget_vbus_draw(gadget, power); if (result >= 0 && cdev->delayed_status) result = USB_GADGET_DELAYED_STATUS; @@ -2259,6 +2270,7 @@ cdev->suspended = 1; + usb_gadget_set_selfpowered(gadget); usb_gadget_vbus_draw(gadget, 2); } @@ -2266,7 +2278,7 @@ { struct usb_composite_dev *cdev = get_gadget_data(gadget); struct usb_function *f; - u16 maxpower; + unsigned maxpower; /* REVISIT: should we have config level * suspend/resume callbacks? @@ -2280,10 +2292,17 @@ f->resume(f); } - maxpower = cdev->config->MaxPower; + maxpower = cdev->config->MaxPower ? + cdev->config->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW; + if (gadget->speed < USB_SPEED_SUPER) + maxpower = min(maxpower, 500U); + else + maxpower = min(maxpower, 900U); + + if (maxpower > USB_SELF_POWER_VBUS_MAX_DRAW) + usb_gadget_clear_selfpowered(gadget); - usb_gadget_vbus_draw(gadget, maxpower ? - maxpower : CONFIG_USB_GADGET_VBUS_DRAW); + usb_gadget_vbus_draw(gadget, maxpower); } cdev->suspended = 0; diff -Nru linux-4.19.98/drivers/usb/gadget/function/f_ecm.c linux-4.19.118/drivers/usb/gadget/function/f_ecm.c --- linux-4.19.98/drivers/usb/gadget/function/f_ecm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/function/f_ecm.c 2020-04-23 08:30:24.000000000 +0000 @@ -52,6 +52,7 @@ struct usb_ep *notify; struct usb_request *notify_req; u8 notify_state; + atomic_t notify_count; bool is_open; /* FIXME is_open needs some irq-ish locking @@ -380,7 +381,7 @@ int status; /* notification already in flight? */ - if (!req) + if (atomic_read(&ecm->notify_count)) return; event = req->buf; @@ -420,10 +421,10 @@ event->bmRequestType = 0xA1; event->wIndex = cpu_to_le16(ecm->ctrl_id); - ecm->notify_req = NULL; + atomic_inc(&ecm->notify_count); status = usb_ep_queue(ecm->notify, req, GFP_ATOMIC); if (status < 0) { - ecm->notify_req = req; + atomic_dec(&ecm->notify_count); DBG(cdev, "notify --> %d\n", status); } } @@ -448,17 +449,19 @@ switch (req->status) { case 0: /* no fault */ + atomic_dec(&ecm->notify_count); break; case -ECONNRESET: case -ESHUTDOWN: + atomic_set(&ecm->notify_count, 0); ecm->notify_state = ECM_NOTIFY_NONE; break; default: DBG(cdev, "event %02x --> %d\n", event->bNotificationType, req->status); + atomic_dec(&ecm->notify_count); break; } - ecm->notify_req = req; ecm_do_notify(ecm); } @@ -907,6 +910,11 @@ usb_free_all_descriptors(f); + if (atomic_read(&ecm->notify_count)) { + usb_ep_dequeue(ecm->notify, ecm->notify_req); + atomic_set(&ecm->notify_count, 0); + } + kfree(ecm->notify_req->buf); usb_ep_free_request(ecm->notify, ecm->notify_req); } diff -Nru linux-4.19.98/drivers/usb/gadget/function/f_fs.c linux-4.19.118/drivers/usb/gadget/function/f_fs.c --- linux-4.19.98/drivers/usb/gadget/function/f_fs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/function/f_fs.c 2020-04-23 08:30:24.000000000 +0000 @@ -1036,6 +1036,7 @@ ret = usb_ep_queue(ep->ep, req, GFP_ATOMIC); if (unlikely(ret)) { + io_data->req = NULL; usb_ep_free_request(ep->ep, req); goto error_lock; } @@ -1077,18 +1078,19 @@ { struct ffs_io_data *io_data = kiocb->private; struct ffs_epfile *epfile = kiocb->ki_filp->private_data; + unsigned long flags; int value; ENTER(); - spin_lock_irq(&epfile->ffs->eps_lock); + spin_lock_irqsave(&epfile->ffs->eps_lock, flags); if (likely(io_data && io_data->ep && io_data->req)) value = usb_ep_dequeue(io_data->ep, io_data->req); else value = -EINVAL; - spin_unlock_irq(&epfile->ffs->eps_lock); + spin_unlock_irqrestore(&epfile->ffs->eps_lock, flags); return value; } diff -Nru linux-4.19.98/drivers/usb/gadget/function/f_ncm.c linux-4.19.118/drivers/usb/gadget/function/f_ncm.c --- linux-4.19.98/drivers/usb/gadget/function/f_ncm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/function/f_ncm.c 2020-04-23 08:30:24.000000000 +0000 @@ -54,6 +54,7 @@ struct usb_ep *notify; struct usb_request *notify_req; u8 notify_state; + atomic_t notify_count; bool is_open; const struct ndp_parser_opts *parser_opts; @@ -547,7 +548,7 @@ int status; /* notification already in flight? */ - if (!req) + if (atomic_read(&ncm->notify_count)) return; event = req->buf; @@ -587,7 +588,8 @@ event->bmRequestType = 0xA1; event->wIndex = cpu_to_le16(ncm->ctrl_id); - ncm->notify_req = NULL; + atomic_inc(&ncm->notify_count); + /* * In double buffering if there is a space in FIFO, * completion callback can be called right after the call, @@ -597,7 +599,7 @@ status = usb_ep_queue(ncm->notify, req, GFP_ATOMIC); spin_lock(&ncm->lock); if (status < 0) { - ncm->notify_req = req; + atomic_dec(&ncm->notify_count); DBG(cdev, "notify --> %d\n", status); } } @@ -632,17 +634,19 @@ case 0: VDBG(cdev, "Notification %02x sent\n", event->bNotificationType); + atomic_dec(&ncm->notify_count); break; case -ECONNRESET: case -ESHUTDOWN: + atomic_set(&ncm->notify_count, 0); ncm->notify_state = NCM_NOTIFY_NONE; break; default: DBG(cdev, "event %02x --> %d\n", event->bNotificationType, req->status); + atomic_dec(&ncm->notify_count); break; } - ncm->notify_req = req; ncm_do_notify(ncm); spin_unlock(&ncm->lock); } @@ -1612,6 +1616,11 @@ ncm_string_defs[0].id = 0; usb_free_all_descriptors(f); + if (atomic_read(&ncm->notify_count)) { + usb_ep_dequeue(ncm->notify, ncm->notify_req); + atomic_set(&ncm->notify_count, 0); + } + kfree(ncm->notify_req->buf); usb_ep_free_request(ncm->notify, ncm->notify_req); } diff -Nru linux-4.19.98/drivers/usb/gadget/function/u_serial.c linux-4.19.118/drivers/usb/gadget/function/u_serial.c --- linux-4.19.98/drivers/usb/gadget/function/u_serial.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/function/u_serial.c 2020-04-23 08:30:24.000000000 +0000 @@ -567,8 +567,10 @@ port->n_read = 0; started = gs_start_rx(port); - /* unblock any pending writes into our circular buffer */ if (started) { + gs_start_tx(port); + /* Unblock any pending writes into our circular buffer, in case + * we didn't in gs_start_tx() */ tty_wakeup(port->port.tty); } else { gs_free_requests(ep, head, &port->read_allocated); diff -Nru linux-4.19.98/drivers/usb/gadget/legacy/cdc2.c linux-4.19.118/drivers/usb/gadget/legacy/cdc2.c --- linux-4.19.98/drivers/usb/gadget/legacy/cdc2.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/legacy/cdc2.c 2020-04-23 08:30:24.000000000 +0000 @@ -225,7 +225,7 @@ .name = "g_cdc", .dev = &device_desc, .strings = dev_strings, - .max_speed = USB_SPEED_HIGH, + .max_speed = USB_SPEED_SUPER, .bind = cdc_bind, .unbind = cdc_unbind, }; diff -Nru linux-4.19.98/drivers/usb/gadget/legacy/g_ffs.c linux-4.19.118/drivers/usb/gadget/legacy/g_ffs.c --- linux-4.19.98/drivers/usb/gadget/legacy/g_ffs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/legacy/g_ffs.c 2020-04-23 08:30:24.000000000 +0000 @@ -149,7 +149,7 @@ .name = DRIVER_NAME, .dev = &gfs_dev_desc, .strings = gfs_dev_strings, - .max_speed = USB_SPEED_HIGH, + .max_speed = USB_SPEED_SUPER, .bind = gfs_bind, .unbind = gfs_unbind, }; diff -Nru linux-4.19.98/drivers/usb/gadget/legacy/multi.c linux-4.19.118/drivers/usb/gadget/legacy/multi.c --- linux-4.19.98/drivers/usb/gadget/legacy/multi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/legacy/multi.c 2020-04-23 08:30:24.000000000 +0000 @@ -482,7 +482,7 @@ .name = "g_multi", .dev = &device_desc, .strings = dev_strings, - .max_speed = USB_SPEED_HIGH, + .max_speed = USB_SPEED_SUPER, .bind = multi_bind, .unbind = multi_unbind, .needs_serial = 1, diff -Nru linux-4.19.98/drivers/usb/gadget/legacy/ncm.c linux-4.19.118/drivers/usb/gadget/legacy/ncm.c --- linux-4.19.98/drivers/usb/gadget/legacy/ncm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/legacy/ncm.c 2020-04-23 08:30:24.000000000 +0000 @@ -197,7 +197,7 @@ .name = "g_ncm", .dev = &device_desc, .strings = dev_strings, - .max_speed = USB_SPEED_HIGH, + .max_speed = USB_SPEED_SUPER, .bind = gncm_bind, .unbind = gncm_unbind, }; diff -Nru linux-4.19.98/drivers/usb/gadget/udc/fsl_udc_core.c linux-4.19.118/drivers/usb/gadget/udc/fsl_udc_core.c --- linux-4.19.98/drivers/usb/gadget/udc/fsl_udc_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/udc/fsl_udc_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -2247,8 +2247,10 @@ udc->phy_mode = pdata->phy_mode; udc->eps = kcalloc(udc->max_ep, sizeof(struct fsl_ep), GFP_KERNEL); - if (!udc->eps) - return -1; + if (!udc->eps) { + ERR("kmalloc udc endpoint status failed\n"); + goto eps_alloc_failed; + } /* initialized QHs, take care of alignment */ size = udc->max_ep * sizeof(struct ep_queue_head); @@ -2262,8 +2264,7 @@ &udc->ep_qh_dma, GFP_KERNEL); if (!udc->ep_qh) { ERR("malloc QHs for udc failed\n"); - kfree(udc->eps); - return -1; + goto ep_queue_alloc_failed; } udc->ep_qh_size = size; @@ -2272,8 +2273,17 @@ /* FIXME: fsl_alloc_request() ignores ep argument */ udc->status_req = container_of(fsl_alloc_request(NULL, GFP_KERNEL), struct fsl_req, req); + if (!udc->status_req) { + ERR("kzalloc for udc status request failed\n"); + goto udc_status_alloc_failed; + } + /* allocate a small amount of memory to get valid address */ udc->status_req->req.buf = kmalloc(8, GFP_KERNEL); + if (!udc->status_req->req.buf) { + ERR("kzalloc for udc request buffer failed\n"); + goto udc_req_buf_alloc_failed; + } udc->resume_state = USB_STATE_NOTATTACHED; udc->usb_state = USB_STATE_POWERED; @@ -2281,6 +2291,18 @@ udc->remote_wakeup = 0; /* default to 0 on reset */ return 0; + +udc_req_buf_alloc_failed: + kfree(udc->status_req); +udc_status_alloc_failed: + kfree(udc->ep_qh); + udc->ep_qh_size = 0; +ep_queue_alloc_failed: + kfree(udc->eps); +eps_alloc_failed: + udc->phy_mode = 0; + return -1; + } /*---------------------------------------------------------------- diff -Nru linux-4.19.98/drivers/usb/gadget/udc/gr_udc.c linux-4.19.118/drivers/usb/gadget/udc/gr_udc.c --- linux-4.19.98/drivers/usb/gadget/udc/gr_udc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/gadget/udc/gr_udc.c 2020-04-23 08:30:24.000000000 +0000 @@ -2180,8 +2180,6 @@ return -ENOMEM; } - spin_lock(&dev->lock); - /* Inside lock so that no gadget can use this udc until probe is done */ retval = usb_add_gadget_udc(dev->dev, &dev->gadget); if (retval) { @@ -2190,15 +2188,21 @@ } dev->added = 1; + spin_lock(&dev->lock); + retval = gr_udc_init(dev); - if (retval) + if (retval) { + spin_unlock(&dev->lock); goto out; - - gr_dfs_create(dev); + } /* Clear all interrupt enables that might be left on since last boot */ gr_disable_interrupts_and_pullup(dev); + spin_unlock(&dev->lock); + + gr_dfs_create(dev); + retval = gr_request_irq(dev, dev->irq); if (retval) { dev_err(dev->dev, "Failed to request irq %d\n", dev->irq); @@ -2227,8 +2231,6 @@ dev_info(dev->dev, "regs: %p, irq %d\n", dev->regs, dev->irq); out: - spin_unlock(&dev->lock); - if (retval) gr_remove(pdev); diff -Nru linux-4.19.98/drivers/usb/host/xhci-hub.c linux-4.19.118/drivers/usb/host/xhci-hub.c --- linux-4.19.98/drivers/usb/host/xhci-hub.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci-hub.c 2020-04-23 08:30:24.000000000 +0000 @@ -55,6 +55,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, u16 wLength) { + struct xhci_port_cap *port_cap = NULL; int i, ssa_count; u32 temp; u16 desc_size, ssp_cap_size, ssa_size = 0; @@ -64,16 +65,24 @@ ssp_cap_size = sizeof(usb_bos_descriptor) - desc_size; /* does xhci support USB 3.1 Enhanced SuperSpeed */ - if (xhci->usb3_rhub.min_rev >= 0x01) { + for (i = 0; i < xhci->num_port_caps; i++) { + if (xhci->port_caps[i].maj_rev == 0x03 && + xhci->port_caps[i].min_rev >= 0x01) { + usb3_1 = true; + port_cap = &xhci->port_caps[i]; + break; + } + } + + if (usb3_1) { /* does xhci provide a PSI table for SSA speed attributes? */ - if (xhci->usb3_rhub.psi_count) { + if (port_cap->psi_count) { /* two SSA entries for each unique PSI ID, RX and TX */ - ssa_count = xhci->usb3_rhub.psi_uid_count * 2; + ssa_count = port_cap->psi_uid_count * 2; ssa_size = ssa_count * sizeof(u32); ssp_cap_size -= 16; /* skip copying the default SSA */ } desc_size += ssp_cap_size; - usb3_1 = true; } memcpy(buf, &usb_bos_descriptor, min(desc_size, wLength)); @@ -99,7 +108,7 @@ } /* If PSI table exists, add the custom speed attributes from it */ - if (usb3_1 && xhci->usb3_rhub.psi_count) { + if (usb3_1 && port_cap->psi_count) { u32 ssp_cap_base, bm_attrib, psi, psi_mant, psi_exp; int offset; @@ -111,7 +120,7 @@ /* attribute count SSAC bits 4:0 and ID count SSIC bits 8:5 */ bm_attrib = (ssa_count - 1) & 0x1f; - bm_attrib |= (xhci->usb3_rhub.psi_uid_count - 1) << 5; + bm_attrib |= (port_cap->psi_uid_count - 1) << 5; put_unaligned_le32(bm_attrib, &buf[ssp_cap_base + 4]); if (wLength < desc_size + ssa_size) @@ -124,8 +133,8 @@ * USB 3.1 requires two SSA entries (RX and TX) for every link */ offset = desc_size; - for (i = 0; i < xhci->usb3_rhub.psi_count; i++) { - psi = xhci->usb3_rhub.psi[i]; + for (i = 0; i < port_cap->psi_count; i++) { + psi = port_cap->psi[i]; psi &= ~USB_SSP_SUBLINK_SPEED_RSVD; psi_exp = XHCI_EXT_PORT_PSIE(psi); psi_mant = XHCI_EXT_PORT_PSIM(psi); @@ -1104,7 +1113,7 @@ } port_li = readl(ports[wIndex]->addr + PORTLI); status = xhci_get_ext_port_status(temp, port_li); - put_unaligned_le32(cpu_to_le32(status), &buf[4]); + put_unaligned_le32(status, &buf[4]); } break; case SetPortFeature: diff -Nru linux-4.19.98/drivers/usb/host/xhci-mem.c linux-4.19.118/drivers/usb/host/xhci-mem.c --- linux-4.19.98/drivers/usb/host/xhci-mem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci-mem.c 2020-04-23 08:30:24.000000000 +0000 @@ -1475,9 +1475,15 @@ /* Allow 3 retries for everything but isoc, set CErr = 3 */ if (!usb_endpoint_xfer_isoc(&ep->desc)) err_count = 3; - /* Some devices get this wrong */ - if (usb_endpoint_xfer_bulk(&ep->desc) && udev->speed == USB_SPEED_HIGH) - max_packet = 512; + /* HS bulk max packet should be 512, FS bulk supports 8, 16, 32 or 64 */ + if (usb_endpoint_xfer_bulk(&ep->desc)) { + if (udev->speed == USB_SPEED_HIGH) + max_packet = 512; + if (udev->speed == USB_SPEED_FULL) { + max_packet = rounddown_pow_of_two(max_packet); + max_packet = clamp_val(max_packet, 8, 64); + } + } /* xHCI 1.0 and 1.1 indicates that ctrl ep avg TRB Length should be 8 */ if (usb_endpoint_xfer_control(&ep->desc) && xhci->hci_version >= 0x100) avg_trb_len = 8; @@ -1909,17 +1915,17 @@ xhci->usb3_rhub.num_ports = 0; xhci->num_active_eps = 0; kfree(xhci->usb2_rhub.ports); - kfree(xhci->usb2_rhub.psi); kfree(xhci->usb3_rhub.ports); - kfree(xhci->usb3_rhub.psi); kfree(xhci->hw_ports); kfree(xhci->rh_bw); kfree(xhci->ext_caps); + for (i = 0; i < xhci->num_port_caps; i++) + kfree(xhci->port_caps[i].psi); + kfree(xhci->port_caps); + xhci->num_port_caps = 0; xhci->usb2_rhub.ports = NULL; - xhci->usb2_rhub.psi = NULL; xhci->usb3_rhub.ports = NULL; - xhci->usb3_rhub.psi = NULL; xhci->hw_ports = NULL; xhci->rh_bw = NULL; xhci->ext_caps = NULL; @@ -2120,6 +2126,7 @@ u8 major_revision, minor_revision; struct xhci_hub *rhub; struct device *dev = xhci_to_hcd(xhci)->self.sysdev; + struct xhci_port_cap *port_cap; temp = readl(addr); major_revision = XHCI_EXT_PORT_MAJOR(temp); @@ -2154,31 +2161,39 @@ /* WTF? "Valid values are ‘1’ to MaxPorts" */ return; - rhub->psi_count = XHCI_EXT_PORT_PSIC(temp); - if (rhub->psi_count) { - rhub->psi = kcalloc_node(rhub->psi_count, sizeof(*rhub->psi), - GFP_KERNEL, dev_to_node(dev)); - if (!rhub->psi) - rhub->psi_count = 0; - - rhub->psi_uid_count++; - for (i = 0; i < rhub->psi_count; i++) { - rhub->psi[i] = readl(addr + 4 + i); + port_cap = &xhci->port_caps[xhci->num_port_caps++]; + if (xhci->num_port_caps > max_caps) + return; + + port_cap->maj_rev = major_revision; + port_cap->min_rev = minor_revision; + port_cap->psi_count = XHCI_EXT_PORT_PSIC(temp); + + if (port_cap->psi_count) { + port_cap->psi = kcalloc_node(port_cap->psi_count, + sizeof(*port_cap->psi), + GFP_KERNEL, dev_to_node(dev)); + if (!port_cap->psi) + port_cap->psi_count = 0; + + port_cap->psi_uid_count++; + for (i = 0; i < port_cap->psi_count; i++) { + port_cap->psi[i] = readl(addr + 4 + i); /* count unique ID values, two consecutive entries can * have the same ID if link is assymetric */ - if (i && (XHCI_EXT_PORT_PSIV(rhub->psi[i]) != - XHCI_EXT_PORT_PSIV(rhub->psi[i - 1]))) - rhub->psi_uid_count++; + if (i && (XHCI_EXT_PORT_PSIV(port_cap->psi[i]) != + XHCI_EXT_PORT_PSIV(port_cap->psi[i - 1]))) + port_cap->psi_uid_count++; xhci_dbg(xhci, "PSIV:%d PSIE:%d PLT:%d PFD:%d LP:%d PSIM:%d\n", - XHCI_EXT_PORT_PSIV(rhub->psi[i]), - XHCI_EXT_PORT_PSIE(rhub->psi[i]), - XHCI_EXT_PORT_PLT(rhub->psi[i]), - XHCI_EXT_PORT_PFD(rhub->psi[i]), - XHCI_EXT_PORT_LP(rhub->psi[i]), - XHCI_EXT_PORT_PSIM(rhub->psi[i])); + XHCI_EXT_PORT_PSIV(port_cap->psi[i]), + XHCI_EXT_PORT_PSIE(port_cap->psi[i]), + XHCI_EXT_PORT_PLT(port_cap->psi[i]), + XHCI_EXT_PORT_PFD(port_cap->psi[i]), + XHCI_EXT_PORT_LP(port_cap->psi[i]), + XHCI_EXT_PORT_PSIM(port_cap->psi[i])); } } /* cache usb2 port capabilities */ @@ -2225,6 +2240,7 @@ continue; } hw_port->rhub = rhub; + hw_port->port_cap = port_cap; rhub->num_ports++; } /* FIXME: Should we disable ports not in the Extended Capabilities? */ @@ -2315,6 +2331,11 @@ if (!xhci->ext_caps) return -ENOMEM; + xhci->port_caps = kcalloc_node(cap_count, sizeof(*xhci->port_caps), + flags, dev_to_node(dev)); + if (!xhci->port_caps) + return -ENOMEM; + offset = cap_start; while (offset) { diff -Nru linux-4.19.98/drivers/usb/host/xhci-pci.c linux-4.19.118/drivers/usb/host/xhci-pci.c --- linux-4.19.98/drivers/usb/host/xhci-pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci-pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -41,6 +41,7 @@ #define PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI 0x1aa8 #define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8 #define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0 +#define PCI_DEVICE_ID_INTEL_CML_XHCI 0xa3af #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba @@ -127,7 +128,8 @@ xhci->quirks |= XHCI_AMD_PLL_FIX; if (pdev->vendor == PCI_VENDOR_ID_AMD && - (pdev->device == 0x15e0 || + (pdev->device == 0x145c || + pdev->device == 0x15e0 || pdev->device == 0x15e1 || pdev->device == 0x43bb)) xhci->quirks |= XHCI_SUSPEND_DELAY; @@ -179,7 +181,8 @@ pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_M_XHCI || pdev->device == PCI_DEVICE_ID_INTEL_BROXTON_B_XHCI || pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI || - pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI)) { + pdev->device == PCI_DEVICE_ID_INTEL_DNV_XHCI || + pdev->device == PCI_DEVICE_ID_INTEL_CML_XHCI)) { xhci->quirks |= XHCI_PME_STUCK_QUIRK; } if (pdev->vendor == PCI_VENDOR_ID_INTEL && @@ -283,6 +286,9 @@ if (!usb_hcd_is_primary_hcd(hcd)) return 0; + if (xhci->quirks & XHCI_PME_STUCK_QUIRK) + xhci_pme_acpi_rtd3_enable(pdev); + xhci_dbg(xhci, "Got SBRN %u\n", (unsigned int) xhci->sbrn); /* Find any debug ports */ @@ -340,9 +346,6 @@ HCC_MAX_PSA(xhci->hcc_params) >= 4) xhci->shared_hcd->can_do_streams = 1; - if (xhci->quirks & XHCI_PME_STUCK_QUIRK) - xhci_pme_acpi_rtd3_enable(dev); - /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ pm_runtime_put_noidle(&dev->dev); diff -Nru linux-4.19.98/drivers/usb/host/xhci-plat.c linux-4.19.118/drivers/usb/host/xhci-plat.c --- linux-4.19.98/drivers/usb/host/xhci-plat.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci-plat.c 2020-04-23 08:30:24.000000000 +0000 @@ -443,6 +443,7 @@ static struct platform_driver usb_xhci_driver = { .probe = xhci_plat_probe, .remove = xhci_plat_remove, + .shutdown = usb_hcd_platform_shutdown, .driver = { .name = "xhci-hcd", .pm = &xhci_plat_pm_ops, diff -Nru linux-4.19.98/drivers/usb/host/xhci-ring.c linux-4.19.118/drivers/usb/host/xhci-ring.c --- linux-4.19.98/drivers/usb/host/xhci-ring.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci-ring.c 2020-04-23 08:30:24.000000000 +0000 @@ -2693,6 +2693,42 @@ } /* + * Update Event Ring Dequeue Pointer: + * - When all events have finished + * - To avoid "Event Ring Full Error" condition + */ +static void xhci_update_erst_dequeue(struct xhci_hcd *xhci, + union xhci_trb *event_ring_deq) +{ + u64 temp_64; + dma_addr_t deq; + + temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); + /* If necessary, update the HW's version of the event ring deq ptr. */ + if (event_ring_deq != xhci->event_ring->dequeue) { + deq = xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, + xhci->event_ring->dequeue); + if (deq == 0) + xhci_warn(xhci, "WARN something wrong with SW event ring dequeue ptr\n"); + /* + * Per 4.9.4, Software writes to the ERDP register shall + * always advance the Event Ring Dequeue Pointer value. + */ + if ((temp_64 & (u64) ~ERST_PTR_MASK) == + ((u64) deq & (u64) ~ERST_PTR_MASK)) + return; + + /* Update HC event ring dequeue pointer */ + temp_64 &= ERST_PTR_MASK; + temp_64 |= ((u64) deq & (u64) ~ERST_PTR_MASK); + } + + /* Clear the event handler busy flag (RW1C) */ + temp_64 |= ERST_EHB; + xhci_write_64(xhci, temp_64, &xhci->ir_set->erst_dequeue); +} + +/* * xHCI spec says we can get an interrupt, and if the HC has an error condition, * we might get bad data out of the event ring. Section 4.10.2.7 has a list of * indicators of an event TRB error, but we check the status *first* to be safe. @@ -2703,9 +2739,9 @@ union xhci_trb *event_ring_deq; irqreturn_t ret = IRQ_NONE; unsigned long flags; - dma_addr_t deq; u64 temp_64; u32 status; + int event_loop = 0; spin_lock_irqsave(&xhci->lock, flags); /* Check if the xHC generated the interrupt, or the irq is shared */ @@ -2759,24 +2795,14 @@ /* FIXME this should be a delayed service routine * that clears the EHB. */ - while (xhci_handle_event(xhci) > 0) {} - - temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); - /* If necessary, update the HW's version of the event ring deq ptr. */ - if (event_ring_deq != xhci->event_ring->dequeue) { - deq = xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, - xhci->event_ring->dequeue); - if (deq == 0) - xhci_warn(xhci, "WARN something wrong with SW event " - "ring dequeue ptr.\n"); - /* Update HC event ring dequeue pointer */ - temp_64 &= ERST_PTR_MASK; - temp_64 |= ((u64) deq & (u64) ~ERST_PTR_MASK); + while (xhci_handle_event(xhci) > 0) { + if (event_loop++ < TRBS_PER_SEGMENT / 2) + continue; + xhci_update_erst_dequeue(xhci, event_ring_deq); + event_loop = 0; } - /* Clear the event handler busy flag (RW1C); event ring is empty. */ - temp_64 |= ERST_EHB; - xhci_write_64(xhci, temp_64, &xhci->ir_set->erst_dequeue); + xhci_update_erst_dequeue(xhci, event_ring_deq); ret = IRQ_HANDLED; out: diff -Nru linux-4.19.98/drivers/usb/host/xhci-trace.h linux-4.19.118/drivers/usb/host/xhci-trace.h --- linux-4.19.98/drivers/usb/host/xhci-trace.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci-trace.h 2020-04-23 08:30:24.000000000 +0000 @@ -289,23 +289,12 @@ ), TP_printk("ep%d%s-%s: urb %p pipe %u slot %d length %d/%d sgs %d/%d stream %d flags %08x", __entry->epnum, __entry->dir_in ? "in" : "out", - ({ char *s; - switch (__entry->type) { - case USB_ENDPOINT_XFER_INT: - s = "intr"; - break; - case USB_ENDPOINT_XFER_CONTROL: - s = "control"; - break; - case USB_ENDPOINT_XFER_BULK: - s = "bulk"; - break; - case USB_ENDPOINT_XFER_ISOC: - s = "isoc"; - break; - default: - s = "UNKNOWN"; - } s; }), __entry->urb, __entry->pipe, __entry->slot_id, + __print_symbolic(__entry->type, + { USB_ENDPOINT_XFER_INT, "intr" }, + { USB_ENDPOINT_XFER_CONTROL, "control" }, + { USB_ENDPOINT_XFER_BULK, "bulk" }, + { USB_ENDPOINT_XFER_ISOC, "isoc" }), + __entry->urb, __entry->pipe, __entry->slot_id, __entry->actual, __entry->length, __entry->num_mapped_sgs, __entry->num_sgs, __entry->stream, __entry->flags ) diff -Nru linux-4.19.98/drivers/usb/host/xhci.c linux-4.19.118/drivers/usb/host/xhci.c --- linux-4.19.98/drivers/usb/host/xhci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci.c 2020-04-23 08:30:24.000000000 +0000 @@ -1147,8 +1147,10 @@ xhci_dbg(xhci, "Stop HCD\n"); xhci_halt(xhci); xhci_zero_64b_regs(xhci); - xhci_reset(xhci); + retval = xhci_reset(xhci); spin_unlock_irq(&xhci->lock); + if (retval) + return retval; xhci_cleanup_msix(xhci); xhci_dbg(xhci, "// Disabling event ring interrupts\n"); diff -Nru linux-4.19.98/drivers/usb/host/xhci.h linux-4.19.118/drivers/usb/host/xhci.h --- linux-4.19.98/drivers/usb/host/xhci.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/host/xhci.h 2020-04-23 08:30:24.000000000 +0000 @@ -1704,11 +1704,21 @@ else return 1; } + +struct xhci_port_cap { + u32 *psi; /* array of protocol speed ID entries */ + u8 psi_count; + u8 psi_uid_count; + u8 maj_rev; + u8 min_rev; +}; + struct xhci_port { __le32 __iomem *addr; int hw_portnum; int hcd_portnum; struct xhci_hub *rhub; + struct xhci_port_cap *port_cap; }; struct xhci_hub { @@ -1718,9 +1728,6 @@ /* supported prococol extended capabiliy values */ u8 maj_rev; u8 min_rev; - u32 *psi; /* array of protocol speed ID entries */ - u8 psi_count; - u8 psi_uid_count; }; /* There is one xhci_hcd structure per controller */ @@ -1882,6 +1889,9 @@ /* cached usb2 extened protocol capabilites */ u32 *ext_caps; unsigned int num_ext_caps; + /* cached extended protocol port capabilities */ + struct xhci_port_cap *port_caps; + unsigned int num_port_caps; /* Compliance Mode Recovery Data */ struct timer_list comp_mode_recovery_timer; u32 port_status_u0; diff -Nru linux-4.19.98/drivers/usb/misc/iowarrior.c linux-4.19.118/drivers/usb/misc/iowarrior.c --- linux-4.19.98/drivers/usb/misc/iowarrior.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/misc/iowarrior.c 2020-04-23 08:30:24.000000000 +0000 @@ -33,6 +33,14 @@ #define USB_DEVICE_ID_CODEMERCS_IOWPV2 0x1512 /* full speed iowarrior */ #define USB_DEVICE_ID_CODEMERCS_IOW56 0x1503 +/* fuller speed iowarrior */ +#define USB_DEVICE_ID_CODEMERCS_IOW28 0x1504 +#define USB_DEVICE_ID_CODEMERCS_IOW28L 0x1505 +#define USB_DEVICE_ID_CODEMERCS_IOW100 0x1506 + +/* OEMed devices */ +#define USB_DEVICE_ID_CODEMERCS_IOW24SAG 0x158a +#define USB_DEVICE_ID_CODEMERCS_IOW56AM 0x158b /* Get a minor range for your devices from the usb maintainer */ #ifdef CONFIG_USB_DYNAMIC_MINORS @@ -137,6 +145,11 @@ {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV1)}, {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOWPV2)}, {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24SAG)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW56AM)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28L)}, + {USB_DEVICE(USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW100)}, {} /* Terminating entry */ }; MODULE_DEVICE_TABLE(usb, iowarrior_ids); @@ -361,6 +374,7 @@ } switch (dev->product_id) { case USB_DEVICE_ID_CODEMERCS_IOW24: + case USB_DEVICE_ID_CODEMERCS_IOW24SAG: case USB_DEVICE_ID_CODEMERCS_IOWPV1: case USB_DEVICE_ID_CODEMERCS_IOWPV2: case USB_DEVICE_ID_CODEMERCS_IOW40: @@ -375,6 +389,10 @@ goto exit; break; case USB_DEVICE_ID_CODEMERCS_IOW56: + case USB_DEVICE_ID_CODEMERCS_IOW56AM: + case USB_DEVICE_ID_CODEMERCS_IOW28: + case USB_DEVICE_ID_CODEMERCS_IOW28L: + case USB_DEVICE_ID_CODEMERCS_IOW100: /* The IOW56 uses asynchronous IO and more urbs */ if (atomic_read(&dev->write_busy) == MAX_WRITES_IN_FLIGHT) { /* Wait until we are below the limit for submitted urbs */ @@ -499,6 +517,7 @@ switch (cmd) { case IOW_WRITE: if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24 || + dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW24SAG || dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV1 || dev->product_id == USB_DEVICE_ID_CODEMERCS_IOWPV2 || dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW40) { @@ -782,7 +801,11 @@ goto error; } - if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) { + if ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100)) { res = usb_find_last_int_out_endpoint(iface_desc, &dev->int_out_endpoint); if (res) { @@ -795,7 +818,11 @@ /* we have to check the report_size often, so remember it in the endianness suitable for our machine */ dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && - (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56)) + ((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || + (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100))) /* IOWarrior56 has wMaxPacketSize different from report size */ dev->report_size = 7; diff -Nru linux-4.19.98/drivers/usb/musb/musb_host.c linux-4.19.118/drivers/usb/musb/musb_host.c --- linux-4.19.98/drivers/usb/musb/musb_host.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/musb/musb_host.c 2020-04-23 08:30:24.000000000 +0000 @@ -1462,10 +1462,7 @@ * We need to map sg if the transfer_buffer is * NULL. */ - if (!urb->transfer_buffer) - qh->use_sg = true; - - if (qh->use_sg) { + if (!urb->transfer_buffer) { /* sg_miter_start is already done in musb_ep_program */ if (!sg_miter_next(&qh->sg_miter)) { dev_err(musb->controller, "error: sg list empty\n"); @@ -1473,9 +1470,8 @@ status = -EINVAL; goto done; } - urb->transfer_buffer = qh->sg_miter.addr; length = min_t(u32, length, qh->sg_miter.length); - musb_write_fifo(hw_ep, length, urb->transfer_buffer); + musb_write_fifo(hw_ep, length, qh->sg_miter.addr); qh->sg_miter.consumed = length; sg_miter_stop(&qh->sg_miter); } else { @@ -1484,11 +1480,6 @@ qh->segsize = length; - if (qh->use_sg) { - if (offset + length >= urb->transfer_buffer_length) - qh->use_sg = false; - } - musb_ep_select(mbase, epnum); musb_writew(epio, MUSB_TXCSR, MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); @@ -2003,8 +1994,10 @@ urb->actual_length += xfer_len; qh->offset += xfer_len; if (done) { - if (qh->use_sg) + if (qh->use_sg) { qh->use_sg = false; + urb->transfer_buffer = NULL; + } if (urb->status == -EINPROGRESS) urb->status = status; diff -Nru linux-4.19.98/drivers/usb/musb/omap2430.c linux-4.19.118/drivers/usb/musb/omap2430.c --- linux-4.19.98/drivers/usb/musb/omap2430.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/musb/omap2430.c 2020-04-23 08:30:24.000000000 +0000 @@ -361,8 +361,6 @@ .init = omap2430_musb_init, .exit = omap2430_musb_exit, - .set_vbus = omap2430_musb_set_vbus, - .enable = omap2430_musb_enable, .disable = omap2430_musb_disable, diff -Nru linux-4.19.98/drivers/usb/phy/Kconfig linux-4.19.118/drivers/usb/phy/Kconfig --- linux-4.19.98/drivers/usb/phy/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/phy/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -20,7 +20,7 @@ in host mode, low speed. config FSL_USB2_OTG - bool "Freescale USB OTG Transceiver Driver" + tristate "Freescale USB OTG Transceiver Driver" depends on USB_EHCI_FSL && USB_FSL_USB2 && USB_OTG_FSM=y && PM depends on USB_GADGET || !USB_GADGET # if USB_GADGET=m, this can't be 'y' select USB_PHY diff -Nru linux-4.19.98/drivers/usb/phy/phy-twl6030-usb.c linux-4.19.118/drivers/usb/phy/phy-twl6030-usb.c --- linux-4.19.98/drivers/usb/phy/phy-twl6030-usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/phy/phy-twl6030-usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -400,7 +400,7 @@ { struct twl6030_usb *twl = platform_get_drvdata(pdev); - cancel_delayed_work(&twl->get_status_work); + cancel_delayed_work_sync(&twl->get_status_work); twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK, REG_INT_MSK_LINE_C); twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK, diff -Nru linux-4.19.98/drivers/usb/serial/io_edgeport.c linux-4.19.118/drivers/usb/serial/io_edgeport.c --- linux-4.19.98/drivers/usb/serial/io_edgeport.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/serial/io_edgeport.c 2020-04-23 08:30:24.000000000 +0000 @@ -710,7 +710,7 @@ /* grab the txcredits for the ports if available */ position = 2; portNumber = 0; - while ((position < length) && + while ((position < length - 1) && (portNumber < edge_serial->serial->num_ports)) { txCredits = data[position] | (data[position+1] << 8); if (txCredits) { diff -Nru linux-4.19.98/drivers/usb/serial/ir-usb.c linux-4.19.118/drivers/usb/serial/ir-usb.c --- linux-4.19.98/drivers/usb/serial/ir-usb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/serial/ir-usb.c 2020-04-23 08:30:24.000000000 +0000 @@ -45,9 +45,10 @@ static int xbof = -1; static int ir_startup (struct usb_serial *serial); -static int ir_open(struct tty_struct *tty, struct usb_serial_port *port); -static int ir_prepare_write_buffer(struct usb_serial_port *port, - void *dest, size_t size); +static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, + const unsigned char *buf, int count); +static int ir_write_room(struct tty_struct *tty); +static void ir_write_bulk_callback(struct urb *urb); static void ir_process_read_urb(struct urb *urb); static void ir_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios); @@ -77,8 +78,9 @@ .num_ports = 1, .set_termios = ir_set_termios, .attach = ir_startup, - .open = ir_open, - .prepare_write_buffer = ir_prepare_write_buffer, + .write = ir_write, + .write_room = ir_write_room, + .write_bulk_callback = ir_write_bulk_callback, .process_read_urb = ir_process_read_urb, }; @@ -195,6 +197,9 @@ struct usb_irda_cs_descriptor *irda_desc; int rates; + if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1) + return -ENODEV; + irda_desc = irda_usb_find_class_desc(serial, 0); if (!irda_desc) { dev_err(&serial->dev->dev, @@ -251,35 +256,102 @@ return 0; } -static int ir_open(struct tty_struct *tty, struct usb_serial_port *port) +static int ir_write(struct tty_struct *tty, struct usb_serial_port *port, + const unsigned char *buf, int count) { - int i; + struct urb *urb = NULL; + unsigned long flags; + int ret; - for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i) - port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET; + if (port->bulk_out_size == 0) + return -EINVAL; - /* Start reading from the device */ - return usb_serial_generic_open(tty, port); -} + if (count == 0) + return 0; -static int ir_prepare_write_buffer(struct usb_serial_port *port, - void *dest, size_t size) -{ - unsigned char *buf = dest; - int count; + count = min(count, port->bulk_out_size - 1); + + spin_lock_irqsave(&port->lock, flags); + if (__test_and_clear_bit(0, &port->write_urbs_free)) { + urb = port->write_urbs[0]; + port->tx_bytes += count; + } + spin_unlock_irqrestore(&port->lock, flags); + + if (!urb) + return 0; /* * The first byte of the packet we send to the device contains an - * inbound header which indicates an additional number of BOFs and + * outbound header which indicates an additional number of BOFs and * a baud rate change. * * See section 5.4.2.2 of the USB IrDA spec. */ - *buf = ir_xbof | ir_baud; + *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud; + + memcpy(urb->transfer_buffer + 1, buf, count); + + urb->transfer_buffer_length = count + 1; + urb->transfer_flags = URB_ZERO_PACKET; + + ret = usb_submit_urb(urb, GFP_ATOMIC); + if (ret) { + dev_err(&port->dev, "failed to submit write urb: %d\n", ret); + + spin_lock_irqsave(&port->lock, flags); + __set_bit(0, &port->write_urbs_free); + port->tx_bytes -= count; + spin_unlock_irqrestore(&port->lock, flags); + + return ret; + } + + return count; +} + +static void ir_write_bulk_callback(struct urb *urb) +{ + struct usb_serial_port *port = urb->context; + int status = urb->status; + unsigned long flags; + + spin_lock_irqsave(&port->lock, flags); + __set_bit(0, &port->write_urbs_free); + port->tx_bytes -= urb->transfer_buffer_length - 1; + spin_unlock_irqrestore(&port->lock, flags); + + switch (status) { + case 0: + break; + case -ENOENT: + case -ECONNRESET: + case -ESHUTDOWN: + dev_dbg(&port->dev, "write urb stopped: %d\n", status); + return; + case -EPIPE: + dev_err(&port->dev, "write urb stopped: %d\n", status); + return; + default: + dev_err(&port->dev, "nonzero write-urb status: %d\n", status); + break; + } + + usb_serial_port_softint(port); +} + +static int ir_write_room(struct tty_struct *tty) +{ + struct usb_serial_port *port = tty->driver_data; + int count = 0; + + if (port->bulk_out_size == 0) + return 0; + + if (test_bit(0, &port->write_urbs_free)) + count = port->bulk_out_size - 1; - count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1, - &port->lock); - return count + 1; + return count; } static void ir_process_read_urb(struct urb *urb) @@ -332,34 +404,34 @@ switch (baud) { case 2400: - ir_baud = USB_IRDA_BR_2400; + ir_baud = USB_IRDA_LS_2400; break; case 9600: - ir_baud = USB_IRDA_BR_9600; + ir_baud = USB_IRDA_LS_9600; break; case 19200: - ir_baud = USB_IRDA_BR_19200; + ir_baud = USB_IRDA_LS_19200; break; case 38400: - ir_baud = USB_IRDA_BR_38400; + ir_baud = USB_IRDA_LS_38400; break; case 57600: - ir_baud = USB_IRDA_BR_57600; + ir_baud = USB_IRDA_LS_57600; break; case 115200: - ir_baud = USB_IRDA_BR_115200; + ir_baud = USB_IRDA_LS_115200; break; case 576000: - ir_baud = USB_IRDA_BR_576000; + ir_baud = USB_IRDA_LS_576000; break; case 1152000: - ir_baud = USB_IRDA_BR_1152000; + ir_baud = USB_IRDA_LS_1152000; break; case 4000000: - ir_baud = USB_IRDA_BR_4000000; + ir_baud = USB_IRDA_LS_4000000; break; default: - ir_baud = USB_IRDA_BR_9600; + ir_baud = USB_IRDA_LS_9600; baud = 9600; } diff -Nru linux-4.19.98/drivers/usb/serial/option.c linux-4.19.118/drivers/usb/serial/option.c --- linux-4.19.98/drivers/usb/serial/option.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/serial/option.c 2020-04-23 08:30:24.000000000 +0000 @@ -1183,6 +1183,8 @@ .driver_info = NCTRL(0) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */ .driver_info = NCTRL(0) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110b, 0xff), /* Telit ME910G1 (ECM) */ + .driver_info = NCTRL(0) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), @@ -1990,8 +1992,14 @@ { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x7e11, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/A3 */ + { USB_DEVICE_INTERFACE_CLASS(0x1435, 0xd191, 0xff), /* Wistron Neweb D19Q1 */ + .driver_info = RSVD(1) | RSVD(4) }, + { USB_DEVICE_INTERFACE_CLASS(0x1690, 0x7588, 0xff), /* ASKEY WWHC050 */ + .driver_info = RSVD(1) | RSVD(4) }, { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x2031, 0xff), /* Olicard 600 */ .driver_info = RSVD(4) }, + { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x2033, 0xff), /* BroadMobi BM806U */ + .driver_info = RSVD(4) }, { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x2060, 0xff), /* BroadMobi BM818 */ .driver_info = RSVD(4) }, { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) }, /* OLICARD300 - MT6225 */ diff -Nru linux-4.19.98/drivers/usb/serial/pl2303.c linux-4.19.118/drivers/usb/serial/pl2303.c --- linux-4.19.98/drivers/usb/serial/pl2303.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/serial/pl2303.c 2020-04-23 08:30:24.000000000 +0000 @@ -93,6 +93,7 @@ { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD220TA_PRODUCT_ID) }, + { USB_DEVICE(HP_VENDOR_ID, HP_LD381_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LD960TA_PRODUCT_ID) }, { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, diff -Nru linux-4.19.98/drivers/usb/serial/pl2303.h linux-4.19.118/drivers/usb/serial/pl2303.h --- linux-4.19.98/drivers/usb/serial/pl2303.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/serial/pl2303.h 2020-04-23 08:30:24.000000000 +0000 @@ -124,6 +124,7 @@ #define HP_LM920_PRODUCT_ID 0x026b #define HP_TD620_PRODUCT_ID 0x0956 #define HP_LD960_PRODUCT_ID 0x0b39 +#define HP_LD381_PRODUCT_ID 0x0f7f #define HP_LCM220_PRODUCT_ID 0x3139 #define HP_LCM960_PRODUCT_ID 0x3239 #define HP_LD220_PRODUCT_ID 0x3524 diff -Nru linux-4.19.98/drivers/usb/storage/uas.c linux-4.19.118/drivers/usb/storage/uas.c --- linux-4.19.98/drivers/usb/storage/uas.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/storage/uas.c 2020-04-23 08:30:24.000000000 +0000 @@ -45,6 +45,7 @@ struct scsi_cmnd *cmnd[MAX_CMNDS]; spinlock_t lock; struct work_struct work; + struct work_struct scan_work; /* for async scanning */ }; enum { @@ -114,6 +115,17 @@ spin_unlock_irqrestore(&devinfo->lock, flags); } +static void uas_scan_work(struct work_struct *work) +{ + struct uas_dev_info *devinfo = + container_of(work, struct uas_dev_info, scan_work); + struct Scsi_Host *shost = usb_get_intfdata(devinfo->intf); + + dev_dbg(&devinfo->intf->dev, "starting scan\n"); + scsi_scan_host(shost); + dev_dbg(&devinfo->intf->dev, "scan complete\n"); +} + static void uas_add_work(struct uas_cmd_info *cmdinfo) { struct scsi_pointer *scp = (void *)cmdinfo; @@ -989,6 +1001,7 @@ init_usb_anchor(&devinfo->data_urbs); spin_lock_init(&devinfo->lock); INIT_WORK(&devinfo->work, uas_do_work); + INIT_WORK(&devinfo->scan_work, uas_scan_work); result = uas_configure_endpoints(devinfo); if (result) @@ -1005,7 +1018,9 @@ if (result) goto free_streams; - scsi_scan_host(shost); + /* Submit the delayed_work for SCSI-device scanning */ + schedule_work(&devinfo->scan_work); + return result; free_streams: @@ -1173,6 +1188,12 @@ usb_kill_anchored_urbs(&devinfo->data_urbs); uas_zap_pending(devinfo, DID_NO_CONNECT); + /* + * Prevent SCSI scanning (if it hasn't started yet) + * or wait for the SCSI-scanning routine to stop. + */ + cancel_work_sync(&devinfo->scan_work); + scsi_remove_host(shost); uas_free_streams(devinfo); scsi_host_put(shost); diff -Nru linux-4.19.98/drivers/usb/storage/unusual_devs.h linux-4.19.118/drivers/usb/storage/unusual_devs.h --- linux-4.19.98/drivers/usb/storage/unusual_devs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/storage/unusual_devs.h 2020-04-23 08:30:24.000000000 +0000 @@ -1258,6 +1258,12 @@ USB_SC_RBC, USB_PR_BULK, NULL, 0 ), +UNUSUAL_DEV(0x090c, 0x1000, 0x1100, 0x1100, + "Samsung", + "Flash Drive FIT", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_MAX_SECTORS_64), + /* aeb */ UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, "Feiya", diff -Nru linux-4.19.98/drivers/usb/storage/unusual_uas.h linux-4.19.118/drivers/usb/storage/unusual_uas.h --- linux-4.19.98/drivers/usb/storage/unusual_uas.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/storage/unusual_uas.h 2020-04-23 08:30:24.000000000 +0000 @@ -87,12 +87,15 @@ USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_IGNORE_UAS), -/* Reported-by: Takeo Nakayama */ +/* + * Initially Reported-by: Takeo Nakayama + * UAS Ignore Reported by Steven Ellis + */ UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999, "JMicron", "JMS566", USB_SC_DEVICE, USB_PR_DEVICE, NULL, - US_FL_NO_REPORT_OPCODES), + US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS), /* Reported-by: Hans de Goede */ UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999, diff -Nru linux-4.19.98/drivers/usb/typec/Kconfig linux-4.19.118/drivers/usb/typec/Kconfig --- linux-4.19.98/drivers/usb/typec/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/typec/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -95,6 +95,7 @@ config TYPEC_TPS6598X tristate "TI TPS6598x USB Power Delivery controller driver" depends on I2C + select REGMAP_I2C help Say Y or M here if your system has TI TPS65982 or TPS65983 USB Power Delivery controller. diff -Nru linux-4.19.98/drivers/usb/typec/fusb302/fusb302.c linux-4.19.118/drivers/usb/typec/fusb302/fusb302.c --- linux-4.19.98/drivers/usb/typec/fusb302/fusb302.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/typec/fusb302/fusb302.c 2020-04-23 08:30:24.000000000 +0000 @@ -990,13 +990,17 @@ return ret; } -static int tcpm_start_drp_toggling(struct tcpc_dev *dev, - enum typec_cc_status cc) +static int tcpm_start_toggling(struct tcpc_dev *dev, + enum typec_port_type port_type, + enum typec_cc_status cc) { struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, tcpc_dev); int ret = 0; + if (port_type != TYPEC_PORT_DRP) + return -EOPNOTSUPP; + mutex_lock(&chip->lock); ret = fusb302_set_src_current(chip, cc_src_current[cc]); if (ret < 0) { @@ -1206,7 +1210,7 @@ fusb302_tcpc_dev->set_vbus = tcpm_set_vbus; fusb302_tcpc_dev->set_pd_rx = tcpm_set_pd_rx; fusb302_tcpc_dev->set_roles = tcpm_set_roles; - fusb302_tcpc_dev->start_drp_toggling = tcpm_start_drp_toggling; + fusb302_tcpc_dev->start_toggling = tcpm_start_toggling; fusb302_tcpc_dev->pd_transmit = tcpm_pd_transmit; } diff -Nru linux-4.19.98/drivers/usb/typec/tcpci.c linux-4.19.118/drivers/usb/typec/tcpci.c --- linux-4.19.98/drivers/usb/typec/tcpci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/typec/tcpci.c 2020-04-23 08:30:24.000000000 +0000 @@ -100,13 +100,17 @@ return 0; } -static int tcpci_start_drp_toggling(struct tcpc_dev *tcpc, - enum typec_cc_status cc) +static int tcpci_start_toggling(struct tcpc_dev *tcpc, + enum typec_port_type port_type, + enum typec_cc_status cc) { int ret; struct tcpci *tcpci = tcpc_to_tcpci(tcpc); unsigned int reg = TCPC_ROLE_CTRL_DRP; + if (port_type != TYPEC_PORT_DRP) + return -EOPNOTSUPP; + /* Handle vendor drp toggling */ if (tcpci->data->start_drp_toggling) { ret = tcpci->data->start_drp_toggling(tcpci, tcpci->data, cc); @@ -511,7 +515,7 @@ tcpci->tcpc.get_cc = tcpci_get_cc; tcpci->tcpc.set_polarity = tcpci_set_polarity; tcpci->tcpc.set_vconn = tcpci_set_vconn; - tcpci->tcpc.start_drp_toggling = tcpci_start_drp_toggling; + tcpci->tcpc.start_toggling = tcpci_start_toggling; tcpci->tcpc.set_pd_rx = tcpci_set_pd_rx; tcpci->tcpc.set_roles = tcpci_set_roles; @@ -577,6 +581,12 @@ static int tcpci_remove(struct i2c_client *client) { struct tcpci_chip *chip = i2c_get_clientdata(client); + int err; + + /* Disable chip interrupts before unregistering port */ + err = tcpci_write16(chip->tcpci, TCPC_ALERT_MASK, 0); + if (err < 0) + return err; tcpci_unregister_port(chip->tcpci); diff -Nru linux-4.19.98/drivers/usb/typec/tcpm.c linux-4.19.118/drivers/usb/typec/tcpm.c --- linux-4.19.98/drivers/usb/typec/tcpm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/typec/tcpm.c 2020-04-23 08:30:24.000000000 +0000 @@ -31,7 +31,7 @@ #define FOREACH_STATE(S) \ S(INVALID_STATE), \ - S(DRP_TOGGLING), \ + S(TOGGLING), \ S(SRC_UNATTACHED), \ S(SRC_ATTACH_WAIT), \ S(SRC_ATTACHED), \ @@ -473,7 +473,7 @@ /* Do not log while disconnected and unattached */ if (tcpm_port_is_disconnected(port) && (port->state == SRC_UNATTACHED || port->state == SNK_UNATTACHED || - port->state == DRP_TOGGLING)) + port->state == TOGGLING)) return; va_start(args, fmt); @@ -2561,20 +2561,16 @@ return 0; } -static bool tcpm_start_drp_toggling(struct tcpm_port *port, - enum typec_cc_status cc) +static bool tcpm_start_toggling(struct tcpm_port *port, enum typec_cc_status cc) { int ret; - if (port->tcpc->start_drp_toggling && - port->port_type == TYPEC_PORT_DRP) { - tcpm_log_force(port, "Start DRP toggling"); - ret = port->tcpc->start_drp_toggling(port->tcpc, cc); - if (!ret) - return true; - } + if (!port->tcpc->start_toggling) + return false; - return false; + tcpm_log_force(port, "Start toggling"); + ret = port->tcpc->start_toggling(port->tcpc, port->port_type, cc); + return ret == 0; } static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc) @@ -2868,15 +2864,15 @@ port->enter_state = port->state; switch (port->state) { - case DRP_TOGGLING: + case TOGGLING: break; /* SRC states */ case SRC_UNATTACHED: if (!port->non_pd_role_swap) tcpm_swap_complete(port, -ENOTCONN); tcpm_src_detach(port); - if (tcpm_start_drp_toggling(port, tcpm_rp_cc(port))) { - tcpm_set_state(port, DRP_TOGGLING, 0); + if (tcpm_start_toggling(port, tcpm_rp_cc(port))) { + tcpm_set_state(port, TOGGLING, 0); break; } tcpm_set_cc(port, tcpm_rp_cc(port)); @@ -3074,8 +3070,8 @@ tcpm_swap_complete(port, -ENOTCONN); tcpm_pps_complete(port, -ENOTCONN); tcpm_snk_detach(port); - if (tcpm_start_drp_toggling(port, TYPEC_CC_RD)) { - tcpm_set_state(port, DRP_TOGGLING, 0); + if (tcpm_start_toggling(port, TYPEC_CC_RD)) { + tcpm_set_state(port, TOGGLING, 0); break; } tcpm_set_cc(port, TYPEC_CC_RD); @@ -3642,7 +3638,7 @@ : "connected"); switch (port->state) { - case DRP_TOGGLING: + case TOGGLING: if (tcpm_port_is_debug(port) || tcpm_port_is_audio(port) || tcpm_port_is_source(port)) tcpm_set_state(port, SRC_ATTACH_WAIT, 0); diff -Nru linux-4.19.98/drivers/usb/typec/typec_wcove.c linux-4.19.118/drivers/usb/typec/typec_wcove.c --- linux-4.19.98/drivers/usb/typec/typec_wcove.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/usb/typec/typec_wcove.c 2020-04-23 08:30:24.000000000 +0000 @@ -416,12 +416,16 @@ return regmap_write(wcove->regmap, USBC_TXCMD, cmd | USBC_TXCMD_START); } -static int wcove_start_drp_toggling(struct tcpc_dev *tcpc, - enum typec_cc_status cc) +static int wcove_start_toggling(struct tcpc_dev *tcpc, + enum typec_port_type port_type, + enum typec_cc_status cc) { struct wcove_typec *wcove = tcpc_to_wcove(tcpc); unsigned int usbc_ctrl; + if (port_type != TYPEC_PORT_DRP) + return -EOPNOTSUPP; + usbc_ctrl = USBC_CONTROL1_MODE_DRP | USBC_CONTROL1_DRPTOGGLE_RANDOM; switch (cc) { @@ -642,7 +646,7 @@ wcove->tcpc.set_polarity = wcove_set_polarity; wcove->tcpc.set_vconn = wcove_set_vconn; wcove->tcpc.set_current_limit = wcove_set_current_limit; - wcove->tcpc.start_drp_toggling = wcove_start_drp_toggling; + wcove->tcpc.start_toggling = wcove_start_toggling; wcove->tcpc.set_pd_rx = wcove_set_pd_rx; wcove->tcpc.set_roles = wcove_set_roles; diff -Nru linux-4.19.98/drivers/vfio/mdev/mdev_core.c linux-4.19.118/drivers/vfio/mdev/mdev_core.c --- linux-4.19.98/drivers/vfio/mdev/mdev_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/vfio/mdev/mdev_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -150,10 +150,10 @@ static int mdev_device_remove_cb(struct device *dev, void *data) { - if (!dev_is_mdev(dev)) - return 0; + if (dev_is_mdev(dev)) + mdev_device_remove(dev, true); - return mdev_device_remove(dev, data ? *(bool *)data : true); + return 0; } /* @@ -182,6 +182,7 @@ /* Check for duplicate */ parent = __find_parent_device(dev); if (parent) { + parent = NULL; ret = -EEXIST; goto add_dev_err; } @@ -240,7 +241,6 @@ void mdev_unregister_device(struct device *dev) { struct mdev_parent *parent; - bool force_remove = true; mutex_lock(&parent_list_lock); parent = __find_parent_device(dev); @@ -254,8 +254,7 @@ list_del(&parent->next); class_compat_remove_link(mdev_bus_compat_class, dev, NULL); - device_for_each_child(dev, (void *)&force_remove, - mdev_device_remove_cb); + device_for_each_child(dev, NULL, mdev_device_remove_cb); parent_remove_sysfs_files(parent); diff -Nru linux-4.19.98/drivers/vfio/mdev/mdev_sysfs.c linux-4.19.118/drivers/vfio/mdev/mdev_sysfs.c --- linux-4.19.98/drivers/vfio/mdev/mdev_sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/vfio/mdev/mdev_sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -280,7 +280,7 @@ void mdev_remove_sysfs_files(struct device *dev, struct mdev_type *type) { + sysfs_remove_files(&dev->kobj, mdev_device_attrs); sysfs_remove_link(&dev->kobj, "mdev_type"); sysfs_remove_link(type->devices_kobj, dev_name(dev)); - sysfs_remove_files(&dev->kobj, mdev_device_attrs); } diff -Nru linux-4.19.98/drivers/vfio/pci/vfio_pci.c linux-4.19.118/drivers/vfio/pci/vfio_pci.c --- linux-4.19.98/drivers/vfio/pci/vfio_pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/vfio/pci/vfio_pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -696,6 +696,7 @@ { void __iomem *io; size_t size; + u16 orig_cmd; info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index); info.flags = 0; @@ -711,15 +712,23 @@ break; } - /* Is it really there? */ + /* + * Is it really there? Enable memory decode for + * implicit access in pci_map_rom(). + */ + pci_read_config_word(pdev, PCI_COMMAND, &orig_cmd); + pci_write_config_word(pdev, PCI_COMMAND, + orig_cmd | PCI_COMMAND_MEMORY); + io = pci_map_rom(pdev, &size); - if (!io || !size) { + if (io) { + info.flags = VFIO_REGION_INFO_FLAG_READ; + pci_unmap_rom(pdev, io); + } else { info.size = 0; - break; } - pci_unmap_rom(pdev, io); - info.flags = VFIO_REGION_INFO_FLAG_READ; + pci_write_config_word(pdev, PCI_COMMAND, orig_cmd); break; } case VFIO_PCI_VGA_REGION_INDEX: diff -Nru linux-4.19.98/drivers/vhost/net.c linux-4.19.118/drivers/vhost/net.c --- linux-4.19.98/drivers/vhost/net.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/vhost/net.c 2020-04-23 08:30:24.000000000 +0000 @@ -1187,10 +1187,6 @@ static struct socket *get_raw_socket(int fd) { - struct { - struct sockaddr_ll sa; - char buf[MAX_ADDR_LEN]; - } uaddr; int r; struct socket *sock = sockfd_lookup(fd, &r); @@ -1203,11 +1199,7 @@ goto err; } - r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0); - if (r < 0) - goto err; - - if (uaddr.sa.sll_family != AF_PACKET) { + if (sock->sk->sk_family != AF_PACKET) { r = -EPFNOSUPPORT; goto err; } diff -Nru linux-4.19.98/drivers/vhost/test.c linux-4.19.118/drivers/vhost/test.c --- linux-4.19.98/drivers/vhost/test.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/vhost/test.c 2020-04-23 08:30:24.000000000 +0000 @@ -162,6 +162,7 @@ vhost_test_stop(n, &private); vhost_test_flush(n); + vhost_dev_stop(&n->dev); vhost_dev_cleanup(&n->dev); /* We do an extra flush before freeing memory, * since jobs can re-queue themselves. */ @@ -238,6 +239,7 @@ } vhost_test_stop(n, &priv); vhost_test_flush(n); + vhost_dev_stop(&n->dev); vhost_dev_reset_owner(&n->dev, umem); done: mutex_unlock(&n->dev.mutex); diff -Nru linux-4.19.98/drivers/video/backlight/lm3630a_bl.c linux-4.19.118/drivers/video/backlight/lm3630a_bl.c --- linux-4.19.98/drivers/video/backlight/lm3630a_bl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/backlight/lm3630a_bl.c 2020-04-23 08:30:24.000000000 +0000 @@ -201,7 +201,7 @@ LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE); if (ret < 0) goto out_i2c_err; - return bl->props.brightness; + return 0; out_i2c_err: dev_err(pchip->dev, "i2c failed to access\n"); @@ -278,7 +278,7 @@ LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE); if (ret < 0) goto out_i2c_err; - return bl->props.brightness; + return 0; out_i2c_err: dev_err(pchip->dev, "i2c failed to access REG_CTRL\n"); diff -Nru linux-4.19.98/drivers/video/backlight/pwm_bl.c linux-4.19.118/drivers/video/backlight/pwm_bl.c --- linux-4.19.98/drivers/video/backlight/pwm_bl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/backlight/pwm_bl.c 2020-04-23 08:30:24.000000000 +0000 @@ -199,29 +199,17 @@ struct platform_pwm_backlight_data *data, unsigned int period) { - unsigned int counter = 0; - unsigned int i, n; + unsigned int i; u64 retval; /* - * Count the number of bits needed to represent the period number. The - * number of bits is used to calculate the number of levels used for the - * brightness-levels table, the purpose of this calculation is have a - * pre-computed table with enough levels to get linear brightness - * perception. The period is divided by the number of bits so for a - * 8-bit PWM we have 255 / 8 = 32 brightness levels or for a 16-bit PWM - * we have 65535 / 16 = 4096 brightness levels. - * - * Note that this method is based on empirical testing on different - * devices with PWM of 8 and 16 bits of resolution. + * Once we have 4096 levels there's little point going much higher... + * neither interactive sliders nor animation benefits from having + * more values in the table. */ - n = period; - while (n) { - counter += n % 2; - n >>= 1; - } + data->max_brightness = + min((int)DIV_ROUND_UP(period, fls(period)), 4096); - data->max_brightness = DIV_ROUND_UP(period, counter); data->levels = devm_kcalloc(dev, data->max_brightness, sizeof(*data->levels), GFP_KERNEL); if (!data->levels) diff -Nru linux-4.19.98/drivers/video/console/vgacon.c linux-4.19.118/drivers/video/console/vgacon.c --- linux-4.19.98/drivers/video/console/vgacon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/console/vgacon.c 2020-04-23 08:30:24.000000000 +0000 @@ -1316,6 +1316,9 @@ static int vgacon_resize(struct vc_data *c, unsigned int width, unsigned int height, unsigned int user) { + if ((width << 1) * height > vga_vram_size) + return -EINVAL; + if (width % 2 || width > screen_info.orig_video_cols || height > (screen_info.orig_video_lines * vga_default_font_height)/ c->vc_font.height) diff -Nru linux-4.19.98/drivers/video/fbdev/chipsfb.c linux-4.19.118/drivers/video/fbdev/chipsfb.c --- linux-4.19.98/drivers/video/fbdev/chipsfb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/fbdev/chipsfb.c 2020-04-23 08:30:24.000000000 +0000 @@ -350,7 +350,7 @@ static int chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent) { struct fb_info *p; - unsigned long addr, size; + unsigned long addr; unsigned short cmd; int rc = -ENODEV; @@ -362,7 +362,6 @@ if ((dp->resource[0].flags & IORESOURCE_MEM) == 0) goto err_disable; addr = pci_resource_start(dp, 0); - size = pci_resource_len(dp, 0); if (addr == 0) goto err_disable; diff -Nru linux-4.19.98/drivers/video/fbdev/core/fbcon.c linux-4.19.118/drivers/video/fbdev/core/fbcon.c --- linux-4.19.98/drivers/video/fbdev/core/fbcon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/fbdev/core/fbcon.c 2020-04-23 08:30:24.000000000 +0000 @@ -1243,6 +1243,9 @@ if (!con_is_bound(&fb_con)) fbcon_exit(); + if (vc->vc_num == logo_shown) + logo_shown = FBCON_LOGO_CANSHOW; + return; } diff -Nru linux-4.19.98/drivers/video/fbdev/core/fbmem.c linux-4.19.118/drivers/video/fbdev/core/fbmem.c --- linux-4.19.98/drivers/video/fbdev/core/fbmem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/fbdev/core/fbmem.c 2020-04-23 08:30:24.000000000 +0000 @@ -1122,7 +1122,7 @@ case FBIOGET_FSCREENINFO: if (!lock_fb_info(info)) return -ENODEV; - fix = info->fix; + memcpy(&fix, &info->fix, sizeof(fix)); unlock_fb_info(info); ret = copy_to_user(argp, &fix, sizeof(fix)) ? -EFAULT : 0; diff -Nru linux-4.19.98/drivers/video/fbdev/pxa168fb.c linux-4.19.118/drivers/video/fbdev/pxa168fb.c --- linux-4.19.98/drivers/video/fbdev/pxa168fb.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/fbdev/pxa168fb.c 2020-04-23 08:30:24.000000000 +0000 @@ -769,8 +769,8 @@ failed_free_clk: clk_disable_unprepare(fbi->clk); failed_free_fbmem: - dma_free_coherent(fbi->dev, info->fix.smem_len, - info->screen_base, fbi->fb_start_dma); + dma_free_wc(fbi->dev, info->fix.smem_len, + info->screen_base, fbi->fb_start_dma); failed_free_info: kfree(info); @@ -804,7 +804,7 @@ irq = platform_get_irq(pdev, 0); - dma_free_wc(fbi->dev, PAGE_ALIGN(info->fix.smem_len), + dma_free_wc(fbi->dev, info->fix.smem_len, info->screen_base, info->fix.smem_start); clk_disable_unprepare(fbi->clk); diff -Nru linux-4.19.98/drivers/video/fbdev/sis/init301.c linux-4.19.118/drivers/video/fbdev/sis/init301.c --- linux-4.19.98/drivers/video/fbdev/sis/init301.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/video/fbdev/sis/init301.c 2020-04-23 08:30:24.000000000 +0000 @@ -848,9 +848,7 @@ SiS_DDC2Delay(SiS_Pr, 0x4000); } - } else if((SiS_Pr->SiS_IF_DEF_LVDS == 1) /* || - (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) || - (SiS_Pr->SiS_CustomT == CUT_CLEVO1400) */ ) { /* 315 series, LVDS; Special */ + } else if (SiS_Pr->SiS_IF_DEF_LVDS == 1) { /* 315 series, LVDS; Special */ if(SiS_Pr->SiS_IF_DEF_CH70xx == 0) { PanelID = SiS_GetReg(SiS_Pr->SiS_P3d4,0x36); diff -Nru linux-4.19.98/drivers/virtio/virtio_balloon.c linux-4.19.118/drivers/virtio/virtio_balloon.c --- linux-4.19.98/drivers/virtio/virtio_balloon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/virtio/virtio_balloon.c 2020-04-23 08:30:24.000000000 +0000 @@ -126,6 +126,8 @@ { unsigned int i; + BUILD_BUG_ON(VIRTIO_BALLOON_PAGES_PER_PAGE > VIRTIO_BALLOON_ARRAY_PFNS_MAX); + /* * Set balloon pfns pointing at this page. * Note that the first pfn points at start of the page. diff -Nru linux-4.19.98/drivers/visorbus/visorchipset.c linux-4.19.118/drivers/visorbus/visorchipset.c --- linux-4.19.98/drivers/visorbus/visorchipset.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/visorbus/visorchipset.c 2020-04-23 08:30:24.000000000 +0000 @@ -1210,14 +1210,17 @@ { struct controlvm_message local_crash_bus_msg; struct controlvm_message local_crash_dev_msg; - struct controlvm_message msg; + struct controlvm_message msg = { + .hdr.id = CONTROLVM_CHIPSET_INIT, + .cmd.init_chipset = { + .bus_count = 23, + .switch_count = 0, + }, + }; u32 local_crash_msg_offset; u16 local_crash_msg_count; /* send init chipset msg */ - msg.hdr.id = CONTROLVM_CHIPSET_INIT; - msg.cmd.init_chipset.bus_count = 23; - msg.cmd.init_chipset.switch_count = 0; chipset_init(&msg); /* get saved message count */ if (visorchannel_read(chipset_dev->controlvm_channel, diff -Nru linux-4.19.98/drivers/vme/bridges/vme_fake.c linux-4.19.118/drivers/vme/bridges/vme_fake.c --- linux-4.19.98/drivers/vme/bridges/vme_fake.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/vme/bridges/vme_fake.c 2020-04-23 08:30:24.000000000 +0000 @@ -418,8 +418,9 @@ } } -static u8 fake_vmeread8(struct fake_driver *bridge, unsigned long long addr, - u32 aspace, u32 cycle) +static noinline_for_stack u8 fake_vmeread8(struct fake_driver *bridge, + unsigned long long addr, + u32 aspace, u32 cycle) { u8 retval = 0xff; int i; @@ -450,8 +451,9 @@ return retval; } -static u16 fake_vmeread16(struct fake_driver *bridge, unsigned long long addr, - u32 aspace, u32 cycle) +static noinline_for_stack u16 fake_vmeread16(struct fake_driver *bridge, + unsigned long long addr, + u32 aspace, u32 cycle) { u16 retval = 0xffff; int i; @@ -482,8 +484,9 @@ return retval; } -static u32 fake_vmeread32(struct fake_driver *bridge, unsigned long long addr, - u32 aspace, u32 cycle) +static noinline_for_stack u32 fake_vmeread32(struct fake_driver *bridge, + unsigned long long addr, + u32 aspace, u32 cycle) { u32 retval = 0xffffffff; int i; @@ -613,8 +616,9 @@ return retval; } -static void fake_vmewrite8(struct fake_driver *bridge, u8 *buf, - unsigned long long addr, u32 aspace, u32 cycle) +static noinline_for_stack void fake_vmewrite8(struct fake_driver *bridge, + u8 *buf, unsigned long long addr, + u32 aspace, u32 cycle) { int i; unsigned long long start, end, offset; @@ -643,8 +647,9 @@ } -static void fake_vmewrite16(struct fake_driver *bridge, u16 *buf, - unsigned long long addr, u32 aspace, u32 cycle) +static noinline_for_stack void fake_vmewrite16(struct fake_driver *bridge, + u16 *buf, unsigned long long addr, + u32 aspace, u32 cycle) { int i; unsigned long long start, end, offset; @@ -673,8 +678,9 @@ } -static void fake_vmewrite32(struct fake_driver *bridge, u32 *buf, - unsigned long long addr, u32 aspace, u32 cycle) +static noinline_for_stack void fake_vmewrite32(struct fake_driver *bridge, + u32 *buf, unsigned long long addr, + u32 aspace, u32 cycle) { int i; unsigned long long start, end, offset; diff -Nru linux-4.19.98/drivers/watchdog/Kconfig linux-4.19.118/drivers/watchdog/Kconfig --- linux-4.19.98/drivers/watchdog/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -594,6 +594,7 @@ config MAX77620_WATCHDOG tristate "Maxim Max77620 Watchdog Timer" depends on MFD_MAX77620 || COMPILE_TEST + select WATCHDOG_CORE help This is the driver for the Max77620 watchdog timer. Say 'Y' here to enable the watchdog timer support for diff -Nru linux-4.19.98/drivers/watchdog/da9062_wdt.c linux-4.19.118/drivers/watchdog/da9062_wdt.c --- linux-4.19.98/drivers/watchdog/da9062_wdt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/da9062_wdt.c 2020-04-23 08:30:24.000000000 +0000 @@ -99,13 +99,6 @@ struct da9062_watchdog *wdt = watchdog_get_drvdata(wdd); int ret; - ret = da9062_reset_watchdog_timer(wdt); - if (ret) { - dev_err(wdt->hw->dev, "Failed to ping the watchdog (err = %d)\n", - ret); - return ret; - } - ret = regmap_update_bits(wdt->hw->regmap, DA9062AA_CONTROL_D, DA9062AA_TWDSCALE_MASK, diff -Nru linux-4.19.98/drivers/watchdog/rn5t618_wdt.c linux-4.19.118/drivers/watchdog/rn5t618_wdt.c --- linux-4.19.98/drivers/watchdog/rn5t618_wdt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/rn5t618_wdt.c 2020-04-23 08:30:24.000000000 +0000 @@ -193,6 +193,7 @@ module_platform_driver(rn5t618_wdt_driver); +MODULE_ALIAS("platform:rn5t618-wdt"); MODULE_AUTHOR("Beniamino Galvani "); MODULE_DESCRIPTION("RN5T618 watchdog driver"); MODULE_LICENSE("GPL v2"); diff -Nru linux-4.19.98/drivers/watchdog/rtd119x_wdt.c linux-4.19.118/drivers/watchdog/rtd119x_wdt.c --- linux-4.19.98/drivers/watchdog/rtd119x_wdt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/rtd119x_wdt.c 2020-04-23 08:30:24.000000000 +0000 @@ -135,7 +135,7 @@ rtd119x_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout); rtd119x_wdt_stop(&data->wdt_dev); - ret = devm_watchdog_register_device(&pdev->dev, &data->wdt_dev); + ret = watchdog_register_device(&data->wdt_dev); if (ret) { clk_disable_unprepare(data->clk); clk_put(data->clk); diff -Nru linux-4.19.98/drivers/watchdog/sp805_wdt.c linux-4.19.118/drivers/watchdog/sp805_wdt.c --- linux-4.19.98/drivers/watchdog/sp805_wdt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/sp805_wdt.c 2020-04-23 08:30:24.000000000 +0000 @@ -137,10 +137,14 @@ { struct sp805_wdt *wdt = watchdog_get_drvdata(wdd); + writel_relaxed(UNLOCK, wdt->base + WDTLOCK); writel_relaxed(0, wdt->base + WDTCONTROL); writel_relaxed(0, wdt->base + WDTLOAD); writel_relaxed(INT_ENABLE | RESET_ENABLE, wdt->base + WDTCONTROL); + /* Flush posted writes. */ + readl_relaxed(wdt->base + WDTLOCK); + return 0; } diff -Nru linux-4.19.98/drivers/watchdog/sprd_wdt.c linux-4.19.118/drivers/watchdog/sprd_wdt.c --- linux-4.19.98/drivers/watchdog/sprd_wdt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/sprd_wdt.c 2020-04-23 08:30:24.000000000 +0000 @@ -342,10 +342,9 @@ static int __maybe_unused sprd_wdt_pm_suspend(struct device *dev) { - struct watchdog_device *wdd = dev_get_drvdata(dev); struct sprd_wdt *wdt = dev_get_drvdata(dev); - if (watchdog_active(wdd)) + if (watchdog_active(&wdt->wdd)) sprd_wdt_stop(&wdt->wdd); sprd_wdt_disable(wdt); @@ -354,7 +353,6 @@ static int __maybe_unused sprd_wdt_pm_resume(struct device *dev) { - struct watchdog_device *wdd = dev_get_drvdata(dev); struct sprd_wdt *wdt = dev_get_drvdata(dev); int ret; @@ -362,7 +360,7 @@ if (ret) return ret; - if (watchdog_active(wdd)) { + if (watchdog_active(&wdt->wdd)) { ret = sprd_wdt_start(&wdt->wdd); if (ret) { sprd_wdt_disable(wdt); diff -Nru linux-4.19.98/drivers/watchdog/watchdog_core.c linux-4.19.118/drivers/watchdog/watchdog_core.c --- linux-4.19.98/drivers/watchdog/watchdog_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/watchdog_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -138,6 +138,25 @@ } EXPORT_SYMBOL_GPL(watchdog_init_timeout); +static int watchdog_reboot_notifier(struct notifier_block *nb, + unsigned long code, void *data) +{ + struct watchdog_device *wdd; + + wdd = container_of(nb, struct watchdog_device, reboot_nb); + if (code == SYS_DOWN || code == SYS_HALT) { + if (watchdog_active(wdd)) { + int ret; + + ret = wdd->ops->stop(wdd); + if (ret) + return NOTIFY_BAD; + } + } + + return NOTIFY_DONE; +} + static int watchdog_restart_notifier(struct notifier_block *nb, unsigned long action, void *data) { @@ -226,6 +245,19 @@ } } + if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { + wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; + + ret = register_reboot_notifier(&wdd->reboot_nb); + if (ret) { + pr_err("watchdog%d: Cannot register reboot notifier (%d)\n", + wdd->id, ret); + watchdog_dev_unregister(wdd); + ida_simple_remove(&watchdog_ida, id); + return ret; + } + } + if (wdd->ops->restart) { wdd->restart_nb.notifier_call = watchdog_restart_notifier; @@ -271,6 +303,9 @@ if (wdd->ops->restart) unregister_restart_handler(&wdd->restart_nb); + if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) + unregister_reboot_notifier(&wdd->reboot_nb); + watchdog_dev_unregister(wdd); ida_simple_remove(&watchdog_ida, wdd->id); } diff -Nru linux-4.19.98/drivers/watchdog/watchdog_dev.c linux-4.19.118/drivers/watchdog/watchdog_dev.c --- linux-4.19.98/drivers/watchdog/watchdog_dev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/watchdog_dev.c 2020-04-23 08:30:24.000000000 +0000 @@ -42,7 +42,6 @@ #include /* For handling misc devices */ #include /* For module stuff/... */ #include /* For mutexes */ -#include /* For reboot notifier */ #include /* For memory functions */ #include /* For standard types (like size_t) */ #include /* For watchdog specific items */ @@ -1048,25 +1047,6 @@ put_device(&wd_data->dev); } -static int watchdog_reboot_notifier(struct notifier_block *nb, - unsigned long code, void *data) -{ - struct watchdog_device *wdd; - - wdd = container_of(nb, struct watchdog_device, reboot_nb); - if (code == SYS_DOWN || code == SYS_HALT) { - if (watchdog_active(wdd)) { - int ret; - - ret = wdd->ops->stop(wdd); - if (ret) - return NOTIFY_BAD; - } - } - - return NOTIFY_DONE; -} - /* * watchdog_dev_register: register a watchdog device * @wdd: watchdog device @@ -1085,22 +1065,8 @@ return ret; ret = watchdog_register_pretimeout(wdd); - if (ret) { + if (ret) watchdog_cdev_unregister(wdd); - return ret; - } - - if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { - wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; - - ret = devm_register_reboot_notifier(&wdd->wd_data->dev, - &wdd->reboot_nb); - if (ret) { - pr_err("watchdog%d: Cannot register reboot notifier (%d)\n", - wdd->id, ret); - watchdog_dev_unregister(wdd); - } - } return ret; } diff -Nru linux-4.19.98/drivers/watchdog/wdat_wdt.c linux-4.19.118/drivers/watchdog/wdat_wdt.c --- linux-4.19.98/drivers/watchdog/wdat_wdt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/watchdog/wdat_wdt.c 2020-04-23 08:30:24.000000000 +0000 @@ -392,7 +392,7 @@ memset(&r, 0, sizeof(r)); r.start = gas->address; - r.end = r.start + gas->access_width - 1; + r.end = r.start + ACPI_ACCESS_BYTE_WIDTH(gas->access_width) - 1; if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { r.flags = IORESOURCE_MEM; } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { diff -Nru linux-4.19.98/drivers/xen/cpu_hotplug.c linux-4.19.118/drivers/xen/cpu_hotplug.c --- linux-4.19.98/drivers/xen/cpu_hotplug.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/xen/cpu_hotplug.c 2020-04-23 08:30:24.000000000 +0000 @@ -54,7 +54,7 @@ } static void vcpu_hotplug(unsigned int cpu) { - if (!cpu_possible(cpu)) + if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) return; switch (vcpu_online(cpu)) { diff -Nru linux-4.19.98/drivers/xen/preempt.c linux-4.19.118/drivers/xen/preempt.c --- linux-4.19.98/drivers/xen/preempt.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/xen/preempt.c 2020-04-23 08:30:24.000000000 +0000 @@ -37,7 +37,9 @@ * cpu. */ __this_cpu_write(xen_in_preemptible_hcall, false); - _cond_resched(); + local_irq_enable(); + cond_resched(); + local_irq_disable(); __this_cpu_write(xen_in_preemptible_hcall, true); } } diff -Nru linux-4.19.98/drivers/xen/pvcalls-back.c linux-4.19.118/drivers/xen/pvcalls-back.c --- linux-4.19.98/drivers/xen/pvcalls-back.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/xen/pvcalls-back.c 2020-04-23 08:30:24.000000000 +0000 @@ -784,7 +784,7 @@ mappass->reqcopy = *req; icsk = inet_csk(mappass->sock->sk); queue = &icsk->icsk_accept_queue; - data = queue->rskq_accept_head != NULL; + data = READ_ONCE(queue->rskq_accept_head) != NULL; if (data) { mappass->reqcopy.cmd = 0; ret = 0; diff -Nru linux-4.19.98/drivers/xen/xen-balloon.c linux-4.19.118/drivers/xen/xen-balloon.c --- linux-4.19.98/drivers/xen/xen-balloon.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/xen/xen-balloon.c 2020-04-23 08:30:24.000000000 +0000 @@ -83,7 +83,7 @@ "%llu", &static_max) == 1)) static_max >>= PAGE_SHIFT - 10; else - static_max = new_target; + static_max = balloon_stats.current_pages; target_diff = (xen_pv_domain() || xen_initial_domain()) ? 0 : static_max - balloon_stats.target_pages; diff -Nru linux-4.19.98/drivers/xen/xenbus/xenbus_comms.c linux-4.19.118/drivers/xen/xenbus/xenbus_comms.c --- linux-4.19.98/drivers/xen/xenbus/xenbus_comms.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/xen/xenbus/xenbus_comms.c 2020-04-23 08:30:24.000000000 +0000 @@ -313,6 +313,8 @@ req->msg.type = state.msg.type; req->msg.len = state.msg.len; req->body = state.body; + /* write body, then update state */ + virt_wmb(); req->state = xb_req_state_got_reply; req->cb(req); } else @@ -395,6 +397,8 @@ if (state.req->state == xb_req_state_aborted) kfree(state.req); else { + /* write err, then update state */ + virt_wmb(); state.req->state = xb_req_state_got_reply; wake_up(&state.req->wq); } diff -Nru linux-4.19.98/drivers/xen/xenbus/xenbus_xs.c linux-4.19.118/drivers/xen/xenbus/xenbus_xs.c --- linux-4.19.98/drivers/xen/xenbus/xenbus_xs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/drivers/xen/xenbus/xenbus_xs.c 2020-04-23 08:30:24.000000000 +0000 @@ -191,8 +191,11 @@ static bool test_reply(struct xb_req_data *req) { - if (req->state == xb_req_state_got_reply || !xenbus_ok()) + if (req->state == xb_req_state_got_reply || !xenbus_ok()) { + /* read req->state before all other fields */ + virt_rmb(); return true; + } /* Make sure to reread req->state each time. */ barrier(); @@ -202,7 +205,7 @@ static void *read_reply(struct xb_req_data *req) { - while (req->state != xb_req_state_got_reply) { + do { wait_event(req->wq, test_reply(req)); if (!xenbus_ok()) @@ -216,7 +219,7 @@ if (req->err) return ERR_PTR(req->err); - } + } while (req->state != xb_req_state_got_reply); return req->body; } diff -Nru linux-4.19.98/fs/affs/super.c linux-4.19.118/fs/affs/super.c --- linux-4.19.98/fs/affs/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/affs/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -561,14 +561,9 @@ int root_block; unsigned long mount_flags; int res = 0; - char *new_opts; char volume[32]; char *prefix = NULL; - new_opts = kstrdup(data, GFP_KERNEL); - if (data && !new_opts) - return -ENOMEM; - pr_debug("%s(flags=0x%x,opts=\"%s\")\n", __func__, *flags, data); sync_filesystem(sb); @@ -579,7 +574,6 @@ &blocksize, &prefix, volume, &mount_flags)) { kfree(prefix); - kfree(new_opts); return -EINVAL; } diff -Nru linux-4.19.98/fs/afs/callback.c linux-4.19.118/fs/afs/callback.c --- linux-4.19.98/fs/afs/callback.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/callback.c 2020-04-23 08:30:24.000000000 +0000 @@ -221,14 +221,8 @@ vnode->cb_break++; afs_clear_permits(vnode); - spin_lock(&vnode->lock); - - _debug("break callback"); - - if (list_empty(&vnode->granted_locks) && - !list_empty(&vnode->pending_locks)) + if (vnode->lock_state == AFS_VNODE_LOCK_WAITING_FOR_CB) afs_lock_may_be_available(vnode); - spin_unlock(&vnode->lock); } write_sequnlock(&vnode->cb_lock); diff -Nru linux-4.19.98/fs/afs/cell.c linux-4.19.118/fs/afs/cell.c --- linux-4.19.98/fs/afs/cell.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/cell.c 2020-04-23 08:30:24.000000000 +0000 @@ -135,8 +135,17 @@ _leave(" = -ENAMETOOLONG"); return ERR_PTR(-ENAMETOOLONG); } - if (namelen == 5 && memcmp(name, "@cell", 5) == 0) + + /* Prohibit cell names that contain unprintable chars, '/' and '@' or + * that begin with a dot. This also precludes "@cell". + */ + if (name[0] == '.') return ERR_PTR(-EINVAL); + for (i = 0; i < namelen; i++) { + char ch = name[i]; + if (!isprint(ch) || ch == '/' || ch == '@') + return ERR_PTR(-EINVAL); + } _enter("%*.*s,%s", namelen, namelen, name, vllist); diff -Nru linux-4.19.98/fs/afs/dir_edit.c linux-4.19.118/fs/afs/dir_edit.c --- linux-4.19.98/fs/afs/dir_edit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/dir_edit.c 2020-04-23 08:30:24.000000000 +0000 @@ -72,13 +72,11 @@ static void afs_set_contig_bits(union afs_xdr_dir_block *block, int bit, unsigned int nr_slots) { - u64 mask, before, after; + u64 mask; mask = (1 << nr_slots) - 1; mask <<= bit; - before = *(u64 *)block->hdr.bitmap; - block->hdr.bitmap[0] |= (u8)(mask >> 0 * 8); block->hdr.bitmap[1] |= (u8)(mask >> 1 * 8); block->hdr.bitmap[2] |= (u8)(mask >> 2 * 8); @@ -87,8 +85,6 @@ block->hdr.bitmap[5] |= (u8)(mask >> 5 * 8); block->hdr.bitmap[6] |= (u8)(mask >> 6 * 8); block->hdr.bitmap[7] |= (u8)(mask >> 7 * 8); - - after = *(u64 *)block->hdr.bitmap; } /* @@ -97,13 +93,11 @@ static void afs_clear_contig_bits(union afs_xdr_dir_block *block, int bit, unsigned int nr_slots) { - u64 mask, before, after; + u64 mask; mask = (1 << nr_slots) - 1; mask <<= bit; - before = *(u64 *)block->hdr.bitmap; - block->hdr.bitmap[0] &= ~(u8)(mask >> 0 * 8); block->hdr.bitmap[1] &= ~(u8)(mask >> 1 * 8); block->hdr.bitmap[2] &= ~(u8)(mask >> 2 * 8); @@ -112,8 +106,6 @@ block->hdr.bitmap[5] &= ~(u8)(mask >> 5 * 8); block->hdr.bitmap[6] &= ~(u8)(mask >> 6 * 8); block->hdr.bitmap[7] &= ~(u8)(mask >> 7 * 8); - - after = *(u64 *)block->hdr.bitmap; } /* diff -Nru linux-4.19.98/fs/afs/file.c linux-4.19.118/fs/afs/file.c --- linux-4.19.98/fs/afs/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -169,11 +169,12 @@ { struct afs_vnode *vnode = AFS_FS_I(inode); struct afs_file *af = file->private_data; + int ret = 0; _enter("{%x:%u},", vnode->fid.vid, vnode->fid.vnode); if ((file->f_mode & FMODE_WRITE)) - return vfs_fsync(file, 0); + ret = vfs_fsync(file, 0); file->private_data = NULL; if (af->wb) @@ -181,8 +182,8 @@ key_put(af->key); kfree(af); afs_prune_wb_keys(vnode); - _leave(" = 0"); - return 0; + _leave(" = %d", ret); + return ret; } /* diff -Nru linux-4.19.98/fs/afs/flock.c linux-4.19.118/fs/afs/flock.c --- linux-4.19.98/fs/afs/flock.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/flock.c 2020-04-23 08:30:24.000000000 +0000 @@ -13,9 +13,11 @@ #define AFS_LOCK_GRANTED 0 #define AFS_LOCK_PENDING 1 +#define AFS_LOCK_YOUR_TRY 2 struct workqueue_struct *afs_lock_manager; +static void afs_next_locker(struct afs_vnode *vnode, int error); static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl); static void afs_fl_release_private(struct file_lock *fl); @@ -24,6 +26,12 @@ .fl_release_private = afs_fl_release_private, }; +static inline void afs_set_lock_state(struct afs_vnode *vnode, enum afs_lock_state state) +{ + _debug("STATE %u -> %u", vnode->lock_state, state); + vnode->lock_state = state; +} + /* * if the callback is broken on this vnode, then the lock may now be available */ @@ -31,14 +39,17 @@ { _enter("{%x:%u}", vnode->fid.vid, vnode->fid.vnode); - queue_delayed_work(afs_lock_manager, &vnode->lock_work, 0); + spin_lock(&vnode->lock); + if (vnode->lock_state == AFS_VNODE_LOCK_WAITING_FOR_CB) + afs_next_locker(vnode, 0); + spin_unlock(&vnode->lock); } /* * the lock will time out in 5 minutes unless we extend it, so schedule * extension in a bit less than that time */ -static void afs_schedule_lock_extension(struct afs_vnode *vnode) +static void __maybe_unused afs_schedule_lock_extension(struct afs_vnode *vnode) { queue_delayed_work(afs_lock_manager, &vnode->lock_work, AFS_LOCKWAIT * HZ / 2); @@ -49,22 +60,65 @@ * first lock in the queue is itself a readlock) * - the caller must hold the vnode lock */ -static void afs_grant_locks(struct afs_vnode *vnode, struct file_lock *fl) +static void afs_grant_locks(struct afs_vnode *vnode) { struct file_lock *p, *_p; + bool exclusive = (vnode->lock_type == AFS_LOCK_WRITE); - list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); - if (fl->fl_type == F_RDLCK) { - list_for_each_entry_safe(p, _p, &vnode->pending_locks, - fl_u.afs.link) { - if (p->fl_type == F_RDLCK) { - p->fl_u.afs.state = AFS_LOCK_GRANTED; - list_move_tail(&p->fl_u.afs.link, - &vnode->granted_locks); - wake_up(&p->fl_wait); - } + list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) { + if (!exclusive && p->fl_type == F_WRLCK) + continue; + + list_move_tail(&p->fl_u.afs.link, &vnode->granted_locks); + p->fl_u.afs.state = AFS_LOCK_GRANTED; + wake_up(&p->fl_wait); + } +} + +/* + * If an error is specified, reject every pending lock that matches the + * authentication and type of the lock we failed to get. If there are any + * remaining lockers, try to wake up one of them to have a go. + */ +static void afs_next_locker(struct afs_vnode *vnode, int error) +{ + struct file_lock *p, *_p, *next = NULL; + struct key *key = vnode->lock_key; + unsigned int fl_type = F_RDLCK; + + _enter(""); + + if (vnode->lock_type == AFS_LOCK_WRITE) + fl_type = F_WRLCK; + + list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) { + if (error && + p->fl_type == fl_type && + afs_file_key(p->fl_file) == key) { + list_del_init(&p->fl_u.afs.link); + p->fl_u.afs.state = error; + wake_up(&p->fl_wait); } + + /* Select the next locker to hand off to. */ + if (next && + (next->fl_type == F_WRLCK || p->fl_type == F_RDLCK)) + continue; + next = p; + } + + vnode->lock_key = NULL; + key_put(key); + + if (next) { + afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING); + next->fl_u.afs.state = AFS_LOCK_YOUR_TRY; + wake_up(&next->fl_wait); + } else { + afs_set_lock_state(vnode, AFS_VNODE_LOCK_NONE); } + + _leave(""); } /* @@ -170,8 +224,6 @@ { struct afs_vnode *vnode = container_of(work, struct afs_vnode, lock_work.work); - struct file_lock *fl, *next; - afs_lock_type_t type; struct key *key; int ret; @@ -184,7 +236,7 @@ switch (vnode->lock_state) { case AFS_VNODE_LOCK_NEED_UNLOCK: _debug("unlock"); - vnode->lock_state = AFS_VNODE_LOCK_UNLOCKING; + afs_set_lock_state(vnode, AFS_VNODE_LOCK_UNLOCKING); spin_unlock(&vnode->lock); /* attempt to release the server lock; if it fails, we just @@ -196,22 +248,9 @@ vnode->fid.vid, vnode->fid.vnode, ret); spin_lock(&vnode->lock); - key_put(vnode->lock_key); - vnode->lock_key = NULL; - vnode->lock_state = AFS_VNODE_LOCK_NONE; - - if (list_empty(&vnode->pending_locks)) { - spin_unlock(&vnode->lock); - return; - } - - /* The new front of the queue now owns the state variables. */ - next = list_entry(vnode->pending_locks.next, - struct file_lock, fl_u.afs.link); - vnode->lock_key = key_get(afs_file_key(next->fl_file)); - vnode->lock_type = (next->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; - vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB; - goto again; + afs_next_locker(vnode, 0); + spin_unlock(&vnode->lock); + return; /* If we've already got a lock, then it must be time to extend that * lock as AFS locks time out after 5 minutes. @@ -222,7 +261,7 @@ ASSERT(!list_empty(&vnode->granted_locks)); key = key_get(vnode->lock_key); - vnode->lock_state = AFS_VNODE_LOCK_EXTENDING; + afs_set_lock_state(vnode, AFS_VNODE_LOCK_EXTENDING); spin_unlock(&vnode->lock); ret = afs_extend_lock(vnode, key); /* RPC */ @@ -236,72 +275,26 @@ if (vnode->lock_state != AFS_VNODE_LOCK_EXTENDING) goto again; - vnode->lock_state = AFS_VNODE_LOCK_GRANTED; + afs_set_lock_state(vnode, AFS_VNODE_LOCK_GRANTED); - if (ret == 0) - afs_schedule_lock_extension(vnode); - else + if (ret != 0) queue_delayed_work(afs_lock_manager, &vnode->lock_work, HZ * 10); spin_unlock(&vnode->lock); _leave(" [ext]"); return; - /* If we don't have a granted lock, then we must've been called - * back by the server, and so if might be possible to get a - * lock we're currently waiting for. - */ + /* If we're waiting for a callback to indicate lock release, we can't + * actually rely on this, so need to recheck at regular intervals. The + * problem is that the server might not notify us if the lock just + * expires (say because a client died) rather than being explicitly + * released. + */ case AFS_VNODE_LOCK_WAITING_FOR_CB: - _debug("get"); - - key = key_get(vnode->lock_key); - type = vnode->lock_type; - vnode->lock_state = AFS_VNODE_LOCK_SETTING; + _debug("retry"); + afs_next_locker(vnode, 0); spin_unlock(&vnode->lock); - - ret = afs_set_lock(vnode, key, type); /* RPC */ - key_put(key); - - spin_lock(&vnode->lock); - switch (ret) { - case -EWOULDBLOCK: - _debug("blocked"); - break; - case 0: - _debug("acquired"); - vnode->lock_state = AFS_VNODE_LOCK_GRANTED; - /* Fall through */ - default: - /* Pass the lock or the error onto the first locker in - * the list - if they're looking for this type of lock. - * If they're not, we assume that whoever asked for it - * took a signal. - */ - if (list_empty(&vnode->pending_locks)) { - _debug("withdrawn"); - vnode->lock_state = AFS_VNODE_LOCK_NEED_UNLOCK; - goto again; - } - - fl = list_entry(vnode->pending_locks.next, - struct file_lock, fl_u.afs.link); - type = (fl->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; - if (vnode->lock_type != type) { - _debug("changed"); - vnode->lock_state = AFS_VNODE_LOCK_NEED_UNLOCK; - goto again; - } - - fl->fl_u.afs.state = ret; - if (ret == 0) - afs_grant_locks(vnode, fl); - else - list_del_init(&fl->fl_u.afs.link); - wake_up(&fl->fl_wait); - spin_unlock(&vnode->lock); - _leave(" [granted]"); - return; - } + return; default: /* Looks like a lock request was withdrawn. */ @@ -319,14 +312,15 @@ */ static void afs_defer_unlock(struct afs_vnode *vnode) { - _enter(""); + _enter("%u", vnode->lock_state); - if (vnode->lock_state == AFS_VNODE_LOCK_GRANTED || - vnode->lock_state == AFS_VNODE_LOCK_EXTENDING) { + if (list_empty(&vnode->granted_locks) && + (vnode->lock_state == AFS_VNODE_LOCK_GRANTED || + vnode->lock_state == AFS_VNODE_LOCK_EXTENDING)) { cancel_delayed_work(&vnode->lock_work); - vnode->lock_state = AFS_VNODE_LOCK_NEED_UNLOCK; - afs_lock_may_be_available(vnode); + afs_set_lock_state(vnode, AFS_VNODE_LOCK_NEED_UNLOCK); + queue_delayed_work(afs_lock_manager, &vnode->lock_work, 0); } } @@ -376,50 +370,6 @@ } /* - * Remove the front runner from the pending queue. - * - The caller must hold vnode->lock. - */ -static void afs_dequeue_lock(struct afs_vnode *vnode, struct file_lock *fl) -{ - struct file_lock *next; - - _enter(""); - - /* ->lock_type, ->lock_key and ->lock_state only belong to this - * file_lock if we're at the front of the pending queue or if we have - * the lock granted or if the lock_state is NEED_UNLOCK or UNLOCKING. - */ - if (vnode->granted_locks.next == &fl->fl_u.afs.link && - vnode->granted_locks.prev == &fl->fl_u.afs.link) { - list_del_init(&fl->fl_u.afs.link); - afs_defer_unlock(vnode); - return; - } - - if (!list_empty(&vnode->granted_locks) || - vnode->pending_locks.next != &fl->fl_u.afs.link) { - list_del_init(&fl->fl_u.afs.link); - return; - } - - list_del_init(&fl->fl_u.afs.link); - key_put(vnode->lock_key); - vnode->lock_key = NULL; - vnode->lock_state = AFS_VNODE_LOCK_NONE; - - if (list_empty(&vnode->pending_locks)) - return; - - /* The new front of the queue now owns the state variables. */ - next = list_entry(vnode->pending_locks.next, - struct file_lock, fl_u.afs.link); - vnode->lock_key = key_get(afs_file_key(next->fl_file)); - vnode->lock_type = (next->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; - vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB; - afs_lock_may_be_available(vnode); -} - -/* * request a lock on a file on the server */ static int afs_do_setlk(struct file *file, struct file_lock *fl) @@ -432,10 +382,6 @@ _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type); - /* only whole-file locks are supported */ - if (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX) - return -EINVAL; - fl->fl_ops = &afs_lock_ops; INIT_LIST_HEAD(&fl->fl_u.afs.link); fl->fl_u.afs.state = AFS_LOCK_PENDING; @@ -447,44 +393,66 @@ return ret; spin_lock(&vnode->lock); + list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks); - /* If we've already got a readlock on the server then we instantly - * grant another readlock, irrespective of whether there are any - * pending writelocks. - */ - if (type == AFS_LOCK_READ && - vnode->lock_state == AFS_VNODE_LOCK_GRANTED && - vnode->lock_type == AFS_LOCK_READ) { - _debug("instant readlock"); - ASSERT(!list_empty(&vnode->granted_locks)); - goto share_existing_lock; - } + /* If we've already got a lock on the server then try to move to having + * the VFS grant the requested lock. Note that this means that other + * clients may get starved out. + */ + _debug("try %u", vnode->lock_state); + if (vnode->lock_state == AFS_VNODE_LOCK_GRANTED) { + if (type == AFS_LOCK_READ) { + _debug("instant readlock"); + list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); + fl->fl_u.afs.state = AFS_LOCK_GRANTED; + goto vnode_is_locked_u; + } - list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks); + if (vnode->lock_type == AFS_LOCK_WRITE) { + _debug("instant writelock"); + list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); + fl->fl_u.afs.state = AFS_LOCK_GRANTED; + goto vnode_is_locked_u; + } + } if (vnode->lock_state != AFS_VNODE_LOCK_NONE) goto need_to_wait; +try_to_lock: /* We don't have a lock on this vnode and we aren't currently waiting * for one either, so ask the server for a lock. * * Note that we need to be careful if we get interrupted by a signal * after dispatching the request as we may still get the lock, even * though we don't wait for the reply (it's not too bad a problem - the - * lock will expire in 10 mins anyway). + * lock will expire in 5 mins anyway). */ _debug("not locked"); vnode->lock_key = key_get(key); vnode->lock_type = type; - vnode->lock_state = AFS_VNODE_LOCK_SETTING; + afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING); spin_unlock(&vnode->lock); ret = afs_set_lock(vnode, key, type); /* RPC */ spin_lock(&vnode->lock); switch (ret) { + case -EKEYREJECTED: + case -EKEYEXPIRED: + case -EKEYREVOKED: + case -EPERM: + case -EACCES: + fl->fl_u.afs.state = ret; + list_del_init(&fl->fl_u.afs.link); + afs_next_locker(vnode, ret); + goto error_unlock; + default: - goto abort_attempt; + fl->fl_u.afs.state = ret; + list_del_init(&fl->fl_u.afs.link); + afs_next_locker(vnode, 0); + goto error_unlock; case -EWOULDBLOCK: /* The server doesn't have a lock-waiting queue, so the client @@ -494,29 +462,23 @@ _debug("would block"); ASSERT(list_empty(&vnode->granted_locks)); ASSERTCMP(vnode->pending_locks.next, ==, &fl->fl_u.afs.link); - vnode->lock_state = AFS_VNODE_LOCK_WAITING_FOR_CB; - goto need_to_wait; + goto lock_is_contended; case 0: _debug("acquired"); - break; + afs_set_lock_state(vnode, AFS_VNODE_LOCK_GRANTED); + afs_grant_locks(vnode); + goto vnode_is_locked_u; } - /* we've acquired a server lock, but it needs to be renewed after 5 - * mins */ - vnode->lock_state = AFS_VNODE_LOCK_GRANTED; - afs_schedule_lock_extension(vnode); - -share_existing_lock: - /* the lock has been granted as far as we're concerned... */ - fl->fl_u.afs.state = AFS_LOCK_GRANTED; - list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks); - -given_lock: - /* ... but we do still need to get the VFS's blessing */ +vnode_is_locked_u: spin_unlock(&vnode->lock); +vnode_is_locked: + /* the lock has been granted by the server... */ + ASSERTCMP(fl->fl_u.afs.state, ==, AFS_LOCK_GRANTED); - ret = posix_lock_file(file, fl, NULL); + /* ... but the VFS still needs to distribute access on this client. */ + ret = locks_lock_file_wait(file, fl); if (ret < 0) goto vfs_rejected_lock; @@ -528,38 +490,61 @@ _leave(" = 0"); return 0; +lock_is_contended: + if (!(fl->fl_flags & FL_SLEEP)) { + list_del_init(&fl->fl_u.afs.link); + afs_next_locker(vnode, 0); + ret = -EAGAIN; + goto error_unlock; + } + + afs_set_lock_state(vnode, AFS_VNODE_LOCK_WAITING_FOR_CB); + queue_delayed_work(afs_lock_manager, &vnode->lock_work, HZ * 5); + need_to_wait: /* We're going to have to wait. Either this client doesn't have a lock * on the server yet and we need to wait for a callback to occur, or - * the client does have a lock on the server, but it belongs to some - * other process(es) and is incompatible with the lock we want. + * the client does have a lock on the server, but it's shared and we + * need an exclusive lock. */ - ret = -EAGAIN; - if (fl->fl_flags & FL_SLEEP) { - spin_unlock(&vnode->lock); + spin_unlock(&vnode->lock); - _debug("sleep"); - ret = wait_event_interruptible(fl->fl_wait, - fl->fl_u.afs.state != AFS_LOCK_PENDING); + _debug("sleep"); + ret = wait_event_interruptible(fl->fl_wait, + fl->fl_u.afs.state != AFS_LOCK_PENDING); + _debug("wait = %d", ret); + if (fl->fl_u.afs.state >= 0 && fl->fl_u.afs.state != AFS_LOCK_GRANTED) { spin_lock(&vnode->lock); + + switch (fl->fl_u.afs.state) { + case AFS_LOCK_YOUR_TRY: + fl->fl_u.afs.state = AFS_LOCK_PENDING; + goto try_to_lock; + case AFS_LOCK_PENDING: + if (ret > 0) { + /* We need to retry the lock. We may not be + * notified by the server if it just expired + * rather than being released. + */ + ASSERTCMP(vnode->lock_state, ==, AFS_VNODE_LOCK_WAITING_FOR_CB); + afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING); + fl->fl_u.afs.state = AFS_LOCK_PENDING; + goto try_to_lock; + } + goto error_unlock; + case AFS_LOCK_GRANTED: + default: + break; + } + + spin_unlock(&vnode->lock); } if (fl->fl_u.afs.state == AFS_LOCK_GRANTED) - goto given_lock; - if (fl->fl_u.afs.state < 0) - ret = fl->fl_u.afs.state; - -abort_attempt: - /* we aren't going to get the lock, either because we're unwilling to - * wait, or because some signal happened */ - _debug("abort"); - afs_dequeue_lock(vnode, fl); - -error_unlock: - spin_unlock(&vnode->lock); - _leave(" = %d", ret); - return ret; + goto vnode_is_locked; + ret = fl->fl_u.afs.state; + goto error; vfs_rejected_lock: /* The VFS rejected the lock we just obtained, so we have to discard @@ -569,9 +554,13 @@ _debug("vfs refused %d", ret); spin_lock(&vnode->lock); list_del_init(&fl->fl_u.afs.link); - if (list_empty(&vnode->granted_locks)) - afs_defer_unlock(vnode); - goto error_unlock; + afs_defer_unlock(vnode); + +error_unlock: + spin_unlock(&vnode->lock); +error: + _leave(" = %d", ret); + return ret; } /* @@ -587,11 +576,7 @@ /* Flush all pending writes before doing anything with locks. */ vfs_fsync(file, 0); - /* only whole-file unlocks are supported */ - if (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX) - return -EINVAL; - - ret = posix_lock_file(file, fl, NULL); + ret = locks_lock_file_wait(file, fl); _leave(" = %d [%u]", ret, vnode->lock_state); return ret; } @@ -618,12 +603,15 @@ goto error; lock_count = READ_ONCE(vnode->status.lock_count); - if (lock_count > 0) - fl->fl_type = F_RDLCK; - else - fl->fl_type = F_WRLCK; - fl->fl_start = 0; - fl->fl_end = OFFSET_MAX; + if (lock_count != 0) { + if (lock_count > 0) + fl->fl_type = F_RDLCK; + else + fl->fl_type = F_WRLCK; + fl->fl_start = 0; + fl->fl_end = OFFSET_MAX; + fl->fl_pid = 0; + } } ret = 0; @@ -710,7 +698,11 @@ _enter(""); spin_lock(&vnode->lock); - afs_dequeue_lock(vnode, fl); + + list_del_init(&fl->fl_u.afs.link); + if (list_empty(&vnode->granted_locks)) + afs_defer_unlock(vnode); + _debug("state %u for %p", vnode->lock_state, vnode); spin_unlock(&vnode->lock); } diff -Nru linux-4.19.98/fs/afs/inode.c linux-4.19.118/fs/afs/inode.c --- linux-4.19.98/fs/afs/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -398,12 +398,9 @@ vnode->cb_s_break = vnode->cb_interest->server->cb_s_break; vnode->cb_v_break = vnode->volume->cb_v_break; valid = false; - } else if (vnode->status.type == AFS_FTYPE_DIR && - (!test_bit(AFS_VNODE_DIR_VALID, &vnode->flags) || - vnode->cb_expires_at - 10 <= now)) { + } else if (test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags)) { valid = false; - } else if (test_bit(AFS_VNODE_ZAP_DATA, &vnode->flags) || - vnode->cb_expires_at - 10 <= now) { + } else if (vnode->cb_expires_at - 10 <= now) { valid = false; } else { valid = true; @@ -541,6 +538,7 @@ } #endif + afs_prune_wb_keys(vnode); afs_put_permits(rcu_access_pointer(vnode->permit_cache)); key_put(vnode->lock_key); vnode->lock_key = NULL; diff -Nru linux-4.19.98/fs/afs/rxrpc.c linux-4.19.118/fs/afs/rxrpc.c --- linux-4.19.98/fs/afs/rxrpc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/rxrpc.c 2020-04-23 08:30:24.000000000 +0000 @@ -159,7 +159,7 @@ int n = atomic_dec_return(&call->usage); int o = atomic_read(&net->nr_outstanding_calls); - trace_afs_call(call, afs_call_trace_put, n + 1, o, + trace_afs_call(call, afs_call_trace_put, n, o, __builtin_return_address(0)); ASSERTCMP(n, >=, 0); @@ -573,6 +573,7 @@ call->need_attention = false; __set_current_state(TASK_RUNNING); afs_deliver_to_call(call); + timeout = rtt2; continue; } @@ -653,7 +654,7 @@ u = atomic_fetch_add_unless(&call->usage, 1, 0); if (u != 0) { - trace_afs_call(call, afs_call_trace_wake, u, + trace_afs_call(call, afs_call_trace_wake, u + 1, atomic_read(&call->net->nr_outstanding_calls), __builtin_return_address(0)); diff -Nru linux-4.19.98/fs/afs/security.c linux-4.19.118/fs/afs/security.c --- linux-4.19.98/fs/afs/security.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/security.c 2020-04-23 08:30:24.000000000 +0000 @@ -87,11 +87,9 @@ permits = rcu_dereference_protected(vnode->permit_cache, lockdep_is_held(&vnode->lock)); RCU_INIT_POINTER(vnode->permit_cache, NULL); - vnode->cb_break++; spin_unlock(&vnode->lock); - if (permits) - afs_put_permits(permits); + afs_put_permits(permits); } /* diff -Nru linux-4.19.98/fs/afs/super.c linux-4.19.118/fs/afs/super.c --- linux-4.19.98/fs/afs/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -393,6 +393,7 @@ /* fill in the superblock */ sb->s_blocksize = PAGE_SIZE; sb->s_blocksize_bits = PAGE_SHIFT; + sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_magic = AFS_FS_MAGIC; sb->s_op = &afs_super_ops; if (!as->dyn_root) diff -Nru linux-4.19.98/fs/afs/xattr.c linux-4.19.118/fs/afs/xattr.c --- linux-4.19.98/fs/afs/xattr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/afs/xattr.c 2020-04-23 08:30:24.000000000 +0000 @@ -50,7 +50,7 @@ return namelen; if (namelen > size) return -ERANGE; - memcpy(buffer, cell->name, size); + memcpy(buffer, cell->name, namelen); return namelen; } @@ -104,7 +104,7 @@ return namelen; if (namelen > size) return -ERANGE; - memcpy(buffer, volname, size); + memcpy(buffer, volname, namelen); return namelen; } diff -Nru linux-4.19.98/fs/aio.c linux-4.19.118/fs/aio.c --- linux-4.19.98/fs/aio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/aio.c 2020-04-23 08:30:24.000000000 +0000 @@ -1600,6 +1600,14 @@ return 0; } +static void aio_poll_put_work(struct work_struct *work) +{ + struct poll_iocb *req = container_of(work, struct poll_iocb, work); + struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll); + + iocb_put(iocb); +} + static void aio_poll_complete_work(struct work_struct *work) { struct poll_iocb *req = container_of(work, struct poll_iocb, work); @@ -1664,6 +1672,8 @@ list_del_init(&req->wait.entry); if (mask && spin_trylock_irqsave(&iocb->ki_ctx->ctx_lock, flags)) { + struct kioctx *ctx = iocb->ki_ctx; + /* * Try to complete the iocb inline if we can. Use * irqsave/irqrestore because not all filesystems (e.g. fuse) @@ -1673,8 +1683,14 @@ list_del(&iocb->ki_list); iocb->ki_res.res = mangle_poll(mask); req->done = true; - spin_unlock_irqrestore(&iocb->ki_ctx->ctx_lock, flags); - iocb_put(iocb); + if (iocb->ki_eventfd && eventfd_signal_count()) { + iocb = NULL; + INIT_WORK(&req->work, aio_poll_put_work); + schedule_work(&req->work); + } + spin_unlock_irqrestore(&ctx->ctx_lock, flags); + if (iocb) + iocb_put(iocb); } else { schedule_work(&req->work); } diff -Nru linux-4.19.98/fs/btrfs/async-thread.c linux-4.19.118/fs/btrfs/async-thread.c --- linux-4.19.98/fs/btrfs/async-thread.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/async-thread.c 2020-04-23 08:30:24.000000000 +0000 @@ -434,3 +434,11 @@ { set_bit(WORK_HIGH_PRIO_BIT, &work->flags); } + +void btrfs_flush_workqueue(struct btrfs_workqueue *wq) +{ + if (wq->high) + flush_workqueue(wq->high->normal_wq); + + flush_workqueue(wq->normal->normal_wq); +} diff -Nru linux-4.19.98/fs/btrfs/async-thread.h linux-4.19.118/fs/btrfs/async-thread.h --- linux-4.19.98/fs/btrfs/async-thread.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/async-thread.h 2020-04-23 08:30:24.000000000 +0000 @@ -73,5 +73,6 @@ struct btrfs_fs_info *btrfs_work_owner(const struct btrfs_work *work); struct btrfs_fs_info *btrfs_workqueue_owner(const struct __btrfs_workqueue *wq); bool btrfs_workqueue_normal_congested(const struct btrfs_workqueue *wq); +void btrfs_flush_workqueue(struct btrfs_workqueue *wq); #endif diff -Nru linux-4.19.98/fs/btrfs/check-integrity.c linux-4.19.118/fs/btrfs/check-integrity.c --- linux-4.19.98/fs/btrfs/check-integrity.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/check-integrity.c 2020-04-23 08:30:24.000000000 +0000 @@ -629,7 +629,6 @@ static int btrfsic_process_superblock(struct btrfsic_state *state, struct btrfs_fs_devices *fs_devices) { - struct btrfs_fs_info *fs_info = state->fs_info; struct btrfs_super_block *selected_super; struct list_head *dev_head = &fs_devices->devices; struct btrfs_device *device; @@ -700,7 +699,7 @@ break; } - num_copies = btrfs_num_copies(fs_info, next_bytenr, + num_copies = btrfs_num_copies(state->fs_info, next_bytenr, state->metablock_size); if (state->print_mask & BTRFSIC_PRINT_MASK_NUM_COPIES) pr_info("num_copies(log_bytenr=%llu) = %d\n", diff -Nru linux-4.19.98/fs/btrfs/ctree.c linux-4.19.118/fs/btrfs/ctree.c --- linux-4.19.98/fs/btrfs/ctree.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/ctree.c 2020-04-23 08:30:24.000000000 +0000 @@ -337,12 +337,10 @@ struct seq_list *elem) { write_lock(&fs_info->tree_mod_log_lock); - spin_lock(&fs_info->tree_mod_seq_lock); if (!elem->seq) { elem->seq = btrfs_inc_tree_mod_seq(fs_info); list_add_tail(&elem->list, &fs_info->tree_mod_seq_list); } - spin_unlock(&fs_info->tree_mod_seq_lock); write_unlock(&fs_info->tree_mod_log_lock); return elem->seq; @@ -362,7 +360,7 @@ if (!seq_putting) return; - spin_lock(&fs_info->tree_mod_seq_lock); + write_lock(&fs_info->tree_mod_log_lock); list_del(&elem->list); elem->seq = 0; @@ -373,19 +371,17 @@ * blocker with lower sequence number exists, we * cannot remove anything from the log */ - spin_unlock(&fs_info->tree_mod_seq_lock); + write_unlock(&fs_info->tree_mod_log_lock); return; } min_seq = cur_elem->seq; } } - spin_unlock(&fs_info->tree_mod_seq_lock); /* * anything that's lower than the lowest existing (read: blocked) * sequence number can be removed from the tree. */ - write_lock(&fs_info->tree_mod_log_lock); tm_root = &fs_info->tree_mod_log; for (node = rb_first(tm_root); node; node = next) { next = rb_next(node); diff -Nru linux-4.19.98/fs/btrfs/ctree.h linux-4.19.118/fs/btrfs/ctree.h --- linux-4.19.98/fs/btrfs/ctree.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/ctree.h 2020-04-23 08:30:24.000000000 +0000 @@ -893,14 +893,12 @@ struct list_head delayed_iputs; struct mutex cleaner_delayed_iput_mutex; - /* this protects tree_mod_seq_list */ - spinlock_t tree_mod_seq_lock; atomic64_t tree_mod_seq; - struct list_head tree_mod_seq_list; - /* this protects tree_mod_log */ + /* this protects tree_mod_log and tree_mod_seq_list */ rwlock_t tree_mod_log_lock; struct rb_root tree_mod_log; + struct list_head tree_mod_seq_list; atomic_t async_delalloc_pages; diff -Nru linux-4.19.98/fs/btrfs/delayed-inode.c linux-4.19.118/fs/btrfs/delayed-inode.c --- linux-4.19.98/fs/btrfs/delayed-inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/delayed-inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -6,6 +6,7 @@ #include #include +#include #include "delayed-inode.h" #include "disk-io.h" #include "transaction.h" @@ -801,11 +802,14 @@ struct btrfs_delayed_item *delayed_item) { struct extent_buffer *leaf; + unsigned int nofs_flag; char *ptr; int ret; + nofs_flag = memalloc_nofs_save(); ret = btrfs_insert_empty_item(trans, root, path, &delayed_item->key, delayed_item->data_len); + memalloc_nofs_restore(nofs_flag); if (ret < 0 && ret != -EEXIST) return ret; @@ -933,6 +937,7 @@ struct btrfs_delayed_node *node) { struct btrfs_delayed_item *curr, *prev; + unsigned int nofs_flag; int ret = 0; do_again: @@ -941,7 +946,9 @@ if (!curr) goto delete_fail; + nofs_flag = memalloc_nofs_save(); ret = btrfs_search_slot(trans, root, &curr->key, path, -1, 1); + memalloc_nofs_restore(nofs_flag); if (ret < 0) goto delete_fail; else if (ret > 0) { @@ -1008,6 +1015,7 @@ struct btrfs_key key; struct btrfs_inode_item *inode_item; struct extent_buffer *leaf; + unsigned int nofs_flag; int mod; int ret; @@ -1020,7 +1028,9 @@ else mod = 1; + nofs_flag = memalloc_nofs_save(); ret = btrfs_lookup_inode(trans, root, path, &key, mod); + memalloc_nofs_restore(nofs_flag); if (ret > 0) { btrfs_release_path(path); return -ENOENT; @@ -1071,7 +1081,10 @@ key.type = BTRFS_INODE_EXTREF_KEY; key.offset = -1; + + nofs_flag = memalloc_nofs_save(); ret = btrfs_search_slot(trans, root, &key, path, -1, 1); + memalloc_nofs_restore(nofs_flag); if (ret < 0) goto err_out; ASSERT(ret); diff -Nru linux-4.19.98/fs/btrfs/delayed-ref.c linux-4.19.118/fs/btrfs/delayed-ref.c --- linux-4.19.98/fs/btrfs/delayed-ref.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/delayed-ref.c 2020-04-23 08:30:24.000000000 +0000 @@ -301,7 +301,7 @@ if (head->is_data) return; - spin_lock(&fs_info->tree_mod_seq_lock); + read_lock(&fs_info->tree_mod_log_lock); if (!list_empty(&fs_info->tree_mod_seq_list)) { struct seq_list *elem; @@ -309,7 +309,7 @@ struct seq_list, list); seq = elem->seq; } - spin_unlock(&fs_info->tree_mod_seq_lock); + read_unlock(&fs_info->tree_mod_log_lock); again: for (node = rb_first(&head->ref_tree); node; node = rb_next(node)) { @@ -326,7 +326,7 @@ struct seq_list *elem; int ret = 0; - spin_lock(&fs_info->tree_mod_seq_lock); + read_lock(&fs_info->tree_mod_log_lock); if (!list_empty(&fs_info->tree_mod_seq_list)) { elem = list_first_entry(&fs_info->tree_mod_seq_list, struct seq_list, list); @@ -339,7 +339,7 @@ } } - spin_unlock(&fs_info->tree_mod_seq_lock); + read_unlock(&fs_info->tree_mod_log_lock); return ret; } diff -Nru linux-4.19.98/fs/btrfs/disk-io.c linux-4.19.118/fs/btrfs/disk-io.c --- linux-4.19.98/fs/btrfs/disk-io.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/disk-io.c 2020-04-23 08:30:24.000000000 +0000 @@ -2031,7 +2031,7 @@ } /* helper to cleanup tree roots */ -static void free_root_pointers(struct btrfs_fs_info *info, int chunk_root) +static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root) { free_root_extent_buffers(info->tree_root); @@ -2040,7 +2040,7 @@ free_root_extent_buffers(info->csum_root); free_root_extent_buffers(info->quota_root); free_root_extent_buffers(info->uuid_root); - if (chunk_root) + if (free_chunk_root) free_root_extent_buffers(info->chunk_root); free_root_extent_buffers(info->free_space_root); } @@ -2645,7 +2645,6 @@ spin_lock_init(&fs_info->fs_roots_radix_lock); spin_lock_init(&fs_info->delayed_iput_lock); spin_lock_init(&fs_info->defrag_inodes_lock); - spin_lock_init(&fs_info->tree_mod_seq_lock); spin_lock_init(&fs_info->super_lock); spin_lock_init(&fs_info->qgroup_op_lock); spin_lock_init(&fs_info->buffer_lock); @@ -3008,6 +3007,18 @@ fs_info->generation = generation; fs_info->last_trans_committed = generation; + /* + * If we have a uuid root and we're not being told to rescan we need to + * check the generation here so we can set the + * BTRFS_FS_UPDATE_UUID_TREE_GEN bit. Otherwise we could commit the + * transaction during a balance or the log replay without updating the + * uuid generation, and then if we crash we would rescan the uuid tree, + * even though it was perfectly fine. + */ + if (fs_info->uuid_root && !btrfs_test_opt(fs_info, RESCAN_UUID_TREE) && + fs_info->generation == btrfs_super_uuid_tree_generation(disk_super)) + set_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags); + ret = btrfs_verify_dev_extents(fs_info); if (ret) { btrfs_err(fs_info, @@ -3118,6 +3129,7 @@ /* do not make disk changes in broken FS or nologreplay is given */ if (btrfs_super_log_root(disk_super) != 0 && !btrfs_test_opt(fs_info, NOLOGREPLAY)) { + btrfs_info(fs_info, "start tree-log replay"); ret = btrfs_replay_log(fs_info, fs_devices); if (ret) { err = ret; @@ -3153,6 +3165,7 @@ if (IS_ERR(fs_info->fs_root)) { err = PTR_ERR(fs_info->fs_root); btrfs_warn(fs_info, "failed to read fs tree: %d", err); + fs_info->fs_root = NULL; goto fail_qgroup; } @@ -3236,8 +3249,6 @@ close_ctree(fs_info); return ret; } - } else { - set_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags); } set_bit(BTRFS_FS_OPEN, &fs_info->flags); @@ -3274,7 +3285,7 @@ btrfs_put_block_group_cache(fs_info); fail_tree_roots: - free_root_pointers(fs_info, 1); + free_root_pointers(fs_info, true); invalidate_inode_pages2(fs_info->btree_inode->i_mapping); fail_sb_buffer: @@ -3302,7 +3313,7 @@ if (!btrfs_test_opt(fs_info, USEBACKUPROOT)) goto fail_tree_roots; - free_root_pointers(fs_info, 0); + free_root_pointers(fs_info, false); /* don't use the log in recovery mode, it won't be valid */ btrfs_set_super_log_root(disk_super, 0); @@ -3948,6 +3959,19 @@ */ btrfs_delete_unused_bgs(fs_info); + /* + * There might be existing delayed inode workers still running + * and holding an empty delayed inode item. We must wait for + * them to complete first because they can create a transaction. + * This happens when someone calls btrfs_balance_delayed_items() + * and then a transaction commit runs the same delayed nodes + * before any delayed worker has done something with the nodes. + * We must wait for any worker here and not at transaction + * commit time since that could cause a deadlock. + * This is a very rare case. + */ + btrfs_flush_workqueue(fs_info->delayed_workers); + ret = btrfs_commit_super(fs_info); if (ret) btrfs_err(fs_info, "commit super ret %d", ret); @@ -3984,10 +4008,17 @@ invalidate_inode_pages2(fs_info->btree_inode->i_mapping); btrfs_stop_all_workers(fs_info); - btrfs_free_block_groups(fs_info); - clear_bit(BTRFS_FS_OPEN, &fs_info->flags); - free_root_pointers(fs_info, 1); + free_root_pointers(fs_info, true); + + /* + * We must free the block groups after dropping the fs_roots as we could + * have had an IO error and have left over tree log blocks that aren't + * cleaned up until the fs roots are freed. This makes the block group + * accounting appear to be wrong because there's pending reserved bytes, + * so make sure we do the block group cleanup afterwards. + */ + btrfs_free_block_groups(fs_info); iput(fs_info->btree_inode); @@ -4461,7 +4492,6 @@ wake_up(&fs_info->transaction_wait); btrfs_destroy_delayed_inodes(fs_info); - btrfs_assert_delayed_root_empty(fs_info); btrfs_destroy_marked_extents(fs_info, &cur_trans->dirty_pages, EXTENT_DIRTY); diff -Nru linux-4.19.98/fs/btrfs/extent_io.c linux-4.19.118/fs/btrfs/extent_io.c --- linux-4.19.98/fs/btrfs/extent_io.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/extent_io.c 2020-04-23 08:30:24.000000000 +0000 @@ -4014,6 +4014,14 @@ */ scanned = 1; index = 0; + + /* + * If we're looping we could run into a page that is locked by a + * writer and that writer could be waiting on writeback for a + * page in our current bio, and thus deadlock, so flush the + * write bio here. + */ + flush_write_bio(epd); goto retry; } diff -Nru linux-4.19.98/fs/btrfs/extent_map.c linux-4.19.118/fs/btrfs/extent_map.c --- linux-4.19.98/fs/btrfs/extent_map.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/extent_map.c 2020-04-23 08:30:24.000000000 +0000 @@ -228,6 +228,17 @@ struct extent_map *merge = NULL; struct rb_node *rb; + /* + * We can't modify an extent map that is in the tree and that is being + * used by another task, as it can cause that other task to see it in + * inconsistent state during the merging. We always have 1 reference for + * the tree and 1 for this task (which is unpinning the extent map or + * clearing the logging flag), so anything > 2 means it's being used by + * other tasks too. + */ + if (refcount_read(&em->refs) > 2) + return; + if (em->start != 0) { rb = rb_prev(&em->rb_node); if (rb) diff -Nru linux-4.19.98/fs/btrfs/file-item.c linux-4.19.118/fs/btrfs/file-item.c --- linux-4.19.98/fs/btrfs/file-item.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/file-item.c 2020-04-23 08:30:24.000000000 +0000 @@ -275,7 +275,8 @@ csum += count * csum_size; nblocks -= count; next: - while (count--) { + while (count > 0) { + count--; disk_bytenr += fs_info->sectorsize; offset += fs_info->sectorsize; page_bytes_left -= fs_info->sectorsize; diff -Nru linux-4.19.98/fs/btrfs/file.c linux-4.19.118/fs/btrfs/file.c --- linux-4.19.98/fs/btrfs/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -1895,7 +1895,7 @@ bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host); ssize_t err; loff_t pos; - size_t count = iov_iter_count(from); + size_t count; loff_t oldsize; int clean_page = 0; @@ -1917,6 +1917,7 @@ } pos = iocb->ki_pos; + count = iov_iter_count(from); if (iocb->ki_flags & IOCB_NOWAIT) { /* * We will allocate space in case nodatacow is not set, @@ -2073,6 +2074,16 @@ btrfs_init_log_ctx(&ctx, inode); /* + * Set the range to full if the NO_HOLES feature is not enabled. + * This is to avoid missing file extent items representing holes after + * replaying the log. + */ + if (!btrfs_fs_incompat(fs_info, NO_HOLES)) { + start = 0; + end = LLONG_MAX; + } + + /* * We write the dirty pages in the range and wait until they complete * out of the ->i_mutex. If so, we can flush the dirty pages by * multi-task, and make the performance up. See @@ -2126,6 +2137,7 @@ */ ret = start_ordered_ops(inode, start, end); if (ret) { + up_write(&BTRFS_I(inode)->dio_sem); inode_unlock(inode); goto out; } diff -Nru linux-4.19.98/fs/btrfs/inode-map.c linux-4.19.118/fs/btrfs/inode-map.c --- linux-4.19.98/fs/btrfs/inode-map.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/inode-map.c 2020-04-23 08:30:24.000000000 +0000 @@ -12,6 +12,19 @@ #include "inode-map.h" #include "transaction.h" +static void fail_caching_thread(struct btrfs_root *root) +{ + struct btrfs_fs_info *fs_info = root->fs_info; + + btrfs_warn(fs_info, "failed to start inode caching task"); + btrfs_clear_pending_and_info(fs_info, INODE_MAP_CACHE, + "disabling inode map caching"); + spin_lock(&root->ino_cache_lock); + root->ino_cache_state = BTRFS_CACHE_ERROR; + spin_unlock(&root->ino_cache_lock); + wake_up(&root->ino_cache_wait); +} + static int caching_kthread(void *data) { struct btrfs_root *root = data; @@ -28,8 +41,10 @@ return 0; path = btrfs_alloc_path(); - if (!path) + if (!path) { + fail_caching_thread(root); return -ENOMEM; + } /* Since the commit root is read-only, we can safely skip locking. */ path->skip_locking = 1; @@ -145,6 +160,7 @@ spin_lock(&root->ino_cache_lock); root->ino_cache_state = BTRFS_CACHE_FINISHED; spin_unlock(&root->ino_cache_lock); + wake_up(&root->ino_cache_wait); return; } @@ -163,11 +179,8 @@ tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu", root->root_key.objectid); - if (IS_ERR(tsk)) { - btrfs_warn(fs_info, "failed to start inode caching task"); - btrfs_clear_pending_and_info(fs_info, INODE_MAP_CACHE, - "disabling inode map caching"); - } + if (IS_ERR(tsk)) + fail_caching_thread(root); } int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) @@ -185,11 +198,14 @@ wait_event(root->ino_cache_wait, root->ino_cache_state == BTRFS_CACHE_FINISHED || + root->ino_cache_state == BTRFS_CACHE_ERROR || root->free_ino_ctl->free_space > 0); if (root->ino_cache_state == BTRFS_CACHE_FINISHED && root->free_ino_ctl->free_space == 0) return -ENOSPC; + else if (root->ino_cache_state == BTRFS_CACHE_ERROR) + return btrfs_find_free_objectid(root, objectid); else goto again; } diff -Nru linux-4.19.98/fs/btrfs/inode.c linux-4.19.118/fs/btrfs/inode.c --- linux-4.19.98/fs/btrfs/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -10015,6 +10015,10 @@ ret = btrfs_sync_log(trans, BTRFS_I(old_inode)->root, &ctx); if (ret) commit_transaction = true; + } else if (sync_log) { + mutex_lock(&root->log_mutex); + list_del(&ctx.list); + mutex_unlock(&root->log_mutex); } if (commit_transaction) { ret = btrfs_commit_transaction(trans); @@ -10348,6 +10352,7 @@ struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_key ins; u64 cur_offset = start; + u64 clear_offset = start; u64 i_size; u64 cur_bytes; u64 last_alloc = (u64)-1; @@ -10382,6 +10387,15 @@ btrfs_end_transaction(trans); break; } + + /* + * We've reserved this space, and thus converted it from + * ->bytes_may_use to ->bytes_reserved. Any error that happens + * from here on out we will only need to clear our reservation + * for the remaining unreserved area, so advance our + * clear_offset by our extent size. + */ + clear_offset += ins.offset; btrfs_dec_block_group_reservations(fs_info, ins.objectid); last_alloc = ins.offset; @@ -10462,9 +10476,9 @@ if (own_trans) btrfs_end_transaction(trans); } - if (cur_offset < end) - btrfs_free_reserved_data_space(inode, NULL, cur_offset, - end - cur_offset + 1); + if (clear_offset < end) + btrfs_free_reserved_data_space(inode, NULL, clear_offset, + end - clear_offset + 1); return ret; } diff -Nru linux-4.19.98/fs/btrfs/ordered-data.c linux-4.19.118/fs/btrfs/ordered-data.c --- linux-4.19.98/fs/btrfs/ordered-data.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/ordered-data.c 2020-04-23 08:30:24.000000000 +0000 @@ -712,10 +712,15 @@ } btrfs_start_ordered_extent(inode, ordered, 1); end = ordered->file_offset; + /* + * If the ordered extent had an error save the error but don't + * exit without waiting first for all other ordered extents in + * the range to complete. + */ if (test_bit(BTRFS_ORDERED_IOERR, &ordered->flags)) ret = -EIO; btrfs_put_ordered_extent(ordered); - if (ret || end == 0 || end == start) + if (end == 0 || end == start) break; end--; } diff -Nru linux-4.19.98/fs/btrfs/qgroup.c linux-4.19.118/fs/btrfs/qgroup.c --- linux-4.19.98/fs/btrfs/qgroup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/qgroup.c 2020-04-23 08:30:24.000000000 +0000 @@ -1032,6 +1032,7 @@ ret = qgroup_rescan_init(fs_info, 0, 1); if (!ret) { qgroup_rescan_zero_tracking(fs_info); + fs_info->qgroup_rescan_running = true; btrfs_queue_work(fs_info->qgroup_rescan_workers, &fs_info->qgroup_rescan_work); } @@ -2906,7 +2907,6 @@ sizeof(fs_info->qgroup_rescan_progress)); fs_info->qgroup_rescan_progress.objectid = progress_objectid; init_completion(&fs_info->qgroup_rescan_completion); - fs_info->qgroup_rescan_running = true; spin_unlock(&fs_info->qgroup_lock); mutex_unlock(&fs_info->qgroup_rescan_lock); @@ -2972,8 +2972,11 @@ qgroup_rescan_zero_tracking(fs_info); + mutex_lock(&fs_info->qgroup_rescan_lock); + fs_info->qgroup_rescan_running = true; btrfs_queue_work(fs_info->qgroup_rescan_workers, &fs_info->qgroup_rescan_work); + mutex_unlock(&fs_info->qgroup_rescan_lock); return 0; } @@ -3009,9 +3012,13 @@ void btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info) { - if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) + if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { + mutex_lock(&fs_info->qgroup_rescan_lock); + fs_info->qgroup_rescan_running = true; btrfs_queue_work(fs_info->qgroup_rescan_workers, &fs_info->qgroup_rescan_work); + mutex_unlock(&fs_info->qgroup_rescan_lock); + } } /* diff -Nru linux-4.19.98/fs/btrfs/ref-verify.c linux-4.19.118/fs/btrfs/ref-verify.c --- linux-4.19.98/fs/btrfs/ref-verify.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/ref-verify.c 2020-04-23 08:30:24.000000000 +0000 @@ -747,6 +747,7 @@ */ be = add_block_entry(root->fs_info, bytenr, num_bytes, ref_root); if (IS_ERR(be)) { + kfree(ref); kfree(ra); ret = PTR_ERR(be); goto out; @@ -760,6 +761,8 @@ "re-allocated a block that still has references to it!"); dump_block_entry(fs_info, be); dump_ref_action(fs_info, ra); + kfree(ref); + kfree(ra); goto out_unlock; } @@ -822,6 +825,7 @@ "dropping a ref for a existing root that doesn't have a ref on the block"); dump_block_entry(fs_info, be); dump_ref_action(fs_info, ra); + kfree(ref); kfree(ra); goto out_unlock; } @@ -837,6 +841,7 @@ "attempting to add another ref for an existing ref on a tree block"); dump_block_entry(fs_info, be); dump_ref_action(fs_info, ra); + kfree(ref); kfree(ra); goto out_unlock; } diff -Nru linux-4.19.98/fs/btrfs/relocation.c linux-4.19.118/fs/btrfs/relocation.c --- linux-4.19.98/fs/btrfs/relocation.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/relocation.c 2020-04-23 08:30:24.000000000 +0000 @@ -525,8 +525,8 @@ if (!reloc_root) return 0; - if (btrfs_root_last_snapshot(&reloc_root->root_item) == - root->fs_info->running_transaction->transid - 1) + if (btrfs_header_generation(reloc_root->commit_root) == + root->fs_info->running_transaction->transid) return 0; /* * if there is reloc tree and it was created in previous @@ -1141,7 +1141,7 @@ free_backref_node(cache, lower); } - free_backref_node(cache, node); + remove_backref_node(cache, node); return ERR_PTR(err); } ASSERT(!node || !node->detached); @@ -1253,7 +1253,7 @@ if (!node) return -ENOMEM; - node->bytenr = root->node->start; + node->bytenr = root->commit_root->start; node->data = root; spin_lock(&rc->reloc_root_tree.lock); @@ -1284,10 +1284,11 @@ if (rc && root->node) { spin_lock(&rc->reloc_root_tree.lock); rb_node = tree_search(&rc->reloc_root_tree.rb_root, - root->node->start); + root->commit_root->start); if (rb_node) { node = rb_entry(rb_node, struct mapping_node, rb_node); rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); + RB_CLEAR_NODE(&node->rb_node); } spin_unlock(&rc->reloc_root_tree.lock); if (!node) @@ -1305,7 +1306,7 @@ * helper to update the 'address of tree root -> reloc tree' * mapping */ -static int __update_reloc_root(struct btrfs_root *root, u64 new_bytenr) +static int __update_reloc_root(struct btrfs_root *root) { struct btrfs_fs_info *fs_info = root->fs_info; struct rb_node *rb_node; @@ -1314,7 +1315,7 @@ spin_lock(&rc->reloc_root_tree.lock); rb_node = tree_search(&rc->reloc_root_tree.rb_root, - root->node->start); + root->commit_root->start); if (rb_node) { node = rb_entry(rb_node, struct mapping_node, rb_node); rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); @@ -1326,7 +1327,7 @@ BUG_ON((struct btrfs_root *)node->data != root); spin_lock(&rc->reloc_root_tree.lock); - node->bytenr = new_bytenr; + node->bytenr = root->node->start; rb_node = tree_insert(&rc->reloc_root_tree.rb_root, node->bytenr, &node->rb_node); spin_unlock(&rc->reloc_root_tree.lock); @@ -1471,6 +1472,7 @@ } if (reloc_root->commit_root != reloc_root->node) { + __update_reloc_root(reloc_root); btrfs_set_root_node(root_item, reloc_root->node); free_extent_buffer(reloc_root->commit_root); reloc_root->commit_root = btrfs_root_node(reloc_root); @@ -2434,7 +2436,21 @@ free_reloc_roots(&reloc_roots); } - BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root)); + /* + * We used to have + * + * BUG_ON(!RB_EMPTY_ROOT(&rc->reloc_root_tree.rb_root)); + * + * here, but it's wrong. If we fail to start the transaction in + * prepare_to_merge() we will have only 0 ref reloc roots, none of which + * have actually been removed from the reloc_root_tree rb tree. This is + * fine because we're bailing here, and we hold a reference on the root + * for the list that holds it, so these roots will be cleaned up when we + * do the reloc_dirty_list afterwards. Meanwhile the root->reloc_root + * will be cleaned up on unmount. + * + * The remaining nodes will be cleaned up by free_reloc_control. + */ } static void free_block_list(struct rb_root *blocks) @@ -4585,11 +4601,6 @@ BUG_ON(rc->stage == UPDATE_DATA_PTRS && root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID); - if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) { - if (buf == root->node) - __update_reloc_root(root, cow->start); - } - level = btrfs_header_level(buf); if (btrfs_header_generation(buf) <= btrfs_root_last_snapshot(&root->root_item)) diff -Nru linux-4.19.98/fs/btrfs/super.c linux-4.19.118/fs/btrfs/super.c --- linux-4.19.98/fs/btrfs/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -1857,6 +1857,8 @@ } if (btrfs_super_log_root(fs_info->super_copy) != 0) { + btrfs_warn(fs_info, + "mount required to replay tree-log, cannot remount read-write"); ret = -EINVAL; goto restore; } @@ -2167,7 +2169,15 @@ */ thresh = SZ_4M; - if (!mixed && total_free_meta - thresh < block_rsv->size) + /* + * We only want to claim there's no available space if we can no longer + * allocate chunks for our metadata profile and our global reserve will + * not fit in the free metadata space. If we aren't ->full then we + * still can allocate chunks and thus are fine using the currently + * calculated f_bavail. + */ + if (!mixed && block_rsv->space_info->full && + total_free_meta - thresh < block_rsv->size) buf->f_bavail = 0; buf->f_type = BTRFS_SUPER_MAGIC; diff -Nru linux-4.19.98/fs/btrfs/tests/btrfs-tests.c linux-4.19.118/fs/btrfs/tests/btrfs-tests.c --- linux-4.19.98/fs/btrfs/tests/btrfs-tests.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/tests/btrfs-tests.c 2020-04-23 08:30:24.000000000 +0000 @@ -102,7 +102,6 @@ spin_lock_init(&fs_info->qgroup_op_lock); spin_lock_init(&fs_info->super_lock); spin_lock_init(&fs_info->fs_roots_radix_lock); - spin_lock_init(&fs_info->tree_mod_seq_lock); mutex_init(&fs_info->qgroup_ioctl_lock); mutex_init(&fs_info->qgroup_rescan_lock); rwlock_init(&fs_info->tree_mod_log_lock); diff -Nru linux-4.19.98/fs/btrfs/transaction.c linux-4.19.118/fs/btrfs/transaction.c --- linux-4.19.98/fs/btrfs/transaction.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/transaction.c 2020-04-23 08:30:24.000000000 +0000 @@ -1936,6 +1936,14 @@ struct btrfs_transaction *prev_trans = NULL; int ret; + /* + * Some places just start a transaction to commit it. We need to make + * sure that if this commit fails that the abort code actually marks the + * transaction as failed, so set trans->dirty to make the abort code do + * the right thing. + */ + trans->dirty = true; + /* Stop the commit early if ->aborted is set */ if (unlikely(READ_ONCE(cur_trans->aborted))) { ret = cur_trans->aborted; diff -Nru linux-4.19.98/fs/btrfs/tree-log.c linux-4.19.118/fs/btrfs/tree-log.c --- linux-4.19.98/fs/btrfs/tree-log.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/tree-log.c 2020-04-23 08:30:24.000000000 +0000 @@ -3892,7 +3892,7 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, struct btrfs_inode *inode, struct btrfs_path *dst_path, - struct btrfs_path *src_path, u64 *last_extent, + struct btrfs_path *src_path, int start_slot, int nr, int inode_only, u64 logged_isize) { @@ -3903,7 +3903,6 @@ struct btrfs_file_extent_item *extent; struct btrfs_inode_item *inode_item; struct extent_buffer *src = src_path->nodes[0]; - struct btrfs_key first_key, last_key, key; int ret; struct btrfs_key *ins_keys; u32 *ins_sizes; @@ -3911,9 +3910,6 @@ int i; struct list_head ordered_sums; int skip_csum = inode->flags & BTRFS_INODE_NODATASUM; - bool has_extents = false; - bool need_find_last_extent = true; - bool done = false; INIT_LIST_HEAD(&ordered_sums); @@ -3922,8 +3918,6 @@ if (!ins_data) return -ENOMEM; - first_key.objectid = (u64)-1; - ins_sizes = (u32 *)ins_data; ins_keys = (struct btrfs_key *)(ins_data + nr * sizeof(u32)); @@ -3944,9 +3938,6 @@ src_offset = btrfs_item_ptr_offset(src, start_slot + i); - if (i == nr - 1) - last_key = ins_keys[i]; - if (ins_keys[i].type == BTRFS_INODE_ITEM_KEY) { inode_item = btrfs_item_ptr(dst_path->nodes[0], dst_path->slots[0], @@ -3960,20 +3951,6 @@ src_offset, ins_sizes[i]); } - /* - * We set need_find_last_extent here in case we know we were - * processing other items and then walk into the first extent in - * the inode. If we don't hit an extent then nothing changes, - * we'll do the last search the next time around. - */ - if (ins_keys[i].type == BTRFS_EXTENT_DATA_KEY) { - has_extents = true; - if (first_key.objectid == (u64)-1) - first_key = ins_keys[i]; - } else { - need_find_last_extent = false; - } - /* take a reference on file data extents so that truncates * or deletes of this inode don't have to relog the inode * again @@ -4039,167 +4016,6 @@ kfree(sums); } - if (!has_extents) - return ret; - - if (need_find_last_extent && *last_extent == first_key.offset) { - /* - * We don't have any leafs between our current one and the one - * we processed before that can have file extent items for our - * inode (and have a generation number smaller than our current - * transaction id). - */ - need_find_last_extent = false; - } - - /* - * Because we use btrfs_search_forward we could skip leaves that were - * not modified and then assume *last_extent is valid when it really - * isn't. So back up to the previous leaf and read the end of the last - * extent before we go and fill in holes. - */ - if (need_find_last_extent) { - u64 len; - - ret = btrfs_prev_leaf(inode->root, src_path); - if (ret < 0) - return ret; - if (ret) - goto fill_holes; - if (src_path->slots[0]) - src_path->slots[0]--; - src = src_path->nodes[0]; - btrfs_item_key_to_cpu(src, &key, src_path->slots[0]); - if (key.objectid != btrfs_ino(inode) || - key.type != BTRFS_EXTENT_DATA_KEY) - goto fill_holes; - extent = btrfs_item_ptr(src, src_path->slots[0], - struct btrfs_file_extent_item); - if (btrfs_file_extent_type(src, extent) == - BTRFS_FILE_EXTENT_INLINE) { - len = btrfs_file_extent_ram_bytes(src, extent); - *last_extent = ALIGN(key.offset + len, - fs_info->sectorsize); - } else { - len = btrfs_file_extent_num_bytes(src, extent); - *last_extent = key.offset + len; - } - } -fill_holes: - /* So we did prev_leaf, now we need to move to the next leaf, but a few - * things could have happened - * - * 1) A merge could have happened, so we could currently be on a leaf - * that holds what we were copying in the first place. - * 2) A split could have happened, and now not all of the items we want - * are on the same leaf. - * - * So we need to adjust how we search for holes, we need to drop the - * path and re-search for the first extent key we found, and then walk - * forward until we hit the last one we copied. - */ - if (need_find_last_extent) { - /* btrfs_prev_leaf could return 1 without releasing the path */ - btrfs_release_path(src_path); - ret = btrfs_search_slot(NULL, inode->root, &first_key, - src_path, 0, 0); - if (ret < 0) - return ret; - ASSERT(ret == 0); - src = src_path->nodes[0]; - i = src_path->slots[0]; - } else { - i = start_slot; - } - - /* - * Ok so here we need to go through and fill in any holes we may have - * to make sure that holes are punched for those areas in case they had - * extents previously. - */ - while (!done) { - u64 offset, len; - u64 extent_end; - - if (i >= btrfs_header_nritems(src_path->nodes[0])) { - ret = btrfs_next_leaf(inode->root, src_path); - if (ret < 0) - return ret; - ASSERT(ret == 0); - src = src_path->nodes[0]; - i = 0; - need_find_last_extent = true; - } - - btrfs_item_key_to_cpu(src, &key, i); - if (!btrfs_comp_cpu_keys(&key, &last_key)) - done = true; - if (key.objectid != btrfs_ino(inode) || - key.type != BTRFS_EXTENT_DATA_KEY) { - i++; - continue; - } - extent = btrfs_item_ptr(src, i, struct btrfs_file_extent_item); - if (btrfs_file_extent_type(src, extent) == - BTRFS_FILE_EXTENT_INLINE) { - len = btrfs_file_extent_ram_bytes(src, extent); - extent_end = ALIGN(key.offset + len, - fs_info->sectorsize); - } else { - len = btrfs_file_extent_num_bytes(src, extent); - extent_end = key.offset + len; - } - i++; - - if (*last_extent == key.offset) { - *last_extent = extent_end; - continue; - } - offset = *last_extent; - len = key.offset - *last_extent; - ret = btrfs_insert_file_extent(trans, log, btrfs_ino(inode), - offset, 0, 0, len, 0, len, 0, 0, 0); - if (ret) - break; - *last_extent = extent_end; - } - - /* - * Check if there is a hole between the last extent found in our leaf - * and the first extent in the next leaf. If there is one, we need to - * log an explicit hole so that at replay time we can punch the hole. - */ - if (ret == 0 && - key.objectid == btrfs_ino(inode) && - key.type == BTRFS_EXTENT_DATA_KEY && - i == btrfs_header_nritems(src_path->nodes[0])) { - ret = btrfs_next_leaf(inode->root, src_path); - need_find_last_extent = true; - if (ret > 0) { - ret = 0; - } else if (ret == 0) { - btrfs_item_key_to_cpu(src_path->nodes[0], &key, - src_path->slots[0]); - if (key.objectid == btrfs_ino(inode) && - key.type == BTRFS_EXTENT_DATA_KEY && - *last_extent < key.offset) { - const u64 len = key.offset - *last_extent; - - ret = btrfs_insert_file_extent(trans, log, - btrfs_ino(inode), - *last_extent, 0, - 0, len, 0, len, - 0, 0, 0); - *last_extent += len; - } - } - } - /* - * Need to let the callers know we dropped the path so they should - * re-search. - */ - if (!ret && need_find_last_extent) - ret = 1; return ret; } @@ -4365,7 +4181,7 @@ const u64 i_size = i_size_read(&inode->vfs_inode); const u64 ino = btrfs_ino(inode); struct btrfs_path *dst_path = NULL; - u64 last_extent = (u64)-1; + bool dropped_extents = false; int ins_nr = 0; int start_slot; int ret; @@ -4387,8 +4203,7 @@ if (slot >= btrfs_header_nritems(leaf)) { if (ins_nr > 0) { ret = copy_items(trans, inode, dst_path, path, - &last_extent, start_slot, - ins_nr, 1, 0); + start_slot, ins_nr, 1, 0); if (ret < 0) goto out; ins_nr = 0; @@ -4412,8 +4227,7 @@ path->slots[0]++; continue; } - if (last_extent == (u64)-1) { - last_extent = key.offset; + if (!dropped_extents) { /* * Avoid logging extent items logged in past fsync calls * and leading to duplicate keys in the log tree. @@ -4427,6 +4241,7 @@ } while (ret == -EAGAIN); if (ret) goto out; + dropped_extents = true; } if (ins_nr == 0) start_slot = slot; @@ -4441,7 +4256,7 @@ } } if (ins_nr > 0) { - ret = copy_items(trans, inode, dst_path, path, &last_extent, + ret = copy_items(trans, inode, dst_path, path, start_slot, ins_nr, 1, 0); if (ret > 0) ret = 0; @@ -4636,13 +4451,8 @@ if (slot >= nritems) { if (ins_nr > 0) { - u64 last_extent = 0; - ret = copy_items(trans, inode, dst_path, path, - &last_extent, start_slot, - ins_nr, 1, 0); - /* can't be 1, extent items aren't processed */ - ASSERT(ret <= 0); + start_slot, ins_nr, 1, 0); if (ret < 0) return ret; ins_nr = 0; @@ -4666,13 +4476,8 @@ cond_resched(); } if (ins_nr > 0) { - u64 last_extent = 0; - ret = copy_items(trans, inode, dst_path, path, - &last_extent, start_slot, - ins_nr, 1, 0); - /* can't be 1, extent items aren't processed */ - ASSERT(ret <= 0); + start_slot, ins_nr, 1, 0); if (ret < 0) return ret; } @@ -4681,100 +4486,119 @@ } /* - * If the no holes feature is enabled we need to make sure any hole between the - * last extent and the i_size of our inode is explicitly marked in the log. This - * is to make sure that doing something like: - * - * 1) create file with 128Kb of data - * 2) truncate file to 64Kb - * 3) truncate file to 256Kb - * 4) fsync file - * 5) - * 6) mount fs and trigger log replay - * - * Will give us a file with a size of 256Kb, the first 64Kb of data match what - * the file had in its first 64Kb of data at step 1 and the last 192Kb of the - * file correspond to a hole. The presence of explicit holes in a log tree is - * what guarantees that log replay will remove/adjust file extent items in the - * fs/subvol tree. - * - * Here we do not need to care about holes between extents, that is already done - * by copy_items(). We also only need to do this in the full sync path, where we - * lookup for extents from the fs/subvol tree only. In the fast path case, we - * lookup the list of modified extent maps and if any represents a hole, we - * insert a corresponding extent representing a hole in the log tree. + * When using the NO_HOLES feature if we punched a hole that causes the + * deletion of entire leafs or all the extent items of the first leaf (the one + * that contains the inode item and references) we may end up not processing + * any extents, because there are no leafs with a generation matching the + * current transaction that have extent items for our inode. So we need to find + * if any holes exist and then log them. We also need to log holes after any + * truncate operation that changes the inode's size. */ -static int btrfs_log_trailing_hole(struct btrfs_trans_handle *trans, - struct btrfs_root *root, - struct btrfs_inode *inode, - struct btrfs_path *path) +static int btrfs_log_holes(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + struct btrfs_inode *inode, + struct btrfs_path *path) { struct btrfs_fs_info *fs_info = root->fs_info; - int ret; struct btrfs_key key; - u64 hole_start; - u64 hole_size; - struct extent_buffer *leaf; - struct btrfs_root *log = root->log_root; const u64 ino = btrfs_ino(inode); const u64 i_size = i_size_read(&inode->vfs_inode); + u64 prev_extent_end = 0; + int ret; - if (!btrfs_fs_incompat(fs_info, NO_HOLES)) + if (!btrfs_fs_incompat(fs_info, NO_HOLES) || i_size == 0) return 0; key.objectid = ino; key.type = BTRFS_EXTENT_DATA_KEY; - key.offset = (u64)-1; + key.offset = 0; ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - ASSERT(ret != 0); if (ret < 0) return ret; - ASSERT(path->slots[0] > 0); - path->slots[0]--; - leaf = path->nodes[0]; - btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); - - if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) { - /* inode does not have any extents */ - hole_start = 0; - hole_size = i_size; - } else { + while (true) { struct btrfs_file_extent_item *extent; + struct extent_buffer *leaf = path->nodes[0]; u64 len; - /* - * If there's an extent beyond i_size, an explicit hole was - * already inserted by copy_items(). - */ - if (key.offset >= i_size) - return 0; + if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { + ret = btrfs_next_leaf(root, path); + if (ret < 0) + return ret; + if (ret > 0) { + ret = 0; + break; + } + leaf = path->nodes[0]; + } + + btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); + if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) + break; + + /* We have a hole, log it. */ + if (prev_extent_end < key.offset) { + const u64 hole_len = key.offset - prev_extent_end; + + /* + * Release the path to avoid deadlocks with other code + * paths that search the root while holding locks on + * leafs from the log root. + */ + btrfs_release_path(path); + ret = btrfs_insert_file_extent(trans, root->log_root, + ino, prev_extent_end, 0, + 0, hole_len, 0, hole_len, + 0, 0, 0); + if (ret < 0) + return ret; + + /* + * Search for the same key again in the root. Since it's + * an extent item and we are holding the inode lock, the + * key must still exist. If it doesn't just emit warning + * and return an error to fall back to a transaction + * commit. + */ + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + if (ret < 0) + return ret; + if (WARN_ON(ret > 0)) + return -ENOENT; + leaf = path->nodes[0]; + } extent = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item); - if (btrfs_file_extent_type(leaf, extent) == - BTRFS_FILE_EXTENT_INLINE) - return 0; + BTRFS_FILE_EXTENT_INLINE) { + len = btrfs_file_extent_ram_bytes(leaf, extent); + prev_extent_end = ALIGN(key.offset + len, + fs_info->sectorsize); + } else { + len = btrfs_file_extent_num_bytes(leaf, extent); + prev_extent_end = key.offset + len; + } - len = btrfs_file_extent_num_bytes(leaf, extent); - /* Last extent goes beyond i_size, no need to log a hole. */ - if (key.offset + len > i_size) - return 0; - hole_start = key.offset + len; - hole_size = i_size - hole_start; + path->slots[0]++; + cond_resched(); } - btrfs_release_path(path); - /* Last extent ends at i_size. */ - if (hole_size == 0) - return 0; + if (prev_extent_end < i_size) { + u64 hole_len; - hole_size = ALIGN(hole_size, fs_info->sectorsize); - ret = btrfs_insert_file_extent(trans, log, ino, hole_start, 0, 0, - hole_size, 0, hole_size, 0, 0, 0); - return ret; + btrfs_release_path(path); + hole_len = ALIGN(i_size - prev_extent_end, fs_info->sectorsize); + ret = btrfs_insert_file_extent(trans, root->log_root, + ino, prev_extent_end, 0, 0, + hole_len, 0, hole_len, + 0, 0, 0); + if (ret < 0) + return ret; + } + + return 0; } /* @@ -4934,7 +4758,6 @@ struct btrfs_key min_key; struct btrfs_key max_key; struct btrfs_root *log = root->log_root; - u64 last_extent = 0; int err = 0; int ret; int nritems; @@ -5108,7 +4931,7 @@ ins_start_slot = path->slots[0]; } ret = copy_items(trans, inode, dst_path, path, - &last_extent, ins_start_slot, + ins_start_slot, ins_nr, inode_only, logged_isize); if (ret < 0) { @@ -5161,17 +4984,13 @@ if (ins_nr == 0) goto next_slot; ret = copy_items(trans, inode, dst_path, path, - &last_extent, ins_start_slot, + ins_start_slot, ins_nr, inode_only, logged_isize); if (ret < 0) { err = ret; goto out_unlock; } ins_nr = 0; - if (ret) { - btrfs_release_path(path); - continue; - } goto next_slot; } @@ -5184,18 +5003,13 @@ goto next_slot; } - ret = copy_items(trans, inode, dst_path, path, &last_extent, + ret = copy_items(trans, inode, dst_path, path, ins_start_slot, ins_nr, inode_only, logged_isize); if (ret < 0) { err = ret; goto out_unlock; } - if (ret) { - ins_nr = 0; - btrfs_release_path(path); - continue; - } ins_nr = 1; ins_start_slot = path->slots[0]; next_slot: @@ -5209,13 +5023,12 @@ } if (ins_nr) { ret = copy_items(trans, inode, dst_path, path, - &last_extent, ins_start_slot, + ins_start_slot, ins_nr, inode_only, logged_isize); if (ret < 0) { err = ret; goto out_unlock; } - ret = 0; ins_nr = 0; } btrfs_release_path(path); @@ -5230,14 +5043,13 @@ } } if (ins_nr) { - ret = copy_items(trans, inode, dst_path, path, &last_extent, + ret = copy_items(trans, inode, dst_path, path, ins_start_slot, ins_nr, inode_only, logged_isize); if (ret < 0) { err = ret; goto out_unlock; } - ret = 0; ins_nr = 0; } @@ -5250,7 +5062,7 @@ if (max_key.type >= BTRFS_EXTENT_DATA_KEY && !fast_search) { btrfs_release_path(path); btrfs_release_path(dst_path); - err = btrfs_log_trailing_hole(trans, root, inode, path); + err = btrfs_log_holes(trans, root, inode, path); if (err) goto out_unlock; } diff -Nru linux-4.19.98/fs/btrfs/volumes.c linux-4.19.118/fs/btrfs/volumes.c --- linux-4.19.98/fs/btrfs/volumes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/btrfs/volumes.c 2020-04-23 08:30:24.000000000 +0000 @@ -7260,6 +7260,8 @@ else btrfs_dev_stat_reset(dev, i); } + btrfs_info(fs_info, "device stats zeroed by %s (%d)", + current->comm, task_pid_nr(current)); } else { for (i = 0; i < BTRFS_DEV_STAT_VALUES_MAX; i++) if (stats->nr_items > i) diff -Nru linux-4.19.98/fs/buffer.c linux-4.19.118/fs/buffer.c --- linux-4.19.98/fs/buffer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/buffer.c 2020-04-23 08:30:24.000000000 +0000 @@ -1336,6 +1336,17 @@ } EXPORT_SYMBOL(__breadahead); +void __breadahead_gfp(struct block_device *bdev, sector_t block, unsigned size, + gfp_t gfp) +{ + struct buffer_head *bh = __getblk_gfp(bdev, block, size, gfp); + if (likely(bh)) { + ll_rw_block(REQ_OP_READ, REQ_RAHEAD, 1, &bh); + brelse(bh); + } +} +EXPORT_SYMBOL(__breadahead_gfp); + /** * __bread_gfp() - reads a specified block and returns the bh * @bdev: the block_device to read from diff -Nru linux-4.19.98/fs/ceph/file.c linux-4.19.118/fs/ceph/file.c --- linux-4.19.98/fs/ceph/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ceph/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -1384,9 +1384,12 @@ struct inode *inode = file_inode(file); struct ceph_inode_info *ci = ceph_inode(inode); struct ceph_fs_client *fsc = ceph_inode_to_client(inode); + struct ceph_osd_client *osdc = &fsc->client->osdc; struct ceph_cap_flush *prealloc_cf; ssize_t count, written = 0; int err, want, got; + u32 map_flags; + u64 pool_flags; loff_t pos; loff_t limit = max(i_size_read(inode), fsc->max_file_size); @@ -1441,8 +1444,12 @@ goto out; } - /* FIXME: not complete since it doesn't account for being at quota */ - if (ceph_osdmap_flag(&fsc->client->osdc, CEPH_OSDMAP_FULL)) { + down_read(&osdc->lock); + map_flags = osdc->osdmap->flags; + pool_flags = ceph_pg_pool_flags(osdc->osdmap, ci->i_layout.pool_id); + up_read(&osdc->lock); + if ((map_flags & CEPH_OSDMAP_FULL) || + (pool_flags & CEPH_POOL_FLAG_FULL)) { err = -ENOSPC; goto out; } @@ -1532,7 +1539,8 @@ } if (written >= 0) { - if (ceph_osdmap_flag(&fsc->client->osdc, CEPH_OSDMAP_NEARFULL)) + if ((map_flags & CEPH_OSDMAP_NEARFULL) || + (pool_flags & CEPH_POOL_FLAG_NEARFULL)) iocb->ki_flags |= IOCB_DSYNC; written = generic_write_sync(iocb, written); } diff -Nru linux-4.19.98/fs/ceph/mds_client.c linux-4.19.118/fs/ceph/mds_client.c --- linux-4.19.98/fs/ceph/mds_client.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ceph/mds_client.c 2020-04-23 08:30:24.000000000 +0000 @@ -2343,8 +2343,7 @@ if (!(mdsc->fsc->mount_options->flags & CEPH_MOUNT_OPT_MOUNTWAIT) && !ceph_mdsmap_is_cluster_available(mdsc->mdsmap)) { - err = -ENOENT; - pr_info("probably no mds server is up\n"); + err = -EHOSTUNREACH; goto finish; } } diff -Nru linux-4.19.98/fs/ceph/super.c linux-4.19.118/fs/ceph/super.c --- linux-4.19.98/fs/ceph/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ceph/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -105,7 +105,6 @@ return 0; } - static int ceph_sync_fs(struct super_block *sb, int wait) { struct ceph_fs_client *fsc = ceph_sb_to_client(sb); @@ -206,6 +205,26 @@ {-1, NULL} }; +/* + * Remove adjacent slashes and then the trailing slash, unless it is + * the only remaining character. + * + * E.g. "//dir1////dir2///" --> "/dir1/dir2", "///" --> "/". + */ +static void canonicalize_path(char *path) +{ + int i, j = 0; + + for (i = 0; path[i] != '\0'; i++) { + if (path[i] != '/' || j < 1 || path[j - 1] != '/') + path[j++] = path[i]; + } + + if (j > 1 && path[j - 1] == '/') + j--; + path[j] = '\0'; +} + static int parse_fsopt_token(char *c, void *private) { struct ceph_mount_options *fsopt = private; @@ -415,12 +434,15 @@ ret = strcmp_null(fsopt1->snapdir_name, fsopt2->snapdir_name); if (ret) return ret; + ret = strcmp_null(fsopt1->mds_namespace, fsopt2->mds_namespace); if (ret) return ret; + ret = strcmp_null(fsopt1->server_path, fsopt2->server_path); if (ret) return ret; + ret = strcmp_null(fsopt1->fscache_uniq, fsopt2->fscache_uniq); if (ret) return ret; @@ -476,13 +498,17 @@ */ dev_name_end = strchr(dev_name, '/'); if (dev_name_end) { - if (strlen(dev_name_end) > 1) { - fsopt->server_path = kstrdup(dev_name_end, GFP_KERNEL); - if (!fsopt->server_path) { - err = -ENOMEM; - goto out; - } + /* + * The server_path will include the whole chars from userland + * including the leading '/'. + */ + fsopt->server_path = kstrdup(dev_name_end, GFP_KERNEL); + if (!fsopt->server_path) { + err = -ENOMEM; + goto out; } + + canonicalize_path(fsopt->server_path); } else { dev_name_end = dev_name + strlen(dev_name); } @@ -810,7 +836,6 @@ ceph_fscache_unregister(); } - /* * ceph_umount_begin - initiate forced umount. Tear down down the * mount, skipping steps that may hang while waiting for server(s). @@ -897,9 +922,6 @@ return root; } - - - /* * mount: join the ceph cluster, and open root directory. */ @@ -913,7 +935,9 @@ mutex_lock(&fsc->client->mount_mutex); if (!fsc->sb->s_root) { - const char *path; + const char *path = fsc->mount_options->server_path ? + fsc->mount_options->server_path + 1 : ""; + err = __ceph_open_session(fsc->client, started); if (err < 0) goto out; @@ -925,13 +949,7 @@ goto out; } - if (!fsc->mount_options->server_path) { - path = ""; - dout("mount opening path \\t\n"); - } else { - path = fsc->mount_options->server_path + 1; - dout("mount opening path %s\n", path); - } + dout("mount opening path '%s'\n", path); err = ceph_fs_debugfs_init(fsc); if (err < 0) @@ -1106,6 +1124,11 @@ return res; out_splat: + if (!ceph_mdsmap_is_cluster_available(fsc->mdsc->mdsmap)) { + pr_info("No mds server is up or the cluster is laggy\n"); + err = -EHOSTUNREACH; + } + ceph_mdsc_close_sessions(fsc->mdsc); deactivate_locked_super(sb); goto out_final; diff -Nru linux-4.19.98/fs/ceph/super.h linux-4.19.118/fs/ceph/super.h --- linux-4.19.98/fs/ceph/super.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ceph/super.h 2020-04-23 08:30:24.000000000 +0000 @@ -86,7 +86,7 @@ char *snapdir_name; /* default ".snap" */ char *mds_namespace; /* default NULL */ - char *server_path; /* default "/" */ + char *server_path; /* default NULL (means "/") */ char *fscache_uniq; /* default NULL */ }; diff -Nru linux-4.19.98/fs/ceph/xattr.c linux-4.19.118/fs/ceph/xattr.c --- linux-4.19.98/fs/ceph/xattr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ceph/xattr.c 2020-04-23 08:30:24.000000000 +0000 @@ -221,7 +221,7 @@ static size_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, size_t size) { - return snprintf(val, size, "%lld.09%ld", ci->i_rctime.tv_sec, + return snprintf(val, size, "%lld.%09ld", ci->i_rctime.tv_sec, ci->i_rctime.tv_nsec); } diff -Nru linux-4.19.98/fs/cifs/cifsacl.c linux-4.19.118/fs/cifs/cifsacl.c --- linux-4.19.98/fs/cifs/cifsacl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/cifsacl.c 2020-04-23 08:30:24.000000000 +0000 @@ -603,7 +603,7 @@ ((flags & FILE_EXEC_RIGHTS) == FILE_EXEC_RIGHTS)) *pmode |= (S_IXUGO & (*pbits_to_set)); - cifs_dbg(NOISY, "access flags 0x%x mode now 0x%x\n", flags, *pmode); + cifs_dbg(NOISY, "access flags 0x%x mode now %04o\n", flags, *pmode); return; } @@ -632,7 +632,7 @@ if (mode & S_IXUGO) *pace_flags |= SET_FILE_EXEC_RIGHTS; - cifs_dbg(NOISY, "mode: 0x%x, access flags now 0x%x\n", + cifs_dbg(NOISY, "mode: %04o, access flags now 0x%x\n", mode, *pace_flags); return; } diff -Nru linux-4.19.98/fs/cifs/connect.c linux-4.19.118/fs/cifs/connect.c --- linux-4.19.98/fs/cifs/connect.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/connect.c 2020-04-23 08:30:24.000000000 +0000 @@ -970,6 +970,7 @@ mempool_resize(cifs_req_poolp, length + cifs_min_rcv); set_freezable(); + allow_kernel_signal(SIGKILL); while (server->tcpStatus != CifsExiting) { if (try_to_freeze()) continue; @@ -2454,7 +2455,7 @@ task = xchg(&server->tsk, NULL); if (task) - force_sig(SIGKILL, task); + send_sig(SIGKILL, task, 1); } static struct TCP_Server_Info * @@ -3341,8 +3342,10 @@ { struct cifs_sb_info *old = CIFS_SB(sb); struct cifs_sb_info *new = mnt_data->cifs_sb; - bool old_set = old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH; - bool new_set = new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH; + bool old_set = (old->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) && + old->prepath; + bool new_set = (new->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH) && + new->prepath; if (old_set && new_set && !strcmp(new->prepath, old->prepath)) return 1; @@ -3791,7 +3794,7 @@ cifs_sb->mnt_gid = pvolume_info->linux_gid; cifs_sb->mnt_file_mode = pvolume_info->file_mode; cifs_sb->mnt_dir_mode = pvolume_info->dir_mode; - cifs_dbg(FYI, "file mode: 0x%hx dir mode: 0x%hx\n", + cifs_dbg(FYI, "file mode: %04ho dir mode: %04ho\n", cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode); cifs_sb->actimeo = pvolume_info->actimeo; diff -Nru linux-4.19.98/fs/cifs/dir.c linux-4.19.118/fs/cifs/dir.c --- linux-4.19.98/fs/cifs/dir.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/dir.c 2020-04-23 08:30:24.000000000 +0000 @@ -561,7 +561,6 @@ if (server->ops->close) server->ops->close(xid, tcon, &fid); cifs_del_pending_open(&open); - fput(file); rc = -ENOMEM; } diff -Nru linux-4.19.98/fs/cifs/file.c linux-4.19.118/fs/cifs/file.c --- linux-4.19.98/fs/cifs/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -3339,7 +3339,7 @@ if (rc == -ENODATA) rc = 0; - ctx->rc = (rc == 0) ? ctx->total_len : rc; + ctx->rc = (rc == 0) ? (ssize_t)ctx->total_len : rc; mutex_unlock(&ctx->aio_mutex); diff -Nru linux-4.19.98/fs/cifs/inode.c linux-4.19.118/fs/cifs/inode.c --- linux-4.19.98/fs/cifs/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -1579,7 +1579,7 @@ struct TCP_Server_Info *server; char *full_path; - cifs_dbg(FYI, "In cifs_mkdir, mode = 0x%hx inode = 0x%p\n", + cifs_dbg(FYI, "In cifs_mkdir, mode = %04ho inode = 0x%p\n", mode, inode); cifs_sb = CIFS_SB(inode->i_sb); @@ -2003,6 +2003,7 @@ struct inode *inode = d_inode(dentry); struct super_block *sb = dentry->d_sb; char *full_path = NULL; + int count = 0; if (inode == NULL) return -ENOENT; @@ -2024,15 +2025,18 @@ full_path, inode, inode->i_count.counter, dentry, cifs_get_time(dentry), jiffies); +again: if (cifs_sb_master_tcon(CIFS_SB(sb))->unix_ext) rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid); else rc = cifs_get_inode_info(&inode, full_path, NULL, sb, xid, NULL); - + if (rc == -EAGAIN && count++ < 10) + goto again; out: kfree(full_path); free_xid(xid); + return rc; } diff -Nru linux-4.19.98/fs/cifs/smb2misc.c linux-4.19.118/fs/cifs/smb2misc.c --- linux-4.19.98/fs/cifs/smb2misc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/smb2misc.c 2020-04-23 08:30:24.000000000 +0000 @@ -750,7 +750,7 @@ { struct close_cancelled_open *cancelled; - cancelled = kzalloc(sizeof(*cancelled), GFP_KERNEL); + cancelled = kzalloc(sizeof(*cancelled), GFP_ATOMIC); if (!cancelled) return -ENOMEM; diff -Nru linux-4.19.98/fs/cifs/smb2pdu.c linux-4.19.118/fs/cifs/smb2pdu.c --- linux-4.19.98/fs/cifs/smb2pdu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/smb2pdu.c 2020-04-23 08:30:24.000000000 +0000 @@ -259,9 +259,14 @@ } rc = cifs_negotiate_protocol(0, tcon->ses); - if (!rc && tcon->ses->need_reconnect) + if (!rc && tcon->ses->need_reconnect) { rc = cifs_setup_session(0, tcon->ses, nls_codepage); - + if ((rc == -EACCES) && !tcon->retry) { + rc = -EHOSTDOWN; + mutex_unlock(&tcon->ses->session_mutex); + goto failed; + } + } if (rc || !tcon->need_reconnect) { mutex_unlock(&tcon->ses->session_mutex); goto out; @@ -306,6 +311,7 @@ case SMB2_SET_INFO: rc = -EAGAIN; } +failed: unload_nls(nls_codepage); return rc; } @@ -3130,8 +3136,8 @@ struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)rdata->iov[0].iov_base; unsigned int credits_received = 0; - struct smb_rqst rqst = { .rq_iov = rdata->iov, - .rq_nvec = 2, + struct smb_rqst rqst = { .rq_iov = &rdata->iov[1], + .rq_nvec = 1, .rq_pages = rdata->pages, .rq_offset = rdata->page_offset, .rq_npages = rdata->nr_pages, @@ -3419,6 +3425,9 @@ wdata->cfile->fid.persistent_fid, tcon->tid, tcon->ses->Suid, wdata->offset, wdata->bytes, wdata->result); + if (wdata->result == -ENOSPC) + printk_once(KERN_WARNING "Out of space writing to %s\n", + tcon->treeName); } else trace_smb3_write_done(0 /* no xid */, wdata->cfile->fid.persistent_fid, diff -Nru linux-4.19.98/fs/cifs/transport.c linux-4.19.118/fs/cifs/transport.c --- linux-4.19.98/fs/cifs/transport.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/cifs/transport.c 2020-04-23 08:30:24.000000000 +0000 @@ -392,7 +392,7 @@ struct smb_rqst *rqst, int flags) { struct kvec iov; - struct smb2_transform_hdr tr_hdr; + struct smb2_transform_hdr *tr_hdr; struct smb_rqst cur_rqst[MAX_COMPOUND]; int rc; @@ -402,28 +402,34 @@ if (num_rqst > MAX_COMPOUND - 1) return -ENOMEM; - memset(&cur_rqst[0], 0, sizeof(cur_rqst)); - memset(&iov, 0, sizeof(iov)); - memset(&tr_hdr, 0, sizeof(tr_hdr)); - - iov.iov_base = &tr_hdr; - iov.iov_len = sizeof(tr_hdr); - cur_rqst[0].rq_iov = &iov; - cur_rqst[0].rq_nvec = 1; - if (!server->ops->init_transform_rq) { cifs_dbg(VFS, "Encryption requested but transform callback " "is missing\n"); return -EIO; } + tr_hdr = kmalloc(sizeof(*tr_hdr), GFP_NOFS); + if (!tr_hdr) + return -ENOMEM; + + memset(&cur_rqst[0], 0, sizeof(cur_rqst)); + memset(&iov, 0, sizeof(iov)); + memset(tr_hdr, 0, sizeof(*tr_hdr)); + + iov.iov_base = tr_hdr; + iov.iov_len = sizeof(*tr_hdr); + cur_rqst[0].rq_iov = &iov; + cur_rqst[0].rq_nvec = 1; + rc = server->ops->init_transform_rq(server, num_rqst + 1, &cur_rqst[0], rqst); if (rc) - return rc; + goto out; rc = __smb_send_rqst(server, num_rqst + 1, &cur_rqst[0]); smb3_free_compound_rqst(num_rqst, &cur_rqst[1]); +out: + kfree(tr_hdr); return rc; } diff -Nru linux-4.19.98/fs/dax.c linux-4.19.118/fs/dax.c --- linux-4.19.98/fs/dax.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/dax.c 2020-04-23 08:30:24.000000000 +0000 @@ -1301,6 +1301,9 @@ lockdep_assert_held(&inode->i_rwsem); } + if (iocb->ki_flags & IOCB_NOWAIT) + flags |= IOMAP_NOWAIT; + while (iov_iter_count(iter)) { ret = iomap_apply(inode, pos, iov_iter_count(iter), flags, ops, iter, dax_iomap_actor); diff -Nru linux-4.19.98/fs/ecryptfs/crypto.c linux-4.19.118/fs/ecryptfs/crypto.c --- linux-4.19.98/fs/ecryptfs/crypto.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ecryptfs/crypto.c 2020-04-23 08:30:24.000000000 +0000 @@ -325,8 +325,10 @@ struct extent_crypt_result ecr; int rc = 0; - BUG_ON(!crypt_stat || !crypt_stat->tfm - || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED)); + if (!crypt_stat || !crypt_stat->tfm + || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED)) + return -EINVAL; + if (unlikely(ecryptfs_verbosity > 0)) { ecryptfs_printk(KERN_DEBUG, "Key size [%zd]; key:\n", crypt_stat->key_size); diff -Nru linux-4.19.98/fs/ecryptfs/keystore.c linux-4.19.118/fs/ecryptfs/keystore.c --- linux-4.19.98/fs/ecryptfs/keystore.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ecryptfs/keystore.c 2020-04-23 08:30:24.000000000 +0000 @@ -1318,7 +1318,7 @@ printk(KERN_WARNING "Tag 1 packet contains key larger " "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n"); rc = -EINVAL; - goto out; + goto out_free; } memcpy((*new_auth_tok)->session_key.encrypted_key, &data[(*packet_size)], (body_size - (ECRYPTFS_SIG_SIZE + 2))); diff -Nru linux-4.19.98/fs/ecryptfs/messaging.c linux-4.19.118/fs/ecryptfs/messaging.c --- linux-4.19.98/fs/ecryptfs/messaging.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ecryptfs/messaging.c 2020-04-23 08:30:24.000000000 +0000 @@ -392,6 +392,7 @@ * ecryptfs_message_buf_len), GFP_KERNEL); if (!ecryptfs_msg_ctx_arr) { + kfree(ecryptfs_daemon_hash); rc = -ENOMEM; goto out; } diff -Nru linux-4.19.98/fs/eventfd.c linux-4.19.118/fs/eventfd.c --- linux-4.19.98/fs/eventfd.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/eventfd.c 2020-04-23 08:30:24.000000000 +0000 @@ -22,6 +22,8 @@ #include #include +DEFINE_PER_CPU(int, eventfd_wake_count); + struct eventfd_ctx { struct kref kref; wait_queue_head_t wqh; @@ -55,12 +57,25 @@ { unsigned long flags; + /* + * Deadlock or stack overflow issues can happen if we recurse here + * through waitqueue wakeup handlers. If the caller users potentially + * nested waitqueues with custom wakeup handlers, then it should + * check eventfd_signal_count() before calling this function. If + * it returns true, the eventfd_signal() call should be deferred to a + * safe context. + */ + if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count))) + return 0; + spin_lock_irqsave(&ctx->wqh.lock, flags); + this_cpu_inc(eventfd_wake_count); if (ULLONG_MAX - ctx->count < n) n = ULLONG_MAX - ctx->count; ctx->count += n; if (waitqueue_active(&ctx->wqh)) wake_up_locked_poll(&ctx->wqh, EPOLLIN); + this_cpu_dec(eventfd_wake_count); spin_unlock_irqrestore(&ctx->wqh.lock, flags); return n; diff -Nru linux-4.19.98/fs/exec.c linux-4.19.118/fs/exec.c --- linux-4.19.98/fs/exec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/exec.c 2020-04-23 08:30:24.000000000 +0000 @@ -1378,7 +1378,7 @@ /* An exec changes our domain. We are no longer part of the thread group */ - current->self_exec_id++; + WRITE_ONCE(current->self_exec_id, current->self_exec_id + 1); flush_signal_handlers(current, 0); } EXPORT_SYMBOL(setup_new_exec); diff -Nru linux-4.19.98/fs/exportfs/expfs.c linux-4.19.118/fs/exportfs/expfs.c --- linux-4.19.98/fs/exportfs/expfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/exportfs/expfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -147,6 +147,7 @@ tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf)); if (IS_ERR(tmp)) { dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); + err = PTR_ERR(tmp); goto out_err; } if (tmp != dentry) { diff -Nru linux-4.19.98/fs/ext2/super.c linux-4.19.118/fs/ext2/super.c --- linux-4.19.98/fs/ext2/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext2/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -1093,9 +1093,9 @@ if (EXT2_BLOCKS_PER_GROUP(sb) == 0) goto cantfind_ext2; - sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - - le32_to_cpu(es->s_first_data_block) - 1) - / EXT2_BLOCKS_PER_GROUP(sb)) + 1; + sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - + le32_to_cpu(es->s_first_data_block) - 1) + / EXT2_BLOCKS_PER_GROUP(sb)) + 1; db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / EXT2_DESC_PER_BLOCK(sb); sbi->s_group_desc = kmalloc_array (db_count, diff -Nru linux-4.19.98/fs/ext2/xattr.c linux-4.19.118/fs/ext2/xattr.c --- linux-4.19.98/fs/ext2/xattr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext2/xattr.c 2020-04-23 08:30:24.000000000 +0000 @@ -56,6 +56,7 @@ #include #include +#include #include #include #include @@ -84,8 +85,8 @@ printk("\n"); \ } while (0) #else -# define ea_idebug(f...) -# define ea_bdebug(f...) +# define ea_idebug(inode, f...) no_printk(f) +# define ea_bdebug(bh, f...) no_printk(f) #endif static int ext2_xattr_set2(struct inode *, struct buffer_head *, @@ -838,8 +839,7 @@ error = mb_cache_entry_create(cache, GFP_NOFS, hash, bh->b_blocknr, 1); if (error) { if (error == -EBUSY) { - ea_bdebug(bh, "already in cache (%d cache entries)", - atomic_read(&ext2_xattr_cache->c_entry_count)); + ea_bdebug(bh, "already in cache"); error = 0; } } else diff -Nru linux-4.19.98/fs/ext4/balloc.c linux-4.19.118/fs/ext4/balloc.c --- linux-4.19.98/fs/ext4/balloc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/balloc.c 2020-04-23 08:30:24.000000000 +0000 @@ -270,6 +270,7 @@ ext4_group_t ngroups = ext4_get_groups_count(sb); struct ext4_group_desc *desc; struct ext4_sb_info *sbi = EXT4_SB(sb); + struct buffer_head *bh_p; if (block_group >= ngroups) { ext4_error(sb, "block_group >= groups_count - block_group = %u," @@ -280,7 +281,14 @@ group_desc = block_group >> EXT4_DESC_PER_BLOCK_BITS(sb); offset = block_group & (EXT4_DESC_PER_BLOCK(sb) - 1); - if (!sbi->s_group_desc[group_desc]) { + bh_p = sbi_array_rcu_deref(sbi, s_group_desc, group_desc); + /* + * sbi_array_rcu_deref returns with rcu unlocked, this is ok since + * the pointer being dereferenced won't be dereferenced again. By + * looking at the usage in add_new_gdb() the value isn't modified, + * just the pointer, and so it remains valid. + */ + if (!bh_p) { ext4_error(sb, "Group descriptor not loaded - " "block_group = %u, group_desc = %u, desc = %u", block_group, group_desc, offset); @@ -288,10 +296,10 @@ } desc = (struct ext4_group_desc *)( - (__u8 *)sbi->s_group_desc[group_desc]->b_data + + (__u8 *)bh_p->b_data + offset * EXT4_DESC_SIZE(sb)); if (bh) - *bh = sbi->s_group_desc[group_desc]; + *bh = bh_p; return desc; } diff -Nru linux-4.19.98/fs/ext4/block_validity.c linux-4.19.118/fs/ext4/block_validity.c --- linux-4.19.98/fs/ext4/block_validity.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/block_validity.c 2020-04-23 08:30:24.000000000 +0000 @@ -203,6 +203,7 @@ return PTR_ERR(inode); num = (inode->i_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; while (i < num) { + cond_resched(); map.m_lblk = i; map.m_len = num - i; n = ext4_map_blocks(NULL, inode, &map, 0); diff -Nru linux-4.19.98/fs/ext4/dir.c linux-4.19.118/fs/ext4/dir.c --- linux-4.19.98/fs/ext4/dir.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/dir.c 2020-04-23 08:30:24.000000000 +0000 @@ -126,12 +126,14 @@ if (err != ERR_BAD_DX_DIR) { return err; } - /* - * We don't set the inode dirty flag since it's not - * critical that it get flushed back to the disk. - */ - ext4_clear_inode_flag(file_inode(file), - EXT4_INODE_INDEX); + /* Can we just clear INDEX flag to ignore htree information? */ + if (!ext4_has_metadata_csum(sb)) { + /* + * We don't set the inode dirty flag since it's not + * critical that it gets flushed back to the disk. + */ + ext4_clear_inode_flag(inode, EXT4_INODE_INDEX); + } } if (ext4_has_inline_data(inode)) { diff -Nru linux-4.19.98/fs/ext4/ext4.h linux-4.19.118/fs/ext4/ext4.h --- linux-4.19.98/fs/ext4/ext4.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/ext4.h 2020-04-23 08:30:24.000000000 +0000 @@ -1372,7 +1372,7 @@ loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */ struct buffer_head * s_sbh; /* Buffer containing the super block */ struct ext4_super_block *s_es; /* Pointer to the super block in the buffer */ - struct buffer_head **s_group_desc; + struct buffer_head * __rcu *s_group_desc; unsigned int s_mount_opt; unsigned int s_mount_opt2; unsigned int s_mount_flags; @@ -1430,7 +1430,7 @@ #endif /* for buddy allocator */ - struct ext4_group_info ***s_group_info; + struct ext4_group_info ** __rcu *s_group_info; struct inode *s_buddy_cache; spinlock_t s_md_lock; unsigned short *s_mb_offsets; @@ -1480,7 +1480,7 @@ unsigned int s_extent_max_zeroout_kb; unsigned int s_log_groups_per_flex; - struct flex_groups *s_flex_groups; + struct flex_groups * __rcu *s_flex_groups; ext4_group_t s_flex_groups_allocated; /* workqueue for reserved extent conversions (buffered io) */ @@ -1520,8 +1520,11 @@ struct ratelimit_state s_warning_ratelimit_state; struct ratelimit_state s_msg_ratelimit_state; - /* Barrier between changing inodes' journal flags and writepages ops. */ - struct percpu_rw_semaphore s_journal_flag_rwsem; + /* + * Barrier between writepages ops and changing any inode's JOURNAL_DATA + * or EXTENTS flag. + */ + struct percpu_rw_semaphore s_writepages_rwsem; struct dax_device *s_daxdev; }; @@ -1542,6 +1545,23 @@ } /* + * Returns: sbi->field[index] + * Used to access an array element from the following sbi fields which require + * rcu protection to avoid dereferencing an invalid pointer due to reassignment + * - s_group_desc + * - s_group_info + * - s_flex_group + */ +#define sbi_array_rcu_deref(sbi, field, index) \ +({ \ + typeof(*((sbi)->field)) _v; \ + rcu_read_lock(); \ + _v = ((typeof(_v)*)rcu_dereference((sbi)->field))[index]; \ + rcu_read_unlock(); \ + _v; \ +}) + +/* * Inode dynamic state flags */ enum { @@ -2375,8 +2395,11 @@ struct ext4_filename *fname); static inline void ext4_update_dx_flag(struct inode *inode) { - if (!ext4_has_feature_dir_index(inode->i_sb)) + if (!ext4_has_feature_dir_index(inode->i_sb)) { + /* ext4_iget() should have caught this... */ + WARN_ON_ONCE(ext4_has_feature_metadata_csum(inode->i_sb)); ext4_clear_inode_flag(inode, EXT4_INODE_INDEX); + } } static const unsigned char ext4_filetype_table[] = { DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK @@ -2561,6 +2584,7 @@ extern bool ext4_empty_dir(struct inode *inode); /* resize.c */ +extern void ext4_kvfree_array_rcu(void *to_free); extern int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input); extern int ext4_group_extend(struct super_block *sb, @@ -2808,13 +2832,13 @@ struct ext4_group_info *ext4_get_group_info(struct super_block *sb, ext4_group_t group) { - struct ext4_group_info ***grp_info; + struct ext4_group_info **grp_info; long indexv, indexh; BUG_ON(group >= EXT4_SB(sb)->s_groups_count); - grp_info = EXT4_SB(sb)->s_group_info; indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb)); indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1); - return grp_info[indexv][indexh]; + grp_info = sbi_array_rcu_deref(EXT4_SB(sb), s_group_info, indexv); + return grp_info[indexh]; } /* @@ -2864,7 +2888,7 @@ !inode_is_locked(inode)); down_write(&EXT4_I(inode)->i_data_sem); if (newsize > EXT4_I(inode)->i_disksize) - EXT4_I(inode)->i_disksize = newsize; + WRITE_ONCE(EXT4_I(inode)->i_disksize, newsize); up_write(&EXT4_I(inode)->i_data_sem); } diff -Nru linux-4.19.98/fs/ext4/extents.c linux-4.19.118/fs/ext4/extents.c --- linux-4.19.98/fs/ext4/extents.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/extents.c 2020-04-23 08:30:24.000000000 +0000 @@ -3438,8 +3438,8 @@ (unsigned long long)map->m_lblk, map_len); sbi = EXT4_SB(inode->i_sb); - eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> - inode->i_sb->s_blocksize_bits; + eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1) + >> inode->i_sb->s_blocksize_bits; if (eof_block < map->m_lblk + map_len) eof_block = map->m_lblk + map_len; @@ -3694,8 +3694,8 @@ __func__, inode->i_ino, (unsigned long long)map->m_lblk, map->m_len); - eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> - inode->i_sb->s_blocksize_bits; + eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1) + >> inode->i_sb->s_blocksize_bits; if (eof_block < map->m_lblk + map->m_len) eof_block = map->m_lblk + map->m_len; /* diff -Nru linux-4.19.98/fs/ext4/file.c linux-4.19.118/fs/ext4/file.c --- linux-4.19.98/fs/ext4/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -40,9 +40,10 @@ struct inode *inode = file_inode(iocb->ki_filp); ssize_t ret; - if (!inode_trylock_shared(inode)) { - if (iocb->ki_flags & IOCB_NOWAIT) + if (iocb->ki_flags & IOCB_NOWAIT) { + if (!inode_trylock_shared(inode)) return -EAGAIN; + } else { inode_lock_shared(inode); } /* @@ -190,9 +191,10 @@ struct inode *inode = file_inode(iocb->ki_filp); ssize_t ret; - if (!inode_trylock(inode)) { - if (iocb->ki_flags & IOCB_NOWAIT) + if (iocb->ki_flags & IOCB_NOWAIT) { + if (!inode_trylock(inode)) return -EAGAIN; + } else { inode_lock(inode); } ret = ext4_write_checks(iocb, from); diff -Nru linux-4.19.98/fs/ext4/ialloc.c linux-4.19.118/fs/ext4/ialloc.c --- linux-4.19.98/fs/ext4/ialloc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/ialloc.c 2020-04-23 08:30:24.000000000 +0000 @@ -330,11 +330,13 @@ percpu_counter_inc(&sbi->s_freeinodes_counter); if (sbi->s_log_groups_per_flex) { - ext4_group_t f = ext4_flex_group(sbi, block_group); + struct flex_groups *fg; - atomic_inc(&sbi->s_flex_groups[f].free_inodes); + fg = sbi_array_rcu_deref(sbi, s_flex_groups, + ext4_flex_group(sbi, block_group)); + atomic_inc(&fg->free_inodes); if (is_directory) - atomic_dec(&sbi->s_flex_groups[f].used_dirs); + atomic_dec(&fg->used_dirs); } BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata"); fatal = ext4_handle_dirty_metadata(handle, NULL, bh2); @@ -370,12 +372,13 @@ int flex_size, struct orlov_stats *stats) { struct ext4_group_desc *desc; - struct flex_groups *flex_group = EXT4_SB(sb)->s_flex_groups; if (flex_size > 1) { - stats->free_inodes = atomic_read(&flex_group[g].free_inodes); - stats->free_clusters = atomic64_read(&flex_group[g].free_clusters); - stats->used_dirs = atomic_read(&flex_group[g].used_dirs); + struct flex_groups *fg = sbi_array_rcu_deref(EXT4_SB(sb), + s_flex_groups, g); + stats->free_inodes = atomic_read(&fg->free_inodes); + stats->free_clusters = atomic64_read(&fg->free_clusters); + stats->used_dirs = atomic_read(&fg->used_dirs); return; } @@ -1056,7 +1059,8 @@ if (sbi->s_log_groups_per_flex) { ext4_group_t f = ext4_flex_group(sbi, group); - atomic_inc(&sbi->s_flex_groups[f].used_dirs); + atomic_inc(&sbi_array_rcu_deref(sbi, s_flex_groups, + f)->used_dirs); } } if (ext4_has_group_desc_csum(sb)) { @@ -1079,7 +1083,8 @@ if (sbi->s_log_groups_per_flex) { flex_group = ext4_flex_group(sbi, group); - atomic_dec(&sbi->s_flex_groups[flex_group].free_inodes); + atomic_dec(&sbi_array_rcu_deref(sbi, s_flex_groups, + flex_group)->free_inodes); } inode->i_ino = ino + group * EXT4_INODES_PER_GROUP(sb); diff -Nru linux-4.19.98/fs/ext4/inline.c linux-4.19.118/fs/ext4/inline.c --- linux-4.19.98/fs/ext4/inline.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/inline.c 2020-04-23 08:30:24.000000000 +0000 @@ -1419,7 +1419,7 @@ err = ext4_htree_store_dirent(dir_file, hinfo->hash, hinfo->minor_hash, de, &tmp_str); if (err) { - count = err; + ret = err; goto out; } count++; diff -Nru linux-4.19.98/fs/ext4/inode.c linux-4.19.118/fs/ext4/inode.c --- linux-4.19.98/fs/ext4/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -2569,7 +2569,7 @@ * truncate are avoided by checking i_size under i_data_sem. */ disksize = ((loff_t)mpd->first_page) << PAGE_SHIFT; - if (disksize > EXT4_I(inode)->i_disksize) { + if (disksize > READ_ONCE(EXT4_I(inode)->i_disksize)) { int err2; loff_t i_size; @@ -2730,7 +2730,7 @@ if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) return -EIO; - percpu_down_read(&sbi->s_journal_flag_rwsem); + percpu_down_read(&sbi->s_writepages_rwsem); trace_ext4_writepages(inode, wbc); /* @@ -2950,7 +2950,7 @@ out_writepages: trace_ext4_writepages_result(inode, wbc, ret, nr_to_write - wbc->nr_to_write); - percpu_up_read(&sbi->s_journal_flag_rwsem); + percpu_up_read(&sbi->s_writepages_rwsem); return ret; } @@ -2965,13 +2965,13 @@ if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) return -EIO; - percpu_down_read(&sbi->s_journal_flag_rwsem); + percpu_down_read(&sbi->s_writepages_rwsem); trace_ext4_writepages(inode, wbc); ret = dax_writeback_mapping_range(mapping, inode->i_sb->s_bdev, wbc); trace_ext4_writepages_result(inode, wbc, ret, nr_to_write - wbc->nr_to_write); - percpu_up_read(&sbi->s_journal_flag_rwsem); + percpu_up_read(&sbi->s_writepages_rwsem); return ret; } @@ -4690,7 +4690,7 @@ if (end > table) end = table; while (b <= end) - sb_breadahead(sb, b++); + sb_breadahead_unmovable(sb, b++); } /* @@ -4975,6 +4975,18 @@ ret = -EFSCORRUPTED; goto bad_inode; } + /* + * If dir_index is not enabled but there's dir with INDEX flag set, + * we'd normally treat htree data as empty space. But with metadata + * checksumming that corrupts checksums so forbid that. + */ + if (!ext4_has_feature_dir_index(sb) && ext4_has_metadata_csum(sb) && + ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) { + ext4_error_inode(inode, function, line, 0, + "iget: Dir with htree data on filesystem without dir_index feature."); + ret = -EFSCORRUPTED; + goto bad_inode; + } ei->i_disksize = inode->i_size; #ifdef CONFIG_QUOTA ei->i_reserved_quota = 0; @@ -5128,7 +5140,7 @@ struct ext4_inode_info *ei) { struct inode *inode = &(ei->vfs_inode); - u64 i_blocks = inode->i_blocks; + u64 i_blocks = READ_ONCE(inode->i_blocks); struct super_block *sb = inode->i_sb; if (i_blocks <= ~0U) { @@ -6195,7 +6207,7 @@ } } - percpu_down_write(&sbi->s_journal_flag_rwsem); + percpu_down_write(&sbi->s_writepages_rwsem); jbd2_journal_lock_updates(journal); /* @@ -6212,7 +6224,7 @@ err = jbd2_journal_flush(journal); if (err < 0) { jbd2_journal_unlock_updates(journal); - percpu_up_write(&sbi->s_journal_flag_rwsem); + percpu_up_write(&sbi->s_writepages_rwsem); return err; } ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); @@ -6220,7 +6232,7 @@ ext4_set_aops(inode); jbd2_journal_unlock_updates(journal); - percpu_up_write(&sbi->s_journal_flag_rwsem); + percpu_up_write(&sbi->s_writepages_rwsem); if (val) up_write(&EXT4_I(inode)->i_mmap_sem); diff -Nru linux-4.19.98/fs/ext4/mballoc.c linux-4.19.118/fs/ext4/mballoc.c --- linux-4.19.98/fs/ext4/mballoc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/mballoc.c 2020-04-23 08:30:24.000000000 +0000 @@ -2356,7 +2356,7 @@ { struct ext4_sb_info *sbi = EXT4_SB(sb); unsigned size; - struct ext4_group_info ***new_groupinfo; + struct ext4_group_info ***old_groupinfo, ***new_groupinfo; size = (ngroups + EXT4_DESC_PER_BLOCK(sb) - 1) >> EXT4_DESC_PER_BLOCK_BITS(sb); @@ -2369,13 +2369,16 @@ ext4_msg(sb, KERN_ERR, "can't allocate buddy meta group"); return -ENOMEM; } - if (sbi->s_group_info) { - memcpy(new_groupinfo, sbi->s_group_info, + rcu_read_lock(); + old_groupinfo = rcu_dereference(sbi->s_group_info); + if (old_groupinfo) + memcpy(new_groupinfo, old_groupinfo, sbi->s_group_info_size * sizeof(*sbi->s_group_info)); - kvfree(sbi->s_group_info); - } - sbi->s_group_info = new_groupinfo; + rcu_read_unlock(); + rcu_assign_pointer(sbi->s_group_info, new_groupinfo); sbi->s_group_info_size = size / sizeof(*sbi->s_group_info); + if (old_groupinfo) + ext4_kvfree_array_rcu(old_groupinfo); ext4_debug("allocated s_groupinfo array for %d meta_bg's\n", sbi->s_group_info_size); return 0; @@ -2387,6 +2390,7 @@ { int i; int metalen = 0; + int idx = group >> EXT4_DESC_PER_BLOCK_BITS(sb); struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_group_info **meta_group_info; struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); @@ -2405,12 +2409,12 @@ "for a buddy group"); goto exit_meta_group_info; } - sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = - meta_group_info; + rcu_read_lock(); + rcu_dereference(sbi->s_group_info)[idx] = meta_group_info; + rcu_read_unlock(); } - meta_group_info = - sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]; + meta_group_info = sbi_array_rcu_deref(sbi, s_group_info, idx); i = group & (EXT4_DESC_PER_BLOCK(sb) - 1); meta_group_info[i] = kmem_cache_zalloc(cachep, GFP_NOFS); @@ -2458,8 +2462,13 @@ exit_group_info: /* If a meta_group_info table has been allocated, release it now */ if (group % EXT4_DESC_PER_BLOCK(sb) == 0) { - kfree(sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)]); - sbi->s_group_info[group >> EXT4_DESC_PER_BLOCK_BITS(sb)] = NULL; + struct ext4_group_info ***group_info; + + rcu_read_lock(); + group_info = rcu_dereference(sbi->s_group_info); + kfree(group_info[idx]); + group_info[idx] = NULL; + rcu_read_unlock(); } exit_meta_group_info: return -ENOMEM; @@ -2472,6 +2481,7 @@ struct ext4_sb_info *sbi = EXT4_SB(sb); int err; struct ext4_group_desc *desc; + struct ext4_group_info ***group_info; struct kmem_cache *cachep; err = ext4_mb_alloc_groupinfo(sb, ngroups); @@ -2506,11 +2516,16 @@ while (i-- > 0) kmem_cache_free(cachep, ext4_get_group_info(sb, i)); i = sbi->s_group_info_size; + rcu_read_lock(); + group_info = rcu_dereference(sbi->s_group_info); while (i-- > 0) - kfree(sbi->s_group_info[i]); + kfree(group_info[i]); + rcu_read_unlock(); iput(sbi->s_buddy_cache); err_freesgi: - kvfree(sbi->s_group_info); + rcu_read_lock(); + kvfree(rcu_dereference(sbi->s_group_info)); + rcu_read_unlock(); return -ENOMEM; } @@ -2699,7 +2714,7 @@ ext4_group_t ngroups = ext4_get_groups_count(sb); ext4_group_t i; int num_meta_group_infos; - struct ext4_group_info *grinfo; + struct ext4_group_info *grinfo, ***group_info; struct ext4_sb_info *sbi = EXT4_SB(sb); struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); @@ -2717,9 +2732,12 @@ num_meta_group_infos = (ngroups + EXT4_DESC_PER_BLOCK(sb) - 1) >> EXT4_DESC_PER_BLOCK_BITS(sb); + rcu_read_lock(); + group_info = rcu_dereference(sbi->s_group_info); for (i = 0; i < num_meta_group_infos; i++) - kfree(sbi->s_group_info[i]); - kvfree(sbi->s_group_info); + kfree(group_info[i]); + kvfree(group_info); + rcu_read_unlock(); } kfree(sbi->s_mb_offsets); kfree(sbi->s_mb_maxs); @@ -3018,7 +3036,8 @@ ext4_group_t flex_group = ext4_flex_group(sbi, ac->ac_b_ex.fe_group); atomic64_sub(ac->ac_b_ex.fe_len, - &sbi->s_flex_groups[flex_group].free_clusters); + &sbi_array_rcu_deref(sbi, s_flex_groups, + flex_group)->free_clusters); } err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); @@ -4912,7 +4931,8 @@ if (sbi->s_log_groups_per_flex) { ext4_group_t flex_group = ext4_flex_group(sbi, block_group); atomic64_add(count_clusters, - &sbi->s_flex_groups[flex_group].free_clusters); + &sbi_array_rcu_deref(sbi, s_flex_groups, + flex_group)->free_clusters); } if (!(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE)) @@ -5061,7 +5081,8 @@ if (sbi->s_log_groups_per_flex) { ext4_group_t flex_group = ext4_flex_group(sbi, block_group); atomic64_add(clusters_freed, - &sbi->s_flex_groups[flex_group].free_clusters); + &sbi_array_rcu_deref(sbi, s_flex_groups, + flex_group)->free_clusters); } ext4_mb_unload_buddy(&e4b); diff -Nru linux-4.19.98/fs/ext4/migrate.c linux-4.19.118/fs/ext4/migrate.c --- linux-4.19.98/fs/ext4/migrate.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/migrate.c 2020-04-23 08:30:24.000000000 +0000 @@ -427,6 +427,7 @@ int ext4_ext_migrate(struct inode *inode) { + struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); handle_t *handle; int retval = 0, i; __le32 *i_data; @@ -451,6 +452,8 @@ */ return retval; + percpu_down_write(&sbi->s_writepages_rwsem); + /* * Worst case we can touch the allocation bitmaps, a bgd * block, and a block to link in the orphan list. We do need @@ -461,7 +464,7 @@ if (IS_ERR(handle)) { retval = PTR_ERR(handle); - return retval; + goto out_unlock; } goal = (((inode->i_ino - 1) / EXT4_INODES_PER_GROUP(inode->i_sb)) * EXT4_INODES_PER_GROUP(inode->i_sb)) + 1; @@ -472,7 +475,7 @@ if (IS_ERR(tmp_inode)) { retval = PTR_ERR(tmp_inode); ext4_journal_stop(handle); - return retval; + goto out_unlock; } i_size_write(tmp_inode, i_size_read(inode)); /* @@ -514,7 +517,7 @@ */ ext4_orphan_del(NULL, tmp_inode); retval = PTR_ERR(handle); - goto out; + goto out_tmp_inode; } ei = EXT4_I(inode); @@ -595,10 +598,11 @@ /* Reset the extent details */ ext4_ext_tree_init(handle, tmp_inode); ext4_journal_stop(handle); -out: +out_tmp_inode: unlock_new_inode(tmp_inode); iput(tmp_inode); - +out_unlock: + percpu_up_write(&sbi->s_writepages_rwsem); return retval; } @@ -608,7 +612,8 @@ int ext4_ind_migrate(struct inode *inode) { struct ext4_extent_header *eh; - struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; + struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); + struct ext4_super_block *es = sbi->s_es; struct ext4_inode_info *ei = EXT4_I(inode); struct ext4_extent *ex; unsigned int i, len; @@ -632,9 +637,13 @@ if (test_opt(inode->i_sb, DELALLOC)) ext4_alloc_da_blocks(inode); + percpu_down_write(&sbi->s_writepages_rwsem); + handle = ext4_journal_start(inode, EXT4_HT_MIGRATE, 1); - if (IS_ERR(handle)) - return PTR_ERR(handle); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_unlock; + } down_write(&EXT4_I(inode)->i_data_sem); ret = ext4_ext_check_inode(inode); @@ -669,5 +678,7 @@ errout: ext4_journal_stop(handle); up_write(&EXT4_I(inode)->i_data_sem); +out_unlock: + percpu_up_write(&sbi->s_writepages_rwsem); return ret; } diff -Nru linux-4.19.98/fs/ext4/mmp.c linux-4.19.118/fs/ext4/mmp.c --- linux-4.19.98/fs/ext4/mmp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/mmp.c 2020-04-23 08:30:24.000000000 +0000 @@ -120,10 +120,10 @@ { __ext4_warning(sb, function, line, "%s", msg); __ext4_warning(sb, function, line, - "MMP failure info: last update time: %llu, last update " - "node: %s, last update device: %s", - (long long unsigned int) le64_to_cpu(mmp->mmp_time), - mmp->mmp_nodename, mmp->mmp_bdevname); + "MMP failure info: last update time: %llu, last update node: %.*s, last update device: %.*s", + (unsigned long long)le64_to_cpu(mmp->mmp_time), + (int)sizeof(mmp->mmp_nodename), mmp->mmp_nodename, + (int)sizeof(mmp->mmp_bdevname), mmp->mmp_bdevname); } /* @@ -154,6 +154,7 @@ mmp_check_interval = max(EXT4_MMP_CHECK_MULT * mmp_update_interval, EXT4_MMP_MIN_CHECK_INTERVAL); mmp->mmp_check_interval = cpu_to_le16(mmp_check_interval); + BUILD_BUG_ON(sizeof(mmp->mmp_bdevname) < BDEVNAME_SIZE); bdevname(bh->b_bdev, mmp->mmp_bdevname); memcpy(mmp->mmp_nodename, init_utsname()->nodename, @@ -375,7 +376,8 @@ /* * Start a kernel thread to update the MMP block periodically. */ - EXT4_SB(sb)->s_mmp_tsk = kthread_run(kmmpd, mmpd_data, "kmmpd-%s", + EXT4_SB(sb)->s_mmp_tsk = kthread_run(kmmpd, mmpd_data, "kmmpd-%.*s", + (int)sizeof(mmp->mmp_bdevname), bdevname(bh->b_bdev, mmp->mmp_bdevname)); if (IS_ERR(EXT4_SB(sb)->s_mmp_tsk)) { diff -Nru linux-4.19.98/fs/ext4/namei.c linux-4.19.118/fs/ext4/namei.c --- linux-4.19.98/fs/ext4/namei.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/namei.c 2020-04-23 08:30:24.000000000 +0000 @@ -1431,6 +1431,7 @@ /* * We deal with the read-ahead logic here. */ + cond_resched(); if (ra_ptr >= ra_max) { /* Refill the readahead buffer */ ra_ptr = 0; @@ -2085,6 +2086,13 @@ retval = ext4_dx_add_entry(handle, &fname, dir, inode); if (!retval || (retval != ERR_BAD_DX_DIR)) goto out; + /* Can we just ignore htree data? */ + if (ext4_has_metadata_csum(sb)) { + EXT4_ERROR_INODE(dir, + "Directory has corrupted htree index."); + retval = -EFSCORRUPTED; + goto out; + } ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); dx_fallback++; ext4_mark_inode_dirty(handle, dir); diff -Nru linux-4.19.98/fs/ext4/page-io.c linux-4.19.118/fs/ext4/page-io.c --- linux-4.19.98/fs/ext4/page-io.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/page-io.c 2020-04-23 08:30:24.000000000 +0000 @@ -481,17 +481,26 @@ nr_to_submit) { gfp_t gfp_flags = GFP_NOFS; + /* + * Since bounce page allocation uses a mempool, we can only use + * a waiting mask (i.e. request guaranteed allocation) on the + * first page of the bio. Otherwise it can deadlock. + */ + if (io->io_bio) + gfp_flags = GFP_NOWAIT | __GFP_NOWARN; retry_encrypt: data_page = fscrypt_encrypt_page(inode, page, PAGE_SIZE, 0, page->index, gfp_flags); if (IS_ERR(data_page)) { ret = PTR_ERR(data_page); - if (ret == -ENOMEM && wbc->sync_mode == WB_SYNC_ALL) { - if (io->io_bio) { + if (ret == -ENOMEM && + (io->io_bio || wbc->sync_mode == WB_SYNC_ALL)) { + gfp_flags = GFP_NOFS; + if (io->io_bio) ext4_io_submit(io); - congestion_wait(BLK_RW_ASYNC, HZ/50); - } - gfp_flags |= __GFP_NOFAIL; + else + gfp_flags |= __GFP_NOFAIL; + congestion_wait(BLK_RW_ASYNC, HZ/50); goto retry_encrypt; } data_page = NULL; diff -Nru linux-4.19.98/fs/ext4/resize.c linux-4.19.118/fs/ext4/resize.c --- linux-4.19.98/fs/ext4/resize.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/resize.c 2020-04-23 08:30:24.000000000 +0000 @@ -17,6 +17,33 @@ #include "ext4_jbd2.h" +struct ext4_rcu_ptr { + struct rcu_head rcu; + void *ptr; +}; + +static void ext4_rcu_ptr_callback(struct rcu_head *head) +{ + struct ext4_rcu_ptr *ptr; + + ptr = container_of(head, struct ext4_rcu_ptr, rcu); + kvfree(ptr->ptr); + kfree(ptr); +} + +void ext4_kvfree_array_rcu(void *to_free) +{ + struct ext4_rcu_ptr *ptr = kzalloc(sizeof(*ptr), GFP_KERNEL); + + if (ptr) { + ptr->ptr = to_free; + call_rcu(&ptr->rcu, ext4_rcu_ptr_callback); + return; + } + synchronize_rcu(); + kvfree(to_free); +} + int ext4_resize_begin(struct super_block *sb) { struct ext4_sb_info *sbi = EXT4_SB(sb); @@ -560,8 +587,8 @@ brelse(gdb); goto out; } - memcpy(gdb->b_data, sbi->s_group_desc[j]->b_data, - gdb->b_size); + memcpy(gdb->b_data, sbi_array_rcu_deref(sbi, + s_group_desc, j)->b_data, gdb->b_size); set_buffer_uptodate(gdb); err = ext4_handle_dirty_metadata(handle, NULL, gdb); @@ -879,13 +906,15 @@ } brelse(dind); - o_group_desc = EXT4_SB(sb)->s_group_desc; + rcu_read_lock(); + o_group_desc = rcu_dereference(EXT4_SB(sb)->s_group_desc); memcpy(n_group_desc, o_group_desc, EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); + rcu_read_unlock(); n_group_desc[gdb_num] = gdb_bh; - EXT4_SB(sb)->s_group_desc = n_group_desc; + rcu_assign_pointer(EXT4_SB(sb)->s_group_desc, n_group_desc); EXT4_SB(sb)->s_gdb_count++; - kvfree(o_group_desc); + ext4_kvfree_array_rcu(o_group_desc); le16_add_cpu(&es->s_reserved_gdt_blocks, -1); err = ext4_handle_dirty_super(handle, sb); @@ -929,9 +958,11 @@ return err; } - o_group_desc = EXT4_SB(sb)->s_group_desc; + rcu_read_lock(); + o_group_desc = rcu_dereference(EXT4_SB(sb)->s_group_desc); memcpy(n_group_desc, o_group_desc, EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); + rcu_read_unlock(); n_group_desc[gdb_num] = gdb_bh; BUFFER_TRACE(gdb_bh, "get_write_access"); @@ -942,9 +973,9 @@ return err; } - EXT4_SB(sb)->s_group_desc = n_group_desc; + rcu_assign_pointer(EXT4_SB(sb)->s_group_desc, n_group_desc); EXT4_SB(sb)->s_gdb_count++; - kvfree(o_group_desc); + ext4_kvfree_array_rcu(o_group_desc); return err; } @@ -1210,7 +1241,8 @@ * use non-sparse filesystems anymore. This is already checked above. */ if (gdb_off) { - gdb_bh = sbi->s_group_desc[gdb_num]; + gdb_bh = sbi_array_rcu_deref(sbi, s_group_desc, + gdb_num); BUFFER_TRACE(gdb_bh, "get_write_access"); err = ext4_journal_get_write_access(handle, gdb_bh); @@ -1292,7 +1324,7 @@ /* * get_write_access() has been called on gdb_bh by ext4_add_new_desc(). */ - gdb_bh = sbi->s_group_desc[gdb_num]; + gdb_bh = sbi_array_rcu_deref(sbi, s_group_desc, gdb_num); /* Update group descriptor block for new group */ gdp = (struct ext4_group_desc *)(gdb_bh->b_data + gdb_off * EXT4_DESC_SIZE(sb)); @@ -1420,11 +1452,14 @@ percpu_counter_read(&sbi->s_freeclusters_counter)); if (ext4_has_feature_flex_bg(sb) && sbi->s_log_groups_per_flex) { ext4_group_t flex_group; + struct flex_groups *fg; + flex_group = ext4_flex_group(sbi, group_data[0].group); + fg = sbi_array_rcu_deref(sbi, s_flex_groups, flex_group); atomic64_add(EXT4_NUM_B2C(sbi, free_blocks), - &sbi->s_flex_groups[flex_group].free_clusters); + &fg->free_clusters); atomic_add(EXT4_INODES_PER_GROUP(sb) * flex_gd->count, - &sbi->s_flex_groups[flex_group].free_inodes); + &fg->free_inodes); } /* @@ -1519,7 +1554,8 @@ for (; gdb_num <= gdb_num_end; gdb_num++) { struct buffer_head *gdb_bh; - gdb_bh = sbi->s_group_desc[gdb_num]; + gdb_bh = sbi_array_rcu_deref(sbi, s_group_desc, + gdb_num); if (old_gdb == gdb_bh->b_blocknr) continue; update_backups(sb, gdb_bh->b_blocknr, gdb_bh->b_data, diff -Nru linux-4.19.98/fs/ext4/super.c linux-4.19.118/fs/ext4/super.c --- linux-4.19.98/fs/ext4/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ext4/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -388,7 +388,8 @@ unsigned int line) { __save_error_info(sb, func, line); - ext4_commit_super(sb, 1); + if (!bdev_read_only(sb->s_bdev)) + ext4_commit_super(sb, 1); } /* @@ -969,6 +970,8 @@ { struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_super_block *es = sbi->s_es; + struct buffer_head **group_desc; + struct flex_groups **flex_groups; int aborted = 0; int i, err; @@ -999,15 +1002,23 @@ if (!sb_rdonly(sb)) ext4_commit_super(sb, 1); + rcu_read_lock(); + group_desc = rcu_dereference(sbi->s_group_desc); for (i = 0; i < sbi->s_gdb_count; i++) - brelse(sbi->s_group_desc[i]); - kvfree(sbi->s_group_desc); - kvfree(sbi->s_flex_groups); + brelse(group_desc[i]); + kvfree(group_desc); + flex_groups = rcu_dereference(sbi->s_flex_groups); + if (flex_groups) { + for (i = 0; i < sbi->s_flex_groups_allocated; i++) + kvfree(flex_groups[i]); + kvfree(flex_groups); + } + rcu_read_unlock(); percpu_counter_destroy(&sbi->s_freeclusters_counter); percpu_counter_destroy(&sbi->s_freeinodes_counter); percpu_counter_destroy(&sbi->s_dirs_counter); percpu_counter_destroy(&sbi->s_dirtyclusters_counter); - percpu_free_rwsem(&sbi->s_journal_flag_rwsem); + percpu_free_rwsem(&sbi->s_writepages_rwsem); #ifdef CONFIG_QUOTA for (i = 0; i < EXT4_MAXQUOTAS; i++) kfree(get_qf_name(sb, sbi, i)); @@ -1842,6 +1853,13 @@ arg = JBD2_DEFAULT_MAX_COMMIT_AGE; sbi->s_commit_interval = HZ * arg; } else if (token == Opt_debug_want_extra_isize) { + if ((arg & 1) || + (arg < 4) || + (arg > (sbi->s_inode_size - EXT4_GOOD_OLD_INODE_SIZE))) { + ext4_msg(sb, KERN_ERR, + "Invalid want_extra_isize %d", arg); + return -1; + } sbi->s_want_extra_isize = arg; } else if (token == Opt_max_batch_time) { sbi->s_max_batch_time = arg; @@ -2280,8 +2298,8 @@ int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) { struct ext4_sb_info *sbi = EXT4_SB(sb); - struct flex_groups *new_groups; - int size; + struct flex_groups **old_groups, **new_groups; + int size, i, j; if (!sbi->s_log_groups_per_flex) return 0; @@ -2290,22 +2308,37 @@ if (size <= sbi->s_flex_groups_allocated) return 0; - size = roundup_pow_of_two(size * sizeof(struct flex_groups)); - new_groups = kvzalloc(size, GFP_KERNEL); + new_groups = kvzalloc(roundup_pow_of_two(size * + sizeof(*sbi->s_flex_groups)), GFP_KERNEL); if (!new_groups) { - ext4_msg(sb, KERN_ERR, "not enough memory for %d flex groups", - size / (int) sizeof(struct flex_groups)); + ext4_msg(sb, KERN_ERR, + "not enough memory for %d flex group pointers", size); return -ENOMEM; } - - if (sbi->s_flex_groups) { - memcpy(new_groups, sbi->s_flex_groups, - (sbi->s_flex_groups_allocated * - sizeof(struct flex_groups))); - kvfree(sbi->s_flex_groups); + for (i = sbi->s_flex_groups_allocated; i < size; i++) { + new_groups[i] = kvzalloc(roundup_pow_of_two( + sizeof(struct flex_groups)), + GFP_KERNEL); + if (!new_groups[i]) { + for (j = sbi->s_flex_groups_allocated; j < i; j++) + kvfree(new_groups[j]); + kvfree(new_groups); + ext4_msg(sb, KERN_ERR, + "not enough memory for %d flex groups", size); + return -ENOMEM; + } } - sbi->s_flex_groups = new_groups; - sbi->s_flex_groups_allocated = size / sizeof(struct flex_groups); + rcu_read_lock(); + old_groups = rcu_dereference(sbi->s_flex_groups); + if (old_groups) + memcpy(new_groups, old_groups, + (sbi->s_flex_groups_allocated * + sizeof(struct flex_groups *))); + rcu_read_unlock(); + rcu_assign_pointer(sbi->s_flex_groups, new_groups); + sbi->s_flex_groups_allocated = size; + if (old_groups) + ext4_kvfree_array_rcu(old_groups); return 0; } @@ -2313,6 +2346,7 @@ { struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_group_desc *gdp = NULL; + struct flex_groups *fg; ext4_group_t flex_group; int i, err; @@ -2330,12 +2364,11 @@ gdp = ext4_get_group_desc(sb, i, NULL); flex_group = ext4_flex_group(sbi, i); - atomic_add(ext4_free_inodes_count(sb, gdp), - &sbi->s_flex_groups[flex_group].free_inodes); + fg = sbi_array_rcu_deref(sbi, s_flex_groups, flex_group); + atomic_add(ext4_free_inodes_count(sb, gdp), &fg->free_inodes); atomic64_add(ext4_free_group_clusters(sb, gdp), - &sbi->s_flex_groups[flex_group].free_clusters); - atomic_add(ext4_used_dirs_count(sb, gdp), - &sbi->s_flex_groups[flex_group].used_dirs); + &fg->free_clusters); + atomic_add(ext4_used_dirs_count(sb, gdp), &fg->used_dirs); } return 1; @@ -2916,17 +2949,11 @@ return 0; } -#ifndef CONFIG_QUOTA - if (ext4_has_feature_quota(sb) && !readonly) { - ext4_msg(sb, KERN_ERR, - "Filesystem with quota feature cannot be mounted RDWR " - "without CONFIG_QUOTA"); - return 0; - } - if (ext4_has_feature_project(sb) && !readonly) { +#if !IS_ENABLED(CONFIG_QUOTA) || !IS_ENABLED(CONFIG_QFMT_V2) + if (!readonly && (ext4_has_feature_quota(sb) || + ext4_has_feature_project(sb))) { ext4_msg(sb, KERN_ERR, - "Filesystem with project quota feature cannot be mounted RDWR " - "without CONFIG_QUOTA"); + "The kernel was not built with CONFIG_QUOTA and CONFIG_QFMT_V2"); return 0; } #endif /* CONFIG_QUOTA */ @@ -3513,40 +3540,6 @@ return 0; } -static void ext4_clamp_want_extra_isize(struct super_block *sb) -{ - struct ext4_sb_info *sbi = EXT4_SB(sb); - struct ext4_super_block *es = sbi->s_es; - unsigned def_extra_isize = sizeof(struct ext4_inode) - - EXT4_GOOD_OLD_INODE_SIZE; - - if (sbi->s_inode_size == EXT4_GOOD_OLD_INODE_SIZE) { - sbi->s_want_extra_isize = 0; - return; - } - if (sbi->s_want_extra_isize < 4) { - sbi->s_want_extra_isize = def_extra_isize; - if (ext4_has_feature_extra_isize(sb)) { - if (sbi->s_want_extra_isize < - le16_to_cpu(es->s_want_extra_isize)) - sbi->s_want_extra_isize = - le16_to_cpu(es->s_want_extra_isize); - if (sbi->s_want_extra_isize < - le16_to_cpu(es->s_min_extra_isize)) - sbi->s_want_extra_isize = - le16_to_cpu(es->s_min_extra_isize); - } - } - /* Check if enough inode space is available */ - if ((sbi->s_want_extra_isize > sbi->s_inode_size) || - (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize > - sbi->s_inode_size)) { - sbi->s_want_extra_isize = def_extra_isize; - ext4_msg(sb, KERN_INFO, - "required extra inode space not available"); - } -} - static void ext4_set_resv_clusters(struct super_block *sb) { ext4_fsblk_t resv_clusters; @@ -3581,9 +3574,10 @@ { struct dax_device *dax_dev = fs_dax_get_by_bdev(sb->s_bdev); char *orig_data = kstrdup(data, GFP_KERNEL); - struct buffer_head *bh; + struct buffer_head *bh, **group_desc; struct ext4_super_block *es = NULL; struct ext4_sb_info *sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); + struct flex_groups **flex_groups; ext4_fsblk_t block; ext4_fsblk_t sb_block = get_sb_block(&data); ext4_fsblk_t logical_sb_block; @@ -3754,6 +3748,75 @@ */ sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT; + blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); + if (blocksize < EXT4_MIN_BLOCK_SIZE || + blocksize > EXT4_MAX_BLOCK_SIZE) { + ext4_msg(sb, KERN_ERR, + "Unsupported filesystem blocksize %d (%d log_block_size)", + blocksize, le32_to_cpu(es->s_log_block_size)); + goto failed_mount; + } + + if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) { + sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE; + sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO; + } else { + sbi->s_inode_size = le16_to_cpu(es->s_inode_size); + sbi->s_first_ino = le32_to_cpu(es->s_first_ino); + if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) { + ext4_msg(sb, KERN_ERR, "invalid first ino: %u", + sbi->s_first_ino); + goto failed_mount; + } + if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) || + (!is_power_of_2(sbi->s_inode_size)) || + (sbi->s_inode_size > blocksize)) { + ext4_msg(sb, KERN_ERR, + "unsupported inode size: %d", + sbi->s_inode_size); + ext4_msg(sb, KERN_ERR, "blocksize: %d", blocksize); + goto failed_mount; + } + /* + * i_atime_extra is the last extra field available for + * [acm]times in struct ext4_inode. Checking for that + * field should suffice to ensure we have extra space + * for all three. + */ + if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) + + sizeof(((struct ext4_inode *)0)->i_atime_extra)) { + sb->s_time_gran = 1; + } else { + sb->s_time_gran = NSEC_PER_SEC; + } + } + if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) { + sbi->s_want_extra_isize = sizeof(struct ext4_inode) - + EXT4_GOOD_OLD_INODE_SIZE; + if (ext4_has_feature_extra_isize(sb)) { + unsigned v, max = (sbi->s_inode_size - + EXT4_GOOD_OLD_INODE_SIZE); + + v = le16_to_cpu(es->s_want_extra_isize); + if (v > max) { + ext4_msg(sb, KERN_ERR, + "bad s_want_extra_isize: %d", v); + goto failed_mount; + } + if (sbi->s_want_extra_isize < v) + sbi->s_want_extra_isize = v; + + v = le16_to_cpu(es->s_min_extra_isize); + if (v > max) { + ext4_msg(sb, KERN_ERR, + "bad s_min_extra_isize: %d", v); + goto failed_mount; + } + if (sbi->s_want_extra_isize < v) + sbi->s_want_extra_isize = v; + } + } + if (sbi->s_es->s_mount_opts[0]) { char *s_mount_opts = kstrndup(sbi->s_es->s_mount_opts, sizeof(sbi->s_es->s_mount_opts), @@ -3875,14 +3938,6 @@ if (!ext4_feature_set_ok(sb, (sb_rdonly(sb)))) goto failed_mount; - blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); - if (blocksize < EXT4_MIN_BLOCK_SIZE || - blocksize > EXT4_MAX_BLOCK_SIZE) { - ext4_msg(sb, KERN_ERR, - "Unsupported filesystem blocksize %d (%d log_block_size)", - blocksize, le32_to_cpu(es->s_log_block_size)); - goto failed_mount; - } if (le32_to_cpu(es->s_log_block_size) > (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) { ext4_msg(sb, KERN_ERR, @@ -3955,29 +4010,6 @@ has_huge_files); sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files); - if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) { - sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE; - sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO; - } else { - sbi->s_inode_size = le16_to_cpu(es->s_inode_size); - sbi->s_first_ino = le32_to_cpu(es->s_first_ino); - if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) { - ext4_msg(sb, KERN_ERR, "invalid first ino: %u", - sbi->s_first_ino); - goto failed_mount; - } - if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) || - (!is_power_of_2(sbi->s_inode_size)) || - (sbi->s_inode_size > blocksize)) { - ext4_msg(sb, KERN_ERR, - "unsupported inode size: %d", - sbi->s_inode_size); - goto failed_mount; - } - if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) - sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2); - } - sbi->s_desc_size = le16_to_cpu(es->s_desc_size); if (ext4_has_feature_64bit(sb)) { if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT || @@ -4000,7 +4032,7 @@ if (sbi->s_inodes_per_group < sbi->s_inodes_per_block || sbi->s_inodes_per_group > blocksize * 8) { ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n", - sbi->s_blocks_per_group); + sbi->s_inodes_per_group); goto failed_mount; } sbi->s_itb_per_group = sbi->s_inodes_per_group / @@ -4131,9 +4163,9 @@ EXT4_BLOCKS_PER_GROUP(sb) - 1); do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb)); if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) { - ext4_msg(sb, KERN_WARNING, "groups count too large: %u " + ext4_msg(sb, KERN_WARNING, "groups count too large: %llu " "(block count %llu, first data block %u, " - "blocks per group %lu)", sbi->s_groups_count, + "blocks per group %lu)", blocks_count, ext4_blocks_count(es), le32_to_cpu(es->s_first_data_block), EXT4_BLOCKS_PER_GROUP(sb)); @@ -4161,9 +4193,10 @@ goto failed_mount; } } - sbi->s_group_desc = kvmalloc_array(db_count, - sizeof(struct buffer_head *), - GFP_KERNEL); + rcu_assign_pointer(sbi->s_group_desc, + kvmalloc_array(db_count, + sizeof(struct buffer_head *), + GFP_KERNEL)); if (sbi->s_group_desc == NULL) { ext4_msg(sb, KERN_ERR, "not enough memory"); ret = -ENOMEM; @@ -4175,18 +4208,23 @@ /* Pre-read the descriptors into the buffer cache */ for (i = 0; i < db_count; i++) { block = descriptor_loc(sb, logical_sb_block, i); - sb_breadahead(sb, block); + sb_breadahead_unmovable(sb, block); } for (i = 0; i < db_count; i++) { + struct buffer_head *bh; + block = descriptor_loc(sb, logical_sb_block, i); - sbi->s_group_desc[i] = sb_bread_unmovable(sb, block); - if (!sbi->s_group_desc[i]) { + bh = sb_bread_unmovable(sb, block); + if (!bh) { ext4_msg(sb, KERN_ERR, "can't read group descriptor %d", i); db_count = i; goto failed_mount2; } + rcu_read_lock(); + rcu_dereference(sbi->s_group_desc)[i] = bh; + rcu_read_unlock(); } sbi->s_gdb_count = db_count; if (!ext4_check_descriptors(sb, logical_sb_block, &first_not_zeroed)) { @@ -4421,8 +4459,6 @@ } else if (ret) goto failed_mount4a; - ext4_clamp_want_extra_isize(sb); - ext4_set_resv_clusters(sb); err = ext4_setup_system_zone(sb); @@ -4460,7 +4496,7 @@ err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0, GFP_KERNEL); if (!err) - err = percpu_init_rwsem(&sbi->s_journal_flag_rwsem); + err = percpu_init_rwsem(&sbi->s_writepages_rwsem); if (err) { ext4_msg(sb, KERN_ERR, "insufficient memory"); @@ -4548,13 +4584,19 @@ ext4_unregister_li_request(sb); failed_mount6: ext4_mb_release(sb); - if (sbi->s_flex_groups) - kvfree(sbi->s_flex_groups); + rcu_read_lock(); + flex_groups = rcu_dereference(sbi->s_flex_groups); + if (flex_groups) { + for (i = 0; i < sbi->s_flex_groups_allocated; i++) + kvfree(flex_groups[i]); + kvfree(flex_groups); + } + rcu_read_unlock(); percpu_counter_destroy(&sbi->s_freeclusters_counter); percpu_counter_destroy(&sbi->s_freeinodes_counter); percpu_counter_destroy(&sbi->s_dirs_counter); percpu_counter_destroy(&sbi->s_dirtyclusters_counter); - percpu_free_rwsem(&sbi->s_journal_flag_rwsem); + percpu_free_rwsem(&sbi->s_writepages_rwsem); failed_mount5: ext4_ext_release(sb); ext4_release_system_zone(sb); @@ -4585,9 +4627,12 @@ if (sbi->s_mmp_tsk) kthread_stop(sbi->s_mmp_tsk); failed_mount2: + rcu_read_lock(); + group_desc = rcu_dereference(sbi->s_group_desc); for (i = 0; i < db_count; i++) - brelse(sbi->s_group_desc[i]); - kvfree(sbi->s_group_desc); + brelse(group_desc[i]); + kvfree(group_desc); + rcu_read_unlock(); failed_mount: if (sbi->s_chksum_driver) crypto_free_shash(sbi->s_chksum_driver); @@ -5207,8 +5252,6 @@ goto restore_opts; } - ext4_clamp_want_extra_isize(sb); - if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^ test_opt(sb, JOURNAL_CHECKSUM)) { ext4_msg(sb, KERN_ERR, "changing journal_checksum " diff -Nru linux-4.19.98/fs/f2fs/dir.c linux-4.19.118/fs/f2fs/dir.c --- linux-4.19.98/fs/f2fs/dir.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/f2fs/dir.c 2020-04-23 08:30:24.000000000 +0000 @@ -572,6 +572,11 @@ if (inode) { f2fs_i_pino_write(inode, dir->i_ino); + + /* synchronize inode page's data from inode cache */ + if (is_inode_flag_set(inode, FI_NEW_INODE)) + f2fs_update_inode(inode, page); + f2fs_put_page(page, 1); } diff -Nru linux-4.19.98/fs/f2fs/f2fs.h linux-4.19.118/fs/f2fs/f2fs.h --- linux-4.19.98/fs/f2fs/f2fs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/f2fs/f2fs.h 2020-04-23 08:30:24.000000000 +0000 @@ -1701,7 +1701,7 @@ if (time_to_inject(sbi, FAULT_BLOCK)) { f2fs_show_injection_info(FAULT_BLOCK); release = *count; - goto enospc; + goto release_quota; } /* @@ -1741,6 +1741,7 @@ enospc: percpu_counter_sub(&sbi->alloc_valid_block_count, release); +release_quota: dquot_release_reservation_block(inode, release); return -ENOSPC; } diff -Nru linux-4.19.98/fs/f2fs/inline.c linux-4.19.118/fs/f2fs/inline.c --- linux-4.19.98/fs/f2fs/inline.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/f2fs/inline.c 2020-04-23 08:30:24.000000000 +0000 @@ -133,6 +133,7 @@ err = f2fs_get_node_info(fio.sbi, dn->nid, &ni); if (err) { + f2fs_truncate_data_blocks_range(dn, 1); f2fs_put_dnode(dn); return err; } @@ -577,6 +578,11 @@ /* we don't need to mark_inode_dirty now */ if (inode) { f2fs_i_pino_write(inode, dir->i_ino); + + /* synchronize inode page's data from inode cache */ + if (is_inode_flag_set(inode, FI_NEW_INODE)) + f2fs_update_inode(inode, page); + f2fs_put_page(page, 1); } diff -Nru linux-4.19.98/fs/f2fs/namei.c linux-4.19.118/fs/f2fs/namei.c --- linux-4.19.98/fs/f2fs/namei.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/f2fs/namei.c 2020-04-23 08:30:24.000000000 +0000 @@ -769,6 +769,7 @@ if (whiteout) { f2fs_i_links_write(inode, false); + inode->i_state |= I_LINKABLE; *whiteout = inode; } else { d_tmpfile(dentry, inode); @@ -835,6 +836,12 @@ F2FS_I(old_dentry->d_inode)->i_projid))) return -EXDEV; + if (flags & RENAME_WHITEOUT) { + err = f2fs_create_whiteout(old_dir, &whiteout); + if (err) + return err; + } + err = dquot_initialize(old_dir); if (err) goto out; @@ -865,17 +872,11 @@ } } - if (flags & RENAME_WHITEOUT) { - err = f2fs_create_whiteout(old_dir, &whiteout); - if (err) - goto out_dir; - } - if (new_inode) { err = -ENOTEMPTY; if (old_dir_entry && !f2fs_empty_dir(new_inode)) - goto out_whiteout; + goto out_dir; err = -ENOENT; new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name, @@ -883,7 +884,7 @@ if (!new_entry) { if (IS_ERR(new_page)) err = PTR_ERR(new_page); - goto out_whiteout; + goto out_dir; } f2fs_balance_fs(sbi, true); @@ -915,7 +916,7 @@ err = f2fs_add_link(new_dentry, old_inode); if (err) { f2fs_unlock_op(sbi); - goto out_whiteout; + goto out_dir; } if (old_dir_entry) @@ -939,7 +940,7 @@ if (IS_ERR(old_page)) err = PTR_ERR(old_page); f2fs_unlock_op(sbi); - goto out_whiteout; + goto out_dir; } } } @@ -958,7 +959,6 @@ f2fs_delete_entry(old_entry, old_page, old_dir, NULL); if (whiteout) { - whiteout->i_state |= I_LINKABLE; set_inode_flag(whiteout, FI_INC_LINK); err = f2fs_add_link(old_dentry, whiteout); if (err) @@ -992,15 +992,14 @@ f2fs_unlock_op(sbi); if (new_page) f2fs_put_page(new_page, 0); -out_whiteout: - if (whiteout) - iput(whiteout); out_dir: if (old_dir_entry) f2fs_put_page(old_dir_page, 0); out_old: f2fs_put_page(old_page, 0); out: + if (whiteout) + iput(whiteout); return err; } diff -Nru linux-4.19.98/fs/f2fs/node.c linux-4.19.118/fs/f2fs/node.c --- linux-4.19.98/fs/f2fs/node.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/f2fs/node.c 2020-04-23 08:30:24.000000000 +0000 @@ -1559,15 +1559,16 @@ if (atomic && !test_opt(sbi, NOBARRIER)) fio.op_flags |= REQ_PREFLUSH | REQ_FUA; - set_page_writeback(page); - ClearPageError(page); - + /* should add to global list before clearing PAGECACHE status */ if (f2fs_in_warm_node_list(sbi, page)) { seq = f2fs_add_fsync_node_entry(sbi, page); if (seq_id) *seq_id = seq; } + set_page_writeback(page); + ClearPageError(page); + fio.old_blkaddr = ni.blk_addr; f2fs_do_write_node_page(nid, &fio); set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page)); diff -Nru linux-4.19.98/fs/f2fs/super.c linux-4.19.118/fs/f2fs/super.c --- linux-4.19.98/fs/f2fs/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/f2fs/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -1148,9 +1148,11 @@ return PTR_ERR(dquot); spin_lock(&dquot->dq_dqb_lock); - limit = (dquot->dq_dqb.dqb_bsoftlimit ? - dquot->dq_dqb.dqb_bsoftlimit : - dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits; + limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit, + dquot->dq_dqb.dqb_bhardlimit); + if (limit) + limit >>= sb->s_blocksize_bits; + if (limit && buf->f_blocks > limit) { curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits; buf->f_blocks = limit; @@ -1159,9 +1161,9 @@ (buf->f_blocks - curblock) : 0; } - limit = dquot->dq_dqb.dqb_isoftlimit ? - dquot->dq_dqb.dqb_isoftlimit : - dquot->dq_dqb.dqb_ihardlimit; + limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit, + dquot->dq_dqb.dqb_ihardlimit); + if (limit && buf->f_files > limit) { buf->f_files = limit; buf->f_ffree = @@ -1646,6 +1648,7 @@ int offset = off & (sb->s_blocksize - 1); size_t towrite = len; struct page *page; + void *fsdata = NULL; char *kaddr; int err = 0; int tocopy; @@ -1655,7 +1658,7 @@ towrite); retry: err = a_ops->write_begin(NULL, mapping, off, tocopy, 0, - &page, NULL); + &page, &fsdata); if (unlikely(err)) { if (err == -ENOMEM) { congestion_wait(BLK_RW_ASYNC, HZ/50); @@ -1670,7 +1673,7 @@ flush_dcache_page(page); a_ops->write_end(NULL, mapping, off, tocopy, tocopy, - page, NULL); + page, fsdata); offset = 0; towrite -= tocopy; off += tocopy; diff -Nru linux-4.19.98/fs/f2fs/sysfs.c linux-4.19.118/fs/f2fs/sysfs.c --- linux-4.19.98/fs/f2fs/sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/f2fs/sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -658,10 +658,12 @@ ret = kobject_init_and_add(&f2fs_feat, &f2fs_feat_ktype, NULL, "features"); - if (ret) + if (ret) { + kobject_put(&f2fs_feat); kset_unregister(&f2fs_kset); - else + } else { f2fs_proc_root = proc_mkdir("fs/f2fs", NULL); + } return ret; } @@ -682,8 +684,11 @@ init_completion(&sbi->s_kobj_unregister); err = kobject_init_and_add(&sbi->s_kobj, &f2fs_sb_ktype, NULL, "%s", sb->s_id); - if (err) + if (err) { + kobject_put(&sbi->s_kobj); + wait_for_completion(&sbi->s_kobj_unregister); return err; + } if (f2fs_proc_root) sbi->s_proc = proc_mkdir(sb->s_id, f2fs_proc_root); @@ -711,4 +716,5 @@ remove_proc_entry(sbi->sb->s_id, f2fs_proc_root); } kobject_del(&sbi->s_kobj); + kobject_put(&sbi->s_kobj); } diff -Nru linux-4.19.98/fs/fat/inode.c linux-4.19.118/fs/fat/inode.c --- linux-4.19.98/fs/fat/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/fat/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -743,6 +743,13 @@ return NULL; init_rwsem(&ei->truncate_lock); + /* Zeroing to allow iput() even if partial initialized inode. */ + ei->mmu_private = 0; + ei->i_start = 0; + ei->i_logstart = 0; + ei->i_attrs = 0; + ei->i_pos = 0; + return &ei->vfs_inode; } @@ -1373,16 +1380,6 @@ return 0; } -static void fat_dummy_inode_init(struct inode *inode) -{ - /* Initialize this dummy inode to work as no-op. */ - MSDOS_I(inode)->mmu_private = 0; - MSDOS_I(inode)->i_start = 0; - MSDOS_I(inode)->i_logstart = 0; - MSDOS_I(inode)->i_attrs = 0; - MSDOS_I(inode)->i_pos = 0; -} - static int fat_read_root(struct inode *inode) { struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb); @@ -1827,13 +1824,11 @@ fat_inode = new_inode(sb); if (!fat_inode) goto out_fail; - fat_dummy_inode_init(fat_inode); sbi->fat_inode = fat_inode; fsinfo_inode = new_inode(sb); if (!fsinfo_inode) goto out_fail; - fat_dummy_inode_init(fsinfo_inode); fsinfo_inode->i_ino = MSDOS_FSINFO_INO; sbi->fsinfo_inode = fsinfo_inode; insert_inode_hash(fsinfo_inode); diff -Nru linux-4.19.98/fs/filesystems.c linux-4.19.118/fs/filesystems.c --- linux-4.19.98/fs/filesystems.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/filesystems.c 2020-04-23 08:30:24.000000000 +0000 @@ -267,7 +267,9 @@ fs = __get_fs_type(name, len); if (!fs && (request_module("fs-%.*s", len, name) == 0)) { fs = __get_fs_type(name, len); - WARN_ONCE(!fs, "request_module fs-%.*s succeeded, but still no fs?\n", len, name); + if (!fs) + pr_warn_once("request_module fs-%.*s succeeded, but still no fs?\n", + len, name); } if (dot && fs && !(fs->fs_flags & FS_HAS_SUBTYPE)) { diff -Nru linux-4.19.98/fs/gfs2/file.c linux-4.19.118/fs/gfs2/file.c --- linux-4.19.98/fs/gfs2/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/gfs2/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -780,7 +780,7 @@ struct file *file = iocb->ki_filp; struct inode *inode = file_inode(file); struct gfs2_inode *ip = GFS2_I(inode); - ssize_t written = 0, ret; + ssize_t ret; ret = gfs2_rsqa_alloc(ip); if (ret) @@ -800,68 +800,58 @@ inode_lock(inode); ret = generic_write_checks(iocb, from); if (ret <= 0) - goto out; - - /* We can write back this queue in page reclaim */ - current->backing_dev_info = inode_to_bdi(inode); + goto out_unlock; ret = file_remove_privs(file); if (ret) - goto out2; + goto out_unlock; ret = file_update_time(file); if (ret) - goto out2; + goto out_unlock; if (iocb->ki_flags & IOCB_DIRECT) { struct address_space *mapping = file->f_mapping; - loff_t pos, endbyte; - ssize_t buffered; - - written = gfs2_file_direct_write(iocb, from); - if (written < 0 || !iov_iter_count(from)) - goto out2; + ssize_t buffered, ret2; - ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); - if (unlikely(ret < 0)) - goto out2; - buffered = ret; + ret = gfs2_file_direct_write(iocb, from); + if (ret < 0 || !iov_iter_count(from)) + goto out_unlock; + + iocb->ki_flags |= IOCB_DSYNC; + current->backing_dev_info = inode_to_bdi(inode); + buffered = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); + current->backing_dev_info = NULL; + if (unlikely(buffered <= 0)) + goto out_unlock; /* * We need to ensure that the page cache pages are written to * disk and invalidated to preserve the expected O_DIRECT - * semantics. + * semantics. If the writeback or invalidate fails, only report + * the direct I/O range as we don't know if the buffered pages + * made it to disk. */ - pos = iocb->ki_pos; - endbyte = pos + buffered - 1; - ret = filemap_write_and_wait_range(mapping, pos, endbyte); - if (!ret) { - iocb->ki_pos += buffered; - written += buffered; - invalidate_mapping_pages(mapping, - pos >> PAGE_SHIFT, - endbyte >> PAGE_SHIFT); - } else { - /* - * We don't know how much we wrote, so just return - * the number of bytes which were direct-written - */ - } + iocb->ki_pos += buffered; + ret2 = generic_write_sync(iocb, buffered); + invalidate_mapping_pages(mapping, + (iocb->ki_pos - buffered) >> PAGE_SHIFT, + (iocb->ki_pos - 1) >> PAGE_SHIFT); + if (!ret || ret2 > 0) + ret += ret2; } else { + current->backing_dev_info = inode_to_bdi(inode); ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops); - if (likely(ret > 0)) + current->backing_dev_info = NULL; + if (likely(ret > 0)) { iocb->ki_pos += ret; + ret = generic_write_sync(iocb, ret); + } } -out2: - current->backing_dev_info = NULL; -out: +out_unlock: inode_unlock(inode); - if (likely(ret > 0)) { - /* Handle various SYNC-type writes */ - ret = generic_write_sync(iocb, ret); - } - return written ? written : ret; + return ret; } static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len, diff -Nru linux-4.19.98/fs/gfs2/glock.c linux-4.19.118/fs/gfs2/glock.c --- linux-4.19.98/fs/gfs2/glock.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/gfs2/glock.c 2020-04-23 08:30:24.000000000 +0000 @@ -636,6 +636,9 @@ goto out_unlock; if (nonblock) goto out_sched; + smp_mb(); + if (atomic_read(&gl->gl_revokes) != 0) + goto out_sched; set_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags); GLOCK_BUG_ON(gl, gl->gl_demote_state == LM_ST_EXCLUSIVE); gl->gl_target = gl->gl_demote_state; diff -Nru linux-4.19.98/fs/gfs2/inode.c linux-4.19.118/fs/gfs2/inode.c --- linux-4.19.98/fs/gfs2/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/gfs2/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -1251,7 +1251,7 @@ if (!(file->f_mode & FMODE_OPENED)) return finish_no_open(file, d); dput(d); - return 0; + return excl && (flags & O_CREAT) ? -EEXIST : 0; } BUG_ON(d != NULL); diff -Nru linux-4.19.98/fs/hfsplus/attributes.c linux-4.19.118/fs/hfsplus/attributes.c --- linux-4.19.98/fs/hfsplus/attributes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/hfsplus/attributes.c 2020-04-23 08:30:24.000000000 +0000 @@ -292,6 +292,10 @@ return -ENOENT; } + /* Avoid btree corruption */ + hfs_bnode_read(fd->bnode, fd->search_key, + fd->keyoffset, fd->keylength); + err = hfs_brec_remove(fd); if (err) return err; diff -Nru linux-4.19.98/fs/inode.c linux-4.19.118/fs/inode.c --- linux-4.19.98/fs/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -136,6 +136,7 @@ inode->i_sb = sb; inode->i_blkbits = sb->s_blocksize_bits; inode->i_flags = 0; + atomic64_set(&inode->i_sequence, 0); atomic_set(&inode->i_count, 1); inode->i_op = &empty_iops; inode->i_fop = &no_open_fops; diff -Nru linux-4.19.98/fs/jbd2/checkpoint.c linux-4.19.118/fs/jbd2/checkpoint.c --- linux-4.19.98/fs/jbd2/checkpoint.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/jbd2/checkpoint.c 2020-04-23 08:30:24.000000000 +0000 @@ -165,7 +165,7 @@ "journal space in %s\n", __func__, journal->j_devname); WARN_ON(1); - jbd2_journal_abort(journal, 0); + jbd2_journal_abort(journal, -EIO); } write_lock(&journal->j_state_lock); } else { diff -Nru linux-4.19.98/fs/jbd2/commit.c linux-4.19.118/fs/jbd2/commit.c --- linux-4.19.98/fs/jbd2/commit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/jbd2/commit.c 2020-04-23 08:30:24.000000000 +0000 @@ -781,7 +781,7 @@ err = journal_submit_commit_record(journal, commit_transaction, &cbh, crc32_sum); if (err) - __jbd2_journal_abort_hard(journal); + jbd2_journal_abort(journal, err); } blk_finish_plug(&plug); @@ -874,7 +874,7 @@ err = journal_submit_commit_record(journal, commit_transaction, &cbh, crc32_sum); if (err) - __jbd2_journal_abort_hard(journal); + jbd2_journal_abort(journal, err); } if (cbh) err = journal_wait_on_commit_record(journal, cbh); @@ -971,29 +971,34 @@ * it. */ /* - * A buffer which has been freed while still being journaled by - * a previous transaction. - */ - if (buffer_freed(bh)) { + * A buffer which has been freed while still being journaled + * by a previous transaction, refile the buffer to BJ_Forget of + * the running transaction. If the just committed transaction + * contains "add to orphan" operation, we can completely + * invalidate the buffer now. We are rather through in that + * since the buffer may be still accessible when blocksize < + * pagesize and it is attached to the last partial page. + */ + if (buffer_freed(bh) && !jh->b_next_transaction) { + struct address_space *mapping; + + clear_buffer_freed(bh); + clear_buffer_jbddirty(bh); + /* - * If the running transaction is the one containing - * "add to orphan" operation (b_next_transaction != - * NULL), we have to wait for that transaction to - * commit before we can really get rid of the buffer. - * So just clear b_modified to not confuse transaction - * credit accounting and refile the buffer to - * BJ_Forget of the running transaction. If the just - * committed transaction contains "add to orphan" - * operation, we can completely invalidate the buffer - * now. We are rather through in that since the - * buffer may be still accessible when blocksize < - * pagesize and it is attached to the last partial - * page. + * Block device buffers need to stay mapped all the + * time, so it is enough to clear buffer_jbddirty and + * buffer_freed bits. For the file mapping buffers (i.e. + * journalled data) we need to unmap buffer and clear + * more bits. We also need to be careful about the check + * because the data page mapping can get cleared under + * our hands. Note that if mapping == NULL, we don't + * need to make buffer unmapped because the page is + * already detached from the mapping and buffers cannot + * get reused. */ - jh->b_modified = 0; - if (!jh->b_next_transaction) { - clear_buffer_freed(bh); - clear_buffer_jbddirty(bh); + mapping = READ_ONCE(bh->b_page->mapping); + if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) { clear_buffer_mapped(bh); clear_buffer_new(bh); clear_buffer_req(bh); diff -Nru linux-4.19.98/fs/jbd2/journal.c linux-4.19.118/fs/jbd2/journal.c --- linux-4.19.98/fs/jbd2/journal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/jbd2/journal.c 2020-04-23 08:30:24.000000000 +0000 @@ -1002,6 +1002,7 @@ static void *jbd2_seq_info_next(struct seq_file *seq, void *v, loff_t *pos) { + (*pos)++; return NULL; } @@ -1700,6 +1701,11 @@ journal->j_devname); return -EFSCORRUPTED; } + /* + * clear JBD2_ABORT flag initialized in journal_init_common + * here to update log tail information with the newest seq. + */ + journal->j_flags &= ~JBD2_ABORT; /* OK, we've finished with the dynamic journal bits: * reinitialise the dynamic contents of the superblock in memory @@ -1707,7 +1713,6 @@ if (journal_reset(journal)) goto recovery_error; - journal->j_flags &= ~JBD2_ABORT; journal->j_flags |= JBD2_LOADED; return 0; @@ -2128,8 +2133,7 @@ if (journal->j_flags & JBD2_ABORT) { write_unlock(&journal->j_state_lock); - if (!old_errno && old_errno != -ESHUTDOWN && - errno == -ESHUTDOWN) + if (old_errno != -ESHUTDOWN && errno == -ESHUTDOWN) jbd2_journal_update_sb_errno(journal); return; } @@ -2137,12 +2141,10 @@ __jbd2_journal_abort_hard(journal); - if (errno) { - jbd2_journal_update_sb_errno(journal); - write_lock(&journal->j_state_lock); - journal->j_flags |= JBD2_REC_ERR; - write_unlock(&journal->j_state_lock); - } + jbd2_journal_update_sb_errno(journal); + write_lock(&journal->j_state_lock); + journal->j_flags |= JBD2_REC_ERR; + write_unlock(&journal->j_state_lock); } /** @@ -2184,11 +2186,6 @@ * failure to disk. ext3_error, for example, now uses this * functionality. * - * Errors which originate from within the journaling layer will NOT - * supply an errno; a null errno implies that absolutely no further - * writes are done to the journal (unless there are any already in - * progress). - * */ void jbd2_journal_abort(journal_t *journal, int errno) diff -Nru linux-4.19.98/fs/jbd2/transaction.c linux-4.19.118/fs/jbd2/transaction.c --- linux-4.19.98/fs/jbd2/transaction.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/jbd2/transaction.c 2020-04-23 08:30:24.000000000 +0000 @@ -831,8 +831,6 @@ char *frozen_buffer = NULL; unsigned long start_lock, time_lock; - if (is_handle_aborted(handle)) - return -EROFS; journal = transaction->t_journal; jbd_debug(5, "journal_head %p, force_copy %d\n", jh, force_copy); @@ -1047,8 +1045,8 @@ /* For undo access buffer must have data copied */ if (undo && !jh->b_committed_data) goto out; - if (jh->b_transaction != handle->h_transaction && - jh->b_next_transaction != handle->h_transaction) + if (READ_ONCE(jh->b_transaction) != handle->h_transaction && + READ_ONCE(jh->b_next_transaction) != handle->h_transaction) goto out; /* * There are two reasons for the barrier here: @@ -1084,6 +1082,9 @@ struct journal_head *jh; int rc; + if (is_handle_aborted(handle)) + return -EROFS; + if (jbd2_write_access_granted(handle, bh, false)) return 0; @@ -1221,6 +1222,9 @@ struct journal_head *jh; char *committed_data = NULL; + if (is_handle_aborted(handle)) + return -EROFS; + if (jbd2_write_access_granted(handle, bh, true)) return 0; @@ -2228,14 +2232,16 @@ return -EBUSY; } /* - * OK, buffer won't be reachable after truncate. We just set - * j_next_transaction to the running transaction (if there is - * one) and mark buffer as freed so that commit code knows it - * should clear dirty bits when it is done with the buffer. + * OK, buffer won't be reachable after truncate. We just clear + * b_modified to not confuse transaction credit accounting, and + * set j_next_transaction to the running transaction (if there + * is one) and mark buffer as freed so that commit code knows + * it should clear dirty bits when it is done with the buffer. */ set_buffer_freed(bh); if (journal->j_running_transaction && buffer_jbddirty(bh)) jh->b_next_transaction = journal->j_running_transaction; + jh->b_modified = 0; jbd2_journal_put_journal_head(jh); spin_unlock(&journal->j_list_lock); jbd_unlock_bh_state(bh); @@ -2461,8 +2467,8 @@ * our jh reference and thus __jbd2_journal_file_buffer() must not * take a new one. */ - jh->b_transaction = jh->b_next_transaction; - jh->b_next_transaction = NULL; + WRITE_ONCE(jh->b_transaction, jh->b_next_transaction); + WRITE_ONCE(jh->b_next_transaction, NULL); if (buffer_freed(bh)) jlist = BJ_Forget; else if (jh->b_modified) diff -Nru linux-4.19.98/fs/jfs/jfs_txnmgr.c linux-4.19.118/fs/jfs/jfs_txnmgr.c --- linux-4.19.98/fs/jfs/jfs_txnmgr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/jfs/jfs_txnmgr.c 2020-04-23 08:30:24.000000000 +0000 @@ -1928,8 +1928,7 @@ * header ? */ if (tlck->type & tlckTRUNCATE) { - /* This odd declaration suppresses a bogus gcc warning */ - pxd_t pxd = pxd; /* truncated extent of xad */ + pxd_t pxd; /* truncated extent of xad */ int twm; /* diff -Nru linux-4.19.98/fs/libfs.c linux-4.19.118/fs/libfs.c --- linux-4.19.98/fs/libfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/libfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -802,7 +802,7 @@ { struct simple_attr *attr; - attr = kmalloc(sizeof(*attr), GFP_KERNEL); + attr = kzalloc(sizeof(*attr), GFP_KERNEL); if (!attr) return -ENOMEM; @@ -842,9 +842,11 @@ if (ret) return ret; - if (*ppos) { /* continued read */ + if (*ppos && attr->get_buf[0]) { + /* continued read */ size = strlen(attr->get_buf); - } else { /* first read */ + } else { + /* first read */ u64 val; ret = attr->get(attr->data, &val); if (ret) diff -Nru linux-4.19.98/fs/namei.c linux-4.19.118/fs/namei.c --- linux-4.19.98/fs/namei.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/namei.c 2020-04-23 08:30:24.000000000 +0000 @@ -1009,7 +1009,8 @@ * may_create_in_sticky - Check whether an O_CREAT open in a sticky directory * should be allowed, or not, on files that already * exist. - * @dir: the sticky parent directory + * @dir_mode: mode bits of directory + * @dir_uid: owner of directory * @inode: the inode of the file to open * * Block an O_CREAT open of a FIFO (or a regular file) when: @@ -1025,18 +1026,18 @@ * * Returns 0 if the open is allowed, -ve on error. */ -static int may_create_in_sticky(struct dentry * const dir, +static int may_create_in_sticky(umode_t dir_mode, kuid_t dir_uid, struct inode * const inode) { if ((!sysctl_protected_fifos && S_ISFIFO(inode->i_mode)) || (!sysctl_protected_regular && S_ISREG(inode->i_mode)) || - likely(!(dir->d_inode->i_mode & S_ISVTX)) || - uid_eq(inode->i_uid, dir->d_inode->i_uid) || + likely(!(dir_mode & S_ISVTX)) || + uid_eq(inode->i_uid, dir_uid) || uid_eq(current_fsuid(), inode->i_uid)) return 0; - if (likely(dir->d_inode->i_mode & 0002) || - (dir->d_inode->i_mode & 0020 && + if (likely(dir_mode & 0002) || + (dir_mode & 0020 && ((sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) || (sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode))))) { return -EACCES; @@ -1367,7 +1368,7 @@ nd->path.dentry = parent; nd->seq = seq; if (unlikely(!path_connected(&nd->path))) - return -ENOENT; + return -ECHILD; break; } else { struct mount *mnt = real_mount(nd->path.mnt); @@ -3258,6 +3259,8 @@ struct file *file, const struct open_flags *op) { struct dentry *dir = nd->path.dentry; + kuid_t dir_uid = nd->inode->i_uid; + umode_t dir_mode = nd->inode->i_mode; int open_flag = op->open_flag; bool will_truncate = (open_flag & O_TRUNC) != 0; bool got_write = false; @@ -3393,7 +3396,7 @@ error = -EISDIR; if (d_is_dir(nd->path.dentry)) goto out; - error = may_create_in_sticky(dir, + error = may_create_in_sticky(dir_mode, dir_uid, d_backing_inode(nd->path.dentry)); if (unlikely(error)) goto out; diff -Nru linux-4.19.98/fs/nfs/Kconfig linux-4.19.118/fs/nfs/Kconfig --- linux-4.19.98/fs/nfs/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -89,7 +89,7 @@ config NFS_SWAP bool "Provide swap over NFS support" default n - depends on NFS_FS + depends on NFS_FS && SWAP select SUNRPC_SWAP help This option enables swapon to work on files located on NFS mounts. diff -Nru linux-4.19.98/fs/nfs/callback_proc.c linux-4.19.118/fs/nfs/callback_proc.c --- linux-4.19.98/fs/nfs/callback_proc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/callback_proc.c 2020-04-23 08:30:24.000000000 +0000 @@ -130,6 +130,8 @@ list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { list_for_each_entry(lo, &server->layouts, plh_layouts) { + if (!pnfs_layout_is_valid(lo)) + continue; if (stateid != NULL && !nfs4_stateid_match_other(stateid, &lo->plh_stateid)) continue; diff -Nru linux-4.19.98/fs/nfs/client.c linux-4.19.118/fs/nfs/client.c --- linux-4.19.98/fs/nfs/client.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/client.c 2020-04-23 08:30:24.000000000 +0000 @@ -157,6 +157,7 @@ if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) goto error_0; + clp->cl_minorversion = cl_init->minorversion; clp->cl_nfs_mod = cl_init->nfs_mod; if (!try_module_get(clp->cl_nfs_mod->owner)) goto error_dealloc; diff -Nru linux-4.19.98/fs/nfs/delegation.c linux-4.19.118/fs/nfs/delegation.c --- linux-4.19.98/fs/nfs/delegation.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/delegation.c 2020-04-23 08:30:24.000000000 +0000 @@ -240,6 +240,8 @@ spin_lock(&delegation->lock); if (delegation->inode != NULL) inode = igrab(delegation->inode); + if (!inode) + set_bit(NFS_DELEGATION_INODE_FREEING, &delegation->flags); spin_unlock(&delegation->lock); return inode; } @@ -955,10 +957,11 @@ list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { list_for_each_entry_rcu(delegation, &server->delegations, super_list) { - if (test_bit(NFS_DELEGATION_RETURNING, - &delegation->flags)) - continue; - if (test_bit(NFS_DELEGATION_NEED_RECLAIM, + if (test_bit(NFS_DELEGATION_INODE_FREEING, + &delegation->flags) || + test_bit(NFS_DELEGATION_RETURNING, + &delegation->flags) || + test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) == 0) continue; if (!nfs_sb_active(server->super)) @@ -1064,10 +1067,11 @@ list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { list_for_each_entry_rcu(delegation, &server->delegations, super_list) { - if (test_bit(NFS_DELEGATION_RETURNING, - &delegation->flags)) - continue; - if (test_bit(NFS_DELEGATION_TEST_EXPIRED, + if (test_bit(NFS_DELEGATION_INODE_FREEING, + &delegation->flags) || + test_bit(NFS_DELEGATION_RETURNING, + &delegation->flags) || + test_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags) == 0) continue; if (!nfs_sb_active(server->super)) diff -Nru linux-4.19.98/fs/nfs/delegation.h linux-4.19.118/fs/nfs/delegation.h --- linux-4.19.98/fs/nfs/delegation.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/delegation.h 2020-04-23 08:30:24.000000000 +0000 @@ -34,6 +34,7 @@ NFS_DELEGATION_RETURNING, NFS_DELEGATION_REVOKED, NFS_DELEGATION_TEST_EXPIRED, + NFS_DELEGATION_INODE_FREEING, }; int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, diff -Nru linux-4.19.98/fs/nfs/dir.c linux-4.19.118/fs/nfs/dir.c --- linux-4.19.98/fs/nfs/dir.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/dir.c 2020-04-23 08:30:24.000000000 +0000 @@ -162,6 +162,17 @@ bool eof; } nfs_readdir_descriptor_t; +static +void nfs_readdir_init_array(struct page *page) +{ + struct nfs_cache_array *array; + + array = kmap_atomic(page); + memset(array, 0, sizeof(struct nfs_cache_array)); + array->eof_index = -1; + kunmap_atomic(array); +} + /* * we are freeing strings created by nfs_add_to_readdir_array() */ @@ -174,6 +185,7 @@ array = kmap_atomic(page); for (i = 0; i < array->size; i++) kfree(array->array[i].string.name); + array->size = 0; kunmap_atomic(array); } @@ -610,6 +622,8 @@ int status = -ENOMEM; unsigned int array_size = ARRAY_SIZE(pages); + nfs_readdir_init_array(page); + entry.prev_cookie = 0; entry.cookie = desc->last_cookie; entry.eof = 0; @@ -626,8 +640,6 @@ } array = kmap(page); - memset(array, 0, sizeof(struct nfs_cache_array)); - array->eof_index = -1; status = nfs_readdir_alloc_pages(pages, array_size); if (status < 0) @@ -681,6 +693,7 @@ unlock_page(page); return 0; error: + nfs_readdir_clear_array(page); unlock_page(page); return ret; } @@ -688,8 +701,6 @@ static void cache_page_release(nfs_readdir_descriptor_t *desc) { - if (!desc->page->mapping) - nfs_readdir_clear_array(desc->page); put_page(desc->page); desc->page = NULL; } @@ -703,19 +714,28 @@ /* * Returns 0 if desc->dir_cookie was found on page desc->page_index + * and locks the page to prevent removal from the page cache. */ static -int find_cache_page(nfs_readdir_descriptor_t *desc) +int find_and_lock_cache_page(nfs_readdir_descriptor_t *desc) { int res; desc->page = get_cache_page(desc); if (IS_ERR(desc->page)) return PTR_ERR(desc->page); - - res = nfs_readdir_search_array(desc); + res = lock_page_killable(desc->page); if (res != 0) - cache_page_release(desc); + goto error; + res = -EAGAIN; + if (desc->page->mapping != NULL) { + res = nfs_readdir_search_array(desc); + if (res == 0) + return 0; + } + unlock_page(desc->page); +error: + cache_page_release(desc); return res; } @@ -730,7 +750,7 @@ desc->last_cookie = 0; } do { - res = find_cache_page(desc); + res = find_and_lock_cache_page(desc); } while (res == -EAGAIN); return res; } @@ -769,7 +789,6 @@ desc->eof = true; kunmap(desc->page); - cache_page_release(desc); dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n", (unsigned long long)*desc->dir_cookie, res); return res; @@ -815,13 +834,13 @@ status = nfs_do_filldir(desc); + out_release: + nfs_readdir_clear_array(desc->page); + cache_page_release(desc); out: dfprintk(DIRCACHE, "NFS: %s: returns %d\n", __func__, status); return status; - out_release: - cache_page_release(desc); - goto out; } /* The file offset position represents the dirent entry number. A @@ -886,6 +905,8 @@ break; res = nfs_do_filldir(desc); + unlock_page(desc->page); + cache_page_release(desc); if (res < 0) break; } while (!desc->eof); diff -Nru linux-4.19.98/fs/nfs/direct.c linux-4.19.118/fs/nfs/direct.c --- linux-4.19.98/fs/nfs/direct.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/direct.c 2020-04-23 08:30:24.000000000 +0000 @@ -261,10 +261,10 @@ data->ds_commit_index); /* verifier not set so always fail */ - if (verfp->committed < 0) + if (verfp->committed < 0 || data->res.verf->committed <= NFS_UNSTABLE) return 1; - return nfs_direct_cmp_verf(verfp, &data->verf); + return nfs_direct_cmp_verf(verfp, data->res.verf); } /** @@ -600,6 +600,7 @@ l_ctx = nfs_get_lock_context(dreq->ctx); if (IS_ERR(l_ctx)) { result = PTR_ERR(l_ctx); + nfs_direct_req_release(dreq); goto out_release; } dreq->l_ctx = l_ctx; @@ -1023,6 +1024,7 @@ l_ctx = nfs_get_lock_context(dreq->ctx); if (IS_ERR(l_ctx)) { result = PTR_ERR(l_ctx); + nfs_direct_req_release(dreq); goto out_release; } dreq->l_ctx = l_ctx; diff -Nru linux-4.19.98/fs/nfs/flexfilelayout/flexfilelayout.h linux-4.19.118/fs/nfs/flexfilelayout/flexfilelayout.h --- linux-4.19.98/fs/nfs/flexfilelayout/flexfilelayout.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/flexfilelayout/flexfilelayout.h 2020-04-23 08:30:24.000000000 +0000 @@ -132,16 +132,6 @@ generic_hdr); } -static inline struct nfs4_deviceid_node * -FF_LAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg, u32 idx) -{ - if (idx >= FF_LAYOUT_LSEG(lseg)->mirror_array_cnt || - FF_LAYOUT_LSEG(lseg)->mirror_array[idx] == NULL || - FF_LAYOUT_LSEG(lseg)->mirror_array[idx]->mirror_ds == NULL) - return NULL; - return &FF_LAYOUT_LSEG(lseg)->mirror_array[idx]->mirror_ds->id_node; -} - static inline struct nfs4_ff_layout_ds * FF_LAYOUT_MIRROR_DS(struct nfs4_deviceid_node *node) { @@ -151,9 +141,25 @@ static inline struct nfs4_ff_layout_mirror * FF_LAYOUT_COMP(struct pnfs_layout_segment *lseg, u32 idx) { - if (idx >= FF_LAYOUT_LSEG(lseg)->mirror_array_cnt) - return NULL; - return FF_LAYOUT_LSEG(lseg)->mirror_array[idx]; + struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg); + + if (idx < fls->mirror_array_cnt) + return fls->mirror_array[idx]; + return NULL; +} + +static inline struct nfs4_deviceid_node * +FF_LAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg, u32 idx) +{ + struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, idx); + + if (mirror != NULL) { + struct nfs4_ff_layout_ds *mirror_ds = mirror->mirror_ds; + + if (!IS_ERR_OR_NULL(mirror_ds)) + return &mirror_ds->id_node; + } + return NULL; } static inline u32 diff -Nru linux-4.19.98/fs/nfs/fscache.c linux-4.19.118/fs/nfs/fscache.c --- linux-4.19.98/fs/nfs/fscache.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/fscache.c 2020-04-23 08:30:24.000000000 +0000 @@ -35,6 +35,7 @@ struct nfs_server_key { struct { uint16_t nfsversion; /* NFS protocol version */ + uint32_t minorversion; /* NFSv4 minor version */ uint16_t family; /* address family */ __be16 port; /* IP port */ } hdr; @@ -59,6 +60,7 @@ memset(&key, 0, sizeof(key)); key.hdr.nfsversion = clp->rpc_ops->version; + key.hdr.minorversion = clp->cl_minorversion; key.hdr.family = clp->cl_addr.ss_family; switch (clp->cl_addr.ss_family) { diff -Nru linux-4.19.98/fs/nfs/nfs3xdr.c linux-4.19.118/fs/nfs/nfs3xdr.c --- linux-4.19.98/fs/nfs/nfs3xdr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/nfs3xdr.c 2020-04-23 08:30:24.000000000 +0000 @@ -2380,6 +2380,7 @@ void *data) { struct nfs_commitres *result = data; + struct nfs_writeverf *verf = result->verf; enum nfs_stat status; int error; @@ -2392,7 +2393,9 @@ result->op_status = status; if (status != NFS3_OK) goto out_status; - error = decode_writeverf3(xdr, &result->verf->verifier); + error = decode_writeverf3(xdr, &verf->verifier); + if (!error) + verf->committed = NFS_FILE_SYNC; out: return error; out_status: diff -Nru linux-4.19.98/fs/nfs/nfs42proc.c linux-4.19.118/fs/nfs/nfs42proc.c --- linux-4.19.98/fs/nfs/nfs42proc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/nfs42proc.c 2020-04-23 08:30:24.000000000 +0000 @@ -283,14 +283,14 @@ status = handle_async_copy(res, server, src, dst, &args->src_stateid); if (status) - return status; + goto out; } if ((!res->synchronous || !args->sync) && res->write_res.verifier.committed != NFS_FILE_SYNC) { status = process_copy_commit(dst, pos_dst, res); if (status) - return status; + goto out; } truncate_pagecache_range(dst_inode, pos_dst, diff -Nru linux-4.19.98/fs/nfs/nfs42xdr.c linux-4.19.118/fs/nfs/nfs42xdr.c --- linux-4.19.98/fs/nfs/nfs42xdr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/nfs42xdr.c 2020-04-23 08:30:24.000000000 +0000 @@ -59,43 +59,53 @@ #define decode_clone_maxsz (op_decode_hdr_maxsz) #define NFS4_enc_allocate_sz (compound_encode_hdr_maxsz + \ + encode_sequence_maxsz + \ encode_putfh_maxsz + \ encode_allocate_maxsz + \ encode_getattr_maxsz) #define NFS4_dec_allocate_sz (compound_decode_hdr_maxsz + \ + decode_sequence_maxsz + \ decode_putfh_maxsz + \ decode_allocate_maxsz + \ decode_getattr_maxsz) #define NFS4_enc_copy_sz (compound_encode_hdr_maxsz + \ + encode_sequence_maxsz + \ encode_putfh_maxsz + \ encode_savefh_maxsz + \ encode_putfh_maxsz + \ encode_copy_maxsz + \ encode_commit_maxsz) #define NFS4_dec_copy_sz (compound_decode_hdr_maxsz + \ + decode_sequence_maxsz + \ decode_putfh_maxsz + \ decode_savefh_maxsz + \ decode_putfh_maxsz + \ decode_copy_maxsz + \ decode_commit_maxsz) #define NFS4_enc_offload_cancel_sz (compound_encode_hdr_maxsz + \ + encode_sequence_maxsz + \ encode_putfh_maxsz + \ encode_offload_cancel_maxsz) #define NFS4_dec_offload_cancel_sz (compound_decode_hdr_maxsz + \ + decode_sequence_maxsz + \ decode_putfh_maxsz + \ decode_offload_cancel_maxsz) #define NFS4_enc_deallocate_sz (compound_encode_hdr_maxsz + \ + encode_sequence_maxsz + \ encode_putfh_maxsz + \ encode_deallocate_maxsz + \ encode_getattr_maxsz) #define NFS4_dec_deallocate_sz (compound_decode_hdr_maxsz + \ + decode_sequence_maxsz + \ decode_putfh_maxsz + \ decode_deallocate_maxsz + \ decode_getattr_maxsz) #define NFS4_enc_seek_sz (compound_encode_hdr_maxsz + \ + encode_sequence_maxsz + \ encode_putfh_maxsz + \ encode_seek_maxsz) #define NFS4_dec_seek_sz (compound_decode_hdr_maxsz + \ + decode_sequence_maxsz + \ decode_putfh_maxsz + \ decode_seek_maxsz) #define NFS4_enc_layoutstats_sz (compound_encode_hdr_maxsz + \ diff -Nru linux-4.19.98/fs/nfs/nfs4client.c linux-4.19.118/fs/nfs/nfs4client.c --- linux-4.19.98/fs/nfs/nfs4client.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/nfs4client.c 2020-04-23 08:30:24.000000000 +0000 @@ -210,7 +210,6 @@ INIT_LIST_HEAD(&clp->cl_ds_clients); rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client"); clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; - clp->cl_minorversion = cl_init->minorversion; clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; clp->cl_mig_gen = 1; #if IS_ENABLED(CONFIG_NFS_V4_1) diff -Nru linux-4.19.98/fs/nfs/nfs4proc.c linux-4.19.118/fs/nfs/nfs4proc.c --- linux-4.19.98/fs/nfs/nfs4proc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/nfs4proc.c 2020-04-23 08:30:24.000000000 +0000 @@ -3089,6 +3089,11 @@ exception.retry = 1; continue; } + if (status == -NFS4ERR_EXPIRED) { + nfs4_schedule_lease_recovery(server->nfs_client); + exception.retry = 1; + continue; + } if (status == -EAGAIN) { /* We must have found a delegation */ exception.retry = 1; @@ -5112,7 +5117,7 @@ hdr->timestamp = jiffies; msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE]; - nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 1, 0); + nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0, 0); nfs4_state_protect_write(server->nfs_client, clnt, msg, hdr); } diff -Nru linux-4.19.98/fs/nfs/nfs4xdr.c linux-4.19.118/fs/nfs/nfs4xdr.c --- linux-4.19.98/fs/nfs/nfs4xdr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/nfs4xdr.c 2020-04-23 08:30:24.000000000 +0000 @@ -4439,11 +4439,14 @@ static int decode_commit(struct xdr_stream *xdr, struct nfs_commitres *res) { + struct nfs_writeverf *verf = res->verf; int status; status = decode_op_hdr(xdr, OP_COMMIT); if (!status) - status = decode_write_verifier(xdr, &res->verf->verifier); + status = decode_write_verifier(xdr, &verf->verifier); + if (!status) + verf->committed = NFS_FILE_SYNC; return status; } diff -Nru linux-4.19.98/fs/nfs/pagelist.c linux-4.19.118/fs/nfs/pagelist.c --- linux-4.19.98/fs/nfs/pagelist.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/pagelist.c 2020-04-23 08:30:24.000000000 +0000 @@ -865,15 +865,6 @@ pgio->pg_mirror_count = mirror_count; } -/* - * nfs_pageio_stop_mirroring - stop using mirroring (set mirror count to 1) - */ -void nfs_pageio_stop_mirroring(struct nfs_pageio_descriptor *pgio) -{ - pgio->pg_mirror_count = 1; - pgio->pg_mirror_idx = 0; -} - static void nfs_pageio_cleanup_mirroring(struct nfs_pageio_descriptor *pgio) { pgio->pg_mirror_count = 1; @@ -1302,6 +1293,14 @@ } } +/* + * nfs_pageio_stop_mirroring - stop using mirroring (set mirror count to 1) + */ +void nfs_pageio_stop_mirroring(struct nfs_pageio_descriptor *pgio) +{ + nfs_pageio_complete(pgio); +} + int __init nfs_init_nfspagecache(void) { nfs_page_cachep = kmem_cache_create("nfs_page", diff -Nru linux-4.19.98/fs/nfs/pnfs.c linux-4.19.118/fs/nfs/pnfs.c --- linux-4.19.98/fs/nfs/pnfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/pnfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -758,22 +758,35 @@ pnfs_layout_bulk_destroy_byserver_locked(struct nfs_client *clp, struct nfs_server *server, struct list_head *layout_list) + __must_hold(&clp->cl_lock) + __must_hold(RCU) { struct pnfs_layout_hdr *lo, *next; struct inode *inode; list_for_each_entry_safe(lo, next, &server->layouts, plh_layouts) { - if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags)) + if (test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) || + test_bit(NFS_LAYOUT_INODE_FREEING, &lo->plh_flags) || + !list_empty(&lo->plh_bulk_destroy)) continue; + /* If the sb is being destroyed, just bail */ + if (!nfs_sb_active(server->super)) + break; inode = igrab(lo->plh_inode); - if (inode == NULL) - continue; - list_del_init(&lo->plh_layouts); - if (pnfs_layout_add_bulk_destroy_list(inode, layout_list)) - continue; - rcu_read_unlock(); - spin_unlock(&clp->cl_lock); - iput(inode); + if (inode != NULL) { + list_del_init(&lo->plh_layouts); + if (pnfs_layout_add_bulk_destroy_list(inode, + layout_list)) + continue; + rcu_read_unlock(); + spin_unlock(&clp->cl_lock); + iput(inode); + } else { + rcu_read_unlock(); + spin_unlock(&clp->cl_lock); + set_bit(NFS_LAYOUT_INODE_FREEING, &lo->plh_flags); + } + nfs_sb_deactive(server->super); spin_lock(&clp->cl_lock); rcu_read_lock(); return -EAGAIN; @@ -811,7 +824,7 @@ /* Free all lsegs that are attached to commit buckets */ nfs_commit_inode(inode, 0); pnfs_put_layout_hdr(lo); - iput(inode); + nfs_iput_and_deactive(inode); } return ret; } diff -Nru linux-4.19.98/fs/nfs/pnfs.h linux-4.19.118/fs/nfs/pnfs.h --- linux-4.19.98/fs/nfs/pnfs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/pnfs.h 2020-04-23 08:30:24.000000000 +0000 @@ -104,6 +104,7 @@ NFS_LAYOUT_RETURN_REQUESTED, /* Return this layout ASAP */ NFS_LAYOUT_INVALID_STID, /* layout stateid id is invalid */ NFS_LAYOUT_FIRST_LAYOUTGET, /* Serialize first layoutget */ + NFS_LAYOUT_INODE_FREEING, /* The inode is being freed */ }; enum layoutdriver_policy_flags { diff -Nru linux-4.19.98/fs/nfs/pnfs_nfs.c linux-4.19.118/fs/nfs/pnfs_nfs.c --- linux-4.19.98/fs/nfs/pnfs_nfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/pnfs_nfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -30,12 +30,11 @@ /* Fake up some data that will cause nfs_commit_release to retry the writes. */ void pnfs_generic_prepare_to_resend_writes(struct nfs_commit_data *data) { - struct nfs_page *first = nfs_list_entry(data->pages.next); + struct nfs_writeverf *verf = data->res.verf; data->task.tk_status = 0; - memcpy(&data->verf.verifier, &first->wb_verf, - sizeof(data->verf.verifier)); - data->verf.verifier.data[0]++; /* ensure verifier mismatch */ + memset(&verf->verifier, 0, sizeof(verf->verifier)); + verf->committed = NFS_UNSTABLE; } EXPORT_SYMBOL_GPL(pnfs_generic_prepare_to_resend_writes); diff -Nru linux-4.19.98/fs/nfs/super.c linux-4.19.118/fs/nfs/super.c --- linux-4.19.98/fs/nfs/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -1930,7 +1930,7 @@ /* kill possible hostname list: not supported */ comma = strchr(dev_name, ','); if (comma != NULL && comma < end) - *comma = 0; + len = comma - dev_name; } if (len > maxnamlen) diff -Nru linux-4.19.98/fs/nfs/write.c linux-4.19.118/fs/nfs/write.c --- linux-4.19.98/fs/nfs/write.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfs/write.c 2020-04-23 08:30:24.000000000 +0000 @@ -240,7 +240,15 @@ /* A writeback failed: mark the page as bad, and invalidate the page cache */ static void nfs_set_pageerror(struct address_space *mapping) { + struct inode *inode = mapping->host; + nfs_zap_mapping(mapping->host, mapping); + /* Force file size revalidation */ + spin_lock(&inode->i_lock); + NFS_I(inode)->cache_validity |= NFS_INO_REVAL_FORCED | + NFS_INO_REVAL_PAGECACHE | + NFS_INO_INVALID_SIZE; + spin_unlock(&inode->i_lock); } /* @@ -424,6 +432,7 @@ } subreq->wb_head = subreq; + nfs_release_request(old_head); if (test_and_clear_bit(PG_INODE_REF, &subreq->wb_flags)) { nfs_release_request(subreq); @@ -646,7 +655,7 @@ return ret; out_launder: nfs_write_error_remove_page(req); - return ret; + return 0; } static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, @@ -1806,6 +1815,7 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data) { + const struct nfs_writeverf *verf = data->res.verf; struct nfs_page *req; int status = data->task.tk_status; struct nfs_commit_info cinfo; @@ -1832,7 +1842,8 @@ /* Okay, COMMIT succeeded, apparently. Check the verifier * returned by the server against all stored verfs. */ - if (!nfs_write_verifier_cmp(&req->wb_verf, &data->verf.verifier)) { + if (verf->committed > NFS_UNSTABLE && + !nfs_write_verifier_cmp(&req->wb_verf, &verf->verifier)) { /* We have a match */ if (req->wb_page) nfs_inode_remove_request(req); diff -Nru linux-4.19.98/fs/nfsd/nfs4layouts.c linux-4.19.118/fs/nfsd/nfs4layouts.c --- linux-4.19.98/fs/nfsd/nfs4layouts.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfsd/nfs4layouts.c 2020-04-23 08:30:24.000000000 +0000 @@ -676,7 +676,7 @@ /* Client gets 2 lease periods to return it */ cutoff = ktime_add_ns(task->tk_start, - nn->nfsd4_lease * NSEC_PER_SEC * 2); + (u64)nn->nfsd4_lease * NSEC_PER_SEC * 2); if (ktime_before(now, cutoff)) { rpc_delay(task, HZ/100); /* 10 mili-seconds */ diff -Nru linux-4.19.98/fs/nfsd/nfs4state.c linux-4.19.118/fs/nfsd/nfs4state.c --- linux-4.19.98/fs/nfsd/nfs4state.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfsd/nfs4state.c 2020-04-23 08:30:24.000000000 +0000 @@ -6075,7 +6075,7 @@ } if (fl_flags & FL_SLEEP) { - nbl->nbl_time = jiffies; + nbl->nbl_time = get_seconds(); spin_lock(&nn->blocked_locks_lock); list_add_tail(&nbl->nbl_list, &lock_sop->lo_blocked); list_add_tail(&nbl->nbl_lru, &nn->blocked_locks_lru); diff -Nru linux-4.19.98/fs/nfsd/state.h linux-4.19.118/fs/nfsd/state.h --- linux-4.19.98/fs/nfsd/state.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfsd/state.h 2020-04-23 08:30:24.000000000 +0000 @@ -592,7 +592,7 @@ struct nfsd4_blocked_lock { struct list_head nbl_list; struct list_head nbl_lru; - unsigned long nbl_time; + time_t nbl_time; struct file_lock nbl_lock; struct knfsd_fh nbl_fh; struct nfsd4_callback nbl_cb; diff -Nru linux-4.19.98/fs/nfsd/vfs.c linux-4.19.118/fs/nfsd/vfs.c --- linux-4.19.98/fs/nfsd/vfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/nfsd/vfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -1016,6 +1016,7 @@ host_err = vfs_iter_write(file, &iter, &pos, flags); if (host_err < 0) goto out_nfserr; + *cnt = host_err; nfsdstats.io_write += *cnt; fsnotify_modify(file); diff -Nru linux-4.19.98/fs/ocfs2/alloc.c linux-4.19.118/fs/ocfs2/alloc.c --- linux-4.19.98/fs/ocfs2/alloc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ocfs2/alloc.c 2020-04-23 08:30:24.000000000 +0000 @@ -7403,6 +7403,10 @@ struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; struct ocfs2_inline_data *idata = &di->id2.i_data; + /* No need to punch hole beyond i_size. */ + if (start >= i_size_read(inode)) + return 0; + if (end > i_size_read(inode)) end = i_size_read(inode); diff -Nru linux-4.19.98/fs/ocfs2/file.c linux-4.19.118/fs/ocfs2/file.c --- linux-4.19.98/fs/ocfs2/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ocfs2/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -2109,17 +2109,15 @@ static int ocfs2_inode_lock_for_extent_tree(struct inode *inode, struct buffer_head **di_bh, int meta_level, - int overwrite_io, int write_sem, int wait) { int ret = 0; if (wait) - ret = ocfs2_inode_lock(inode, NULL, meta_level); + ret = ocfs2_inode_lock(inode, di_bh, meta_level); else - ret = ocfs2_try_inode_lock(inode, - overwrite_io ? NULL : di_bh, meta_level); + ret = ocfs2_try_inode_lock(inode, di_bh, meta_level); if (ret < 0) goto out; @@ -2144,6 +2142,7 @@ out_unlock: brelse(*di_bh); + *di_bh = NULL; ocfs2_inode_unlock(inode, meta_level); out: return ret; @@ -2186,7 +2185,6 @@ ret = ocfs2_inode_lock_for_extent_tree(inode, &di_bh, meta_level, - overwrite_io, write_sem, wait); if (ret < 0) { @@ -2244,13 +2242,13 @@ &di_bh, meta_level, write_sem); + meta_level = 1; + write_sem = 1; ret = ocfs2_inode_lock_for_extent_tree(inode, &di_bh, meta_level, - overwrite_io, - 1, + write_sem, wait); - write_sem = 1; if (ret < 0) { if (ret != -EAGAIN) mlog_errno(ret); diff -Nru linux-4.19.98/fs/ocfs2/journal.h linux-4.19.118/fs/ocfs2/journal.h --- linux-4.19.98/fs/ocfs2/journal.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ocfs2/journal.h 2020-04-23 08:30:24.000000000 +0000 @@ -637,9 +637,11 @@ { struct ocfs2_inode_info *oi = OCFS2_I(inode); - oi->i_sync_tid = handle->h_transaction->t_tid; - if (datasync) - oi->i_datasync_tid = handle->h_transaction->t_tid; + if (!is_handle_aborted(handle)) { + oi->i_sync_tid = handle->h_transaction->t_tid; + if (datasync) + oi->i_datasync_tid = handle->h_transaction->t_tid; + } } #endif /* OCFS2_JOURNAL_H */ diff -Nru linux-4.19.98/fs/open.c linux-4.19.118/fs/open.c --- linux-4.19.98/fs/open.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/open.c 2020-04-23 08:30:24.000000000 +0000 @@ -851,9 +851,6 @@ * the return value of d_splice_alias(), then the caller needs to perform dput() * on it after finish_open(). * - * On successful return @file is a fully instantiated open file. After this, if - * an error occurs in ->atomic_open(), it needs to clean up with fput(). - * * Returns zero on success or -errno if the open failed. */ int finish_open(struct file *file, struct dentry *dentry, diff -Nru linux-4.19.98/fs/orangefs/orangefs-debugfs.c linux-4.19.118/fs/orangefs/orangefs-debugfs.c --- linux-4.19.98/fs/orangefs/orangefs-debugfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/orangefs/orangefs-debugfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -305,6 +305,7 @@ static void *help_next(struct seq_file *m, void *v, loff_t *pos) { + (*pos)++; gossip_debug(GOSSIP_DEBUGFS_DEBUG, "help_next: start\n"); return NULL; diff -Nru linux-4.19.98/fs/overlayfs/file.c linux-4.19.118/fs/overlayfs/file.c --- linux-4.19.98/fs/overlayfs/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/overlayfs/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -149,7 +149,7 @@ struct inode *inode = file_inode(file); struct fd real; const struct cred *old_cred; - ssize_t ret; + loff_t ret; /* * The two special cases below do not need to involve real fs, diff -Nru linux-4.19.98/fs/overlayfs/inode.c linux-4.19.118/fs/overlayfs/inode.c --- linux-4.19.98/fs/overlayfs/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/overlayfs/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -884,7 +884,7 @@ struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL; bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry, oip->index); - int fsid = bylower ? oip->lowerpath->layer->fsid : 0; + int fsid = bylower ? lowerpath->layer->fsid : 0; bool is_dir, metacopy = false; unsigned long ino = 0; int err = oip->newinode ? -EEXIST : -ENOMEM; @@ -934,6 +934,8 @@ err = -ENOMEM; goto out_err; } + ino = realinode->i_ino; + fsid = lowerpath->layer->fsid; } ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev, ino, fsid); ovl_inode_init(inode, upperdentry, lowerdentry, oip->lowerdata); diff -Nru linux-4.19.98/fs/overlayfs/readdir.c linux-4.19.118/fs/overlayfs/readdir.c --- linux-4.19.98/fs/overlayfs/readdir.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/overlayfs/readdir.c 2020-04-23 08:30:24.000000000 +0000 @@ -507,7 +507,13 @@ if (err) goto fail; - WARN_ON_ONCE(dir->d_sb->s_dev != stat.dev); + /* + * Directory inode is always on overlay st_dev. + * Non-dir with ovl_same_dev() could be on pseudo st_dev in case + * of xino bits overflow. + */ + WARN_ON_ONCE(S_ISDIR(stat.mode) && + dir->d_sb->s_dev != stat.dev); ino = stat.ino; } else if (xinobits && !OVL_TYPE_UPPER(type)) { ino = ovl_remap_lower_ino(ino, xinobits, diff -Nru linux-4.19.98/fs/pstore/inode.c linux-4.19.118/fs/pstore/inode.c --- linux-4.19.98/fs/pstore/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/pstore/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -99,11 +99,11 @@ struct pstore_private *ps = s->private; struct pstore_ftrace_seq_data *data = v; + (*pos)++; data->off += REC_SIZE; if (data->off + REC_SIZE > ps->total_size) return NULL; - (*pos)++; return data; } @@ -113,6 +113,9 @@ struct pstore_ftrace_seq_data *data = v; struct pstore_ftrace_record *rec; + if (!data) + return 0; + rec = (struct pstore_ftrace_record *)(ps->record->buf + data->off); seq_printf(s, "CPU:%d ts:%llu %08lx %08lx %pf <- %pF\n", diff -Nru linux-4.19.98/fs/pstore/platform.c linux-4.19.118/fs/pstore/platform.c --- linux-4.19.98/fs/pstore/platform.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/pstore/platform.c 2020-04-23 08:30:24.000000000 +0000 @@ -802,9 +802,9 @@ ret = pstore_init_fs(); if (ret) - return ret; + free_buf_for_compression(); - return 0; + return ret; } late_initcall(pstore_init); diff -Nru linux-4.19.98/fs/reiserfs/stree.c linux-4.19.118/fs/reiserfs/stree.c --- linux-4.19.98/fs/reiserfs/stree.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/reiserfs/stree.c 2020-04-23 08:30:24.000000000 +0000 @@ -2250,7 +2250,8 @@ /* also releases the path */ unfix_nodes(&s_ins_balance); #ifdef REISERQUOTA_DEBUG - reiserfs_debug(th->t_super, REISERFS_DEBUG_CODE, + if (inode) + reiserfs_debug(th->t_super, REISERFS_DEBUG_CODE, "reiserquota insert_item(): freeing %u id=%u type=%c", quota_bytes, inode->i_uid, head2type(ih)); #endif diff -Nru linux-4.19.98/fs/reiserfs/super.c linux-4.19.118/fs/reiserfs/super.c --- linux-4.19.98/fs/reiserfs/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/reiserfs/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -629,6 +629,7 @@ reiserfs_write_unlock(s); mutex_destroy(&REISERFS_SB(s)->lock); destroy_workqueue(REISERFS_SB(s)->commit_wq); + kfree(REISERFS_SB(s)->s_jdev); kfree(s->s_fs_info); s->s_fs_info = NULL; } @@ -1953,7 +1954,7 @@ if (!sbi->s_jdev) { SWARN(silent, s, "", "Cannot allocate memory for " "journal device name"); - goto error; + goto error_unlocked; } } #ifdef CONFIG_QUOTA @@ -2243,6 +2244,7 @@ kfree(qf_names[j]); } #endif + kfree(sbi->s_jdev); kfree(sbi); s->s_fs_info = NULL; diff -Nru linux-4.19.98/fs/ubifs/dir.c linux-4.19.118/fs/ubifs/dir.c --- linux-4.19.98/fs/ubifs/dir.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ubifs/dir.c 2020-04-23 08:30:24.000000000 +0000 @@ -242,6 +242,8 @@ if (nm.hash) { ubifs_assert(c, fname_len(&nm) == 0); ubifs_assert(c, fname_name(&nm) == NULL); + if (nm.hash & ~UBIFS_S_KEY_HASH_MASK) + goto done; /* ENOENT */ dent_key_init_hash(c, &key, dir->i_ino, nm.hash); err = ubifs_tnc_lookup_dh(c, &key, dent, nm.minor_hash); } else { diff -Nru linux-4.19.98/fs/ubifs/file.c linux-4.19.118/fs/ubifs/file.c --- linux-4.19.98/fs/ubifs/file.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ubifs/file.c 2020-04-23 08:30:24.000000000 +0000 @@ -798,7 +798,9 @@ if (page_offset > end_index) break; - page = find_or_create_page(mapping, page_offset, ra_gfp_mask); + page = pagecache_get_page(mapping, page_offset, + FGP_LOCK|FGP_ACCESSED|FGP_CREAT|FGP_NOWAIT, + ra_gfp_mask); if (!page) break; if (!PageUptodate(page)) diff -Nru linux-4.19.98/fs/ubifs/ioctl.c linux-4.19.118/fs/ubifs/ioctl.c --- linux-4.19.98/fs/ubifs/ioctl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/ubifs/ioctl.c 2020-04-23 08:30:24.000000000 +0000 @@ -28,6 +28,11 @@ #include #include "ubifs.h" +/* Need to be kept consistent with checked flags in ioctl2ubifs() */ +#define UBIFS_SUPPORTED_IOCTL_FLAGS \ + (FS_COMPR_FL | FS_SYNC_FL | FS_APPEND_FL | \ + FS_IMMUTABLE_FL | FS_DIRSYNC_FL) + /** * ubifs_set_inode_flags - set VFS inode flags. * @inode: VFS inode to set flags for @@ -127,7 +132,8 @@ } } - ui->flags = ioctl2ubifs(flags); + ui->flags &= ~ioctl2ubifs(UBIFS_SUPPORTED_IOCTL_FLAGS); + ui->flags |= ioctl2ubifs(flags); ubifs_set_inode_flags(inode); inode->i_ctime = current_time(inode); release = ui->dirty; @@ -169,6 +175,9 @@ if (get_user(flags, (int __user *) arg)) return -EFAULT; + if (flags & ~UBIFS_SUPPORTED_IOCTL_FLAGS) + return -EOPNOTSUPP; + if (!S_ISDIR(inode->i_mode)) flags &= ~FS_DIRSYNC_FL; diff -Nru linux-4.19.98/fs/udf/super.c linux-4.19.118/fs/udf/super.c --- linux-4.19.98/fs/udf/super.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/udf/super.c 2020-04-23 08:30:24.000000000 +0000 @@ -999,7 +999,6 @@ switch (le32_to_cpu(p->accessType)) { case PD_ACCESS_TYPE_READ_ONLY: case PD_ACCESS_TYPE_WRITE_ONCE: - case PD_ACCESS_TYPE_REWRITABLE: case PD_ACCESS_TYPE_NONE: goto force_ro; } @@ -2470,17 +2469,29 @@ static unsigned int udf_count_free(struct super_block *sb) { unsigned int accum = 0; - struct udf_sb_info *sbi; + struct udf_sb_info *sbi = UDF_SB(sb); struct udf_part_map *map; + unsigned int part = sbi->s_partition; + int ptype = sbi->s_partmaps[part].s_partition_type; + + if (ptype == UDF_METADATA_MAP25) { + part = sbi->s_partmaps[part].s_type_specific.s_metadata. + s_phys_partition_ref; + } else if (ptype == UDF_VIRTUAL_MAP15 || ptype == UDF_VIRTUAL_MAP20) { + /* + * Filesystems with VAT are append-only and we cannot write to + * them. Let's just report 0 here. + */ + return 0; + } - sbi = UDF_SB(sb); if (sbi->s_lvid_bh) { struct logicalVolIntegrityDesc *lvid = (struct logicalVolIntegrityDesc *) sbi->s_lvid_bh->b_data; - if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) { + if (le32_to_cpu(lvid->numOfPartitions) > part) { accum = le32_to_cpu( - lvid->freeSpaceTable[sbi->s_partition]); + lvid->freeSpaceTable[part]); if (accum == 0xFFFFFFFF) accum = 0; } @@ -2489,7 +2500,7 @@ if (accum) return accum; - map = &sbi->s_partmaps[sbi->s_partition]; + map = &sbi->s_partmaps[part]; if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) { accum += udf_count_free_bitmap(sb, map->s_uspace.s_bitmap); diff -Nru linux-4.19.98/fs/xfs/xfs_quotaops.c linux-4.19.118/fs/xfs/xfs_quotaops.c --- linux-4.19.98/fs/xfs/xfs_quotaops.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/fs/xfs/xfs_quotaops.c 2020-04-23 08:30:24.000000000 +0000 @@ -202,6 +202,9 @@ if (XFS_IS_QUOTA_ON(mp)) return -EINVAL; + if (uflags & ~(FS_USER_QUOTA | FS_GROUP_QUOTA | FS_PROJ_QUOTA)) + return -EINVAL; + if (uflags & FS_USER_QUOTA) flags |= XFS_DQ_USER; if (uflags & FS_GROUP_QUOTA) diff -Nru linux-4.19.98/include/acpi/actypes.h linux-4.19.118/include/acpi/actypes.h --- linux-4.19.98/include/acpi/actypes.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/acpi/actypes.h 2020-04-23 08:30:24.000000000 +0000 @@ -528,11 +528,12 @@ #define ACPI_MAKE_RSDP_SIG(dest) (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8)) /* - * Algorithm to obtain access bit width. + * Algorithm to obtain access bit or byte width. * Can be used with access_width of struct acpi_generic_address and access_size of * struct acpi_resource_generic_register. */ #define ACPI_ACCESS_BIT_WIDTH(size) (1 << ((size) + 2)) +#define ACPI_ACCESS_BYTE_WIDTH(size) (1 << ((size) - 1)) /******************************************************************************* * diff -Nru linux-4.19.98/include/acpi/processor.h linux-4.19.118/include/acpi/processor.h --- linux-4.19.98/include/acpi/processor.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/acpi/processor.h 2020-04-23 08:30:24.000000000 +0000 @@ -293,6 +293,14 @@ } #endif +static inline int call_on_cpu(int cpu, long (*fn)(void *), void *arg, + bool direct) +{ + if (direct || (is_percpu_thread() && cpu == smp_processor_id())) + return fn(arg); + return work_on_cpu(cpu, fn, arg); +} + /* in processor_perflib.c */ #ifdef CONFIG_CPU_FREQ diff -Nru linux-4.19.98/include/drm/drm_panel.h linux-4.19.118/include/drm/drm_panel.h --- linux-4.19.98/include/drm/drm_panel.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/drm/drm_panel.h 2020-04-23 08:30:24.000000000 +0000 @@ -24,6 +24,7 @@ #ifndef __DRM_PANEL_H__ #define __DRM_PANEL_H__ +#include #include #include diff -Nru linux-4.19.98/include/keys/big_key-type.h linux-4.19.118/include/keys/big_key-type.h --- linux-4.19.98/include/keys/big_key-type.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/keys/big_key-type.h 2020-04-23 08:30:24.000000000 +0000 @@ -21,6 +21,6 @@ extern void big_key_revoke(struct key *key); extern void big_key_destroy(struct key *key); extern void big_key_describe(const struct key *big_key, struct seq_file *m); -extern long big_key_read(const struct key *key, char __user *buffer, size_t buflen); +extern long big_key_read(const struct key *key, char *buffer, size_t buflen); #endif /* _KEYS_BIG_KEY_TYPE_H */ diff -Nru linux-4.19.98/include/keys/user-type.h linux-4.19.118/include/keys/user-type.h --- linux-4.19.98/include/keys/user-type.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/keys/user-type.h 2020-04-23 08:30:24.000000000 +0000 @@ -45,8 +45,7 @@ extern void user_revoke(struct key *key); extern void user_destroy(struct key *key); extern void user_describe(const struct key *user, struct seq_file *m); -extern long user_read(const struct key *key, - char __user *buffer, size_t buflen); +extern long user_read(const struct key *key, char *buffer, size_t buflen); static inline const struct user_key_payload *user_key_payload_rcu(const struct key *key) { diff -Nru linux-4.19.98/include/linux/acpi.h linux-4.19.118/include/linux/acpi.h --- linux-4.19.98/include/linux/acpi.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/acpi.h 2020-04-23 08:30:24.000000000 +0000 @@ -917,26 +917,18 @@ void acpi_subsys_complete(struct device *dev); int acpi_subsys_suspend_late(struct device *dev); int acpi_subsys_suspend_noirq(struct device *dev); -int acpi_subsys_resume_noirq(struct device *dev); -int acpi_subsys_resume_early(struct device *dev); int acpi_subsys_suspend(struct device *dev); int acpi_subsys_freeze(struct device *dev); -int acpi_subsys_freeze_late(struct device *dev); -int acpi_subsys_freeze_noirq(struct device *dev); -int acpi_subsys_thaw_noirq(struct device *dev); +int acpi_subsys_poweroff(struct device *dev); #else static inline int acpi_dev_resume_early(struct device *dev) { return 0; } static inline int acpi_subsys_prepare(struct device *dev) { return 0; } static inline void acpi_subsys_complete(struct device *dev) {} static inline int acpi_subsys_suspend_late(struct device *dev) { return 0; } static inline int acpi_subsys_suspend_noirq(struct device *dev) { return 0; } -static inline int acpi_subsys_resume_noirq(struct device *dev) { return 0; } -static inline int acpi_subsys_resume_early(struct device *dev) { return 0; } static inline int acpi_subsys_suspend(struct device *dev) { return 0; } static inline int acpi_subsys_freeze(struct device *dev) { return 0; } -static inline int acpi_subsys_freeze_late(struct device *dev) { return 0; } -static inline int acpi_subsys_freeze_noirq(struct device *dev) { return 0; } -static inline int acpi_subsys_thaw_noirq(struct device *dev) { return 0; } +static inline int acpi_subsys_poweroff(struct device *dev) { return 0; } #endif #ifdef CONFIG_ACPI diff -Nru linux-4.19.98/include/linux/bitops.h linux-4.19.118/include/linux/bitops.h --- linux-4.19.98/include/linux/bitops.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/bitops.h 2020-04-23 08:30:24.000000000 +0000 @@ -236,17 +236,17 @@ #ifdef __KERNEL__ #ifndef set_mask_bits -#define set_mask_bits(ptr, _mask, _bits) \ +#define set_mask_bits(ptr, mask, bits) \ ({ \ - const typeof(*ptr) mask = (_mask), bits = (_bits); \ - typeof(*ptr) old, new; \ + const typeof(*(ptr)) mask__ = (mask), bits__ = (bits); \ + typeof(*(ptr)) old__, new__; \ \ do { \ - old = READ_ONCE(*ptr); \ - new = (old & ~mask) | bits; \ - } while (cmpxchg(ptr, old, new) != old); \ + old__ = READ_ONCE(*(ptr)); \ + new__ = (old__ & ~mask__) | bits__; \ + } while (cmpxchg(ptr, old__, new__) != old__); \ \ - new; \ + new__; \ }) #endif diff -Nru linux-4.19.98/include/linux/buffer_head.h linux-4.19.118/include/linux/buffer_head.h --- linux-4.19.98/include/linux/buffer_head.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/buffer_head.h 2020-04-23 08:30:24.000000000 +0000 @@ -189,6 +189,8 @@ void __brelse(struct buffer_head *); void __bforget(struct buffer_head *); void __breadahead(struct block_device *, sector_t block, unsigned int size); +void __breadahead_gfp(struct block_device *, sector_t block, unsigned int size, + gfp_t gfp); struct buffer_head *__bread_gfp(struct block_device *, sector_t block, unsigned size, gfp_t gfp); void invalidate_bh_lrus(void); @@ -319,6 +321,12 @@ __breadahead(sb->s_bdev, block, sb->s_blocksize); } +static inline void +sb_breadahead_unmovable(struct super_block *sb, sector_t block) +{ + __breadahead_gfp(sb->s_bdev, block, sb->s_blocksize, 0); +} + static inline struct buffer_head * sb_getblk(struct super_block *sb, sector_t block) { diff -Nru linux-4.19.98/include/linux/ceph/osdmap.h linux-4.19.118/include/linux/ceph/osdmap.h --- linux-4.19.98/include/linux/ceph/osdmap.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/ceph/osdmap.h 2020-04-23 08:30:24.000000000 +0000 @@ -37,6 +37,9 @@ #define CEPH_POOL_FLAG_HASHPSPOOL (1ULL << 0) /* hash pg seed and pool id together */ #define CEPH_POOL_FLAG_FULL (1ULL << 1) /* pool is full */ +#define CEPH_POOL_FLAG_FULL_QUOTA (1ULL << 10) /* pool ran out of quota, + will set FULL too */ +#define CEPH_POOL_FLAG_NEARFULL (1ULL << 11) /* pool is nearfull */ struct ceph_pg_pool_info { struct rb_node node; @@ -305,5 +308,6 @@ extern const char *ceph_pg_pool_name_by_id(struct ceph_osdmap *map, u64 id); extern int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name); +u64 ceph_pg_pool_flags(struct ceph_osdmap *map, u64 id); #endif diff -Nru linux-4.19.98/include/linux/ceph/rados.h linux-4.19.118/include/linux/ceph/rados.h --- linux-4.19.98/include/linux/ceph/rados.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/ceph/rados.h 2020-04-23 08:30:24.000000000 +0000 @@ -143,8 +143,10 @@ /* * osd map flag bits */ -#define CEPH_OSDMAP_NEARFULL (1<<0) /* sync writes (near ENOSPC) */ -#define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC) */ +#define CEPH_OSDMAP_NEARFULL (1<<0) /* sync writes (near ENOSPC), + not set since ~luminous */ +#define CEPH_OSDMAP_FULL (1<<1) /* no data writes (ENOSPC), + not set since ~luminous */ #define CEPH_OSDMAP_PAUSERD (1<<2) /* pause all reads */ #define CEPH_OSDMAP_PAUSEWR (1<<3) /* pause all writes */ #define CEPH_OSDMAP_PAUSEREC (1<<4) /* pause recovery */ diff -Nru linux-4.19.98/include/linux/cgroup.h linux-4.19.118/include/linux/cgroup.h --- linux-4.19.98/include/linux/cgroup.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/cgroup.h 2020-04-23 08:30:24.000000000 +0000 @@ -62,6 +62,7 @@ struct list_head *mg_tasks_head; struct list_head *dying_tasks_head; + struct list_head *cur_tasks_head; struct css_set *cur_cset; struct css_set *cur_dcset; struct task_struct *cur_task; diff -Nru linux-4.19.98/include/linux/compiler.h linux-4.19.118/include/linux/compiler.h --- linux-4.19.98/include/linux/compiler.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/compiler.h 2020-04-23 08:30:24.000000000 +0000 @@ -345,7 +345,7 @@ * compiler has support to do so. */ #define compiletime_assert(condition, msg) \ - _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) + _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) #define compiletime_assert_atomic_type(t) \ compiletime_assert(__native_word(t), \ diff -Nru linux-4.19.98/include/linux/devfreq_cooling.h linux-4.19.118/include/linux/devfreq_cooling.h --- linux-4.19.98/include/linux/devfreq_cooling.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/devfreq_cooling.h 2020-04-23 08:30:24.000000000 +0000 @@ -75,7 +75,7 @@ #else /* !CONFIG_DEVFREQ_THERMAL */ -struct thermal_cooling_device * +static inline struct thermal_cooling_device * of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df, struct devfreq_cooling_power *dfc_power) { diff -Nru linux-4.19.98/include/linux/device.h linux-4.19.118/include/linux/device.h --- linux-4.19.98/include/linux/device.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/device.h 2020-04-23 08:30:24.000000000 +0000 @@ -339,6 +339,7 @@ struct device *start, void *data, int (*match)(struct device *dev, void *data)); +void driver_deferred_probe_add(struct device *dev); int driver_deferred_probe_check_state(struct device *dev); /** @@ -701,7 +702,8 @@ gfp_t gfp_mask, unsigned int order); extern void devm_free_pages(struct device *dev, unsigned long addr); -void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); +void __iomem *devm_ioremap_resource(struct device *dev, + const struct resource *res); void __iomem *devm_of_iomap(struct device *dev, struct device_node *node, int index, @@ -818,17 +820,21 @@ /* * Device link flags. * - * STATELESS: The core won't track the presence of supplier/consumer drivers. + * STATELESS: The core will not remove this link automatically. * AUTOREMOVE_CONSUMER: Remove the link automatically on consumer driver unbind. * PM_RUNTIME: If set, the runtime PM framework will use this link. * RPM_ACTIVE: Run pm_runtime_get_sync() on the supplier during link creation. * AUTOREMOVE_SUPPLIER: Remove the link automatically on supplier driver unbind. + * AUTOPROBE_CONSUMER: Probe consumer driver automatically after supplier binds. + * MANAGED: The core tracks presence of supplier/consumer drivers (internal). */ #define DL_FLAG_STATELESS BIT(0) #define DL_FLAG_AUTOREMOVE_CONSUMER BIT(1) #define DL_FLAG_PM_RUNTIME BIT(2) #define DL_FLAG_RPM_ACTIVE BIT(3) #define DL_FLAG_AUTOREMOVE_SUPPLIER BIT(4) +#define DL_FLAG_AUTOPROBE_CONSUMER BIT(5) +#define DL_FLAG_MANAGED BIT(6) /** * struct device_link - Device link representation. @@ -849,11 +855,12 @@ struct list_head c_node; enum device_link_state status; u32 flags; - bool rpm_active; + refcount_t rpm_active; struct kref kref; #ifdef CONFIG_SRCU struct rcu_head rcu_head; #endif + bool supplier_preactivated; /* Owned by consumer probe. */ }; /** diff -Nru linux-4.19.98/include/linux/dmaengine.h linux-4.19.118/include/linux/dmaengine.h --- linux-4.19.98/include/linux/dmaengine.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/dmaengine.h 2020-04-23 08:30:24.000000000 +0000 @@ -686,6 +686,7 @@ * @fill_align: alignment shift for memset operations * @dev_id: unique device ID * @dev: struct device reference for dma mapping api + * @owner: owner module (automatically set based on the provided dev) * @src_addr_widths: bit mask of src addr widths the device supports * Width is specified in bytes, e.g. for a device supporting * a width of 4 the mask should have BIT(4) set. @@ -749,6 +750,7 @@ int dev_id; struct device *dev; + struct module *owner; u32 src_addr_widths; u32 dst_addr_widths; diff -Nru linux-4.19.98/include/linux/efi.h linux-4.19.118/include/linux/efi.h --- linux-4.19.98/include/linux/efi.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/efi.h 2020-04-23 08:30:24.000000000 +0000 @@ -1664,6 +1664,42 @@ extern int efi_tpm_eventlog_init(void); +/* efi_runtime_service() function identifiers */ +enum efi_rts_ids { + GET_TIME, + SET_TIME, + GET_WAKEUP_TIME, + SET_WAKEUP_TIME, + GET_VARIABLE, + GET_NEXT_VARIABLE, + SET_VARIABLE, + QUERY_VARIABLE_INFO, + GET_NEXT_HIGH_MONO_COUNT, + UPDATE_CAPSULE, + QUERY_CAPSULE_CAPS, +}; + +/* + * efi_runtime_work: Details of EFI Runtime Service work + * @arg<1-5>: EFI Runtime Service function arguments + * @status: Status of executing EFI Runtime Service + * @efi_rts_id: EFI Runtime Service function identifier + * @efi_rts_comp: Struct used for handling completions + */ +struct efi_runtime_work { + void *arg1; + void *arg2; + void *arg3; + void *arg4; + void *arg5; + efi_status_t status; + struct work_struct work; + enum efi_rts_ids efi_rts_id; + struct completion efi_rts_comp; +}; + +extern struct efi_runtime_work efi_rts_work; + /* Workqueue to queue EFI Runtime Services */ extern struct workqueue_struct *efi_rts_wq; diff -Nru linux-4.19.98/include/linux/eventfd.h linux-4.19.118/include/linux/eventfd.h --- linux-4.19.98/include/linux/eventfd.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/eventfd.h 2020-04-23 08:30:24.000000000 +0000 @@ -12,6 +12,8 @@ #include #include #include +#include +#include /* * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining @@ -40,6 +42,13 @@ int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait, __u64 *cnt); +DECLARE_PER_CPU(int, eventfd_wake_count); + +static inline bool eventfd_signal_count(void) +{ + return this_cpu_read(eventfd_wake_count); +} + #else /* CONFIG_EVENTFD */ /* @@ -68,6 +77,11 @@ return -ENOSYS; } +static inline bool eventfd_signal_count(void) +{ + return false; +} + #endif #endif /* _LINUX_EVENTFD_H */ diff -Nru linux-4.19.98/include/linux/fs.h linux-4.19.118/include/linux/fs.h --- linux-4.19.98/include/linux/fs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/fs.h 2020-04-23 08:30:24.000000000 +0000 @@ -663,6 +663,7 @@ struct rcu_head i_rcu; }; atomic64_t i_version; + atomic64_t i_sequence; /* see futex */ atomic_t i_count; atomic_t i_dio_count; atomic_t i_writecount; diff -Nru linux-4.19.98/include/linux/futex.h linux-4.19.118/include/linux/futex.h --- linux-4.19.98/include/linux/futex.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/futex.h 2020-04-23 08:30:24.000000000 +0000 @@ -29,23 +29,26 @@ union futex_key { struct { + u64 i_seq; unsigned long pgoff; - struct inode *inode; - int offset; + unsigned int offset; } shared; struct { + union { + struct mm_struct *mm; + u64 __tmp; + }; unsigned long address; - struct mm_struct *mm; - int offset; + unsigned int offset; } private; struct { + u64 ptr; unsigned long word; - void *ptr; - int offset; + unsigned int offset; } both; }; -#define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = NULL } } +#define FUTEX_KEY_INIT (union futex_key) { .both = { .ptr = 0ULL } } #ifdef CONFIG_FUTEX extern void exit_robust_list(struct task_struct *curr); diff -Nru linux-4.19.98/include/linux/hid.h linux-4.19.118/include/linux/hid.h --- linux-4.19.98/include/linux/hid.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/hid.h 2020-04-23 08:30:24.000000000 +0000 @@ -495,7 +495,7 @@ }; #define HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */ -#define HID_MAX_BUFFER_SIZE 4096 /* 4kb */ +#define HID_MAX_BUFFER_SIZE 8192 /* 8kb */ #define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */ #define HID_OUTPUT_FIFO_SIZE 64 diff -Nru linux-4.19.98/include/linux/inet_diag.h linux-4.19.118/include/linux/inet_diag.h --- linux-4.19.98/include/linux/inet_diag.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/inet_diag.h 2020-04-23 08:30:24.000000000 +0000 @@ -2,15 +2,10 @@ #ifndef _INET_DIAG_H_ #define _INET_DIAG_H_ 1 +#include #include -struct net; -struct sock; struct inet_hashinfo; -struct nlattr; -struct nlmsghdr; -struct sk_buff; -struct netlink_callback; struct inet_diag_handler { void (*dump)(struct sk_buff *skb, @@ -62,6 +57,17 @@ void inet_diag_msg_common_fill(struct inet_diag_msg *r, struct sock *sk); +static inline size_t inet_diag_msg_attrs_size(void) +{ + return nla_total_size(1) /* INET_DIAG_SHUTDOWN */ + + nla_total_size(1) /* INET_DIAG_TOS */ +#if IS_ENABLED(CONFIG_IPV6) + + nla_total_size(1) /* INET_DIAG_TCLASS */ + + nla_total_size(1) /* INET_DIAG_SKV6ONLY */ +#endif + + nla_total_size(4) /* INET_DIAG_MARK */ + + nla_total_size(4); /* INET_DIAG_CLASS_ID */ +} int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb, struct inet_diag_msg *r, int ext, struct user_namespace *user_ns, bool net_admin); diff -Nru linux-4.19.98/include/linux/intel-svm.h linux-4.19.118/include/linux/intel-svm.h --- linux-4.19.98/include/linux/intel-svm.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/intel-svm.h 2020-04-23 08:30:24.000000000 +0000 @@ -130,7 +130,7 @@ BUG(); } -static int intel_svm_is_pasid_valid(struct device *dev, int pasid) +static inline int intel_svm_is_pasid_valid(struct device *dev, int pasid) { return -EINVAL; } diff -Nru linux-4.19.98/include/linux/iocontext.h linux-4.19.118/include/linux/iocontext.h --- linux-4.19.98/include/linux/iocontext.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/iocontext.h 2020-04-23 08:30:24.000000000 +0000 @@ -8,6 +8,7 @@ enum { ICQ_EXITED = 1 << 2, + ICQ_DESTROYED = 1 << 3, }; /* diff -Nru linux-4.19.98/include/linux/irq.h linux-4.19.118/include/linux/irq.h --- linux-4.19.98/include/linux/irq.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/irq.h 2020-04-23 08:30:24.000000000 +0000 @@ -208,6 +208,8 @@ * IRQD_SINGLE_TARGET - IRQ allows only a single affinity target * IRQD_DEFAULT_TRIGGER_SET - Expected trigger already been set * IRQD_CAN_RESERVE - Can use reservation mode + * IRQD_MSI_NOMASK_QUIRK - Non-maskable MSI quirk for affinity change + * required */ enum { IRQD_TRIGGER_MASK = 0xf, @@ -230,6 +232,7 @@ IRQD_SINGLE_TARGET = (1 << 24), IRQD_DEFAULT_TRIGGER_SET = (1 << 25), IRQD_CAN_RESERVE = (1 << 26), + IRQD_MSI_NOMASK_QUIRK = (1 << 27), }; #define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors) @@ -389,6 +392,21 @@ return __irqd_to_state(d) & IRQD_CAN_RESERVE; } +static inline void irqd_set_msi_nomask_quirk(struct irq_data *d) +{ + __irqd_to_state(d) |= IRQD_MSI_NOMASK_QUIRK; +} + +static inline void irqd_clr_msi_nomask_quirk(struct irq_data *d) +{ + __irqd_to_state(d) &= ~IRQD_MSI_NOMASK_QUIRK; +} + +static inline bool irqd_msi_nomask_quirk(struct irq_data *d) +{ + return __irqd_to_state(d) & IRQD_MSI_NOMASK_QUIRK; +} + #undef __irqd_to_state static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) diff -Nru linux-4.19.98/include/linux/irqchip/arm-gic-v3.h linux-4.19.118/include/linux/irqchip/arm-gic-v3.h --- linux-4.19.98/include/linux/irqchip/arm-gic-v3.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/irqchip/arm-gic-v3.h 2020-04-23 08:30:24.000000000 +0000 @@ -165,7 +165,7 @@ #define GICR_PROPBASER_nCnB GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nCnB) #define GICR_PROPBASER_nC GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nC) #define GICR_PROPBASER_RaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWt) -#define GICR_PROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWt) +#define GICR_PROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWb) #define GICR_PROPBASER_WaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWt) #define GICR_PROPBASER_WaWb GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWb) #define GICR_PROPBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWaWt) @@ -192,7 +192,7 @@ #define GICR_PENDBASER_nCnB GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nCnB) #define GICR_PENDBASER_nC GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nC) #define GICR_PENDBASER_RaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWt) -#define GICR_PENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWt) +#define GICR_PENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWb) #define GICR_PENDBASER_WaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWt) #define GICR_PENDBASER_WaWb GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWb) #define GICR_PENDBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWaWt) @@ -251,7 +251,7 @@ #define GICR_VPROPBASER_nCnB GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nCnB) #define GICR_VPROPBASER_nC GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nC) #define GICR_VPROPBASER_RaWt GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWt) -#define GICR_VPROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWt) +#define GICR_VPROPBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWb) #define GICR_VPROPBASER_WaWt GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWt) #define GICR_VPROPBASER_WaWb GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWb) #define GICR_VPROPBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWt) @@ -277,7 +277,7 @@ #define GICR_VPENDBASER_nCnB GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nCnB) #define GICR_VPENDBASER_nC GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nC) #define GICR_VPENDBASER_RaWt GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt) -#define GICR_VPENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt) +#define GICR_VPENDBASER_RaWb GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWb) #define GICR_VPENDBASER_WaWt GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWt) #define GICR_VPENDBASER_WaWb GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWb) #define GICR_VPENDBASER_RaWaWt GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWaWt) @@ -351,7 +351,7 @@ #define GITS_CBASER_nCnB GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nCnB) #define GITS_CBASER_nC GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nC) #define GITS_CBASER_RaWt GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWt) -#define GITS_CBASER_RaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWt) +#define GITS_CBASER_RaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWb) #define GITS_CBASER_WaWt GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWt) #define GITS_CBASER_WaWb GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWb) #define GITS_CBASER_RaWaWt GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWt) @@ -375,7 +375,7 @@ #define GITS_BASER_nCnB GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nCnB) #define GITS_BASER_nC GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nC) #define GITS_BASER_RaWt GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWt) -#define GITS_BASER_RaWb GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWt) +#define GITS_BASER_RaWb GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWb) #define GITS_BASER_WaWt GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWt) #define GITS_BASER_WaWb GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWb) #define GITS_BASER_RaWaWt GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWaWt) diff -Nru linux-4.19.98/include/linux/irqdomain.h linux-4.19.118/include/linux/irqdomain.h --- linux-4.19.98/include/linux/irqdomain.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/irqdomain.h 2020-04-23 08:30:24.000000000 +0000 @@ -188,7 +188,7 @@ IRQ_DOMAIN_FLAG_HIERARCHY = (1 << 0), /* Irq domain name was allocated in __irq_domain_add() */ - IRQ_DOMAIN_NAME_ALLOCATED = (1 << 6), + IRQ_DOMAIN_NAME_ALLOCATED = (1 << 1), /* Irq domain is an IPI domain with virq per cpu */ IRQ_DOMAIN_FLAG_IPI_PER_CPU = (1 << 2), @@ -203,6 +203,13 @@ IRQ_DOMAIN_FLAG_MSI_REMAP = (1 << 5), /* + * Quirk to handle MSI implementations which do not provide + * masking. Currently known to affect x86, but partially + * handled in core code. + */ + IRQ_DOMAIN_MSI_NOMASK_QUIRK = (1 << 6), + + /* * Flags starting from IRQ_DOMAIN_FLAG_NONCORE are reserved * for implementation specific purposes and ignored by the * core code. diff -Nru linux-4.19.98/include/linux/key-type.h linux-4.19.118/include/linux/key-type.h --- linux-4.19.98/include/linux/key-type.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/key-type.h 2020-04-23 08:30:24.000000000 +0000 @@ -125,7 +125,7 @@ * much is copied into the buffer * - shouldn't do the copy if the buffer is NULL */ - long (*read)(const struct key *key, char __user *buffer, size_t buflen); + long (*read)(const struct key *key, char *buffer, size_t buflen); /* handle request_key() for this type instead of invoking * /sbin/request-key (optional) diff -Nru linux-4.19.98/include/linux/kvm_host.h linux-4.19.118/include/linux/kvm_host.h --- linux-4.19.98/include/linux/kvm_host.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/kvm_host.h 2020-04-23 08:30:24.000000000 +0000 @@ -186,7 +186,7 @@ struct list_head queue; struct kvm_vcpu *vcpu; struct mm_struct *mm; - gva_t gva; + gpa_t cr2_or_gpa; unsigned long addr; struct kvm_arch_async_pf arch; bool wakeup_all; @@ -194,8 +194,8 @@ void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu); void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu); -int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, - struct kvm_arch_async_pf *arch); +int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + unsigned long hva, struct kvm_arch_async_pf *arch); int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu); #endif @@ -704,7 +704,7 @@ int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); bool kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); -unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn); +unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn); void mark_page_dirty(struct kvm *kvm, gfn_t gfn); struct kvm_memslots *kvm_vcpu_memslots(struct kvm_vcpu *vcpu); diff -Nru linux-4.19.98/include/linux/libata.h linux-4.19.118/include/linux/libata.h --- linux-4.19.98/include/linux/libata.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/libata.h 2020-04-23 08:30:24.000000000 +0000 @@ -1236,6 +1236,7 @@ }; extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits); +extern void ata_pci_shutdown_one(struct pci_dev *pdev); extern void ata_pci_remove_one(struct pci_dev *pdev); #ifdef CONFIG_PM diff -Nru linux-4.19.98/include/linux/list_nulls.h linux-4.19.118/include/linux/list_nulls.h --- linux-4.19.98/include/linux/list_nulls.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/list_nulls.h 2020-04-23 08:30:24.000000000 +0000 @@ -72,10 +72,10 @@ struct hlist_nulls_node *first = h->first; n->next = first; - n->pprev = &h->first; + WRITE_ONCE(n->pprev, &h->first); h->first = n; if (!is_a_nulls(first)) - first->pprev = &n->next; + WRITE_ONCE(first->pprev, &n->next); } static inline void __hlist_nulls_del(struct hlist_nulls_node *n) @@ -85,13 +85,13 @@ WRITE_ONCE(*pprev, next); if (!is_a_nulls(next)) - next->pprev = pprev; + WRITE_ONCE(next->pprev, pprev); } static inline void hlist_nulls_del(struct hlist_nulls_node *n) { __hlist_nulls_del(n); - n->pprev = LIST_POISON2; + WRITE_ONCE(n->pprev, LIST_POISON2); } /** diff -Nru linux-4.19.98/include/linux/memblock.h linux-4.19.118/include/linux/memblock.h --- linux-4.19.98/include/linux/memblock.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/memblock.h 2020-04-23 08:30:24.000000000 +0000 @@ -265,21 +265,6 @@ for_each_mem_range_rev(i, &memblock.memory, &memblock.reserved, \ nid, flags, p_start, p_end, p_nid) -/** - * for_each_resv_unavail_range - iterate through reserved and unavailable memory - * @i: u64 used as loop variable - * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL - * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL - * - * Walks over unavailable but reserved (reserved && !memory) areas of memblock. - * Available as soon as memblock is initialized. - * Note: because this memory does not belong to any physical node, flags and - * nid arguments do not make sense and thus not exported as arguments. - */ -#define for_each_resv_unavail_range(i, p_start, p_end) \ - for_each_mem_range(i, &memblock.reserved, &memblock.memory, \ - NUMA_NO_NODE, MEMBLOCK_NONE, p_start, p_end, NULL) - static inline void memblock_set_region_flags(struct memblock_region *r, enum memblock_flags flags) { diff -Nru linux-4.19.98/include/linux/memory.h linux-4.19.118/include/linux/memory.h --- linux-4.19.98/include/linux/memory.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/memory.h 2020-04-23 08:30:24.000000000 +0000 @@ -111,16 +111,16 @@ extern void unregister_memory_notifier(struct notifier_block *nb); extern int register_memory_isolate_notifier(struct notifier_block *nb); extern void unregister_memory_isolate_notifier(struct notifier_block *nb); -int hotplug_memory_register(int nid, struct mem_section *section); -#ifdef CONFIG_MEMORY_HOTREMOVE -extern int unregister_memory_section(struct mem_section *); -#endif +int create_memory_block_devices(unsigned long start, unsigned long size); +void remove_memory_block_devices(unsigned long start, unsigned long size); extern int memory_dev_init(void); extern int memory_notify(unsigned long val, void *v); extern int memory_isolate_notify(unsigned long val, void *v); extern struct memory_block *find_memory_block_hinted(struct mem_section *, struct memory_block *); extern struct memory_block *find_memory_block(struct mem_section *); +typedef int (*walk_memory_blocks_func_t)(struct memory_block *, void *); +extern int for_each_memory_block(void *arg, walk_memory_blocks_func_t func); #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION< #include #include diff -Nru linux-4.19.98/include/linux/node.h linux-4.19.118/include/linux/node.h --- linux-4.19.98/include/linux/node.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/node.h 2020-04-23 08:30:24.000000000 +0000 @@ -72,8 +72,7 @@ extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); extern int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg); -extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, - unsigned long phys_index); +extern void unregister_memory_block_under_nodes(struct memory_block *mem_blk); #ifdef CONFIG_HUGETLBFS extern void register_hugetlbfs_with_node(node_registration_func_t doregister, @@ -105,10 +104,8 @@ { return 0; } -static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, - unsigned long phys_index) +static inline void unregister_memory_block_under_nodes(struct memory_block *mem_blk) { - return 0; } static inline void register_hugetlbfs_with_node(node_registration_func_t reg, diff -Nru linux-4.19.98/include/linux/notifier.h linux-4.19.118/include/linux/notifier.h --- linux-4.19.98/include/linux/notifier.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/notifier.h 2020-04-23 08:30:24.000000000 +0000 @@ -122,8 +122,7 @@ #ifdef CONFIG_TREE_SRCU #define _SRCU_NOTIFIER_HEAD(name, mod) \ - static DEFINE_PER_CPU(struct srcu_data, \ - name##_head_srcu_data); \ + static DEFINE_PER_CPU(struct srcu_data, name##_head_srcu_data); \ mod struct srcu_notifier_head name = \ SRCU_NOTIFIER_INIT(name, name##_head_srcu_data) diff -Nru linux-4.19.98/include/linux/nvme-fc-driver.h linux-4.19.118/include/linux/nvme-fc-driver.h --- linux-4.19.98/include/linux/nvme-fc-driver.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/nvme-fc-driver.h 2020-04-23 08:30:24.000000000 +0000 @@ -282,8 +282,6 @@ * * Host/Initiator Transport Entrypoints/Parameters: * - * @module: The LLDD module using the interface - * * @localport_delete: The LLDD initiates deletion of a localport via * nvme_fc_deregister_localport(). However, the teardown is * asynchronous. This routine is called upon the completion of the @@ -397,8 +395,6 @@ * Value is Mandatory. Allowed to be zero. */ struct nvme_fc_port_template { - struct module *module; - /* initiator-based functions */ void (*localport_delete)(struct nvme_fc_local_port *); void (*remoteport_delete)(struct nvme_fc_remote_port *); diff -Nru linux-4.19.98/include/linux/of.h linux-4.19.118/include/linux/of.h --- linux-4.19.98/include/linux/of.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/of.h 2020-04-23 08:30:24.000000000 +0000 @@ -1001,7 +1001,7 @@ static inline const char *of_node_get_device_type(const struct device_node *np) { - return of_get_property(np, "type", NULL); + return of_get_property(np, "device_type", NULL); } static inline bool of_node_is_type(const struct device_node *np, const char *type) @@ -1425,7 +1425,8 @@ #else -static inline int of_overlay_fdt_apply(void *overlay_fdt, int *ovcs_id) +static inline int of_overlay_fdt_apply(void *overlay_fdt, u32 overlay_fdt_size, + int *ovcs_id) { return -ENOTSUPP; } diff -Nru linux-4.19.98/include/linux/page-flags.h linux-4.19.118/include/linux/page-flags.h --- linux-4.19.98/include/linux/page-flags.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/page-flags.h 2020-04-23 08:30:24.000000000 +0000 @@ -271,7 +271,7 @@ __PAGEFLAG(Locked, locked, PF_NO_TAIL) PAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) __CLEARPAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) -PAGEFLAG(Error, error, PF_NO_COMPOUND) TESTCLEARFLAG(Error, error, PF_NO_COMPOUND) +PAGEFLAG(Error, error, PF_NO_TAIL) TESTCLEARFLAG(Error, error, PF_NO_TAIL) PAGEFLAG(Referenced, referenced, PF_HEAD) TESTCLEARFLAG(Referenced, referenced, PF_HEAD) __SETPAGEFLAG(Referenced, referenced, PF_HEAD) diff -Nru linux-4.19.98/include/linux/pci-epc.h linux-4.19.118/include/linux/pci-epc.h --- linux-4.19.98/include/linux/pci-epc.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/pci-epc.h 2020-04-23 08:30:24.000000000 +0000 @@ -69,6 +69,7 @@ * @bitmap: bitmap to manage the PCI address space * @pages: number of bits representing the address region * @page_size: size of each page + * @lock: mutex to protect bitmap */ struct pci_epc_mem { phys_addr_t phys_base; @@ -76,6 +77,8 @@ unsigned long *bitmap; size_t page_size; int pages; + /* mutex to protect against concurrent access for memory allocation*/ + struct mutex lock; }; /** diff -Nru linux-4.19.98/include/linux/percpu-defs.h linux-4.19.118/include/linux/percpu-defs.h --- linux-4.19.98/include/linux/percpu-defs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/percpu-defs.h 2020-04-23 08:30:24.000000000 +0000 @@ -176,8 +176,7 @@ * Declaration/definition used for per-CPU variables that should be accessed * as decrypted when memory encryption is enabled in the guest. */ -#if defined(CONFIG_VIRTUALIZATION) && defined(CONFIG_AMD_MEM_ENCRYPT) - +#ifdef CONFIG_AMD_MEM_ENCRYPT #define DECLARE_PER_CPU_DECRYPTED(type, name) \ DECLARE_PER_CPU_SECTION(type, name, "..decrypted") diff -Nru linux-4.19.98/include/linux/percpu_counter.h linux-4.19.118/include/linux/percpu_counter.h --- linux-4.19.98/include/linux/percpu_counter.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/percpu_counter.h 2020-04-23 08:30:24.000000000 +0000 @@ -78,9 +78,9 @@ */ static inline s64 percpu_counter_read_positive(struct percpu_counter *fbc) { - s64 ret = fbc->count; + /* Prevent reloads of fbc->count */ + s64 ret = READ_ONCE(fbc->count); - barrier(); /* Prevent reloads of fbc->count */ if (ret >= 0) return ret; return 0; diff -Nru linux-4.19.98/include/linux/perf_event.h linux-4.19.118/include/linux/perf_event.h --- linux-4.19.98/include/linux/perf_event.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/perf_event.h 2020-04-23 08:30:24.000000000 +0000 @@ -494,6 +494,11 @@ unsigned int nr_file_filters; }; +struct perf_addr_filter_range { + unsigned long start; + unsigned long size; +}; + /** * enum perf_event_state - the states of an event: */ @@ -670,7 +675,7 @@ /* address range filters */ struct perf_addr_filters_head addr_filters; /* vma address array for file-based filders */ - unsigned long *addr_filters_offs; + struct perf_addr_filter_range *addr_filter_ranges; unsigned long addr_filters_gen; void (*destroy)(struct perf_event *); diff -Nru linux-4.19.98/include/linux/phy.h linux-4.19.118/include/linux/phy.h --- linux-4.19.98/include/linux/phy.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/phy.h 2020-04-23 08:30:24.000000000 +0000 @@ -373,6 +373,7 @@ * is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc. * has_fixups: Set to true if this phy has fixups/quirks. * suspended: Set to true if this phy has been suspended successfully. + * suspended_by_mdio_bus: Set to true if this phy was suspended by MDIO bus. * sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal. * loopback_enabled: Set true if this phy has been loopbacked successfully. * state: state of the PHY for management purposes @@ -411,6 +412,7 @@ unsigned is_pseudo_fixed_link:1; unsigned has_fixups:1; unsigned suspended:1; + unsigned suspended_by_mdio_bus:1; unsigned sysfs_links:1; unsigned loopback_enabled:1; diff -Nru linux-4.19.98/include/linux/platform_data/dma-imx-sdma.h linux-4.19.118/include/linux/platform_data/dma-imx-sdma.h --- linux-4.19.98/include/linux/platform_data/dma-imx-sdma.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/platform_data/dma-imx-sdma.h 2020-04-23 08:30:24.000000000 +0000 @@ -51,7 +51,10 @@ /* End of v2 array */ s32 zcanfd_2_mcu_addr; s32 zqspi_2_mcu_addr; + s32 mcu_2_ecspi_addr; /* End of v3 array */ + s32 mcu_2_zqspi_addr; + /* End of v4 array */ }; /** diff -Nru linux-4.19.98/include/linux/power/smartreflex.h linux-4.19.118/include/linux/power/smartreflex.h --- linux-4.19.98/include/linux/power/smartreflex.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/power/smartreflex.h 2020-04-23 08:30:24.000000000 +0000 @@ -296,6 +296,9 @@ struct voltagedomain *voltdm; }; + +extern struct omap_sr_data omap_sr_pdata[OMAP_SR_NR]; + #ifdef CONFIG_POWER_AVS_OMAP /* Smartreflex module enable/disable interface */ diff -Nru linux-4.19.98/include/linux/rculist_nulls.h linux-4.19.118/include/linux/rculist_nulls.h --- linux-4.19.98/include/linux/rculist_nulls.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/rculist_nulls.h 2020-04-23 08:30:24.000000000 +0000 @@ -34,7 +34,7 @@ { if (!hlist_nulls_unhashed(n)) { __hlist_nulls_del(n); - n->pprev = NULL; + WRITE_ONCE(n->pprev, NULL); } } @@ -66,7 +66,7 @@ static inline void hlist_nulls_del_rcu(struct hlist_nulls_node *n) { __hlist_nulls_del(n); - n->pprev = LIST_POISON2; + WRITE_ONCE(n->pprev, LIST_POISON2); } /** @@ -94,10 +94,10 @@ struct hlist_nulls_node *first = h->first; n->next = first; - n->pprev = &h->first; + WRITE_ONCE(n->pprev, &h->first); rcu_assign_pointer(hlist_nulls_first_rcu(h), n); if (!is_a_nulls(first)) - first->pprev = &n->next; + WRITE_ONCE(first->pprev, &n->next); } /** diff -Nru linux-4.19.98/include/linux/rtc.h linux-4.19.118/include/linux/rtc.h --- linux-4.19.98/include/linux/rtc.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/rtc.h 2020-04-23 08:30:24.000000000 +0000 @@ -163,7 +163,7 @@ #define to_rtc_device(d) container_of(d, struct rtc_device, dev) /* useful timestamps */ -#define RTC_TIMESTAMP_BEGIN_1900 -2208989361LL /* 1900-01-01 00:00:00 */ +#define RTC_TIMESTAMP_BEGIN_1900 -2208988800LL /* 1900-01-01 00:00:00 */ #define RTC_TIMESTAMP_BEGIN_2000 946684800LL /* 2000-01-01 00:00:00 */ #define RTC_TIMESTAMP_END_2099 4102444799LL /* 2099-12-31 23:59:59 */ diff -Nru linux-4.19.98/include/linux/sched.h linux-4.19.118/include/linux/sched.h --- linux-4.19.98/include/linux/sched.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/sched.h 2020-04-23 08:30:24.000000000 +0000 @@ -887,8 +887,8 @@ struct seccomp seccomp; /* Thread group tracking: */ - u32 parent_exec_id; - u32 self_exec_id; + u64 parent_exec_id; + u64 self_exec_id; /* Protection against (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, mempolicy: */ spinlock_t alloc_lock; @@ -1843,11 +1843,11 @@ /* * If parent process has a registered restartable sequences area, the - * child inherits. Only applies when forking a process, not a thread. + * child inherits. Unregister rseq for a clone with CLONE_VM set. */ static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags) { - if (clone_flags & CLONE_THREAD) { + if (clone_flags & CLONE_VM) { t->rseq = NULL; t->rseq_len = 0; t->rseq_sig = 0; diff -Nru linux-4.19.98/include/linux/selection.h linux-4.19.118/include/linux/selection.h --- linux-4.19.98/include/linux/selection.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/selection.h 2020-04-23 08:30:24.000000000 +0000 @@ -13,8 +13,8 @@ struct tty_struct; -extern struct vc_data *sel_cons; struct tty_struct; +struct vc_data; extern void clear_selection(void); extern int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty); @@ -23,6 +23,8 @@ extern int mouse_reporting(void); extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry); +bool vc_is_sel(struct vc_data *vc); + extern int console_blanked; extern const unsigned char color_table[]; diff -Nru linux-4.19.98/include/linux/signal.h linux-4.19.118/include/linux/signal.h --- linux-4.19.98/include/linux/signal.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/signal.h 2020-04-23 08:30:24.000000000 +0000 @@ -272,6 +272,9 @@ extern void exit_signals(struct task_struct *tsk); extern void kernel_sigaction(int, __sighandler_t); +#define SIG_KTHREAD ((__force __sighandler_t)2) +#define SIG_KTHREAD_KERNEL ((__force __sighandler_t)3) + static inline void allow_signal(int sig) { /* @@ -279,7 +282,17 @@ * know it'll be handled, so that they don't get converted to * SIGKILL or just silently dropped. */ - kernel_sigaction(sig, (__force __sighandler_t)2); + kernel_sigaction(sig, SIG_KTHREAD); +} + +static inline void allow_kernel_signal(int sig) +{ + /* + * Kernel threads handle their own signals. Let the signal code + * know signals sent by the kernel will be handled, so that they + * don't get silently dropped. + */ + kernel_sigaction(sig, SIG_KTHREAD_KERNEL); } static inline void disallow_signal(int sig) diff -Nru linux-4.19.98/include/linux/swab.h linux-4.19.118/include/linux/swab.h --- linux-4.19.98/include/linux/swab.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/swab.h 2020-04-23 08:30:24.000000000 +0000 @@ -7,6 +7,7 @@ # define swab16 __swab16 # define swab32 __swab32 # define swab64 __swab64 +# define swab __swab # define swahw32 __swahw32 # define swahb32 __swahb32 # define swab16p __swab16p diff -Nru linux-4.19.98/include/linux/swapops.h linux-4.19.118/include/linux/swapops.h --- linux-4.19.98/include/linux/swapops.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/swapops.h 2020-04-23 08:30:24.000000000 +0000 @@ -368,7 +368,8 @@ } #endif -#if defined(CONFIG_MEMORY_FAILURE) || defined(CONFIG_MIGRATION) +#if defined(CONFIG_MEMORY_FAILURE) || defined(CONFIG_MIGRATION) || \ + defined(CONFIG_DEVICE_PRIVATE) static inline int non_swap_entry(swp_entry_t entry) { return swp_type(entry) >= MAX_SWAPFILES; diff -Nru linux-4.19.98/include/linux/switchtec.h linux-4.19.118/include/linux/switchtec.h --- linux-4.19.98/include/linux/switchtec.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/switchtec.h 2020-04-23 08:30:24.000000000 +0000 @@ -244,8 +244,8 @@ u64 xlate_addr; } bar_entry[6]; u32 reserved2[216]; - u32 req_id_table[256]; - u32 reserved3[512]; + u32 req_id_table[512]; + u32 reserved3[256]; u64 lut_entry[512]; } __packed; diff -Nru linux-4.19.98/include/linux/tty.h linux-4.19.118/include/linux/tty.h --- linux-4.19.98/include/linux/tty.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/tty.h 2020-04-23 08:30:24.000000000 +0000 @@ -225,6 +225,8 @@ void (*write_wakeup)(struct tty_port *port); }; +extern const struct tty_port_client_operations tty_port_default_client_ops; + struct tty_port { struct tty_bufhead buf; /* Locked internally */ struct tty_struct *tty; /* Back pointer */ diff -Nru linux-4.19.98/include/linux/usb/irda.h linux-4.19.118/include/linux/usb/irda.h --- linux-4.19.98/include/linux/usb/irda.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/usb/irda.h 2020-04-23 08:30:24.000000000 +0000 @@ -119,11 +119,22 @@ * 6 - 115200 bps * 7 - 576000 bps * 8 - 1.152 Mbps - * 9 - 5 mbps + * 9 - 4 Mbps * 10..15 - Reserved */ #define USB_IRDA_STATUS_LINK_SPEED 0x0f +#define USB_IRDA_LS_NO_CHANGE 0 +#define USB_IRDA_LS_2400 1 +#define USB_IRDA_LS_9600 2 +#define USB_IRDA_LS_19200 3 +#define USB_IRDA_LS_38400 4 +#define USB_IRDA_LS_57600 5 +#define USB_IRDA_LS_115200 6 +#define USB_IRDA_LS_576000 7 +#define USB_IRDA_LS_1152000 8 +#define USB_IRDA_LS_4000000 9 + /* The following is a 4-bit value used only for * outbound header: * diff -Nru linux-4.19.98/include/linux/usb/quirks.h linux-4.19.118/include/linux/usb/quirks.h --- linux-4.19.98/include/linux/usb/quirks.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/usb/quirks.h 2020-04-23 08:30:24.000000000 +0000 @@ -69,4 +69,7 @@ /* Hub needs extra delay after resetting its port. */ #define USB_QUIRK_HUB_SLOW_RESET BIT(14) +/* device has blacklisted endpoints */ +#define USB_QUIRK_ENDPOINT_BLACKLIST BIT(15) + #endif /* __LINUX_USB_QUIRKS_H */ diff -Nru linux-4.19.98/include/linux/usb/tcpm.h linux-4.19.118/include/linux/usb/tcpm.h --- linux-4.19.98/include/linux/usb/tcpm.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/usb/tcpm.h 2020-04-23 08:30:24.000000000 +0000 @@ -121,10 +121,10 @@ * with partner. * @set_pd_rx: Called to enable or disable reception of PD messages * @set_roles: Called to set power and data roles - * @start_drp_toggling: - * Optional; if supported by hardware, called to start DRP - * toggling. DRP toggling is stopped automatically if - * a connection is established. + * @start_toggling: + * Optional; if supported by hardware, called to start dual-role + * toggling or single-role connection detection. Toggling stops + * automatically if a connection is established. * @try_role: Optional; called to set a preferred role * @pd_transmit:Called to transmit PD message * @mux: Pointer to multiplexer data @@ -147,8 +147,9 @@ int (*set_pd_rx)(struct tcpc_dev *dev, bool on); int (*set_roles)(struct tcpc_dev *dev, bool attached, enum typec_role role, enum typec_data_role data); - int (*start_drp_toggling)(struct tcpc_dev *dev, - enum typec_cc_status cc); + int (*start_toggling)(struct tcpc_dev *dev, + enum typec_port_type port_type, + enum typec_cc_status cc); int (*try_role)(struct tcpc_dev *dev, int role); int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type, const struct pd_message *msg); diff -Nru linux-4.19.98/include/linux/vmalloc.h linux-4.19.118/include/linux/vmalloc.h --- linux-4.19.98/include/linux/vmalloc.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/vmalloc.h 2020-04-23 08:30:24.000000000 +0000 @@ -107,8 +107,9 @@ extern int remap_vmalloc_range(struct vm_area_struct *vma, void *addr, unsigned long pgoff); -void vmalloc_sync_all(void); - +void vmalloc_sync_mappings(void); +void vmalloc_sync_unmappings(void); + /* * Lowlevel-APIs (not for driver use!) */ diff -Nru linux-4.19.98/include/linux/vt_kern.h linux-4.19.118/include/linux/vt_kern.h --- linux-4.19.98/include/linux/vt_kern.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/linux/vt_kern.h 2020-04-23 08:30:24.000000000 +0000 @@ -142,7 +142,7 @@ return false; } -extern char vt_dont_switch; +extern bool vt_dont_switch; extern int default_utf8; extern int global_cursor_default; diff -Nru linux-4.19.98/include/media/davinci/vpbe.h linux-4.19.118/include/media/davinci/vpbe.h --- linux-4.19.98/include/media/davinci/vpbe.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/media/davinci/vpbe.h 2020-04-23 08:30:24.000000000 +0000 @@ -92,7 +92,7 @@ struct encoder_config_info *ext_encoders; /* amplifier information goes here */ struct amp_config_info *amp; - int num_outputs; + unsigned int num_outputs; /* Order is venc outputs followed by LCD and then external encoders */ struct vpbe_output *outputs; }; diff -Nru linux-4.19.98/include/media/v4l2-device.h linux-4.19.118/include/media/v4l2-device.h --- linux-4.19.98/include/media/v4l2-device.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/media/v4l2-device.h 2020-04-23 08:30:24.000000000 +0000 @@ -372,7 +372,7 @@ struct v4l2_subdev *__sd; \ \ __v4l2_device_call_subdevs_p(v4l2_dev, __sd, \ - !(grpid) || __sd->grp_id == (grpid), o, f , \ + (grpid) == 0 || __sd->grp_id == (grpid), o, f , \ ##args); \ } while (0) @@ -404,7 +404,7 @@ ({ \ struct v4l2_subdev *__sd; \ __v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, \ - !(grpid) || __sd->grp_id == (grpid), o, f , \ + (grpid) == 0 || __sd->grp_id == (grpid), o, f , \ ##args); \ }) @@ -432,8 +432,8 @@ struct v4l2_subdev *__sd; \ \ __v4l2_device_call_subdevs_p(v4l2_dev, __sd, \ - !(grpmsk) || (__sd->grp_id & (grpmsk)), o, f , \ - ##args); \ + (grpmsk) == 0 || (__sd->grp_id & (grpmsk)), o, \ + f , ##args); \ } while (0) /** @@ -463,8 +463,8 @@ ({ \ struct v4l2_subdev *__sd; \ __v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, \ - !(grpmsk) || (__sd->grp_id & (grpmsk)), o, f , \ - ##args); \ + (grpmsk) == 0 || (__sd->grp_id & (grpmsk)), o, \ + f , ##args); \ }) diff -Nru linux-4.19.98/include/media/v4l2-rect.h linux-4.19.118/include/media/v4l2-rect.h --- linux-4.19.98/include/media/v4l2-rect.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/media/v4l2-rect.h 2020-04-23 08:30:24.000000000 +0000 @@ -63,10 +63,10 @@ r->left = boundary->left; if (r->top < boundary->top) r->top = boundary->top; - if (r->left + r->width > boundary->width) - r->left = boundary->width - r->width; - if (r->top + r->height > boundary->height) - r->top = boundary->height - r->height; + if (r->left + r->width > boundary->left + boundary->width) + r->left = boundary->left + boundary->width - r->width; + if (r->top + r->height > boundary->top + boundary->height) + r->top = boundary->top + boundary->height - r->height; } /** diff -Nru linux-4.19.98/include/net/cfg80211.h linux-4.19.118/include/net/cfg80211.h --- linux-4.19.98/include/net/cfg80211.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/cfg80211.h 2020-04-23 08:30:24.000000000 +0000 @@ -3050,6 +3050,9 @@ * * @start_radar_detection: Start radar detection in the driver. * + * @end_cac: End running CAC, probably because a related CAC + * was finished on another phy. + * * @update_ft_ies: Provide updated Fast BSS Transition information to the * driver. If the SME is in the driver/firmware, this information can be * used in building Authentication and Reassociation Request frames. @@ -3364,6 +3367,8 @@ struct net_device *dev, struct cfg80211_chan_def *chandef, u32 cac_time_ms); + void (*end_cac)(struct wiphy *wiphy, + struct net_device *dev); int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev, struct cfg80211_update_ft_ies_params *ftie); int (*crit_proto_start)(struct wiphy *wiphy, diff -Nru linux-4.19.98/include/net/fib_rules.h linux-4.19.118/include/net/fib_rules.h --- linux-4.19.98/include/net/fib_rules.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/fib_rules.h 2020-04-23 08:30:24.000000000 +0000 @@ -107,6 +107,7 @@ [FRA_OIFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 }, \ [FRA_PRIORITY] = { .type = NLA_U32 }, \ [FRA_FWMARK] = { .type = NLA_U32 }, \ + [FRA_TUN_ID] = { .type = NLA_U64 }, \ [FRA_FWMASK] = { .type = NLA_U32 }, \ [FRA_TABLE] = { .type = NLA_U32 }, \ [FRA_SUPPRESS_PREFIXLEN] = { .type = NLA_U32 }, \ diff -Nru linux-4.19.98/include/net/flow_dissector.h linux-4.19.118/include/net/flow_dissector.h --- linux-4.19.98/include/net/flow_dissector.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/flow_dissector.h 2020-04-23 08:30:24.000000000 +0000 @@ -5,6 +5,7 @@ #include #include #include +#include #include /** @@ -306,4 +307,12 @@ return ((char *)target_container) + flow_dissector->offset[key_id]; } +static inline void +flow_dissector_init_keys(struct flow_dissector_key_control *key_control, + struct flow_dissector_key_basic *key_basic) +{ + memset(key_control, 0, sizeof(*key_control)); + memset(key_basic, 0, sizeof(*key_basic)); +} + #endif diff -Nru linux-4.19.98/include/net/ip6_route.h linux-4.19.118/include/net/ip6_route.h --- linux-4.19.98/include/net/ip6_route.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/ip6_route.h 2020-04-23 08:30:24.000000000 +0000 @@ -234,6 +234,7 @@ return rt->rt6i_flags & RTF_ANYCAST || (rt->rt6i_dst.plen < 127 && + !(rt->rt6i_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) && ipv6_addr_equal(&rt->rt6i_dst.addr, daddr)); } diff -Nru linux-4.19.98/include/net/ipx.h linux-4.19.118/include/net/ipx.h --- linux-4.19.98/include/net/ipx.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/ipx.h 2020-04-23 08:30:24.000000000 +0000 @@ -47,11 +47,6 @@ /* From af_ipx.c */ extern int sysctl_ipx_pprop_broadcasting; -static __inline__ struct ipxhdr *ipx_hdr(struct sk_buff *skb) -{ - return (struct ipxhdr *)skb_transport_header(skb); -} - struct ipx_interface { /* IPX address */ __be32 if_netnum; diff -Nru linux-4.19.98/include/net/pkt_cls.h linux-4.19.118/include/net/pkt_cls.h --- linux-4.19.98/include/net/pkt_cls.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/pkt_cls.h 2020-04-23 08:30:24.000000000 +0000 @@ -206,31 +206,38 @@ return xchg(clp, cl); } -static inline unsigned long -cls_set_class(struct Qdisc *q, unsigned long *clp, unsigned long cl) +static inline void +__tcf_bind_filter(struct Qdisc *q, struct tcf_result *r, unsigned long base) { - unsigned long old_cl; + unsigned long cl; - sch_tree_lock(q); - old_cl = __cls_set_class(clp, cl); - sch_tree_unlock(q); - return old_cl; + cl = q->ops->cl_ops->bind_tcf(q, base, r->classid); + cl = __cls_set_class(&r->class, cl); + if (cl) + q->ops->cl_ops->unbind_tcf(q, cl); } static inline void tcf_bind_filter(struct tcf_proto *tp, struct tcf_result *r, unsigned long base) { struct Qdisc *q = tp->chain->block->q; - unsigned long cl; /* Check q as it is not set for shared blocks. In that case, * setting class is not supported. */ if (!q) return; - cl = q->ops->cl_ops->bind_tcf(q, base, r->classid); - cl = cls_set_class(q, &r->class, cl); - if (cl) + sch_tree_lock(q); + __tcf_bind_filter(q, r, base); + sch_tree_unlock(q); +} + +static inline void +__tcf_unbind_filter(struct Qdisc *q, struct tcf_result *r) +{ + unsigned long cl; + + if ((cl = __cls_set_class(&r->class, 0)) != 0) q->ops->cl_ops->unbind_tcf(q, cl); } @@ -238,12 +245,10 @@ tcf_unbind_filter(struct tcf_proto *tp, struct tcf_result *r) { struct Qdisc *q = tp->chain->block->q; - unsigned long cl; if (!q) return; - if ((cl = __cls_set_class(&r->class, 0)) != 0) - q->ops->cl_ops->unbind_tcf(q, cl); + __tcf_unbind_filter(q, r); } struct tcf_exts { diff -Nru linux-4.19.98/include/net/request_sock.h linux-4.19.118/include/net/request_sock.h --- linux-4.19.98/include/net/request_sock.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/request_sock.h 2020-04-23 08:30:24.000000000 +0000 @@ -183,7 +183,7 @@ static inline bool reqsk_queue_empty(const struct request_sock_queue *queue) { - return queue->rskq_accept_head == NULL; + return READ_ONCE(queue->rskq_accept_head) == NULL; } static inline struct request_sock *reqsk_queue_remove(struct request_sock_queue *queue, @@ -195,7 +195,7 @@ req = queue->rskq_accept_head; if (req) { sk_acceptq_removed(parent); - queue->rskq_accept_head = req->dl_next; + WRITE_ONCE(queue->rskq_accept_head, req->dl_next); if (queue->rskq_accept_head == NULL) queue->rskq_accept_tail = NULL; } diff -Nru linux-4.19.98/include/net/sch_generic.h linux-4.19.118/include/net/sch_generic.h --- linux-4.19.98/include/net/sch_generic.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/sch_generic.h 2020-04-23 08:30:24.000000000 +0000 @@ -273,7 +273,8 @@ int (*reoffload)(struct tcf_proto *tp, bool add, tc_setup_cb_t *cb, void *cb_priv, struct netlink_ext_ack *extack); - void (*bind_class)(void *, u32, unsigned long); + void (*bind_class)(void *, u32, unsigned long, + void *, unsigned long); void * (*tmplt_create)(struct net *net, struct tcf_chain *chain, struct nlattr **tca, diff -Nru linux-4.19.98/include/net/sctp/sctp.h linux-4.19.118/include/net/sctp/sctp.h --- linux-4.19.98/include/net/sctp/sctp.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/sctp/sctp.h 2020-04-23 08:30:24.000000000 +0000 @@ -625,4 +625,9 @@ return sctp_mtu_payload(sp, SCTP_DEFAULT_MINSEGMENT, datasize); } +static inline bool sctp_newsk_ready(const struct sock *sk) +{ + return sock_flag(sk, SOCK_DEAD) || sk->sk_socket; +} + #endif /* __net_sctp_h__ */ diff -Nru linux-4.19.98/include/net/tcp.h linux-4.19.118/include/net/tcp.h --- linux-4.19.98/include/net/tcp.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/tcp.h 2020-04-23 08:30:24.000000000 +0000 @@ -261,7 +261,7 @@ mem_cgroup_under_socket_pressure(sk->sk_memcg)) return true; - return tcp_memory_pressure; + return READ_ONCE(tcp_memory_pressure); } /* * The next routines deal with comparing 32 bit unsigned ints diff -Nru linux-4.19.98/include/net/xfrm.h linux-4.19.118/include/net/xfrm.h --- linux-4.19.98/include/net/xfrm.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/net/xfrm.h 2020-04-23 08:30:24.000000000 +0000 @@ -1054,7 +1054,6 @@ void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev); struct xfrm_if_parms { - char name[IFNAMSIZ]; /* name of XFRM device */ int link; /* ifindex of underlying L2 interface */ u32 if_id; /* interface identifyer */ }; diff -Nru linux-4.19.98/include/rdma/ib_verbs.h linux-4.19.118/include/rdma/ib_verbs.h --- linux-4.19.98/include/rdma/ib_verbs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/rdma/ib_verbs.h 2020-04-23 08:30:24.000000000 +0000 @@ -3864,6 +3864,9 @@ !(flags & IB_ACCESS_LOCAL_WRITE)) return -EINVAL; + if (flags & ~IB_ACCESS_SUPPORTED) + return -EINVAL; + return 0; } diff -Nru linux-4.19.98/include/scsi/iscsi_proto.h linux-4.19.118/include/scsi/iscsi_proto.h --- linux-4.19.98/include/scsi/iscsi_proto.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/scsi/iscsi_proto.h 2020-04-23 08:30:24.000000000 +0000 @@ -638,7 +638,6 @@ #define ISCSI_REASON_BOOKMARK_INVALID 9 #define ISCSI_REASON_BOOKMARK_NO_RESOURCES 10 #define ISCSI_REASON_NEGOTIATION_RESET 11 -#define ISCSI_REASON_WAITING_FOR_LOGOUT 12 /* Max. number of Key=Value pairs in a text message */ #define MAX_KEY_VALUE_PAIRS 8192 diff -Nru linux-4.19.98/include/sound/rawmidi.h linux-4.19.118/include/sound/rawmidi.h --- linux-4.19.98/include/sound/rawmidi.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/sound/rawmidi.h 2020-04-23 08:30:24.000000000 +0000 @@ -92,9 +92,9 @@ struct list_head list; /* list of all substream for given stream */ int stream; /* direction */ int number; /* substream number */ - unsigned int opened: 1, /* open flag */ - append: 1, /* append flag (merge more streams) */ - active_sensing: 1; /* send active sensing when close */ + bool opened; /* open flag */ + bool append; /* append flag (merge more streams) */ + bool active_sensing; /* send active sensing when close */ int use_count; /* use counter (for output) */ size_t bytes; struct snd_rawmidi *rmidi; diff -Nru linux-4.19.98/include/sound/soc.h linux-4.19.118/include/sound/soc.h --- linux-4.19.98/include/sound/soc.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/sound/soc.h 2020-04-23 08:30:24.000000000 +0000 @@ -548,12 +548,12 @@ } #endif -#ifdef CONFIG_SND_SOC_AC97_BUS struct snd_ac97 *snd_soc_alloc_ac97_component(struct snd_soc_component *component); struct snd_ac97 *snd_soc_new_ac97_component(struct snd_soc_component *component, unsigned int id, unsigned int id_mask); void snd_soc_free_ac97_component(struct snd_ac97 *ac97); +#ifdef CONFIG_SND_SOC_AC97_BUS int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops); int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops, struct platform_device *pdev); diff -Nru linux-4.19.98/include/target/iscsi/iscsi_target_core.h linux-4.19.118/include/target/iscsi/iscsi_target_core.h --- linux-4.19.98/include/target/iscsi/iscsi_target_core.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/target/iscsi/iscsi_target_core.h 2020-04-23 08:30:24.000000000 +0000 @@ -674,7 +674,7 @@ atomic_t session_logout; atomic_t session_reinstatement; atomic_t session_stop_active; - atomic_t sleep_on_sess_wait_comp; + atomic_t session_close; /* connection list */ struct list_head sess_conn_list; struct list_head cr_active_list; diff -Nru linux-4.19.98/include/trace/events/afs.h linux-4.19.118/include/trace/events/afs.h --- linux-4.19.98/include/trace/events/afs.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/trace/events/afs.h 2020-04-23 08:30:24.000000000 +0000 @@ -94,7 +94,7 @@ EM(afs_call_trace_free, "FREE ") \ EM(afs_call_trace_put, "PUT ") \ EM(afs_call_trace_wake, "WAKE ") \ - E_(afs_call_trace_work, "WORK ") + E_(afs_call_trace_work, "QUEUE") #define afs_fs_operations \ EM(afs_FS_FetchData, "FS.FetchData") \ diff -Nru linux-4.19.98/include/trace/events/rxrpc.h linux-4.19.118/include/trace/events/rxrpc.h --- linux-4.19.98/include/trace/events/rxrpc.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/trace/events/rxrpc.h 2020-04-23 08:30:24.000000000 +0000 @@ -554,10 +554,10 @@ ); TRACE_EVENT(rxrpc_conn, - TP_PROTO(struct rxrpc_connection *conn, enum rxrpc_conn_trace op, + TP_PROTO(unsigned int conn_debug_id, enum rxrpc_conn_trace op, int usage, const void *where), - TP_ARGS(conn, op, usage, where), + TP_ARGS(conn_debug_id, op, usage, where), TP_STRUCT__entry( __field(unsigned int, conn ) @@ -567,7 +567,7 @@ ), TP_fast_assign( - __entry->conn = conn->debug_id; + __entry->conn = conn_debug_id; __entry->op = op; __entry->usage = usage; __entry->where = where; diff -Nru linux-4.19.98/include/trace/events/xen.h linux-4.19.118/include/trace/events/xen.h --- linux-4.19.98/include/trace/events/xen.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/trace/events/xen.h 2020-04-23 08:30:24.000000000 +0000 @@ -66,7 +66,11 @@ TP_PROTO(xen_mc_callback_fn_t fn, void *data), TP_ARGS(fn, data), TP_STRUCT__entry( - __field(xen_mc_callback_fn_t, fn) + /* + * Use field_struct to avoid is_signed_type() + * comparison of a function pointer. + */ + __field_struct(xen_mc_callback_fn_t, fn) __field(void *, data) ), TP_fast_assign( diff -Nru linux-4.19.98/include/uapi/linux/btf.h linux-4.19.118/include/uapi/linux/btf.h --- linux-4.19.98/include/uapi/linux/btf.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/uapi/linux/btf.h 2020-04-23 08:30:24.000000000 +0000 @@ -22,9 +22,9 @@ }; /* Max # of type identifier */ -#define BTF_MAX_TYPE 0x0000ffff +#define BTF_MAX_TYPE 0x000fffff /* Max offset into the string section */ -#define BTF_MAX_NAME_OFFSET 0x0000ffff +#define BTF_MAX_NAME_OFFSET 0x00ffffff /* Max # of struct/union/enum members or func args */ #define BTF_MAX_VLEN 0xffff diff -Nru linux-4.19.98/include/uapi/linux/coresight-stm.h linux-4.19.118/include/uapi/linux/coresight-stm.h --- linux-4.19.98/include/uapi/linux/coresight-stm.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/uapi/linux/coresight-stm.h 2020-04-23 08:30:24.000000000 +0000 @@ -2,8 +2,10 @@ #ifndef __UAPI_CORESIGHT_STM_H_ #define __UAPI_CORESIGHT_STM_H_ -#define STM_FLAG_TIMESTAMPED BIT(3) -#define STM_FLAG_GUARANTEED BIT(7) +#include + +#define STM_FLAG_TIMESTAMPED _BITUL(3) +#define STM_FLAG_GUARANTEED _BITUL(7) /* * The CoreSight STM supports guaranteed and invariant timing diff -Nru linux-4.19.98/include/uapi/linux/netfilter/nf_tables.h linux-4.19.118/include/uapi/linux/netfilter/nf_tables.h --- linux-4.19.98/include/uapi/linux/netfilter/nf_tables.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/uapi/linux/netfilter/nf_tables.h 2020-04-23 08:30:24.000000000 +0000 @@ -1128,7 +1128,7 @@ NFT_LOGLEVEL_AUDIT, __NFT_LOGLEVEL_MAX }; -#define NFT_LOGLEVEL_MAX (__NFT_LOGLEVEL_MAX + 1) +#define NFT_LOGLEVEL_MAX (__NFT_LOGLEVEL_MAX - 1) /** * enum nft_queue_attributes - nf_tables queue expression netlink attributes diff -Nru linux-4.19.98/include/uapi/linux/serio.h linux-4.19.118/include/uapi/linux/serio.h --- linux-4.19.98/include/uapi/linux/serio.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/uapi/linux/serio.h 2020-04-23 08:30:24.000000000 +0000 @@ -9,7 +9,7 @@ #ifndef _UAPI_SERIO_H #define _UAPI_SERIO_H - +#include #include #define SPIOCSTYPE _IOW('q', 0x01, unsigned long) @@ -18,10 +18,10 @@ /* * bit masks for use in "interrupt" flags (3rd argument) */ -#define SERIO_TIMEOUT BIT(0) -#define SERIO_PARITY BIT(1) -#define SERIO_FRAME BIT(2) -#define SERIO_OOB_DATA BIT(3) +#define SERIO_TIMEOUT _BITUL(0) +#define SERIO_PARITY _BITUL(1) +#define SERIO_FRAME _BITUL(2) +#define SERIO_OOB_DATA _BITUL(3) /* * Serio types diff -Nru linux-4.19.98/include/uapi/linux/swab.h linux-4.19.118/include/uapi/linux/swab.h --- linux-4.19.98/include/uapi/linux/swab.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/uapi/linux/swab.h 2020-04-23 08:30:24.000000000 +0000 @@ -4,6 +4,7 @@ #include #include +#include #include /* @@ -132,6 +133,15 @@ __fswab64(x)) #endif +static __always_inline unsigned long __swab(const unsigned long y) +{ +#if BITS_PER_LONG == 64 + return __swab64(y); +#else /* BITS_PER_LONG == 32 */ + return __swab32(y); +#endif +} + /** * __swahw32 - return a word-swapped 32-bit value * @x: value to wordswap diff -Nru linux-4.19.98/include/uapi/linux/usb/charger.h linux-4.19.118/include/uapi/linux/usb/charger.h --- linux-4.19.98/include/uapi/linux/usb/charger.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/include/uapi/linux/usb/charger.h 2020-04-23 08:30:24.000000000 +0000 @@ -14,18 +14,18 @@ * ACA (Accessory Charger Adapters) */ enum usb_charger_type { - UNKNOWN_TYPE, - SDP_TYPE, - DCP_TYPE, - CDP_TYPE, - ACA_TYPE, + UNKNOWN_TYPE = 0, + SDP_TYPE = 1, + DCP_TYPE = 2, + CDP_TYPE = 3, + ACA_TYPE = 4, }; /* USB charger state */ enum usb_charger_state { - USB_CHARGER_DEFAULT, - USB_CHARGER_PRESENT, - USB_CHARGER_ABSENT, + USB_CHARGER_DEFAULT = 0, + USB_CHARGER_PRESENT = 1, + USB_CHARGER_ABSENT = 2, }; #endif /* _UAPI__LINUX_USB_CHARGER_H */ diff -Nru linux-4.19.98/ipc/msg.c linux-4.19.118/ipc/msg.c --- linux-4.19.98/ipc/msg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/ipc/msg.c 2020-04-23 08:30:24.000000000 +0000 @@ -377,7 +377,7 @@ * NOTE: no locks must be held, the rwsem is taken inside this function. */ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, - struct msqid64_ds *msqid64) + struct ipc64_perm *perm, int msg_qbytes) { struct kern_ipc_perm *ipcp; struct msg_queue *msq; @@ -387,7 +387,7 @@ rcu_read_lock(); ipcp = ipcctl_obtain_check(ns, &msg_ids(ns), msqid, cmd, - &msqid64->msg_perm, msqid64->msg_qbytes); + perm, msg_qbytes); if (IS_ERR(ipcp)) { err = PTR_ERR(ipcp); goto out_unlock1; @@ -409,18 +409,18 @@ { DEFINE_WAKE_Q(wake_q); - if (msqid64->msg_qbytes > ns->msg_ctlmnb && + if (msg_qbytes > ns->msg_ctlmnb && !capable(CAP_SYS_RESOURCE)) { err = -EPERM; goto out_unlock1; } ipc_lock_object(&msq->q_perm); - err = ipc_update_perm(&msqid64->msg_perm, ipcp); + err = ipc_update_perm(perm, ipcp); if (err) goto out_unlock0; - msq->q_qbytes = msqid64->msg_qbytes; + msq->q_qbytes = msg_qbytes; msq->q_ctime = ktime_get_real_seconds(); /* @@ -603,9 +603,10 @@ case IPC_SET: if (copy_msqid_from_user(&msqid64, buf, version)) return -EFAULT; - /* fallthru */ + return msgctl_down(ns, msqid, cmd, &msqid64.msg_perm, + msqid64.msg_qbytes); case IPC_RMID: - return msgctl_down(ns, msqid, cmd, &msqid64); + return msgctl_down(ns, msqid, cmd, NULL, 0); default: return -EINVAL; } @@ -724,9 +725,9 @@ case IPC_SET: if (copy_compat_msqid_from_user(&msqid64, uptr, version)) return -EFAULT; - /* fallthru */ + return msgctl_down(ns, msqid, cmd, &msqid64.msg_perm, msqid64.msg_qbytes); case IPC_RMID: - return msgctl_down(ns, msqid, cmd, &msqid64); + return msgctl_down(ns, msqid, cmd, NULL, 0); default: return -EINVAL; } diff -Nru linux-4.19.98/ipc/sem.c linux-4.19.118/ipc/sem.c --- linux-4.19.98/ipc/sem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/ipc/sem.c 2020-04-23 08:30:24.000000000 +0000 @@ -2345,11 +2345,9 @@ ipc_assert_locked_object(&sma->sem_perm); list_del(&un->list_id); - /* we are the last process using this ulp, acquiring ulp->lock - * isn't required. Besides that, we are also protected against - * IPC_RMID as we hold sma->sem_perm lock now - */ + spin_lock(&ulp->lock); list_del_rcu(&un->list_proc); + spin_unlock(&ulp->lock); /* perform adjustments registered in un */ for (i = 0; i < sma->sem_nsems; i++) { diff -Nru linux-4.19.98/kernel/audit.c linux-4.19.118/kernel/audit.c --- linux-4.19.98/kernel/audit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/audit.c 2020-04-23 08:30:24.000000000 +0000 @@ -1106,13 +1106,11 @@ audit_log_end(ab); } -static int audit_set_feature(struct sk_buff *skb) +static int audit_set_feature(struct audit_features *uaf) { - struct audit_features *uaf; int i; BUILD_BUG_ON(AUDIT_LAST_FEATURE + 1 > ARRAY_SIZE(audit_feature_names)); - uaf = nlmsg_data(nlmsg_hdr(skb)); /* if there is ever a version 2 we should handle that here */ @@ -1180,6 +1178,7 @@ { u32 seq; void *data; + int data_len; int err; struct audit_buffer *ab; u16 msg_type = nlh->nlmsg_type; @@ -1193,6 +1192,7 @@ seq = nlh->nlmsg_seq; data = nlmsg_data(nlh); + data_len = nlmsg_len(nlh); switch (msg_type) { case AUDIT_GET: { @@ -1216,7 +1216,7 @@ struct audit_status s; memset(&s, 0, sizeof(s)); /* guard against past and future API changes */ - memcpy(&s, data, min_t(size_t, sizeof(s), nlmsg_len(nlh))); + memcpy(&s, data, min_t(size_t, sizeof(s), data_len)); if (s.mask & AUDIT_STATUS_ENABLED) { err = audit_set_enabled(s.enabled); if (err < 0) @@ -1320,7 +1320,9 @@ return err; break; case AUDIT_SET_FEATURE: - err = audit_set_feature(skb); + if (data_len < sizeof(struct audit_features)) + return -EINVAL; + err = audit_set_feature(data); if (err) return err; break; @@ -1332,6 +1334,8 @@ err = audit_filter(msg_type, AUDIT_FILTER_USER); if (err == 1) { /* match or error */ + char *str = data; + err = 0; if (msg_type == AUDIT_USER_TTY) { err = tty_audit_push(); @@ -1339,26 +1343,24 @@ break; } audit_log_common_recv_msg(&ab, msg_type); - if (msg_type != AUDIT_USER_TTY) + if (msg_type != AUDIT_USER_TTY) { + /* ensure NULL termination */ + str[data_len - 1] = '\0'; audit_log_format(ab, " msg='%.*s'", AUDIT_MESSAGE_TEXT_MAX, - (char *)data); - else { - int size; - + str); + } else { audit_log_format(ab, " data="); - size = nlmsg_len(nlh); - if (size > 0 && - ((unsigned char *)data)[size - 1] == '\0') - size--; - audit_log_n_untrustedstring(ab, data, size); + if (data_len > 0 && str[data_len - 1] == '\0') + data_len--; + audit_log_n_untrustedstring(ab, str, data_len); } audit_log_end(ab); } break; case AUDIT_ADD_RULE: case AUDIT_DEL_RULE: - if (nlmsg_len(nlh) < sizeof(struct audit_rule_data)) + if (data_len < sizeof(struct audit_rule_data)) return -EINVAL; if (audit_enabled == AUDIT_LOCKED) { audit_log_common_recv_msg(&ab, AUDIT_CONFIG_CHANGE); @@ -1366,7 +1368,7 @@ audit_log_end(ab); return -EPERM; } - err = audit_rule_change(msg_type, seq, data, nlmsg_len(nlh)); + err = audit_rule_change(msg_type, seq, data, data_len); break; case AUDIT_LIST_RULES: err = audit_list_rules_send(skb, seq); @@ -1380,7 +1382,7 @@ case AUDIT_MAKE_EQUIV: { void *bufp = data; u32 sizes[2]; - size_t msglen = nlmsg_len(nlh); + size_t msglen = data_len; char *old, *new; err = -EINVAL; @@ -1456,7 +1458,7 @@ memset(&s, 0, sizeof(s)); /* guard against past and future API changes */ - memcpy(&s, data, min_t(size_t, sizeof(s), nlmsg_len(nlh))); + memcpy(&s, data, min_t(size_t, sizeof(s), data_len)); /* check if new data is valid */ if ((s.enabled != 0 && s.enabled != 1) || (s.log_passwd != 0 && s.log_passwd != 1)) diff -Nru linux-4.19.98/kernel/auditfilter.c linux-4.19.118/kernel/auditfilter.c --- linux-4.19.98/kernel/auditfilter.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/auditfilter.c 2020-04-23 08:30:24.000000000 +0000 @@ -452,6 +452,7 @@ bufp = data->buf; for (i = 0; i < data->field_count; i++) { struct audit_field *f = &entry->rule.fields[i]; + u32 f_val; err = -EINVAL; @@ -460,12 +461,12 @@ goto exit_free; f->type = data->fields[i]; - f->val = data->values[i]; + f_val = data->values[i]; /* Support legacy tests for a valid loginuid */ - if ((f->type == AUDIT_LOGINUID) && (f->val == AUDIT_UID_UNSET)) { + if ((f->type == AUDIT_LOGINUID) && (f_val == AUDIT_UID_UNSET)) { f->type = AUDIT_LOGINUID_SET; - f->val = 0; + f_val = 0; entry->rule.pflags |= AUDIT_LOGINUID_LEGACY; } @@ -481,7 +482,7 @@ case AUDIT_SUID: case AUDIT_FSUID: case AUDIT_OBJ_UID: - f->uid = make_kuid(current_user_ns(), f->val); + f->uid = make_kuid(current_user_ns(), f_val); if (!uid_valid(f->uid)) goto exit_free; break; @@ -490,11 +491,12 @@ case AUDIT_SGID: case AUDIT_FSGID: case AUDIT_OBJ_GID: - f->gid = make_kgid(current_user_ns(), f->val); + f->gid = make_kgid(current_user_ns(), f_val); if (!gid_valid(f->gid)) goto exit_free; break; case AUDIT_ARCH: + f->val = f_val; entry->rule.arch_f = f; break; case AUDIT_SUBJ_USER: @@ -507,11 +509,13 @@ case AUDIT_OBJ_TYPE: case AUDIT_OBJ_LEV_LOW: case AUDIT_OBJ_LEV_HIGH: - str = audit_unpack_string(&bufp, &remain, f->val); - if (IS_ERR(str)) + str = audit_unpack_string(&bufp, &remain, f_val); + if (IS_ERR(str)) { + err = PTR_ERR(str); goto exit_free; - entry->rule.buflen += f->val; - + } + entry->rule.buflen += f_val; + f->lsm_str = str; err = security_audit_rule_init(f->type, f->op, str, (void **)&f->lsm_rule); /* Keep currently invalid fields around in case they @@ -520,68 +524,71 @@ pr_warn("audit rule for LSM \'%s\' is invalid\n", str); err = 0; - } - if (err) { - kfree(str); + } else if (err) goto exit_free; - } else - f->lsm_str = str; break; case AUDIT_WATCH: - str = audit_unpack_string(&bufp, &remain, f->val); - if (IS_ERR(str)) + str = audit_unpack_string(&bufp, &remain, f_val); + if (IS_ERR(str)) { + err = PTR_ERR(str); goto exit_free; - entry->rule.buflen += f->val; - - err = audit_to_watch(&entry->rule, str, f->val, f->op); + } + err = audit_to_watch(&entry->rule, str, f_val, f->op); if (err) { kfree(str); goto exit_free; } + entry->rule.buflen += f_val; break; case AUDIT_DIR: - str = audit_unpack_string(&bufp, &remain, f->val); - if (IS_ERR(str)) + str = audit_unpack_string(&bufp, &remain, f_val); + if (IS_ERR(str)) { + err = PTR_ERR(str); goto exit_free; - entry->rule.buflen += f->val; - + } err = audit_make_tree(&entry->rule, str, f->op); kfree(str); if (err) goto exit_free; + entry->rule.buflen += f_val; break; case AUDIT_INODE: + f->val = f_val; err = audit_to_inode(&entry->rule, f); if (err) goto exit_free; break; case AUDIT_FILTERKEY: - if (entry->rule.filterkey || f->val > AUDIT_MAX_KEY_LEN) + if (entry->rule.filterkey || f_val > AUDIT_MAX_KEY_LEN) goto exit_free; - str = audit_unpack_string(&bufp, &remain, f->val); - if (IS_ERR(str)) + str = audit_unpack_string(&bufp, &remain, f_val); + if (IS_ERR(str)) { + err = PTR_ERR(str); goto exit_free; - entry->rule.buflen += f->val; + } + entry->rule.buflen += f_val; entry->rule.filterkey = str; break; case AUDIT_EXE: - if (entry->rule.exe || f->val > PATH_MAX) + if (entry->rule.exe || f_val > PATH_MAX) goto exit_free; - str = audit_unpack_string(&bufp, &remain, f->val); + str = audit_unpack_string(&bufp, &remain, f_val); if (IS_ERR(str)) { err = PTR_ERR(str); goto exit_free; } - entry->rule.buflen += f->val; - - audit_mark = audit_alloc_mark(&entry->rule, str, f->val); + audit_mark = audit_alloc_mark(&entry->rule, str, f_val); if (IS_ERR(audit_mark)) { kfree(str); err = PTR_ERR(audit_mark); goto exit_free; } + entry->rule.buflen += f_val; entry->rule.exe = audit_mark; break; + default: + f->val = f_val; + break; } } diff -Nru linux-4.19.98/kernel/bpf/btf.c linux-4.19.118/kernel/bpf/btf.c --- linux-4.19.98/kernel/bpf/btf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/bpf/btf.c 2020-04-23 08:30:24.000000000 +0000 @@ -1763,7 +1763,7 @@ struct_size = struct_type->size; bytes_offset = BITS_ROUNDDOWN_BYTES(struct_bits_off); - if (struct_size - bytes_offset < sizeof(int)) { + if (struct_size - bytes_offset < member_type->size) { btf_verifier_log_member(env, struct_type, member, "Member exceeds struct_size"); return -EINVAL; @@ -2387,7 +2387,7 @@ union bpf_attr __user *uattr) { struct bpf_btf_info __user *uinfo; - struct bpf_btf_info info = {}; + struct bpf_btf_info info; u32 info_copy, btf_copy; void __user *ubtf; u32 uinfo_len; @@ -2396,6 +2396,7 @@ uinfo_len = attr->info.info_len; info_copy = min_t(u32, uinfo_len, sizeof(info)); + memset(&info, 0, sizeof(info)); if (copy_from_user(&info, uinfo, info_copy)) return -EFAULT; diff -Nru linux-4.19.98/kernel/bpf/inode.c linux-4.19.118/kernel/bpf/inode.c --- linux-4.19.98/kernel/bpf/inode.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/bpf/inode.c 2020-04-23 08:30:24.000000000 +0000 @@ -198,6 +198,7 @@ void *key = map_iter(m)->key; void *prev_key; + (*pos)++; if (map_iter(m)->done) return NULL; @@ -210,8 +211,6 @@ map_iter(m)->done = true; return NULL; } - - ++(*pos); return key; } diff -Nru linux-4.19.98/kernel/bpf/offload.c linux-4.19.118/kernel/bpf/offload.c --- linux-4.19.98/kernel/bpf/offload.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/bpf/offload.c 2020-04-23 08:30:24.000000000 +0000 @@ -289,7 +289,7 @@ ulen = info->jited_prog_len; info->jited_prog_len = aux->offload->jited_len; - if (info->jited_prog_len & ulen) { + if (info->jited_prog_len && ulen) { uinsns = u64_to_user_ptr(info->jited_prog_insns); ulen = min_t(u32, info->jited_prog_len, ulen); if (copy_to_user(uinsns, aux->offload->jited_image, ulen)) { @@ -645,8 +645,10 @@ down_write(&bpf_devs_lock); if (!offdevs_inited) { err = rhashtable_init(&offdevs, &offdevs_params); - if (err) + if (err) { + up_write(&bpf_devs_lock); return ERR_PTR(err); + } offdevs_inited = true; } up_write(&bpf_devs_lock); diff -Nru linux-4.19.98/kernel/bpf/syscall.c linux-4.19.118/kernel/bpf/syscall.c --- linux-4.19.98/kernel/bpf/syscall.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/bpf/syscall.c 2020-04-23 08:30:24.000000000 +0000 @@ -1958,7 +1958,7 @@ union bpf_attr __user *uattr) { struct bpf_prog_info __user *uinfo = u64_to_user_ptr(attr->info.info); - struct bpf_prog_info info = {}; + struct bpf_prog_info info; u32 info_len = attr->info.info_len; char __user *uinsns; u32 ulen; @@ -1969,6 +1969,7 @@ return err; info_len = min_t(u32, sizeof(info), info_len); + memset(&info, 0, sizeof(info)); if (copy_from_user(&info, uinfo, info_len)) return -EFAULT; @@ -2136,7 +2137,7 @@ union bpf_attr __user *uattr) { struct bpf_map_info __user *uinfo = u64_to_user_ptr(attr->info.info); - struct bpf_map_info info = {}; + struct bpf_map_info info; u32 info_len = attr->info.info_len; int err; @@ -2145,6 +2146,7 @@ return err; info_len = min_t(u32, sizeof(info), info_len); + memset(&info, 0, sizeof(info)); info.type = map->map_type; info.id = map->id; info.key_size = map->key_size; @@ -2372,7 +2374,7 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, size) { - union bpf_attr attr = {}; + union bpf_attr attr; int err; if (sysctl_unprivileged_bpf_disabled && !capable(CAP_SYS_ADMIN)) @@ -2384,6 +2386,7 @@ size = min_t(u32, size, sizeof(attr)); /* copy attributes from user space, may be less than sizeof(bpf_attr) */ + memset(&attr, 0, sizeof(attr)); if (copy_from_user(&attr, uattr, size) != 0) return -EFAULT; diff -Nru linux-4.19.98/kernel/bpf/verifier.c linux-4.19.118/kernel/bpf/verifier.c --- linux-4.19.98/kernel/bpf/verifier.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/bpf/verifier.c 2020-04-23 08:30:24.000000000 +0000 @@ -188,8 +188,7 @@ bool pkt_access; int regno; int access_size; - s64 msize_smax_value; - u64 msize_umax_value; + u64 msize_max_value; }; static DEFINE_MUTEX(bpf_verifier_lock); @@ -1253,7 +1252,7 @@ char tn_buf[48]; tnum_strn(tn_buf, sizeof(tn_buf), reg->var_off); - verbose(env, "variable stack access var_off=%s off=%d size=%d", + verbose(env, "variable stack access var_off=%s off=%d size=%d\n", tn_buf, off, size); return -EACCES; } @@ -2076,8 +2075,7 @@ /* remember the mem_size which may be used later * to refine return values. */ - meta->msize_smax_value = reg->smax_value; - meta->msize_umax_value = reg->umax_value; + meta->msize_max_value = reg->umax_value; /* The register is SCALAR_VALUE; the access check * happens using its boundaries. @@ -2448,21 +2446,44 @@ return 0; } -static void do_refine_retval_range(struct bpf_reg_state *regs, int ret_type, - int func_id, - struct bpf_call_arg_meta *meta) +static int do_refine_retval_range(struct bpf_verifier_env *env, + struct bpf_reg_state *regs, int ret_type, + int func_id, struct bpf_call_arg_meta *meta) { struct bpf_reg_state *ret_reg = ®s[BPF_REG_0]; + struct bpf_reg_state tmp_reg = *ret_reg; + bool ret; if (ret_type != RET_INTEGER || (func_id != BPF_FUNC_get_stack && func_id != BPF_FUNC_probe_read_str)) - return; + return 0; + + /* Error case where ret is in interval [S32MIN, -1]. */ + ret_reg->smin_value = S32_MIN; + ret_reg->smax_value = -1; - ret_reg->smax_value = meta->msize_smax_value; - ret_reg->umax_value = meta->msize_umax_value; __reg_deduce_bounds(ret_reg); __reg_bound_offset(ret_reg); + __update_reg_bounds(ret_reg); + + ret = push_stack(env, env->insn_idx + 1, env->insn_idx, false); + if (!ret) + return -EFAULT; + + *ret_reg = tmp_reg; + + /* Success case where ret is in range [0, msize_max_value]. */ + ret_reg->smin_value = 0; + ret_reg->smax_value = meta->msize_max_value; + ret_reg->umin_value = ret_reg->smin_value; + ret_reg->umax_value = ret_reg->smax_value; + + __reg_deduce_bounds(ret_reg); + __reg_bound_offset(ret_reg); + __update_reg_bounds(ret_reg); + + return 0; } static int @@ -2617,7 +2638,9 @@ return -EINVAL; } - do_refine_retval_range(regs, fn->ret_type, func_id, &meta); + err = do_refine_retval_range(env, regs, fn->ret_type, func_id, &meta); + if (err) + return err; err = check_map_func_compatibility(env, meta.map_ptr, func_id); if (err) diff -Nru linux-4.19.98/kernel/cgroup/cgroup-v1.c linux-4.19.118/kernel/cgroup/cgroup-v1.c --- linux-4.19.98/kernel/cgroup/cgroup-v1.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/cgroup/cgroup-v1.c 2020-04-23 08:30:24.000000000 +0000 @@ -501,6 +501,7 @@ */ p++; if (p >= end) { + (*pos)++; return NULL; } else { *pos = *p; @@ -811,7 +812,7 @@ pathbuf = kmalloc(PATH_MAX, GFP_KERNEL); agentbuf = kstrdup(cgrp->root->release_agent_path, GFP_KERNEL); - if (!pathbuf || !agentbuf) + if (!pathbuf || !agentbuf || !strlen(agentbuf)) goto out; spin_lock_irq(&css_set_lock); diff -Nru linux-4.19.98/kernel/cgroup/cgroup.c linux-4.19.118/kernel/cgroup/cgroup.c --- linux-4.19.98/kernel/cgroup/cgroup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/cgroup/cgroup.c 2020-04-23 08:30:24.000000000 +0000 @@ -2940,8 +2940,6 @@ for_each_subsys(ss, ssid) { struct cgroup_subsys_state *css = cgroup_css(dsct, ss); - WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); - if (!(cgroup_ss_mask(dsct) & (1 << ss->id))) continue; @@ -2951,6 +2949,8 @@ return PTR_ERR(css); } + WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); + if (css_visible(css)) { ret = css_populate_dir(css); if (ret) @@ -2986,11 +2986,11 @@ for_each_subsys(ss, ssid) { struct cgroup_subsys_state *css = cgroup_css(dsct, ss); - WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt)); - if (!css) continue; + WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt)); + if (css->parent && !(cgroup_ss_mask(dsct) & (1 << ss->id))) { kill_css(css); @@ -3277,7 +3277,8 @@ if (strcmp(strstrip(buf), "threaded")) return -EINVAL; - cgrp = cgroup_kn_lock_live(of->kn, false); + /* drain dying csses before we re-apply (threaded) subtree control */ + cgrp = cgroup_kn_lock_live(of->kn, true); if (!cgrp) return -ENOENT; @@ -4156,12 +4157,16 @@ } } while (!css_set_populated(cset) && list_empty(&cset->dying_tasks)); - if (!list_empty(&cset->tasks)) + if (!list_empty(&cset->tasks)) { it->task_pos = cset->tasks.next; - else if (!list_empty(&cset->mg_tasks)) + it->cur_tasks_head = &cset->tasks; + } else if (!list_empty(&cset->mg_tasks)) { it->task_pos = cset->mg_tasks.next; - else + it->cur_tasks_head = &cset->mg_tasks; + } else { it->task_pos = cset->dying_tasks.next; + it->cur_tasks_head = &cset->dying_tasks; + } it->tasks_head = &cset->tasks; it->mg_tasks_head = &cset->mg_tasks; @@ -4219,10 +4224,14 @@ else it->task_pos = it->task_pos->next; - if (it->task_pos == it->tasks_head) + if (it->task_pos == it->tasks_head) { it->task_pos = it->mg_tasks_head->next; - if (it->task_pos == it->mg_tasks_head) + it->cur_tasks_head = it->mg_tasks_head; + } + if (it->task_pos == it->mg_tasks_head) { it->task_pos = it->dying_tasks_head->next; + it->cur_tasks_head = it->dying_tasks_head; + } if (it->task_pos == it->dying_tasks_head) css_task_iter_advance_css_set(it); } else { @@ -4241,11 +4250,12 @@ goto repeat; /* and dying leaders w/o live member threads */ - if (!atomic_read(&task->signal->live)) + if (it->cur_tasks_head == it->dying_tasks_head && + !atomic_read(&task->signal->live)) goto repeat; } else { /* skip all dying ones */ - if (task->flags & PF_EXITING) + if (it->cur_tasks_head == it->dying_tasks_head) goto repeat; } } @@ -4354,6 +4364,9 @@ struct kernfs_open_file *of = s->private; struct css_task_iter *it = of->priv; + if (pos) + (*pos)++; + return css_task_iter_next(it); } @@ -4369,7 +4382,7 @@ * from position 0, so we can simply keep iterating on !0 *pos. */ if (!it) { - if (WARN_ON_ONCE((*pos)++)) + if (WARN_ON_ONCE((*pos))) return ERR_PTR(-EINVAL); it = kzalloc(sizeof(*it), GFP_KERNEL); @@ -4377,10 +4390,11 @@ return ERR_PTR(-ENOMEM); of->priv = it; css_task_iter_start(&cgrp->self, iter_flags, it); - } else if (!(*pos)++) { + } else if (!(*pos)) { css_task_iter_end(it); css_task_iter_start(&cgrp->self, iter_flags, it); - } + } else + return it->cur_task; return cgroup_procs_next(s, NULL, NULL); } @@ -5928,6 +5942,10 @@ return; } + /* Don't associate the sock with unrelated interrupted task's cgroup. */ + if (in_interrupt()) + return; + rcu_read_lock(); while (true) { diff -Nru linux-4.19.98/kernel/cpu.c linux-4.19.118/kernel/cpu.c --- linux-4.19.98/kernel/cpu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/cpu.c 2020-04-23 08:30:24.000000000 +0000 @@ -493,8 +493,7 @@ if (WARN_ON_ONCE((!cpu_online(cpu)))) return -ECANCELED; - /* Unpark the stopper thread and the hotplug thread of the target cpu */ - stop_machine_unpark(cpu); + /* Unpark the hotplug thread of the target cpu */ kthread_unpark(st->thread); /* @@ -1048,8 +1047,8 @@ /* * Called from the idle task. Wake up the controlling task which brings the - * stopper and the hotplug thread of the upcoming CPU up and then delegates - * the rest of the online bringup to the hotplug thread. + * hotplug thread of the upcoming CPU up and then delegates the rest of the + * online bringup to the hotplug thread. */ void cpuhp_online_idle(enum cpuhp_state state) { @@ -1059,6 +1058,12 @@ if (state != CPUHP_AP_ONLINE_IDLE) return; + /* + * Unpart the stopper thread before we start the idle loop (and start + * scheduling); this ensures the stopper task is always available. + */ + stop_machine_unpark(smp_processor_id()); + st->state = CPUHP_AP_ONLINE_IDLE; complete_ap_thread(st, true); } @@ -2065,10 +2070,8 @@ */ cpuhp_offline_cpu_device(cpu); } - if (!ret) { + if (!ret) cpu_smt_control = ctrlval; - arch_smt_update(); - } cpu_maps_update_done(); return ret; } @@ -2079,7 +2082,6 @@ cpu_maps_update_begin(); cpu_smt_control = CPU_SMT_ENABLED; - arch_smt_update(); for_each_present_cpu(cpu) { /* Skip online CPUs and CPUs on offline nodes */ if (cpu_online(cpu) || !node_online(cpu_to_node(cpu))) diff -Nru linux-4.19.98/kernel/debug/kdb/kdb_main.c linux-4.19.118/kernel/debug/kdb/kdb_main.c --- linux-4.19.98/kernel/debug/kdb/kdb_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/debug/kdb/kdb_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -2604,7 +2604,7 @@ diag = kdbgetularg(argv[3], &whichcpu); if (diag) return diag; - if (!cpu_online(whichcpu)) { + if (whichcpu >= nr_cpu_ids || !cpu_online(whichcpu)) { kdb_printf("cpu %ld is not online\n", whichcpu); return KDB_BADCPUNUM; } diff -Nru linux-4.19.98/kernel/events/core.c linux-4.19.118/kernel/events/core.c --- linux-4.19.98/kernel/events/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/events/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -1254,6 +1254,7 @@ * perf_event_context::lock * perf_event::mmap_mutex * mmap_sem + * perf_addr_filters_head::lock * * cpu_hotplug_lock * pmus_lock @@ -2803,7 +2804,7 @@ * * (p1) when userspace mappings change as a result of (1) or (2) or (3) below, * we update the addresses of corresponding vmas in - * event::addr_filters_offs array and bump the event::addr_filters_gen; + * event::addr_filter_ranges array and bump the event::addr_filters_gen; * (p2) when an event is scheduled in (pmu::add), it calls * perf_event_addr_filters_sync() which calls pmu::addr_filters_sync() * if the generation has changed since the previous call. @@ -4447,7 +4448,7 @@ perf_event_free_bpf_prog(event); perf_addr_filters_splice(event, NULL); - kfree(event->addr_filters_offs); + kfree(event->addr_filter_ranges); if (event->destroy) event->destroy(event); @@ -5011,6 +5012,9 @@ if (perf_event_check_period(event, value)) return -EINVAL; + if (!event->attr.freq && (value & (1ULL << 63))) + return -EINVAL; + event_function_call(event, __perf_event_period, &value); return 0; @@ -5705,7 +5709,15 @@ */ user_lock_limit *= num_online_cpus(); - user_locked = atomic_long_read(&user->locked_vm) + user_extra; + user_locked = atomic_long_read(&user->locked_vm); + + /* + * sysctl_perf_event_mlock may have changed, so that + * user->locked_vm > user_lock_limit + */ + if (user_locked > user_lock_limit) + user_locked = user_lock_limit; + user_locked += user_extra; if (user_locked > user_lock_limit) extra = user_locked - user_lock_limit; @@ -6742,7 +6754,8 @@ raw_spin_lock_irqsave(&ifh->lock, flags); list_for_each_entry(filter, &ifh->list, entry) { if (filter->path.dentry) { - event->addr_filters_offs[count] = 0; + event->addr_filter_ranges[count].start = 0; + event->addr_filter_ranges[count].size = 0; restart++; } @@ -7424,28 +7437,47 @@ return true; } +static bool perf_addr_filter_vma_adjust(struct perf_addr_filter *filter, + struct vm_area_struct *vma, + struct perf_addr_filter_range *fr) +{ + unsigned long vma_size = vma->vm_end - vma->vm_start; + unsigned long off = vma->vm_pgoff << PAGE_SHIFT; + struct file *file = vma->vm_file; + + if (!perf_addr_filter_match(filter, file, off, vma_size)) + return false; + + if (filter->offset < off) { + fr->start = vma->vm_start; + fr->size = min(vma_size, filter->size - (off - filter->offset)); + } else { + fr->start = vma->vm_start + filter->offset - off; + fr->size = min(vma->vm_end - fr->start, filter->size); + } + + return true; +} + static void __perf_addr_filters_adjust(struct perf_event *event, void *data) { struct perf_addr_filters_head *ifh = perf_event_addr_filters(event); struct vm_area_struct *vma = data; - unsigned long off = vma->vm_pgoff << PAGE_SHIFT, flags; - struct file *file = vma->vm_file; struct perf_addr_filter *filter; unsigned int restart = 0, count = 0; + unsigned long flags; if (!has_addr_filter(event)) return; - if (!file) + if (!vma->vm_file) return; raw_spin_lock_irqsave(&ifh->lock, flags); list_for_each_entry(filter, &ifh->list, entry) { - if (perf_addr_filter_match(filter, file, off, - vma->vm_end - vma->vm_start)) { - event->addr_filters_offs[count] = vma->vm_start; + if (perf_addr_filter_vma_adjust(filter, vma, + &event->addr_filter_ranges[count])) restart++; - } count++; } @@ -8805,26 +8837,19 @@ * @filter; if so, adjust filter's address range. * Called with mm::mmap_sem down for reading. */ -static unsigned long perf_addr_filter_apply(struct perf_addr_filter *filter, - struct mm_struct *mm) +static void perf_addr_filter_apply(struct perf_addr_filter *filter, + struct mm_struct *mm, + struct perf_addr_filter_range *fr) { struct vm_area_struct *vma; for (vma = mm->mmap; vma; vma = vma->vm_next) { - struct file *file = vma->vm_file; - unsigned long off = vma->vm_pgoff << PAGE_SHIFT; - unsigned long vma_size = vma->vm_end - vma->vm_start; - - if (!file) + if (!vma->vm_file) continue; - if (!perf_addr_filter_match(filter, file, off, vma_size)) - continue; - - return vma->vm_start; + if (perf_addr_filter_vma_adjust(filter, vma, fr)) + return; } - - return 0; } /* @@ -8847,26 +8872,29 @@ if (task == TASK_TOMBSTONE) return; - if (!ifh->nr_file_filters) - return; - - mm = get_task_mm(event->ctx->task); - if (!mm) - goto restart; + if (ifh->nr_file_filters) { + mm = get_task_mm(event->ctx->task); + if (!mm) + goto restart; - down_read(&mm->mmap_sem); + down_read(&mm->mmap_sem); + } raw_spin_lock_irqsave(&ifh->lock, flags); list_for_each_entry(filter, &ifh->list, entry) { - event->addr_filters_offs[count] = 0; + if (filter->path.dentry) { + /* + * Adjust base offset if the filter is associated to a + * binary that needs to be mapped: + */ + event->addr_filter_ranges[count].start = 0; + event->addr_filter_ranges[count].size = 0; - /* - * Adjust base offset if the filter is associated to a binary - * that needs to be mapped: - */ - if (filter->path.dentry) - event->addr_filters_offs[count] = - perf_addr_filter_apply(filter, mm); + perf_addr_filter_apply(filter, mm, &event->addr_filter_ranges[count]); + } else { + event->addr_filter_ranges[count].start = filter->offset; + event->addr_filter_ranges[count].size = filter->size; + } count++; } @@ -8874,9 +8902,11 @@ event->addr_filters_gen++; raw_spin_unlock_irqrestore(&ifh->lock, flags); - up_read(&mm->mmap_sem); + if (ifh->nr_file_filters) { + up_read(&mm->mmap_sem); - mmput(mm); + mmput(mm); + } restart: perf_event_stop(event, 1); @@ -10128,14 +10158,28 @@ goto err_pmu; if (has_addr_filter(event)) { - event->addr_filters_offs = kcalloc(pmu->nr_addr_filters, - sizeof(unsigned long), - GFP_KERNEL); - if (!event->addr_filters_offs) { + event->addr_filter_ranges = kcalloc(pmu->nr_addr_filters, + sizeof(struct perf_addr_filter_range), + GFP_KERNEL); + if (!event->addr_filter_ranges) { err = -ENOMEM; goto err_per_task; } + /* + * Clone the parent's vma offsets: they are valid until exec() + * even if the mm is not shared with the parent. + */ + if (event->parent) { + struct perf_addr_filters_head *ifh = perf_event_addr_filters(event); + + raw_spin_lock_irq(&ifh->lock); + memcpy(event->addr_filter_ranges, + event->parent->addr_filter_ranges, + pmu->nr_addr_filters * sizeof(struct perf_addr_filter_range)); + raw_spin_unlock_irq(&ifh->lock); + } + /* force hw sync on the address filters */ event->addr_filters_gen = 1; } @@ -10154,7 +10198,7 @@ return event; err_addr_filters: - kfree(event->addr_filters_offs); + kfree(event->addr_filter_ranges); err_per_task: exclusive_event_destroy(event); diff -Nru linux-4.19.98/kernel/fork.c linux-4.19.118/kernel/fork.c --- linux-4.19.98/kernel/fork.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/fork.c 2020-04-23 08:30:24.000000000 +0000 @@ -216,6 +216,7 @@ memset(s->addr, 0, THREAD_SIZE); tsk->stack_vm_area = s; + tsk->stack = s->addr; return s->addr; } @@ -230,14 +231,20 @@ * free_thread_stack() can be called in interrupt context, * so cache the vm_struct. */ - if (stack) + if (stack) { tsk->stack_vm_area = find_vm_area(stack); + tsk->stack = stack; + } return stack; #else struct page *page = alloc_pages_node(node, THREADINFO_GFP, THREAD_SIZE_ORDER); - return page ? page_address(page) : NULL; + if (likely(page)) { + tsk->stack = page_address(page); + return tsk->stack; + } + return NULL; #endif } @@ -268,7 +275,10 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node) { - return kmem_cache_alloc_node(thread_stack_cache, THREADINFO_GFP, node); + unsigned long *stack; + stack = kmem_cache_alloc_node(thread_stack_cache, THREADINFO_GFP, node); + tsk->stack = stack; + return stack; } static void free_thread_stack(struct task_struct *tsk) diff -Nru linux-4.19.98/kernel/futex.c linux-4.19.118/kernel/futex.c --- linux-4.19.98/kernel/futex.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/futex.c 2020-04-23 08:30:24.000000000 +0000 @@ -395,9 +395,9 @@ */ static struct futex_hash_bucket *hash_futex(union futex_key *key) { - u32 hash = jhash2((u32*)&key->both.word, - (sizeof(key->both.word)+sizeof(key->both.ptr))/4, + u32 hash = jhash2((u32 *)key, offsetof(typeof(*key), both.offset) / 4, key->both.offset); + return &futex_queues[hash & (futex_hashsize - 1)]; } @@ -439,7 +439,7 @@ switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { case FUT_OFF_INODE: - ihold(key->shared.inode); /* implies smp_mb(); (B) */ + smp_mb(); /* explicit smp_mb(); (B) */ break; case FUT_OFF_MMSHARED: futex_get_mm(key); /* implies smp_mb(); (B) */ @@ -473,7 +473,6 @@ switch (key->both.offset & (FUT_OFF_INODE|FUT_OFF_MMSHARED)) { case FUT_OFF_INODE: - iput(key->shared.inode); break; case FUT_OFF_MMSHARED: mmdrop(key->private.mm); @@ -481,6 +480,46 @@ } } +/* + * Generate a machine wide unique identifier for this inode. + * + * This relies on u64 not wrapping in the life-time of the machine; which with + * 1ns resolution means almost 585 years. + * + * This further relies on the fact that a well formed program will not unmap + * the file while it has a (shared) futex waiting on it. This mapping will have + * a file reference which pins the mount and inode. + * + * If for some reason an inode gets evicted and read back in again, it will get + * a new sequence number and will _NOT_ match, even though it is the exact same + * file. + * + * It is important that match_futex() will never have a false-positive, esp. + * for PI futexes that can mess up the state. The above argues that false-negatives + * are only possible for malformed programs. + */ +static u64 get_inode_sequence_number(struct inode *inode) +{ + static atomic64_t i_seq; + u64 old; + + /* Does the inode already have a sequence number? */ + old = atomic64_read(&inode->i_sequence); + if (likely(old)) + return old; + + for (;;) { + u64 new = atomic64_add_return(1, &i_seq); + if (WARN_ON_ONCE(!new)) + continue; + + old = atomic64_cmpxchg_relaxed(&inode->i_sequence, 0, new); + if (old) + return old; + return new; + } +} + /** * get_futex_key() - Get parameters which are the keys for a futex * @uaddr: virtual address of the futex @@ -493,9 +532,15 @@ * * The key words are stored in @key on success. * - * For shared mappings, it's (page->index, file_inode(vma->vm_file), - * offset_within_page). For private mappings, it's (uaddr, current->mm). - * We can usually work out the index without swapping in the page. + * For shared mappings (when @fshared), the key is: + * ( inode->i_sequence, page->index, offset_within_page ) + * [ also see get_inode_sequence_number() ] + * + * For private mappings (or when !@fshared), the key is: + * ( current->mm, address, 0 ) + * + * This allows (cross process, where applicable) identification of the futex + * without keeping the page pinned for the duration of the FUTEX_WAIT. * * lock_page() might sleep, the caller should not hold a spinlock. */ @@ -635,8 +680,6 @@ key->private.mm = mm; key->private.address = address; - get_futex_key_refs(key); /* implies smp_mb(); (B) */ - } else { struct inode *inode; @@ -668,40 +711,14 @@ goto again; } - /* - * Take a reference unless it is about to be freed. Previously - * this reference was taken by ihold under the page lock - * pinning the inode in place so i_lock was unnecessary. The - * only way for this check to fail is if the inode was - * truncated in parallel which is almost certainly an - * application bug. In such a case, just retry. - * - * We are not calling into get_futex_key_refs() in file-backed - * cases, therefore a successful atomic_inc return below will - * guarantee that get_futex_key() will still imply smp_mb(); (B). - */ - if (!atomic_inc_not_zero(&inode->i_count)) { - rcu_read_unlock(); - put_page(page); - - goto again; - } - - /* Should be impossible but lets be paranoid for now */ - if (WARN_ON_ONCE(inode->i_mapping != mapping)) { - err = -EFAULT; - rcu_read_unlock(); - iput(inode); - - goto out; - } - key->both.offset |= FUT_OFF_INODE; /* inode-based key */ - key->shared.inode = inode; + key->shared.i_seq = get_inode_sequence_number(inode); key->shared.pgoff = basepage_index(tail); rcu_read_unlock(); } + get_futex_key_refs(key); /* implies smp_mb(); (B) */ + out: put_page(page); return err; diff -Nru linux-4.19.98/kernel/irq/debugfs.c linux-4.19.118/kernel/irq/debugfs.c --- linux-4.19.98/kernel/irq/debugfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/irq/debugfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -113,6 +113,7 @@ BIT_MASK_DESCR(IRQD_AFFINITY_MANAGED), BIT_MASK_DESCR(IRQD_MANAGED_SHUTDOWN), BIT_MASK_DESCR(IRQD_CAN_RESERVE), + BIT_MASK_DESCR(IRQD_MSI_NOMASK_QUIRK), BIT_MASK_DESCR(IRQD_FORWARDED_TO_VCPU), diff -Nru linux-4.19.98/kernel/irq/internals.h linux-4.19.118/kernel/irq/internals.h --- linux-4.19.98/kernel/irq/internals.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/irq/internals.h 2020-04-23 08:30:24.000000000 +0000 @@ -126,8 +126,6 @@ extern bool irq_can_set_affinity_usr(unsigned int irq); -extern int irq_select_affinity_usr(unsigned int irq); - extern void irq_set_thread_affinity(struct irq_desc *desc); extern int irq_do_set_affinity(struct irq_data *data, diff -Nru linux-4.19.98/kernel/irq/irqdomain.c linux-4.19.118/kernel/irq/irqdomain.c --- linux-4.19.98/kernel/irq/irqdomain.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/irq/irqdomain.c 2020-04-23 08:30:24.000000000 +0000 @@ -148,6 +148,7 @@ switch (fwid->type) { case IRQCHIP_FWNODE_NAMED: case IRQCHIP_FWNODE_NAMED_ID: + domain->fwnode = fwnode; domain->name = kstrdup(fwid->name, GFP_KERNEL); if (!domain->name) { kfree(domain); @@ -183,7 +184,7 @@ * unhappy about. Replace them with ':', which does * the trick and is not as offensive as '\'... */ - name = kstrdup(of_node_full_name(of_node), GFP_KERNEL); + name = kasprintf(GFP_KERNEL, "%pOF", of_node); if (!name) { kfree(domain); return NULL; @@ -1254,6 +1255,11 @@ unsigned int irq_base, unsigned int nr_irqs, void *arg) { + if (!domain->ops->alloc) { + pr_debug("domain->ops->alloc() is NULL\n"); + return -ENOSYS; + } + return domain->ops->alloc(domain, irq_base, nr_irqs, arg); } @@ -1291,11 +1297,6 @@ return -EINVAL; } - if (!domain->ops->alloc) { - pr_debug("domain->ops->alloc() is NULL\n"); - return -ENOSYS; - } - if (realloc && irq_base >= 0) { virq = irq_base; } else { @@ -1420,6 +1421,7 @@ if (rv) { /* Restore the original irq_data. */ *root_irq_data = *child_irq_data; + kfree(child_irq_data); goto error; } diff -Nru linux-4.19.98/kernel/irq/manage.c linux-4.19.118/kernel/irq/manage.c --- linux-4.19.98/kernel/irq/manage.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/irq/manage.c 2020-04-23 08:30:24.000000000 +0000 @@ -283,7 +283,11 @@ if (desc->affinity_notify) { kref_get(&desc->affinity_notify->kref); - schedule_work(&desc->affinity_notify->work); + if (!schedule_work(&desc->affinity_notify->work)) { + /* Work was already scheduled, drop our extra ref */ + kref_put(&desc->affinity_notify->kref, + desc->affinity_notify->release); + } } irqd_set(data, IRQD_AFFINITY_SET); @@ -383,7 +387,10 @@ raw_spin_unlock_irqrestore(&desc->lock, flags); if (old_notify) { - cancel_work_sync(&old_notify->work); + if (cancel_work_sync(&old_notify->work)) { + /* Pending work had a ref, put that one too */ + kref_put(&old_notify->kref, old_notify->release); + } kref_put(&old_notify->kref, old_notify->release); } @@ -441,23 +448,9 @@ { return irq_select_affinity(irq_desc_get_irq(desc)); } -#endif +#endif /* CONFIG_AUTO_IRQ_AFFINITY */ +#endif /* CONFIG_SMP */ -/* - * Called when a bogus affinity is set via /proc/irq - */ -int irq_select_affinity_usr(unsigned int irq) -{ - struct irq_desc *desc = irq_to_desc(irq); - unsigned long flags; - int ret; - - raw_spin_lock_irqsave(&desc->lock, flags); - ret = irq_setup_affinity(desc); - raw_spin_unlock_irqrestore(&desc->lock, flags); - return ret; -} -#endif /** * irq_set_vcpu_affinity - Set vcpu affinity for the interrupt diff -Nru linux-4.19.98/kernel/irq/msi.c linux-4.19.118/kernel/irq/msi.c --- linux-4.19.98/kernel/irq/msi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/irq/msi.c 2020-04-23 08:30:24.000000000 +0000 @@ -453,8 +453,11 @@ continue; irq_data = irq_domain_get_irq_data(domain, desc->irq); - if (!can_reserve) + if (!can_reserve) { irqd_clr_can_reserve(irq_data); + if (domain->flags & IRQ_DOMAIN_MSI_NOMASK_QUIRK) + irqd_set_msi_nomask_quirk(irq_data); + } ret = irq_domain_activate_irq(irq_data, can_reserve); if (ret) goto cleanup; diff -Nru linux-4.19.98/kernel/irq/proc.c linux-4.19.118/kernel/irq/proc.c --- linux-4.19.98/kernel/irq/proc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/irq/proc.c 2020-04-23 08:30:24.000000000 +0000 @@ -115,6 +115,28 @@ return show_irq_affinity(AFFINITY_LIST, m); } +#ifndef CONFIG_AUTO_IRQ_AFFINITY +static inline int irq_select_affinity_usr(unsigned int irq) +{ + /* + * If the interrupt is started up already then this fails. The + * interrupt is assigned to an online CPU already. There is no + * point to move it around randomly. Tell user space that the + * selected mask is bogus. + * + * If not then any change to the affinity is pointless because the + * startup code invokes irq_setup_affinity() which will select + * a online CPU anyway. + */ + return -EINVAL; +} +#else +/* ALPHA magic affinity auto selector. Keep it for historical reasons. */ +static inline int irq_select_affinity_usr(unsigned int irq) +{ + return irq_select_affinity(irq); +} +#endif static ssize_t write_irq_affinity(int type, struct file *file, const char __user *buffer, size_t count, loff_t *pos) diff -Nru linux-4.19.98/kernel/kmod.c linux-4.19.118/kernel/kmod.c --- linux-4.19.98/kernel/kmod.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/kmod.c 2020-04-23 08:30:24.000000000 +0000 @@ -120,7 +120,7 @@ * invoke it. * * If module auto-loading support is disabled then this function - * becomes a no-operation. + * simply returns -ENOENT. */ int __request_module(bool wait, const char *fmt, ...) { @@ -137,7 +137,7 @@ WARN_ON_ONCE(wait && current_is_async()); if (!modprobe_path[0]) - return 0; + return -ENOENT; va_start(args, fmt); ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args); diff -Nru linux-4.19.98/kernel/kprobes.c linux-4.19.118/kernel/kprobes.c --- linux-4.19.98/kernel/kprobes.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/kprobes.c 2020-04-23 08:30:24.000000000 +0000 @@ -523,6 +523,8 @@ arch_unoptimize_kprobes(&unoptimizing_list, &freeing_list); /* Loop free_list for disarming */ list_for_each_entry_safe(op, tmp, &freeing_list, list) { + /* Switching from detour code to origin */ + op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; /* Disarm probes if marked disabled */ if (kprobe_disabled(&op->kp)) arch_disarm_kprobe(&op->kp); @@ -623,6 +625,18 @@ mutex_unlock(&kprobe_mutex); } +static bool optprobe_queued_unopt(struct optimized_kprobe *op) +{ + struct optimized_kprobe *_op; + + list_for_each_entry(_op, &unoptimizing_list, list) { + if (op == _op) + return true; + } + + return false; +} + /* Optimize kprobe if p is ready to be optimized */ static void optimize_kprobe(struct kprobe *p) { @@ -644,17 +658,21 @@ return; /* Check if it is already optimized. */ - if (op->kp.flags & KPROBE_FLAG_OPTIMIZED) + if (op->kp.flags & KPROBE_FLAG_OPTIMIZED) { + if (optprobe_queued_unopt(op)) { + /* This is under unoptimizing. Just dequeue the probe */ + list_del_init(&op->list); + } return; + } op->kp.flags |= KPROBE_FLAG_OPTIMIZED; - if (!list_empty(&op->list)) - /* This is under unoptimizing. Just dequeue the probe */ - list_del_init(&op->list); - else { - list_add(&op->list, &optimizing_list); - kick_kprobe_optimizer(); - } + /* On unoptimizing/optimizing_list, op must have OPTIMIZED flag */ + if (WARN_ON_ONCE(!list_empty(&op->list))) + return; + + list_add(&op->list, &optimizing_list); + kick_kprobe_optimizer(); } /* Short cut to direct unoptimizing */ @@ -662,6 +680,7 @@ { lockdep_assert_cpus_held(); arch_unoptimize_kprobe(op); + op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; if (kprobe_disabled(&op->kp)) arch_disarm_kprobe(&op->kp); } @@ -675,31 +694,33 @@ return; /* This is not an optprobe nor optimized */ op = container_of(p, struct optimized_kprobe, kp); - if (!kprobe_optimized(p)) { - /* Unoptimized or unoptimizing case */ - if (force && !list_empty(&op->list)) { - /* - * Only if this is unoptimizing kprobe and forced, - * forcibly unoptimize it. (No need to unoptimize - * unoptimized kprobe again :) - */ - list_del_init(&op->list); - force_unoptimize_kprobe(op); - } + if (!kprobe_optimized(p)) return; - } - op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; if (!list_empty(&op->list)) { - /* Dequeue from the optimization queue */ - list_del_init(&op->list); + if (optprobe_queued_unopt(op)) { + /* Queued in unoptimizing queue */ + if (force) { + /* + * Forcibly unoptimize the kprobe here, and queue it + * in the freeing list for release afterwards. + */ + force_unoptimize_kprobe(op); + list_move(&op->list, &freeing_list); + } + } else { + /* Dequeue from the optimizing queue */ + list_del_init(&op->list); + op->kp.flags &= ~KPROBE_FLAG_OPTIMIZED; + } return; } + /* Optimized kprobe case */ - if (force) + if (force) { /* Forcibly update the code: this is a special case */ force_unoptimize_kprobe(op); - else { + } else { list_add(&op->list, &unoptimizing_list); kick_kprobe_optimizer(); } diff -Nru linux-4.19.98/kernel/locking/lockdep.c linux-4.19.118/kernel/locking/lockdep.c --- linux-4.19.98/kernel/locking/lockdep.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/locking/lockdep.c 2020-04-23 08:30:24.000000000 +0000 @@ -1260,9 +1260,11 @@ this.class = class; raw_local_irq_save(flags); + current->lockdep_recursion = 1; arch_spin_lock(&lockdep_lock); ret = __lockdep_count_forward_deps(&this); arch_spin_unlock(&lockdep_lock); + current->lockdep_recursion = 0; raw_local_irq_restore(flags); return ret; @@ -1287,9 +1289,11 @@ this.class = class; raw_local_irq_save(flags); + current->lockdep_recursion = 1; arch_spin_lock(&lockdep_lock); ret = __lockdep_count_backward_deps(&this); arch_spin_unlock(&lockdep_lock); + current->lockdep_recursion = 0; raw_local_irq_restore(flags); return ret; diff -Nru linux-4.19.98/kernel/locking/locktorture.c linux-4.19.118/kernel/locking/locktorture.c --- linux-4.19.98/kernel/locking/locktorture.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/locking/locktorture.c 2020-04-23 08:30:24.000000000 +0000 @@ -710,10 +710,10 @@ if (statp[i].n_lock_fail) fail = true; sum += statp[i].n_lock_acquired; - if (max < statp[i].n_lock_fail) - max = statp[i].n_lock_fail; - if (min > statp[i].n_lock_fail) - min = statp[i].n_lock_fail; + if (max < statp[i].n_lock_acquired) + max = statp[i].n_lock_acquired; + if (min > statp[i].n_lock_acquired) + min = statp[i].n_lock_acquired; } page += sprintf(page, "%s: Total: %lld Max/Min: %ld/%ld %s Fail: %d %s\n", diff -Nru linux-4.19.98/kernel/memremap.c linux-4.19.118/kernel/memremap.c --- linux-4.19.98/kernel/memremap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/memremap.c 2020-04-23 08:30:24.000000000 +0000 @@ -120,7 +120,9 @@ struct device *dev = pgmap->dev; struct resource *res = &pgmap->res; resource_size_t align_start, align_size; + struct page *first_page; unsigned long pfn; + int nid; pgmap->kill(pgmap->ref); for_each_device_pfn(pfn, pgmap) @@ -131,13 +133,17 @@ align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) - align_start; + /* make sure to access a memmap that was actually initialized */ + first_page = pfn_to_page(pfn_first(pgmap)); + + nid = page_to_nid(first_page); + mem_hotplug_begin(); if (pgmap->type == MEMORY_DEVICE_PRIVATE) { pfn = align_start >> PAGE_SHIFT; - __remove_pages(page_zone(pfn_to_page(pfn)), pfn, - align_size >> PAGE_SHIFT, NULL); + __remove_pages(pfn, align_size >> PAGE_SHIFT, NULL); } else { - arch_remove_memory(align_start, align_size, + arch_remove_memory(nid, align_start, align_size, pgmap->altmap_valid ? &pgmap->altmap : NULL); kasan_remove_zero_shadow(__va(align_start), align_size); } diff -Nru linux-4.19.98/kernel/module.c linux-4.19.118/kernel/module.c --- linux-4.19.98/kernel/module.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/module.c 2020-04-23 08:30:24.000000000 +0000 @@ -1729,6 +1729,8 @@ error_out: if (i > 0) module_remove_modinfo_attrs(mod, --i); + else + kfree(mod->modinfo_attrs); return error; } @@ -2978,9 +2980,7 @@ /* Try to find a name early so we can log errors with a module name */ info->index.info = find_sec(info, ".modinfo"); - if (!info->index.info) - info->name = "(missing .modinfo section)"; - else + if (info->index.info) info->name = get_modinfo(info, "name"); /* Find internal symbols and strings. */ @@ -2995,14 +2995,15 @@ } if (info->index.sym == 0) { - pr_warn("%s: module has no symbols (stripped?)\n", info->name); + pr_warn("%s: module has no symbols (stripped?)\n", + info->name ?: "(missing .modinfo section or name field)"); return -ENOEXEC; } info->index.mod = find_sec(info, ".gnu.linkonce.this_module"); if (!info->index.mod) { pr_warn("%s: No module found in object\n", - info->name ?: "(missing .modinfo name field)"); + info->name ?: "(missing .modinfo section or name field)"); return -ENOEXEC; } /* This is temporary: point mod into copy of data. */ diff -Nru linux-4.19.98/kernel/notifier.c linux-4.19.118/kernel/notifier.c --- linux-4.19.98/kernel/notifier.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/notifier.c 2020-04-23 08:30:24.000000000 +0000 @@ -552,7 +552,7 @@ int register_die_notifier(struct notifier_block *nb) { - vmalloc_sync_all(); + vmalloc_sync_mappings(); return atomic_notifier_chain_register(&die_chain, nb); } EXPORT_SYMBOL_GPL(register_die_notifier); diff -Nru linux-4.19.98/kernel/padata.c linux-4.19.118/kernel/padata.c --- linux-4.19.98/kernel/padata.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/padata.c 2020-04-23 08:30:24.000000000 +0000 @@ -35,6 +35,8 @@ #define MAX_OBJ_NUM 1000 +static void padata_free_pd(struct parallel_data *pd); + static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index) { int cpu, target_cpu; @@ -334,6 +336,7 @@ struct padata_serial_queue *squeue; struct parallel_data *pd; LIST_HEAD(local_list); + int cnt; local_bh_disable(); squeue = container_of(serial_work, struct padata_serial_queue, work); @@ -343,6 +346,8 @@ list_replace_init(&squeue->serial.list, &local_list); spin_unlock(&squeue->serial.lock); + cnt = 0; + while (!list_empty(&local_list)) { struct padata_priv *padata; @@ -352,9 +357,12 @@ list_del_init(&padata->list); padata->serial(padata); - atomic_dec(&pd->refcnt); + cnt++; } local_bh_enable(); + + if (atomic_sub_and_test(cnt, &pd->refcnt)) + padata_free_pd(pd); } /** @@ -501,7 +509,7 @@ timer_setup(&pd->timer, padata_reorder_timer, 0); atomic_set(&pd->seq_nr, -1); atomic_set(&pd->reorder_objects, 0); - atomic_set(&pd->refcnt, 0); + atomic_set(&pd->refcnt, 1); pd->pinst = pinst; spin_lock_init(&pd->lock); @@ -526,31 +534,6 @@ kfree(pd); } -/* Flush all objects out of the padata queues. */ -static void padata_flush_queues(struct parallel_data *pd) -{ - int cpu; - struct padata_parallel_queue *pqueue; - struct padata_serial_queue *squeue; - - for_each_cpu(cpu, pd->cpumask.pcpu) { - pqueue = per_cpu_ptr(pd->pqueue, cpu); - flush_work(&pqueue->work); - } - - del_timer_sync(&pd->timer); - - if (atomic_read(&pd->reorder_objects)) - padata_reorder(pd); - - for_each_cpu(cpu, pd->cpumask.cbcpu) { - squeue = per_cpu_ptr(pd->squeue, cpu); - flush_work(&squeue->work); - } - - BUG_ON(atomic_read(&pd->refcnt) != 0); -} - static void __padata_start(struct padata_instance *pinst) { pinst->flags |= PADATA_INIT; @@ -564,10 +547,6 @@ pinst->flags &= ~PADATA_INIT; synchronize_rcu(); - - get_online_cpus(); - padata_flush_queues(pinst->pd); - put_online_cpus(); } /* Replace the internal control structure with a new one. */ @@ -588,8 +567,8 @@ if (!cpumask_equal(pd_old->cpumask.cbcpu, pd_new->cpumask.cbcpu)) notification_mask |= PADATA_CPU_SERIAL; - padata_flush_queues(pd_old); - padata_free_pd(pd_old); + if (atomic_dec_and_test(&pd_old->refcnt)) + padata_free_pd(pd_old); if (notification_mask) blocking_notifier_call_chain(&pinst->cpumask_change_notifier, @@ -692,8 +671,8 @@ struct cpumask *serial_mask, *parallel_mask; int err = -EINVAL; - mutex_lock(&pinst->lock); get_online_cpus(); + mutex_lock(&pinst->lock); switch (cpumask_type) { case PADATA_CPU_PARALLEL: @@ -711,8 +690,8 @@ err = __padata_set_cpumasks(pinst, parallel_mask, serial_mask); out: - put_online_cpus(); mutex_unlock(&pinst->lock); + put_online_cpus(); return err; } diff -Nru linux-4.19.98/kernel/printk/printk.c linux-4.19.118/kernel/printk/printk.c --- linux-4.19.98/kernel/printk/printk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/printk/printk.c 2020-04-23 08:30:24.000000000 +0000 @@ -2717,8 +2717,6 @@ * for us. */ logbuf_lock_irqsave(flags); - console_seq = syslog_seq; - console_idx = syslog_idx; /* * We're about to replay the log buffer. Only do this to the * just-registered console to avoid excessive message spam to @@ -2730,6 +2728,8 @@ */ exclusive_console = newcon; exclusive_console_stop_seq = console_seq; + console_seq = syslog_seq; + console_idx = syslog_idx; logbuf_unlock_irqrestore(flags); } console_unlock(); diff -Nru linux-4.19.98/kernel/rcu/tree_plugin.h linux-4.19.118/kernel/rcu/tree_plugin.h --- linux-4.19.98/kernel/rcu/tree_plugin.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/rcu/tree_plugin.h 2020-04-23 08:30:24.000000000 +0000 @@ -267,7 +267,7 @@ * blocked tasks. */ if (!rnp->gp_tasks && (blkd_state & RCU_GP_BLKD)) { - rnp->gp_tasks = &t->rcu_node_entry; + WRITE_ONCE(rnp->gp_tasks, &t->rcu_node_entry); WARN_ON_ONCE(rnp->completedqs == rnp->gp_seq); } if (!rnp->exp_tasks && (blkd_state & RCU_EXP_BLKD)) @@ -392,7 +392,7 @@ */ static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp) { - return rnp->gp_tasks != NULL; + return READ_ONCE(rnp->gp_tasks) != NULL; } /* @@ -557,7 +557,7 @@ trace_rcu_unlock_preempted_task(TPS("rcu_preempt"), rnp->gp_seq, t->pid); if (&t->rcu_node_entry == rnp->gp_tasks) - rnp->gp_tasks = np; + WRITE_ONCE(rnp->gp_tasks, np); if (&t->rcu_node_entry == rnp->exp_tasks) rnp->exp_tasks = np; if (IS_ENABLED(CONFIG_RCU_BOOST)) { @@ -716,7 +716,7 @@ dump_blkd_tasks(rsp, rnp, 10); if (rcu_preempt_has_tasks(rnp) && (rnp->qsmaskinit || rnp->wait_blkd_tasks)) { - rnp->gp_tasks = rnp->blkd_tasks.next; + WRITE_ONCE(rnp->gp_tasks, rnp->blkd_tasks.next); t = container_of(rnp->gp_tasks, struct task_struct, rcu_node_entry); trace_rcu_unlock_preempted_task(TPS("rcu_preempt-GPS"), @@ -883,7 +883,8 @@ pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx\n", __func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext); pr_info("%s: ->gp_tasks %p ->boost_tasks %p ->exp_tasks %p\n", - __func__, rnp->gp_tasks, rnp->boost_tasks, rnp->exp_tasks); + __func__, READ_ONCE(rnp->gp_tasks), rnp->boost_tasks, + rnp->exp_tasks); pr_info("%s: ->blkd_tasks", __func__); i = 0; list_for_each(lhp, &rnp->blkd_tasks) { diff -Nru linux-4.19.98/kernel/sched/fair.c linux-4.19.118/kernel/sched/fair.c --- linux-4.19.98/kernel/sched/fair.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/sched/fair.c 2020-04-23 08:30:24.000000000 +0000 @@ -282,79 +282,103 @@ return grp->my_q; } -static inline void list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq) +static inline bool list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq) { - if (!cfs_rq->on_list) { - struct rq *rq = rq_of(cfs_rq); - int cpu = cpu_of(rq); + struct rq *rq = rq_of(cfs_rq); + int cpu = cpu_of(rq); + + if (cfs_rq->on_list) + return rq->tmp_alone_branch == &rq->leaf_cfs_rq_list; + + cfs_rq->on_list = 1; + + /* + * Ensure we either appear before our parent (if already + * enqueued) or force our parent to appear after us when it is + * enqueued. The fact that we always enqueue bottom-up + * reduces this to two cases and a special case for the root + * cfs_rq. Furthermore, it also means that we will always reset + * tmp_alone_branch either when the branch is connected + * to a tree or when we reach the top of the tree + */ + if (cfs_rq->tg->parent && + cfs_rq->tg->parent->cfs_rq[cpu]->on_list) { /* - * Ensure we either appear before our parent (if already - * enqueued) or force our parent to appear after us when it is - * enqueued. The fact that we always enqueue bottom-up - * reduces this to two cases and a special case for the root - * cfs_rq. Furthermore, it also means that we will always reset - * tmp_alone_branch either when the branch is connected - * to a tree or when we reach the beg of the tree + * If parent is already on the list, we add the child + * just before. Thanks to circular linked property of + * the list, this means to put the child at the tail + * of the list that starts by parent. */ - if (cfs_rq->tg->parent && - cfs_rq->tg->parent->cfs_rq[cpu]->on_list) { - /* - * If parent is already on the list, we add the child - * just before. Thanks to circular linked property of - * the list, this means to put the child at the tail - * of the list that starts by parent. - */ - list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, - &(cfs_rq->tg->parent->cfs_rq[cpu]->leaf_cfs_rq_list)); - /* - * The branch is now connected to its tree so we can - * reset tmp_alone_branch to the beginning of the - * list. - */ - rq->tmp_alone_branch = &rq->leaf_cfs_rq_list; - } else if (!cfs_rq->tg->parent) { - /* - * cfs rq without parent should be put - * at the tail of the list. - */ - list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, - &rq->leaf_cfs_rq_list); - /* - * We have reach the beg of a tree so we can reset - * tmp_alone_branch to the beginning of the list. - */ - rq->tmp_alone_branch = &rq->leaf_cfs_rq_list; - } else { - /* - * The parent has not already been added so we want to - * make sure that it will be put after us. - * tmp_alone_branch points to the beg of the branch - * where we will add parent. - */ - list_add_rcu(&cfs_rq->leaf_cfs_rq_list, - rq->tmp_alone_branch); - /* - * update tmp_alone_branch to points to the new beg - * of the branch - */ - rq->tmp_alone_branch = &cfs_rq->leaf_cfs_rq_list; - } + list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, + &(cfs_rq->tg->parent->cfs_rq[cpu]->leaf_cfs_rq_list)); + /* + * The branch is now connected to its tree so we can + * reset tmp_alone_branch to the beginning of the + * list. + */ + rq->tmp_alone_branch = &rq->leaf_cfs_rq_list; + return true; + } - cfs_rq->on_list = 1; + if (!cfs_rq->tg->parent) { + /* + * cfs rq without parent should be put + * at the tail of the list. + */ + list_add_tail_rcu(&cfs_rq->leaf_cfs_rq_list, + &rq->leaf_cfs_rq_list); + /* + * We have reach the top of a tree so we can reset + * tmp_alone_branch to the beginning of the list. + */ + rq->tmp_alone_branch = &rq->leaf_cfs_rq_list; + return true; } + + /* + * The parent has not already been added so we want to + * make sure that it will be put after us. + * tmp_alone_branch points to the begin of the branch + * where we will add parent. + */ + list_add_rcu(&cfs_rq->leaf_cfs_rq_list, rq->tmp_alone_branch); + /* + * update tmp_alone_branch to points to the new begin + * of the branch + */ + rq->tmp_alone_branch = &cfs_rq->leaf_cfs_rq_list; + return false; } static inline void list_del_leaf_cfs_rq(struct cfs_rq *cfs_rq) { if (cfs_rq->on_list) { + struct rq *rq = rq_of(cfs_rq); + + /* + * With cfs_rq being unthrottled/throttled during an enqueue, + * it can happen the tmp_alone_branch points the a leaf that + * we finally want to del. In this case, tmp_alone_branch moves + * to the prev element but it will point to rq->leaf_cfs_rq_list + * at the end of the enqueue. + */ + if (rq->tmp_alone_branch == &cfs_rq->leaf_cfs_rq_list) + rq->tmp_alone_branch = cfs_rq->leaf_cfs_rq_list.prev; + list_del_rcu(&cfs_rq->leaf_cfs_rq_list); cfs_rq->on_list = 0; } } -/* Iterate through all leaf cfs_rq's on a runqueue: */ -#define for_each_leaf_cfs_rq(rq, cfs_rq) \ - list_for_each_entry_rcu(cfs_rq, &rq->leaf_cfs_rq_list, leaf_cfs_rq_list) +static inline void assert_list_leaf_cfs_rq(struct rq *rq) +{ + SCHED_WARN_ON(rq->tmp_alone_branch != &rq->leaf_cfs_rq_list); +} + +/* Iterate thr' all leaf cfs_rq's on a runqueue */ +#define for_each_leaf_cfs_rq_safe(rq, cfs_rq, pos) \ + list_for_each_entry_safe(cfs_rq, pos, &rq->leaf_cfs_rq_list, \ + leaf_cfs_rq_list) /* Do the two (enqueued) entities belong to the same group ? */ static inline struct cfs_rq * @@ -438,16 +462,21 @@ return NULL; } -static inline void list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq) +static inline bool list_add_leaf_cfs_rq(struct cfs_rq *cfs_rq) { + return true; } static inline void list_del_leaf_cfs_rq(struct cfs_rq *cfs_rq) { } -#define for_each_leaf_cfs_rq(rq, cfs_rq) \ - for (cfs_rq = &rq->cfs; cfs_rq; cfs_rq = NULL) +static inline void assert_list_leaf_cfs_rq(struct rq *rq) +{ +} + +#define for_each_leaf_cfs_rq_safe(rq, cfs_rq, pos) \ + for (cfs_rq = &rq->cfs, pos = NULL; cfs_rq; cfs_rq = pos) static inline struct sched_entity *parent_entity(struct sched_entity *se) { @@ -4425,6 +4454,10 @@ /* adjust cfs_rq_clock_task() */ cfs_rq->throttled_clock_task_time += rq_clock_task(rq) - cfs_rq->throttled_clock_task; + + /* Add cfs_rq with already running entity in the list */ + if (cfs_rq->nr_running >= 1) + list_add_leaf_cfs_rq(cfs_rq); } return 0; @@ -4436,8 +4469,10 @@ struct cfs_rq *cfs_rq = tg->cfs_rq[cpu_of(rq)]; /* group is entering throttled state, stop time */ - if (!cfs_rq->throttle_count) + if (!cfs_rq->throttle_count) { cfs_rq->throttled_clock_task = rq_clock_task(rq); + list_del_leaf_cfs_rq(cfs_rq); + } cfs_rq->throttle_count++; return 0; @@ -4540,6 +4575,8 @@ break; } + assert_list_leaf_cfs_rq(rq); + if (!se) add_nr_running(rq, task_delta); @@ -5005,6 +5042,12 @@ } #else /* CONFIG_CFS_BANDWIDTH */ + +static inline bool cfs_bandwidth_used(void) +{ + return false; +} + static inline u64 cfs_rq_clock_task(struct cfs_rq *cfs_rq) { return rq_clock_task(rq_of(cfs_rq)); @@ -5160,6 +5203,23 @@ if (!se) add_nr_running(rq, 1); + if (cfs_bandwidth_used()) { + /* + * When bandwidth control is enabled; the cfs_rq_throttled() + * breaks in the above iteration can result in incomplete + * leaf list maintenance, resulting in triggering the assertion + * below. + */ + for_each_sched_entity(se) { + cfs_rq = cfs_rq_of(se); + + if (list_add_leaf_cfs_rq(cfs_rq)) + break; + } + } + + assert_list_leaf_cfs_rq(rq); + hrtick_update(rq); } @@ -7402,10 +7462,27 @@ #ifdef CONFIG_FAIR_GROUP_SCHED +static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq) +{ + if (cfs_rq->load.weight) + return false; + + if (cfs_rq->avg.load_sum) + return false; + + if (cfs_rq->avg.util_sum) + return false; + + if (cfs_rq->avg.runnable_load_sum) + return false; + + return true; +} + static void update_blocked_averages(int cpu) { struct rq *rq = cpu_rq(cpu); - struct cfs_rq *cfs_rq; + struct cfs_rq *cfs_rq, *pos; const struct sched_class *curr_class; struct rq_flags rf; bool done = true; @@ -7417,13 +7494,9 @@ * Iterates the task_group tree in a bottom up fashion, see * list_add_leaf_cfs_rq() for details. */ - for_each_leaf_cfs_rq(rq, cfs_rq) { + for_each_leaf_cfs_rq_safe(rq, cfs_rq, pos) { struct sched_entity *se; - /* throttled entities do not contribute to load */ - if (throttled_hierarchy(cfs_rq)) - continue; - if (update_cfs_rq_load_avg(cfs_rq_clock_task(cfs_rq), cfs_rq)) update_tg_load_avg(cfs_rq, 0); @@ -7432,6 +7505,13 @@ if (se && !skip_blocked_update(se)) update_load_avg(cfs_rq_of(se), se, 0); + /* + * There can be a lot of idle CPU cgroups. Don't let fully + * decayed cfs_rqs linger on the list. + */ + if (cfs_rq_is_decayed(cfs_rq)) + list_del_leaf_cfs_rq(cfs_rq); + /* Don't need periodic decay once load/util_avg are null */ if (cfs_rq_has_blocked(cfs_rq)) done = false; @@ -10217,10 +10297,10 @@ #ifdef CONFIG_SCHED_DEBUG void print_cfs_stats(struct seq_file *m, int cpu) { - struct cfs_rq *cfs_rq; + struct cfs_rq *cfs_rq, *pos; rcu_read_lock(); - for_each_leaf_cfs_rq(cpu_rq(cpu), cfs_rq) + for_each_leaf_cfs_rq_safe(cpu_rq(cpu), cfs_rq, pos) print_cfs_rq(m, cpu, cfs_rq); rcu_read_unlock(); } diff -Nru linux-4.19.98/kernel/sched/sched.h linux-4.19.118/kernel/sched/sched.h --- linux-4.19.98/kernel/sched/sched.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/sched/sched.h 2020-04-23 08:30:24.000000000 +0000 @@ -123,7 +123,13 @@ #ifdef CONFIG_64BIT # define NICE_0_LOAD_SHIFT (SCHED_FIXEDPOINT_SHIFT + SCHED_FIXEDPOINT_SHIFT) # define scale_load(w) ((w) << SCHED_FIXEDPOINT_SHIFT) -# define scale_load_down(w) ((w) >> SCHED_FIXEDPOINT_SHIFT) +# define scale_load_down(w) \ +({ \ + unsigned long __w = (w); \ + if (__w) \ + __w = max(2UL, __w >> SCHED_FIXEDPOINT_SHIFT); \ + __w; \ +}) #else # define NICE_0_LOAD_SHIFT (SCHED_FIXEDPOINT_SHIFT) # define scale_load(w) (w) diff -Nru linux-4.19.98/kernel/signal.c linux-4.19.118/kernel/signal.c --- linux-4.19.98/kernel/signal.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/signal.c 2020-04-23 08:30:24.000000000 +0000 @@ -86,6 +86,11 @@ handler == SIG_DFL && !(force && sig_kernel_only(sig))) return true; + /* Only allow kernel generated signals to this kthread */ + if (unlikely((t->flags & PF_KTHREAD) && + (handler == SIG_KTHREAD_KERNEL) && !force)) + return true; + return sig_handler_ignored(handler, sig); } @@ -402,27 +407,32 @@ { struct sigqueue *q = NULL; struct user_struct *user; + int sigpending; /* * Protect access to @t credentials. This can go away when all * callers hold rcu read lock. + * + * NOTE! A pending signal will hold on to the user refcount, + * and we get/put the refcount only when the sigpending count + * changes from/to zero. */ rcu_read_lock(); - user = get_uid(__task_cred(t)->user); - atomic_inc(&user->sigpending); + user = __task_cred(t)->user; + sigpending = atomic_inc_return(&user->sigpending); + if (sigpending == 1) + get_uid(user); rcu_read_unlock(); - if (override_rlimit || - atomic_read(&user->sigpending) <= - task_rlimit(t, RLIMIT_SIGPENDING)) { + if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) { q = kmem_cache_alloc(sigqueue_cachep, flags); } else { print_dropped_signal(sig); } if (unlikely(q == NULL)) { - atomic_dec(&user->sigpending); - free_uid(user); + if (atomic_dec_and_test(&user->sigpending)) + free_uid(user); } else { INIT_LIST_HEAD(&q->list); q->flags = 0; @@ -436,8 +446,8 @@ { if (q->flags & SIGQUEUE_PREALLOC) return; - atomic_dec(&q->user->sigpending); - free_uid(q->user); + if (atomic_dec_and_test(&q->user->sigpending)) + free_uid(q->user); kmem_cache_free(sigqueue_cachep, q); } @@ -1827,7 +1837,7 @@ * This is only possible if parent == real_parent. * Check if it has changed security domain. */ - if (tsk->parent_exec_id != tsk->parent->self_exec_id) + if (tsk->parent_exec_id != READ_ONCE(tsk->parent->self_exec_id)) sig = SIGCHLD; } diff -Nru linux-4.19.98/kernel/time/alarmtimer.c linux-4.19.118/kernel/time/alarmtimer.c --- linux-4.19.98/kernel/time/alarmtimer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/time/alarmtimer.c 2020-04-23 08:30:24.000000000 +0000 @@ -91,6 +91,7 @@ unsigned long flags; struct rtc_device *rtc = to_rtc_device(dev); struct wakeup_source *__ws; + int ret = 0; if (rtcdev) return -EBUSY; @@ -105,8 +106,8 @@ spin_lock_irqsave(&rtcdev_lock, flags); if (!rtcdev) { if (!try_module_get(rtc->owner)) { - spin_unlock_irqrestore(&rtcdev_lock, flags); - return -1; + ret = -1; + goto unlock; } rtcdev = rtc; @@ -115,11 +116,12 @@ ws = __ws; __ws = NULL; } +unlock: spin_unlock_irqrestore(&rtcdev_lock, flags); wakeup_source_unregister(__ws); - return 0; + return ret; } static inline void alarmtimer_rtc_timer_init(void) diff -Nru linux-4.19.98/kernel/time/clocksource.c linux-4.19.118/kernel/time/clocksource.c --- linux-4.19.98/kernel/time/clocksource.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/time/clocksource.c 2020-04-23 08:30:24.000000000 +0000 @@ -311,8 +311,15 @@ next_cpu = cpumask_next(raw_smp_processor_id(), cpu_online_mask); if (next_cpu >= nr_cpu_ids) next_cpu = cpumask_first(cpu_online_mask); - watchdog_timer.expires += WATCHDOG_INTERVAL; - add_timer_on(&watchdog_timer, next_cpu); + + /* + * Arm timer if not already pending: could race with concurrent + * pair clocksource_stop_watchdog() clocksource_start_watchdog(). + */ + if (!timer_pending(&watchdog_timer)) { + watchdog_timer.expires += WATCHDOG_INTERVAL; + add_timer_on(&watchdog_timer, next_cpu); + } out: spin_unlock(&watchdog_lock); } diff -Nru linux-4.19.98/kernel/trace/ftrace.c linux-4.19.118/kernel/trace/ftrace.c --- linux-4.19.98/kernel/trace/ftrace.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/ftrace.c 2020-04-23 08:30:24.000000000 +0000 @@ -5072,8 +5072,8 @@ static DEFINE_MUTEX(graph_lock); -struct ftrace_hash *ftrace_graph_hash = EMPTY_HASH; -struct ftrace_hash *ftrace_graph_notrace_hash = EMPTY_HASH; +struct ftrace_hash __rcu *ftrace_graph_hash = EMPTY_HASH; +struct ftrace_hash __rcu *ftrace_graph_notrace_hash = EMPTY_HASH; enum graph_filter_type { GRAPH_FILTER_NOTRACE = 0, @@ -5344,8 +5344,15 @@ mutex_unlock(&graph_lock); - /* Wait till all users are no longer using the old hash */ - synchronize_sched(); + /* + * We need to do a hard force of sched synchronization. + * This is because we use preempt_disable() to do RCU, but + * the function tracers can be called where RCU is not watching + * (like before user_exit()). We can not rely on the RCU + * infrastructure to do the synchronization, thus we must do it + * ourselves. + */ + schedule_on_each_cpu(ftrace_sync); free_ftrace_hash(old_hash); } @@ -6518,9 +6525,10 @@ struct trace_array *tr = m->private; struct trace_pid_list *pid_list = rcu_dereference_sched(tr->function_pids); - if (v == FTRACE_NO_PIDS) + if (v == FTRACE_NO_PIDS) { + (*pos)++; return NULL; - + } return trace_pid_next(pid_list, v, pos); } diff -Nru linux-4.19.98/kernel/trace/trace.c linux-4.19.118/kernel/trace/trace.c --- linux-4.19.98/kernel/trace/trace.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/trace.c 2020-04-23 08:30:24.000000000 +0000 @@ -1549,6 +1549,7 @@ pr_info("Running postponed tracer tests:\n"); + tracing_selftest_running = true; list_for_each_entry_safe(p, n, &postponed_selftests, list) { ret = run_tracer_selftest(p->type); /* If the test fails, then warn and remove from available_tracers */ @@ -1567,6 +1568,7 @@ list_del(&p->list); kfree(p); } + tracing_selftest_running = false; out: mutex_unlock(&trace_types_lock); diff -Nru linux-4.19.98/kernel/trace/trace.h linux-4.19.118/kernel/trace/trace.h --- linux-4.19.98/kernel/trace/trace.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/trace.h 2020-04-23 08:30:24.000000000 +0000 @@ -872,22 +872,31 @@ unsigned long flags, int pc); #ifdef CONFIG_DYNAMIC_FTRACE -extern struct ftrace_hash *ftrace_graph_hash; -extern struct ftrace_hash *ftrace_graph_notrace_hash; +extern struct ftrace_hash __rcu *ftrace_graph_hash; +extern struct ftrace_hash __rcu *ftrace_graph_notrace_hash; static inline int ftrace_graph_addr(struct ftrace_graph_ent *trace) { unsigned long addr = trace->func; int ret = 0; + struct ftrace_hash *hash; preempt_disable_notrace(); - if (ftrace_hash_empty(ftrace_graph_hash)) { + /* + * Have to open code "rcu_dereference_sched()" because the + * function graph tracer can be called when RCU is not + * "watching". + * Protected with schedule_on_each_cpu(ftrace_sync) + */ + hash = rcu_dereference_protected(ftrace_graph_hash, !preemptible()); + + if (ftrace_hash_empty(hash)) { ret = 1; goto out; } - if (ftrace_lookup_ip(ftrace_graph_hash, addr)) { + if (ftrace_lookup_ip(hash, addr)) { /* * This needs to be cleared on the return functions @@ -923,10 +932,20 @@ static inline int ftrace_graph_notrace_addr(unsigned long addr) { int ret = 0; + struct ftrace_hash *notrace_hash; preempt_disable_notrace(); - if (ftrace_lookup_ip(ftrace_graph_notrace_hash, addr)) + /* + * Have to open code "rcu_dereference_sched()" because the + * function graph tracer can be called when RCU is not + * "watching". + * Protected with schedule_on_each_cpu(ftrace_sync) + */ + notrace_hash = rcu_dereference_protected(ftrace_graph_notrace_hash, + !preemptible()); + + if (ftrace_lookup_ip(notrace_hash, addr)) ret = 1; preempt_enable_notrace(); diff -Nru linux-4.19.98/kernel/trace/trace_events_hist.c linux-4.19.118/kernel/trace/trace_events_hist.c --- linux-4.19.98/kernel/trace/trace_events_hist.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/trace_events_hist.c 2020-04-23 08:30:24.000000000 +0000 @@ -49,6 +49,7 @@ struct ftrace_event_field *field; unsigned long flags; hist_field_fn_t fn; + unsigned int ref; unsigned int size; unsigned int offset; unsigned int is_signed; @@ -1274,6 +1275,17 @@ return cpu; } +/** + * check_field_for_var_ref - Check if a VAR_REF field references a variable + * @hist_field: The VAR_REF field to check + * @var_data: The hist trigger that owns the variable + * @var_idx: The trigger variable identifier + * + * Check the given VAR_REF field to see whether or not it references + * the given variable associated with the given trigger. + * + * Return: The VAR_REF field if it does reference the variable, NULL if not + */ static struct hist_field * check_field_for_var_ref(struct hist_field *hist_field, struct hist_trigger_data *var_data, @@ -1324,6 +1336,18 @@ return found; } +/** + * find_var_ref - Check if a trigger has a reference to a trigger variable + * @hist_data: The hist trigger that might have a reference to the variable + * @var_data: The hist trigger that owns the variable + * @var_idx: The trigger variable identifier + * + * Check the list of var_refs[] on the first hist trigger to see + * whether any of them are references to the variable on the second + * trigger. + * + * Return: The VAR_REF field referencing the variable if so, NULL if not + */ static struct hist_field *find_var_ref(struct hist_trigger_data *hist_data, struct hist_trigger_data *var_data, unsigned int var_idx) @@ -1350,6 +1374,20 @@ return found; } +/** + * find_any_var_ref - Check if there is a reference to a given trigger variable + * @hist_data: The hist trigger + * @var_idx: The trigger variable identifier + * + * Check to see whether the given variable is currently referenced by + * any other trigger. + * + * The trigger the variable is defined on is explicitly excluded - the + * assumption being that a self-reference doesn't prevent a trigger + * from being removed. + * + * Return: The VAR_REF field referencing the variable if so, NULL if not + */ static struct hist_field *find_any_var_ref(struct hist_trigger_data *hist_data, unsigned int var_idx) { @@ -1368,6 +1406,19 @@ return found; } +/** + * check_var_refs - Check if there is a reference to any of trigger's variables + * @hist_data: The hist trigger + * + * A trigger can define one or more variables. If any one of them is + * currently referenced by any other trigger, this function will + * determine that. + + * Typically used to determine whether or not a trigger can be removed + * - if there are any references to a trigger's variables, it cannot. + * + * Return: True if there is a reference to any of trigger's variables + */ static bool check_var_refs(struct hist_trigger_data *hist_data) { struct hist_field *field; @@ -1511,11 +1562,13 @@ struct event_trigger_data *test; struct hist_field *hist_field; + lockdep_assert_held(&event_mutex); + hist_field = find_var_field(hist_data, var_name); if (hist_field) return hist_field; - list_for_each_entry_rcu(test, &file->triggers, list) { + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { test_data = test->private_data; hist_field = find_var_field(test_data, var_name); @@ -1565,7 +1618,9 @@ struct event_trigger_data *test; struct hist_field *hist_field; - list_for_each_entry_rcu(test, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { test_data = test->private_data; hist_field = find_var_field(test_data, var_name); @@ -2171,6 +2226,23 @@ return field_op; } +static void get_hist_field(struct hist_field *hist_field) +{ + hist_field->ref++; +} + +static void __destroy_hist_field(struct hist_field *hist_field) +{ + if (--hist_field->ref > 1) + return; + + kfree(hist_field->var.name); + kfree(hist_field->name); + kfree(hist_field->type); + + kfree(hist_field); +} + static void destroy_hist_field(struct hist_field *hist_field, unsigned int level) { @@ -2182,14 +2254,13 @@ if (!hist_field) return; + if (hist_field->flags & HIST_FIELD_FL_VAR_REF) + return; /* var refs will be destroyed separately */ + for (i = 0; i < HIST_FIELD_OPERANDS_MAX; i++) destroy_hist_field(hist_field->operands[i], level + 1); - kfree(hist_field->var.name); - kfree(hist_field->name); - kfree(hist_field->type); - - kfree(hist_field); + __destroy_hist_field(hist_field); } static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data, @@ -2206,6 +2277,8 @@ if (!hist_field) return NULL; + hist_field->ref = 1; + hist_field->hist_data = hist_data; if (flags & HIST_FIELD_FL_EXPR || flags & HIST_FIELD_FL_ALIAS) @@ -2316,6 +2389,12 @@ hist_data->fields[i] = NULL; } } + + for (i = 0; i < hist_data->n_var_refs; i++) { + WARN_ON(!(hist_data->var_refs[i]->flags & HIST_FIELD_FL_VAR_REF)); + __destroy_hist_field(hist_data->var_refs[i]); + hist_data->var_refs[i] = NULL; + } } static int init_var_ref(struct hist_field *ref_field, @@ -2374,11 +2453,38 @@ goto out; } -static struct hist_field *create_var_ref(struct hist_field *var_field, +/** + * create_var_ref - Create a variable reference and attach it to trigger + * @hist_data: The trigger that will be referencing the variable + * @var_field: The VAR field to create a reference to + * @system: The optional system string + * @event_name: The optional event_name string + * + * Given a variable hist_field, create a VAR_REF hist_field that + * represents a reference to it. + * + * This function also adds the reference to the trigger that + * now references the variable. + * + * Return: The VAR_REF field if successful, NULL if not + */ +static struct hist_field *create_var_ref(struct hist_trigger_data *hist_data, + struct hist_field *var_field, char *system, char *event_name) { unsigned long flags = HIST_FIELD_FL_VAR_REF; struct hist_field *ref_field; + int i; + + /* Check if the variable already exists */ + for (i = 0; i < hist_data->n_var_refs; i++) { + ref_field = hist_data->var_refs[i]; + if (ref_field->var.idx == var_field->var.idx && + ref_field->var.hist_data == var_field->hist_data) { + get_hist_field(ref_field); + return ref_field; + } + } ref_field = create_hist_field(var_field->hist_data, NULL, flags, NULL); if (ref_field) { @@ -2386,6 +2492,9 @@ destroy_hist_field(ref_field, 0); return NULL; } + + hist_data->var_refs[hist_data->n_var_refs] = ref_field; + ref_field->var_ref_idx = hist_data->n_var_refs++; } return ref_field; @@ -2459,7 +2568,8 @@ var_field = find_event_var(hist_data, system, event_name, var_name); if (var_field) - ref_field = create_var_ref(var_field, system, event_name); + ref_field = create_var_ref(hist_data, var_field, + system, event_name); if (!ref_field) hist_err_event("Couldn't find variable: $", @@ -2579,8 +2689,6 @@ if (!s) { hist_field = parse_var_ref(hist_data, ref_system, ref_event, ref_var); if (hist_field) { - hist_data->var_refs[hist_data->n_var_refs] = hist_field; - hist_field->var_ref_idx = hist_data->n_var_refs++; if (var_name) { hist_field = create_alias(hist_data, hist_field, var_name); if (!hist_field) { @@ -2828,7 +2936,9 @@ { struct event_trigger_data *test; - list_for_each_entry_rcu(test, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (test->private_data == hist_data) return test->filter_str; @@ -2879,9 +2989,11 @@ struct event_trigger_data *test; unsigned int n_keys; + lockdep_assert_held(&event_mutex); + n_keys = target_hist_data->n_fields - target_hist_data->n_vals; - list_for_each_entry_rcu(test, &file->triggers, list) { + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { hist_data = test->private_data; @@ -3354,7 +3466,6 @@ unsigned int var_ref_idx = hist_data->n_var_refs; struct field_var *field_var; char *onmax_var_str, *param; - unsigned long flags; unsigned int i; int ret = 0; @@ -3371,18 +3482,10 @@ return -EINVAL; } - flags = HIST_FIELD_FL_VAR_REF; - ref_field = create_hist_field(hist_data, NULL, flags, NULL); + ref_field = create_var_ref(hist_data, var_field, NULL, NULL); if (!ref_field) return -ENOMEM; - if (init_var_ref(ref_field, var_field, NULL, NULL)) { - destroy_hist_field(ref_field, 0); - ret = -ENOMEM; - goto out; - } - hist_data->var_refs[hist_data->n_var_refs] = ref_field; - ref_field->var_ref_idx = hist_data->n_var_refs++; data->onmax.var = ref_field; data->fn = onmax_save; @@ -3573,9 +3676,6 @@ struct hist_field *var_ref) { hist_data->synth_var_refs[hist_data->n_synth_var_refs++] = var_ref; - - hist_data->var_refs[hist_data->n_var_refs] = var_ref; - var_ref->var_ref_idx = hist_data->n_var_refs++; } static int check_synth_field(struct synth_event *event, @@ -3730,7 +3830,8 @@ } if (check_synth_field(event, hist_field, field_pos) == 0) { - var_ref = create_var_ref(hist_field, system, event_name); + var_ref = create_var_ref(hist_data, hist_field, + system, event_name); if (!var_ref) { kfree(p); ret = -ENOMEM; @@ -4905,7 +5006,7 @@ goto out_unlock; } - list_for_each_entry_rcu(data, &event_file->triggers, list) { + list_for_each_entry(data, &event_file->triggers, list) { if (data->cmd_ops->trigger_type == ETT_EVENT_HIST) hist_trigger_show(m, data, n++); } @@ -5296,7 +5397,9 @@ if (hist_data->attrs->name && !named_data) goto new; - list_for_each_entry_rcu(test, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (!hist_trigger_match(data, test, named_data, false)) continue; @@ -5380,10 +5483,12 @@ struct event_trigger_data *test, *named_data = NULL; bool match = false; + lockdep_assert_held(&event_mutex); + if (hist_data->attrs->name) named_data = find_named_trigger(hist_data->attrs->name); - list_for_each_entry_rcu(test, &file->triggers, list) { + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (hist_trigger_match(data, test, named_data, false)) { match = true; @@ -5401,10 +5506,12 @@ struct hist_trigger_data *hist_data = data->private_data; struct event_trigger_data *test, *named_data = NULL; + lockdep_assert_held(&event_mutex); + if (hist_data->attrs->name) named_data = find_named_trigger(hist_data->attrs->name); - list_for_each_entry_rcu(test, &file->triggers, list) { + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (!hist_trigger_match(data, test, named_data, false)) continue; @@ -5426,10 +5533,12 @@ struct event_trigger_data *test, *named_data = NULL; bool unregistered = false; + lockdep_assert_held(&event_mutex); + if (hist_data->attrs->name) named_data = find_named_trigger(hist_data->attrs->name); - list_for_each_entry_rcu(test, &file->triggers, list) { + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { if (!hist_trigger_match(data, test, named_data, false)) continue; @@ -5455,7 +5564,9 @@ struct hist_trigger_data *hist_data; struct event_trigger_data *test; - list_for_each_entry_rcu(test, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == ETT_EVENT_HIST) { hist_data = test->private_data; if (check_var_refs(hist_data)) diff -Nru linux-4.19.98/kernel/trace/trace_events_trigger.c linux-4.19.118/kernel/trace/trace_events_trigger.c --- linux-4.19.98/kernel/trace/trace_events_trigger.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/trace_events_trigger.c 2020-04-23 08:30:24.000000000 +0000 @@ -115,9 +115,10 @@ { struct trace_event_file *event_file = event_file_data(m->private); - if (t == SHOW_AVAILABLE_TRIGGERS) + if (t == SHOW_AVAILABLE_TRIGGERS) { + (*pos)++; return NULL; - + } return seq_list_next(t, &event_file->triggers, pos); } @@ -495,7 +496,9 @@ struct event_trigger_data *data; bool set_cond = false; - list_for_each_entry_rcu(data, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(data, &file->triggers, list) { if (data->filter || event_command_post_trigger(data->cmd_ops) || event_command_needs_rec(data->cmd_ops)) { set_cond = true; @@ -530,7 +533,9 @@ struct event_trigger_data *test; int ret = 0; - list_for_each_entry_rcu(test, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(test, &file->triggers, list) { if (test->cmd_ops->trigger_type == data->cmd_ops->trigger_type) { ret = -EEXIST; goto out; @@ -575,7 +580,9 @@ struct event_trigger_data *data; bool unregistered = false; - list_for_each_entry_rcu(data, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(data, &file->triggers, list) { if (data->cmd_ops->trigger_type == test->cmd_ops->trigger_type) { unregistered = true; list_del_rcu(&data->list); @@ -1074,14 +1081,10 @@ struct event_trigger_data *data, struct trace_event_file *file) { - int ret = register_trigger(glob, ops, data, file); - - if (ret > 0 && tracing_alloc_snapshot_instance(file->tr) != 0) { - unregister_trigger(glob, ops, data, file); - ret = 0; - } + if (tracing_alloc_snapshot_instance(file->tr) != 0) + return 0; - return ret; + return register_trigger(glob, ops, data, file); } static int @@ -1490,7 +1493,9 @@ struct event_trigger_data *test; int ret = 0; - list_for_each_entry_rcu(test, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(test, &file->triggers, list) { test_enable_data = test->private_data; if (test_enable_data && (test->cmd_ops->trigger_type == @@ -1530,7 +1535,9 @@ struct event_trigger_data *data; bool unregistered = false; - list_for_each_entry_rcu(data, &file->triggers, list) { + lockdep_assert_held(&event_mutex); + + list_for_each_entry(data, &file->triggers, list) { enable_data = data->private_data; if (enable_data && (data->cmd_ops->trigger_type == diff -Nru linux-4.19.98/kernel/trace/trace_kprobe.c linux-4.19.118/kernel/trace/trace_kprobe.c --- linux-4.19.98/kernel/trace/trace_kprobe.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/trace_kprobe.c 2020-04-23 08:30:24.000000000 +0000 @@ -975,6 +975,8 @@ int i; seq_putc(m, trace_kprobe_is_return(tk) ? 'r' : 'p'); + if (trace_kprobe_is_return(tk) && tk->rp.maxactive) + seq_printf(m, "%d", tk->rp.maxactive); seq_printf(m, ":%s/%s", tk->tp.call.class->system, trace_event_name(&tk->tp.call)); diff -Nru linux-4.19.98/kernel/trace/trace_sched_switch.c linux-4.19.118/kernel/trace/trace_sched_switch.c --- linux-4.19.98/kernel/trace/trace_sched_switch.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/trace_sched_switch.c 2020-04-23 08:30:24.000000000 +0000 @@ -89,8 +89,10 @@ static void tracing_start_sched_switch(int ops) { - bool sched_register = (!sched_cmdline_ref && !sched_tgid_ref); + bool sched_register; + mutex_lock(&sched_register_mutex); + sched_register = (!sched_cmdline_ref && !sched_tgid_ref); switch (ops) { case RECORD_CMDLINE: diff -Nru linux-4.19.98/kernel/trace/trace_stat.c linux-4.19.118/kernel/trace/trace_stat.c --- linux-4.19.98/kernel/trace/trace_stat.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/trace/trace_stat.c 2020-04-23 08:30:24.000000000 +0000 @@ -278,18 +278,22 @@ d_tracing = tracing_init_dentry(); if (IS_ERR(d_tracing)) - return 0; + return -ENODEV; stat_dir = tracefs_create_dir("trace_stat", d_tracing); - if (!stat_dir) + if (!stat_dir) { pr_warn("Could not create tracefs 'trace_stat' entry\n"); + return -ENOMEM; + } return 0; } static int init_stat_file(struct stat_session *session) { - if (!stat_dir && tracing_stat_init()) - return -ENODEV; + int ret; + + if (!stat_dir && (ret = tracing_stat_init())) + return ret; session->file = tracefs_create_file(session->ts->name, 0644, stat_dir, @@ -302,7 +306,7 @@ int register_stat_tracer(struct tracer_stat *trace) { struct stat_session *session, *node; - int ret; + int ret = -EINVAL; if (!trace) return -EINVAL; @@ -313,17 +317,15 @@ /* Already registered? */ mutex_lock(&all_stat_sessions_mutex); list_for_each_entry(node, &all_stat_sessions, session_list) { - if (node->ts == trace) { - mutex_unlock(&all_stat_sessions_mutex); - return -EINVAL; - } + if (node->ts == trace) + goto out; } - mutex_unlock(&all_stat_sessions_mutex); + ret = -ENOMEM; /* Init the session */ session = kzalloc(sizeof(*session), GFP_KERNEL); if (!session) - return -ENOMEM; + goto out; session->ts = trace; INIT_LIST_HEAD(&session->session_list); @@ -332,15 +334,16 @@ ret = init_stat_file(session); if (ret) { destroy_session(session); - return ret; + goto out; } + ret = 0; /* Register */ - mutex_lock(&all_stat_sessions_mutex); list_add_tail(&session->session_list, &all_stat_sessions); + out: mutex_unlock(&all_stat_sessions_mutex); - return 0; + return ret; } void unregister_stat_tracer(struct tracer_stat *trace) diff -Nru linux-4.19.98/kernel/watchdog.c linux-4.19.118/kernel/watchdog.c --- linux-4.19.98/kernel/watchdog.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/watchdog.c 2020-04-23 08:30:24.000000000 +0000 @@ -161,6 +161,8 @@ #ifdef CONFIG_SOFTLOCKUP_DETECTOR +#define SOFTLOCKUP_RESET ULONG_MAX + /* Global variables, exported for sysctl */ unsigned int __read_mostly softlockup_panic = CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE; @@ -267,7 +269,7 @@ * Preemption can be enabled. It doesn't matter which CPU's timestamp * gets zeroed here, so use the raw_ operation. */ - raw_cpu_write(watchdog_touch_ts, 0); + raw_cpu_write(watchdog_touch_ts, SOFTLOCKUP_RESET); } notrace void touch_softlockup_watchdog(void) @@ -291,14 +293,14 @@ * the softlockup check. */ for_each_cpu(cpu, &watchdog_allowed_mask) - per_cpu(watchdog_touch_ts, cpu) = 0; + per_cpu(watchdog_touch_ts, cpu) = SOFTLOCKUP_RESET; wq_watchdog_touch(-1); } void touch_softlockup_watchdog_sync(void) { __this_cpu_write(softlockup_touch_sync, true); - __this_cpu_write(watchdog_touch_ts, 0); + __this_cpu_write(watchdog_touch_ts, SOFTLOCKUP_RESET); } static int is_softlockup(unsigned long touch_ts) @@ -376,7 +378,7 @@ /* .. and repeat */ hrtimer_forward_now(hrtimer, ns_to_ktime(sample_period)); - if (touch_ts == 0) { + if (touch_ts == SOFTLOCKUP_RESET) { if (unlikely(__this_cpu_read(softlockup_touch_sync))) { /* * If the time stamp was touched atomically diff -Nru linux-4.19.98/kernel/workqueue.c linux-4.19.118/kernel/workqueue.c --- linux-4.19.98/kernel/workqueue.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/kernel/workqueue.c 2020-04-23 08:30:24.000000000 +0000 @@ -1384,14 +1384,16 @@ WARN_ON_ONCE(!is_chained_work(wq))) return; retry: - if (req_cpu == WORK_CPU_UNBOUND) - cpu = wq_select_unbound_cpu(raw_smp_processor_id()); - /* pwq which will be used unless @work is executing elsewhere */ - if (!(wq->flags & WQ_UNBOUND)) - pwq = per_cpu_ptr(wq->cpu_pwqs, cpu); - else + if (wq->flags & WQ_UNBOUND) { + if (req_cpu == WORK_CPU_UNBOUND) + cpu = wq_select_unbound_cpu(raw_smp_processor_id()); pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu)); + } else { + if (req_cpu == WORK_CPU_UNBOUND) + cpu = raw_smp_processor_id(); + pwq = per_cpu_ptr(wq->cpu_pwqs, cpu); + } /* * If @work was previously on a different pool, it might still be diff -Nru linux-4.19.98/lib/devres.c linux-4.19.118/lib/devres.c --- linux-4.19.98/lib/devres.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/devres.c 2020-04-23 08:30:24.000000000 +0000 @@ -131,7 +131,8 @@ * if (IS_ERR(base)) * return PTR_ERR(base); */ -void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res) +void __iomem *devm_ioremap_resource(struct device *dev, + const struct resource *res) { resource_size_t size; const char *name; diff -Nru linux-4.19.98/lib/find_bit.c linux-4.19.118/lib/find_bit.c --- linux-4.19.98/lib/find_bit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/find_bit.c 2020-04-23 08:30:24.000000000 +0000 @@ -153,18 +153,6 @@ #ifdef __BIG_ENDIAN -/* include/linux/byteorder does not support "unsigned long" type */ -static inline unsigned long ext2_swab(const unsigned long y) -{ -#if BITS_PER_LONG == 64 - return (unsigned long) __swab64((u64) y); -#elif BITS_PER_LONG == 32 - return (unsigned long) __swab32((u32) y); -#else -#error BITS_PER_LONG not defined -#endif -} - #if !defined(find_next_bit_le) || !defined(find_next_zero_bit_le) static inline unsigned long _find_next_bit_le(const unsigned long *addr1, const unsigned long *addr2, unsigned long nbits, @@ -181,7 +169,7 @@ tmp ^= invert; /* Handle 1st word. */ - tmp &= ext2_swab(BITMAP_FIRST_WORD_MASK(start)); + tmp &= swab(BITMAP_FIRST_WORD_MASK(start)); start = round_down(start, BITS_PER_LONG); while (!tmp) { @@ -195,7 +183,7 @@ tmp ^= invert; } - return min(start + __ffs(ext2_swab(tmp)), nbits); + return min(start + __ffs(swab(tmp)), nbits); } #endif diff -Nru linux-4.19.98/lib/kfifo.c linux-4.19.118/lib/kfifo.c --- linux-4.19.98/lib/kfifo.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/kfifo.c 2020-04-23 08:30:24.000000000 +0000 @@ -82,7 +82,8 @@ { size /= esize; - size = roundup_pow_of_two(size); + if (!is_power_of_2(size)) + size = rounddown_pow_of_two(size); fifo->in = 0; fifo->out = 0; diff -Nru linux-4.19.98/lib/raid6/neon.uc linux-4.19.118/lib/raid6/neon.uc --- linux-4.19.98/lib/raid6/neon.uc 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/raid6/neon.uc 2020-04-23 08:30:24.000000000 +0000 @@ -28,7 +28,6 @@ typedef uint8x16_t unative_t; -#define NBYTES(x) ((unative_t){x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}) #define NSIZE sizeof(unative_t) /* @@ -61,7 +60,7 @@ int d, z, z0; register unative_t wd$$, wq$$, wp$$, w1$$, w2$$; - const unative_t x1d = NBYTES(0x1d); + const unative_t x1d = vdupq_n_u8(0x1d); z0 = disks - 3; /* Highest data disk */ p = dptr[z0+1]; /* XOR parity */ @@ -92,7 +91,7 @@ int d, z, z0; register unative_t wd$$, wq$$, wp$$, w1$$, w2$$; - const unative_t x1d = NBYTES(0x1d); + const unative_t x1d = vdupq_n_u8(0x1d); z0 = stop; /* P/Q right side optimization */ p = dptr[disks-2]; /* XOR parity */ diff -Nru linux-4.19.98/lib/raid6/recov_neon_inner.c linux-4.19.118/lib/raid6/recov_neon_inner.c --- linux-4.19.98/lib/raid6/recov_neon_inner.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/raid6/recov_neon_inner.c 2020-04-23 08:30:24.000000000 +0000 @@ -10,11 +10,6 @@ #include -static const uint8x16_t x0f = { - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, -}; - #ifdef CONFIG_ARM /* * AArch32 does not provide this intrinsic natively because it does not @@ -41,6 +36,7 @@ uint8x16_t pm1 = vld1q_u8(pbmul + 16); uint8x16_t qm0 = vld1q_u8(qmul); uint8x16_t qm1 = vld1q_u8(qmul + 16); + uint8x16_t x0f = vdupq_n_u8(0x0f); /* * while ( bytes-- ) { @@ -87,6 +83,7 @@ { uint8x16_t qm0 = vld1q_u8(qmul); uint8x16_t qm1 = vld1q_u8(qmul + 16); + uint8x16_t x0f = vdupq_n_u8(0x0f); /* * while (bytes--) { diff -Nru linux-4.19.98/lib/scatterlist.c linux-4.19.118/lib/scatterlist.c --- linux-4.19.98/lib/scatterlist.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/scatterlist.c 2020-04-23 08:30:24.000000000 +0000 @@ -305,7 +305,7 @@ if (prv) table->nents = ++table->orig_nents; - return -ENOMEM; + return -ENOMEM; } sg_init_table(sg, alloc_size); diff -Nru linux-4.19.98/lib/stackdepot.c linux-4.19.118/lib/stackdepot.c --- linux-4.19.98/lib/stackdepot.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/stackdepot.c 2020-04-23 08:30:24.000000000 +0000 @@ -92,15 +92,19 @@ return true; if (stack_slabs[depot_index] == NULL) { stack_slabs[depot_index] = *prealloc; + *prealloc = NULL; } else { - stack_slabs[depot_index + 1] = *prealloc; + /* If this is the last depot slab, do not touch the next one. */ + if (depot_index + 1 < STACK_ALLOC_MAX_SLABS) { + stack_slabs[depot_index + 1] = *prealloc; + *prealloc = NULL; + } /* * This smp_store_release pairs with smp_load_acquire() from * |next_slab_inited| above and in depot_save_stack(). */ smp_store_release(&next_slab_inited, 1); } - *prealloc = NULL; return true; } diff -Nru linux-4.19.98/lib/test_kasan.c linux-4.19.118/lib/test_kasan.c --- linux-4.19.98/lib/test_kasan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/lib/test_kasan.c 2020-04-23 08:30:24.000000000 +0000 @@ -157,6 +157,7 @@ if (!ptr1 || !ptr2) { pr_err("Allocation failed\n"); kfree(ptr1); + kfree(ptr2); return; } diff -Nru linux-4.19.98/mm/hmm.c linux-4.19.118/mm/hmm.c --- linux-4.19.98/mm/hmm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/hmm.c 2020-04-23 08:30:24.000000000 +0000 @@ -997,21 +997,21 @@ struct hmm_devmem *devmem = data; struct resource *resource = devmem->resource; unsigned long start_pfn, npages; - struct zone *zone; struct page *page; + int nid; /* pages are dead and unused, undo the arch mapping */ start_pfn = (resource->start & ~(PA_SECTION_SIZE - 1)) >> PAGE_SHIFT; npages = ALIGN(resource_size(resource), PA_SECTION_SIZE) >> PAGE_SHIFT; page = pfn_to_page(start_pfn); - zone = page_zone(page); + nid = page_to_nid(page); mem_hotplug_begin(); if (resource->desc == IORES_DESC_DEVICE_PRIVATE_MEMORY) - __remove_pages(zone, start_pfn, npages, NULL); + __remove_pages(start_pfn, npages, NULL); else - arch_remove_memory(start_pfn << PAGE_SHIFT, + arch_remove_memory(nid, start_pfn << PAGE_SHIFT, npages << PAGE_SHIFT, NULL); mem_hotplug_done(); diff -Nru linux-4.19.98/mm/huge_memory.c linux-4.19.118/mm/huge_memory.c --- linux-4.19.98/mm/huge_memory.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/huge_memory.c 2020-04-23 08:30:24.000000000 +0000 @@ -173,16 +173,13 @@ { ssize_t ret = count; - if (!memcmp("always", buf, - min(sizeof("always")-1, count))) { + if (sysfs_streq(buf, "always")) { clear_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG, &transparent_hugepage_flags); set_bit(TRANSPARENT_HUGEPAGE_FLAG, &transparent_hugepage_flags); - } else if (!memcmp("madvise", buf, - min(sizeof("madvise")-1, count))) { + } else if (sysfs_streq(buf, "madvise")) { clear_bit(TRANSPARENT_HUGEPAGE_FLAG, &transparent_hugepage_flags); set_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG, &transparent_hugepage_flags); - } else if (!memcmp("never", buf, - min(sizeof("never")-1, count))) { + } else if (sysfs_streq(buf, "never")) { clear_bit(TRANSPARENT_HUGEPAGE_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG, &transparent_hugepage_flags); } else @@ -246,32 +243,27 @@ struct kobj_attribute *attr, const char *buf, size_t count) { - if (!memcmp("always", buf, - min(sizeof("always")-1, count))) { + if (sysfs_streq(buf, "always")) { clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); - } else if (!memcmp("defer+madvise", buf, - min(sizeof("defer+madvise")-1, count))) { + } else if (sysfs_streq(buf, "defer+madvise")) { clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); - } else if (!memcmp("defer", buf, - min(sizeof("defer")-1, count))) { + } else if (sysfs_streq(buf, "defer")) { clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); - } else if (!memcmp("madvise", buf, - min(sizeof("madvise")-1, count))) { + } else if (sysfs_streq(buf, "madvise")) { clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage_flags); - } else if (!memcmp("never", buf, - min(sizeof("never")-1, count))) { + } else if (sysfs_streq(buf, "never")) { clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_flags); clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hugepage_flags); @@ -2661,7 +2653,7 @@ unsigned long flags; pgoff_t end; - VM_BUG_ON_PAGE(is_huge_zero_page(page), page); + VM_BUG_ON_PAGE(is_huge_zero_page(head), head); VM_BUG_ON_PAGE(!PageLocked(page), page); VM_BUG_ON_PAGE(!PageCompound(page), page); @@ -2957,8 +2949,7 @@ return; flush_cache_range(vma, address, address + HPAGE_PMD_SIZE); - pmdval = *pvmw->pmd; - pmdp_invalidate(vma, address, pvmw->pmd); + pmdval = pmdp_invalidate(vma, address, pvmw->pmd); if (pmd_dirty(pmdval)) set_page_dirty(page); entry = make_migration_entry(page, pmd_write(pmdval)); diff -Nru linux-4.19.98/mm/memcontrol.c linux-4.19.118/mm/memcontrol.c --- linux-4.19.98/mm/memcontrol.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/memcontrol.c 2020-04-23 08:30:24.000000000 +0000 @@ -419,8 +419,10 @@ if (mem_cgroup_is_root(memcg)) continue; ret = memcg_expand_one_shrinker_map(memcg, size, old_size); - if (ret) + if (ret) { + mem_cgroup_iter_break(NULL, memcg); goto unlock; + } } unlock: if (!ret) @@ -3757,7 +3759,7 @@ struct mem_cgroup_thresholds *thresholds; struct mem_cgroup_threshold_ary *new; unsigned long usage; - int i, j, size; + int i, j, size, entries; mutex_lock(&memcg->thresholds_lock); @@ -3777,14 +3779,20 @@ __mem_cgroup_threshold(memcg, type == _MEMSWAP); /* Calculate new number of threshold */ - size = 0; + size = entries = 0; for (i = 0; i < thresholds->primary->size; i++) { if (thresholds->primary->entries[i].eventfd != eventfd) size++; + else + entries++; } new = thresholds->spare; + /* If no items related to eventfd have been cleared, nothing to do */ + if (!entries) + goto unlock; + /* Set thresholds array to NULL if we don't have thresholds */ if (!size) { kfree(new); @@ -6305,19 +6313,9 @@ if (!mem_cgroup_sockets_enabled) return; - /* - * Socket cloning can throw us here with sk_memcg already - * filled. It won't however, necessarily happen from - * process context. So the test for root memcg given - * the current task's memcg won't help us in this case. - * - * Respecting the original socket's memcg is a better - * decision in this case. - */ - if (sk->sk_memcg) { - css_get(&sk->sk_memcg->css); + /* Do not associate the sock with unrelated interrupted task's memcg. */ + if (in_interrupt()) return; - } rcu_read_lock(); memcg = mem_cgroup_from_task(current); diff -Nru linux-4.19.98/mm/memory_hotplug.c linux-4.19.118/mm/memory_hotplug.c --- linux-4.19.98/mm/memory_hotplug.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/memory_hotplug.c 2020-04-23 08:30:24.000000000 +0000 @@ -255,14 +255,8 @@ if (pfn_valid(phys_start_pfn)) return -EEXIST; - ret = sparse_add_one_section(NODE_DATA(nid), phys_start_pfn, altmap); - if (ret < 0) - return ret; - - if (!want_memblock) - return 0; - - return hotplug_memory_register(nid, __pfn_to_section(phys_start_pfn)); + ret = sparse_add_one_section(nid, phys_start_pfn, altmap); + return ret < 0 ? ret : 0; } /* @@ -315,7 +309,6 @@ return err; } -#ifdef CONFIG_MEMORY_HOTREMOVE /* find the smallest valid pfn in the range [start_pfn, end_pfn) */ static unsigned long find_smallest_section_pfn(int nid, struct zone *zone, unsigned long start_pfn, @@ -456,10 +449,11 @@ pgdat->node_spanned_pages = node_end_pfn - node_start_pfn; } -static void __remove_zone(struct zone *zone, unsigned long start_pfn) +void __ref remove_pfn_range_from_zone(struct zone *zone, + unsigned long start_pfn, + unsigned long nr_pages) { struct pglist_data *pgdat = zone->zone_pgdat; - int nr_pages = PAGES_PER_SECTION; unsigned long flags; #ifdef CONFIG_ZONE_DEVICE @@ -472,37 +466,33 @@ return; #endif + clear_zone_contiguous(zone); + pgdat_resize_lock(zone->zone_pgdat, &flags); shrink_zone_span(zone, start_pfn, start_pfn + nr_pages); update_pgdat_span(pgdat); pgdat_resize_unlock(zone->zone_pgdat, &flags); + + set_zone_contiguous(zone); } -static int __remove_section(struct zone *zone, struct mem_section *ms, - unsigned long map_offset, struct vmem_altmap *altmap) +static void __remove_section(struct mem_section *ms, unsigned long map_offset, + struct vmem_altmap *altmap) { unsigned long start_pfn; int scn_nr; - int ret = -EINVAL; - if (!valid_section(ms)) - return ret; - - ret = unregister_memory_section(ms); - if (ret) - return ret; + if (WARN_ON_ONCE(!valid_section(ms))) + return; scn_nr = __section_nr(ms); start_pfn = section_nr_to_pfn((unsigned long)scn_nr); - __remove_zone(zone, start_pfn); - sparse_remove_one_section(zone, ms, map_offset, altmap); - return 0; + sparse_remove_one_section(ms, map_offset, altmap); } /** - * __remove_pages() - remove sections of pages from a zone - * @zone: zone from which pages need to be removed + * __remove_pages() - remove sections of pages * @phys_start_pfn: starting pageframe (must be aligned to start of a section) * @nr_pages: number of pages to remove (must be multiple of section size) * @altmap: alternative device page map or %NULL if default memmap is used @@ -512,34 +502,15 @@ * sure that pages are marked reserved and zones are adjust properly by * calling offline_pages(). */ -int __remove_pages(struct zone *zone, unsigned long phys_start_pfn, - unsigned long nr_pages, struct vmem_altmap *altmap) +void __remove_pages(unsigned long phys_start_pfn, unsigned long nr_pages, + struct vmem_altmap *altmap) { unsigned long i; unsigned long map_offset = 0; - int sections_to_remove, ret = 0; - - /* In the ZONE_DEVICE case device driver owns the memory region */ - if (is_dev_zone(zone)) { - if (altmap) - map_offset = vmem_altmap_offset(altmap); - } else { - resource_size_t start, size; - - start = phys_start_pfn << PAGE_SHIFT; - size = nr_pages * PAGE_SIZE; - - ret = release_mem_region_adjustable(&iomem_resource, start, - size); - if (ret) { - resource_size_t endres = start + size - 1; + int sections_to_remove; - pr_warn("Unable to release resource <%pa-%pa> (%d)\n", - &start, &endres, ret); - } - } - - clear_zone_contiguous(zone); + if (altmap) + map_offset = vmem_altmap_offset(altmap); /* * We can only remove entire sections @@ -552,18 +523,10 @@ unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION; cond_resched(); - ret = __remove_section(zone, __pfn_to_section(pfn), map_offset, - altmap); + __remove_section(__pfn_to_section(pfn), map_offset, altmap); map_offset = 0; - if (ret) - break; } - - set_zone_contiguous(zone); - - return ret; } -#endif /* CONFIG_MEMORY_HOTREMOVE */ int set_online_page_callback(online_page_callback_t callback) { @@ -932,6 +895,7 @@ (unsigned long long) pfn << PAGE_SHIFT, (((unsigned long long) pfn + nr_pages) << PAGE_SHIFT) - 1); memory_notify(MEM_CANCEL_ONLINE, &arg); + remove_pfn_range_from_zone(zone, pfn, nr_pages); mem_hotplug_done(); return ret; } @@ -1119,6 +1083,13 @@ if (ret < 0) goto error; + /* create memory block devices after memory was added */ + ret = create_memory_block_devices(start, size); + if (ret) { + arch_remove_memory(nid, start, size, NULL); + goto error; + } + if (new_node) { /* If sysfs file of new node can't be created, cpu on the node * can't be hot-added. There is no rollback way now. @@ -1709,6 +1680,7 @@ writeback_set_ratelimit(); memory_notify(MEM_OFFLINE, &arg); + remove_pfn_range_from_zone(zone, start_pfn, nr_pages); mem_hotplug_done(); return 0; @@ -1839,6 +1811,18 @@ return 0; } +static int check_no_memblock_for_node_cb(struct memory_block *mem, void *arg) +{ + int nid = *(int *)arg; + + /* + * If a memory block belongs to multiple nodes, the stored nid is not + * reliable. However, such blocks are always online (e.g., cannot get + * offlined) and, therefore, are still spanned by the node. + */ + return mem->nid == nid ? -EEXIST : 0; +} + /** * try_offline_node * @nid: the node ID @@ -1851,25 +1835,24 @@ void try_offline_node(int nid) { pg_data_t *pgdat = NODE_DATA(nid); - unsigned long start_pfn = pgdat->node_start_pfn; - unsigned long end_pfn = start_pfn + pgdat->node_spanned_pages; - unsigned long pfn; - - for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) { - unsigned long section_nr = pfn_to_section_nr(pfn); - - if (!present_section_nr(section_nr)) - continue; + int rc; - if (pfn_to_nid(pfn) != nid) - continue; + /* + * If the node still spans pages (especially ZONE_DEVICE), don't + * offline it. A node spans memory after move_pfn_range_to_zone(), + * e.g., after the memory block was onlined. + */ + if (pgdat->node_spanned_pages) + return; - /* - * some memory sections of this node are not removed, and we - * can't offline node now. - */ + /* + * Especially offline memory blocks might not be spanned by the + * node. They will get spanned by the node once they get onlined. + * However, they link to the node in sysfs and can get onlined later. + */ + rc = for_each_memory_block(&nid, check_no_memblock_for_node_cb); + if (rc) return; - } if (check_and_unmap_cpu_on_node(pgdat)) return; @@ -1883,6 +1866,26 @@ } EXPORT_SYMBOL(try_offline_node); +static void __release_memory_resource(resource_size_t start, + resource_size_t size) +{ + int ret; + + /* + * When removing memory in the same granularity as it was added, + * this function never fails. It might only fail if resources + * have to be adjusted or split. We'll ignore the error, as + * removing of memory cannot fail. + */ + ret = release_mem_region_adjustable(&iomem_resource, start, size); + if (ret) { + resource_size_t endres = start + size - 1; + + pr_warn("Unable to release resource <%pa-%pa> (%d)\n", + &start, &endres, ret); + } +} + /** * remove_memory * @nid: the node ID @@ -1893,14 +1896,12 @@ * and online/offline operations before this call, as required by * try_offline_node(). */ -void __ref remove_memory(int nid, u64 start, u64 size) +void __ref __remove_memory(int nid, u64 start, u64 size) { int ret; BUG_ON(check_hotplug_memory_range(start, size)); - mem_hotplug_begin(); - /* * All memory blocks must be offlined before removing memory. Check * whether all memory blocks in question are offline and trigger a BUG() @@ -1916,11 +1917,27 @@ memblock_free(start, size); memblock_remove(start, size); - arch_remove_memory(start, size, NULL); + /* + * Memory block device removal under the device_hotplug_lock is + * a barrier against racing online attempts. + */ + remove_memory_block_devices(start, size); + + mem_hotplug_begin(); + + arch_remove_memory(nid, start, size, NULL); + __release_memory_resource(start, size); try_offline_node(nid); mem_hotplug_done(); } + +void remove_memory(int nid, u64 start, u64 size) +{ + lock_device_hotplug(); + __remove_memory(nid, start, size); + unlock_device_hotplug(); +} EXPORT_SYMBOL_GPL(remove_memory); #endif /* CONFIG_MEMORY_HOTREMOVE */ diff -Nru linux-4.19.98/mm/mempolicy.c linux-4.19.118/mm/mempolicy.c --- linux-4.19.98/mm/mempolicy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/mempolicy.c 2020-04-23 08:30:24.000000000 +0000 @@ -2808,6 +2808,9 @@ char *flags = strchr(str, '='); int err = 1; + if (flags) + *flags++ = '\0'; /* terminate mode string */ + if (nodelist) { /* NUL-terminate mode or flags string */ *nodelist++ = '\0'; @@ -2818,9 +2821,6 @@ } else nodes_clear(nodes); - if (flags) - *flags++ = '\0'; /* terminate mode string */ - for (mode = 0; mode < MPOL_MAX; mode++) { if (!strcmp(str, policy_modes[mode])) { break; @@ -2832,7 +2832,9 @@ switch (mode) { case MPOL_PREFERRED: /* - * Insist on a nodelist of one node only + * Insist on a nodelist of one node only, although later + * we use first_node(nodes) to grab a single node, so here + * nodelist (or nodes) cannot be empty. */ if (nodelist) { char *rest = nodelist; @@ -2840,6 +2842,8 @@ rest++; if (*rest) goto out; + if (nodes_empty(nodes)) + goto out; } break; case MPOL_INTERLEAVE: diff -Nru linux-4.19.98/mm/migrate.c linux-4.19.118/mm/migrate.c --- linux-4.19.98/mm/migrate.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/migrate.c 2020-04-23 08:30:24.000000000 +0000 @@ -1623,8 +1623,19 @@ start = i; } else if (node != current_node) { err = do_move_pages_to_node(mm, &pagelist, current_node); - if (err) + if (err) { + /* + * Positive err means the number of failed + * pages to migrate. Since we are going to + * abort and return the number of non-migrated + * pages, so need to incude the rest of the + * nr_pages that have not been attempted as + * well. + */ + if (err > 0) + err += nr_pages - i - 1; goto out; + } err = store_status(status, start, current_node, i - start); if (err) goto out; @@ -1655,8 +1666,11 @@ goto out_flush; err = do_move_pages_to_node(mm, &pagelist, current_node); - if (err) + if (err) { + if (err > 0) + err += nr_pages - i - 1; goto out; + } if (i > start) { err = store_status(status, start, current_node, i - start); if (err) @@ -1670,9 +1684,16 @@ /* Make sure we do not overwrite the existing error */ err1 = do_move_pages_to_node(mm, &pagelist, current_node); + /* + * Don't have to report non-attempted pages here since: + * - If the above loop is done gracefully all pages have been + * attempted. + * - If the above loop is aborted it means a fatal error + * happened, should return ret. + */ if (!err1) err1 = store_status(status, start, current_node, i - start); - if (!err) + if (err >= 0) err = err1; out: return err; diff -Nru linux-4.19.98/mm/mprotect.c linux-4.19.118/mm/mprotect.c --- linux-4.19.98/mm/mprotect.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/mprotect.c 2020-04-23 08:30:24.000000000 +0000 @@ -162,6 +162,31 @@ return pages; } +/* + * Used when setting automatic NUMA hinting protection where it is + * critical that a numa hinting PMD is not confused with a bad PMD. + */ +static inline int pmd_none_or_clear_bad_unless_trans_huge(pmd_t *pmd) +{ + pmd_t pmdval = pmd_read_atomic(pmd); + + /* See pmd_none_or_trans_huge_or_clear_bad for info on barrier */ +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + barrier(); +#endif + + if (pmd_none(pmdval)) + return 1; + if (pmd_trans_huge(pmdval)) + return 0; + if (unlikely(pmd_bad(pmdval))) { + pmd_clear_bad(pmd); + return 1; + } + + return 0; +} + static inline unsigned long change_pmd_range(struct vm_area_struct *vma, pud_t *pud, unsigned long addr, unsigned long end, pgprot_t newprot, int dirty_accountable, int prot_numa) @@ -178,8 +203,17 @@ unsigned long this_pages; next = pmd_addr_end(addr, end); - if (!is_swap_pmd(*pmd) && !pmd_trans_huge(*pmd) && !pmd_devmap(*pmd) - && pmd_none_or_clear_bad(pmd)) + + /* + * Automatic NUMA balancing walks the tables with mmap_sem + * held for read. It's possible a parallel update to occur + * between pmd_trans_huge() and a pmd_none_or_clear_bad() + * check leading to a false positive and clearing. + * Hence, it's necessary to atomically read the PMD value + * for all the checks. + */ + if (!is_swap_pmd(*pmd) && !pmd_devmap(*pmd) && + pmd_none_or_clear_bad_unless_trans_huge(pmd)) goto next; /* invoke the mmu notifier if the pmd is populated */ diff -Nru linux-4.19.98/mm/nommu.c linux-4.19.118/mm/nommu.c --- linux-4.19.98/mm/nommu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/nommu.c 2020-04-23 08:30:24.000000000 +0000 @@ -446,10 +446,14 @@ EXPORT_SYMBOL_GPL(vm_unmap_aliases); /* - * Implement a stub for vmalloc_sync_all() if the architecture chose not to - * have one. + * Implement a stub for vmalloc_sync_[un]mapping() if the architecture + * chose not to have one. */ -void __weak vmalloc_sync_all(void) +void __weak vmalloc_sync_mappings(void) +{ +} + +void __weak vmalloc_sync_unmappings(void) { } diff -Nru linux-4.19.98/mm/page_alloc.c linux-4.19.118/mm/page_alloc.c --- linux-4.19.98/mm/page_alloc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/page_alloc.c 2020-04-23 08:30:24.000000000 +0000 @@ -4537,11 +4537,11 @@ /* Even if we own the page, we do not use atomic_set(). * This would break get_page_unless_zero() users. */ - page_ref_add(page, size); + page_ref_add(page, PAGE_FRAG_CACHE_MAX_SIZE); /* reset page count bias and offset to start of new frag */ nc->pfmemalloc = page_is_pfmemalloc(page); - nc->pagecnt_bias = size + 1; + nc->pagecnt_bias = PAGE_FRAG_CACHE_MAX_SIZE + 1; nc->offset = size; } @@ -4557,10 +4557,10 @@ size = nc->size; #endif /* OK, page count is 0, we can safely set it */ - set_page_count(page, size + 1); + set_page_count(page, PAGE_FRAG_CACHE_MAX_SIZE + 1); /* reset page count bias and offset to start of new frag */ - nc->pagecnt_bias = size + 1; + nc->pagecnt_bias = PAGE_FRAG_CACHE_MAX_SIZE + 1; offset = size - fragsz; } @@ -6456,45 +6456,75 @@ } #if defined(CONFIG_HAVE_MEMBLOCK) && !defined(CONFIG_FLAT_NODE_MEM_MAP) + +/* + * Zero all valid struct pages in range [spfn, epfn), return number of struct + * pages zeroed + */ +static u64 zero_pfn_range(unsigned long spfn, unsigned long epfn) +{ + unsigned long pfn; + u64 pgcnt = 0; + + for (pfn = spfn; pfn < epfn; pfn++) { + if (!pfn_valid(ALIGN_DOWN(pfn, pageblock_nr_pages))) { + pfn = ALIGN_DOWN(pfn, pageblock_nr_pages) + + pageblock_nr_pages - 1; + continue; + } + mm_zero_struct_page(pfn_to_page(pfn)); + pgcnt++; + } + + return pgcnt; +} + /* * Only struct pages that are backed by physical memory are zeroed and * initialized by going through __init_single_page(). But, there are some * struct pages which are reserved in memblock allocator and their fields * may be accessed (for example page_to_pfn() on some configuration accesses * flags). We must explicitly zero those struct pages. + * + * This function also addresses a similar issue where struct pages are left + * uninitialized because the physical address range is not covered by + * memblock.memory or memblock.reserved. That could happen when memblock + * layout is manually configured via memmap=, or when the highest physical + * address (max_pfn) does not end on a section boundary. */ void __init zero_resv_unavail(void) { phys_addr_t start, end; - unsigned long pfn; u64 i, pgcnt; + phys_addr_t next = 0; /* - * Loop through ranges that are reserved, but do not have reported - * physical memory backing. + * Loop through unavailable ranges not covered by memblock.memory. */ pgcnt = 0; - for_each_resv_unavail_range(i, &start, &end) { - for (pfn = PFN_DOWN(start); pfn < PFN_UP(end); pfn++) { - if (!pfn_valid(ALIGN_DOWN(pfn, pageblock_nr_pages))) { - pfn = ALIGN_DOWN(pfn, pageblock_nr_pages) - + pageblock_nr_pages - 1; - continue; - } - mm_zero_struct_page(pfn_to_page(pfn)); - pgcnt++; - } + for_each_mem_range(i, &memblock.memory, NULL, + NUMA_NO_NODE, MEMBLOCK_NONE, &start, &end, NULL) { + if (next < start) + pgcnt += zero_pfn_range(PFN_DOWN(next), PFN_UP(start)); + next = end; } /* + * Early sections always have a fully populated memmap for the whole + * section - see pfn_valid(). If the last section has holes at the + * end and that section is marked "online", the memmap will be + * considered initialized. Make sure that memmap has a well defined + * state. + */ + pgcnt += zero_pfn_range(PFN_DOWN(next), + round_up(max_pfn, PAGES_PER_SECTION)); + + /* * Struct pages that do not have backing memory. This could be because * firmware is using some of this memory, or for some other reasons. - * Once memblock is changed so such behaviour is not allowed: i.e. - * list of "reserved" memory must be a subset of list of "memory", then - * this code can be removed. */ if (pgcnt) - pr_info("Reserved but unavailable: %lld pages", pgcnt); + pr_info("Zeroed struct page in unavailable ranges: %lld pages", pgcnt); } #endif /* CONFIG_HAVE_MEMBLOCK && !CONFIG_FLAT_NODE_MEM_MAP */ diff -Nru linux-4.19.98/mm/slub.c linux-4.19.118/mm/slub.c --- linux-4.19.98/mm/slub.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/slub.c 2020-04-23 08:30:24.000000000 +0000 @@ -249,7 +249,7 @@ unsigned long ptr_addr) { #ifdef CONFIG_SLAB_FREELIST_HARDENED - return (void *)((unsigned long)ptr ^ s->random ^ ptr_addr); + return (void *)((unsigned long)ptr ^ s->random ^ swab(ptr_addr)); #else return ptr; #endif @@ -1906,8 +1906,6 @@ if (node == NUMA_NO_NODE) searchnode = numa_mem_id(); - else if (!node_present_pages(node)) - searchnode = node_to_mem_node(node); object = get_partial_node(s, get_node(s, searchnode), c, flags); if (object || node != NUMA_NO_NODE) @@ -2504,17 +2502,27 @@ struct page *page; page = c->page; - if (!page) + if (!page) { + /* + * if the node is not online or has no normal memory, just + * ignore the node constraint + */ + if (unlikely(node != NUMA_NO_NODE && + !node_state(node, N_NORMAL_MEMORY))) + node = NUMA_NO_NODE; goto new_slab; + } redo: if (unlikely(!node_match(page, node))) { - int searchnode = node; - - if (node != NUMA_NO_NODE && !node_present_pages(node)) - searchnode = node_to_mem_node(node); - - if (unlikely(!node_match(page, searchnode))) { + /* + * same as above but node_match() being false already + * implies node != NUMA_NO_NODE + */ + if (!node_state(node, N_NORMAL_MEMORY)) { + node = NUMA_NO_NODE; + goto redo; + } else { stat(s, ALLOC_NODE_MISMATCH); deactivate_slab(s, page, c->freelist, c); goto new_slab; @@ -2926,11 +2934,13 @@ barrier(); if (likely(page == c->page)) { - set_freepointer(s, tail_obj, c->freelist); + void **freelist = READ_ONCE(c->freelist); + + set_freepointer(s, tail_obj, freelist); if (unlikely(!this_cpu_cmpxchg_double( s->cpu_slab->freelist, s->cpu_slab->tid, - c->freelist, tid, + freelist, tid, head, next_tid(tid)))) { note_cmpxchg_failure("slab_free", s, tid); @@ -3104,6 +3114,15 @@ if (unlikely(!object)) { /* + * We may have removed an object from c->freelist using + * the fastpath in the previous iteration; in that case, + * c->tid has not been bumped yet. + * Since ___slab_alloc() may reenable interrupts while + * allocating memory, we should bump c->tid now. + */ + c->tid = next_tid(c->tid); + + /* * Invoking slow path likely have side-effect * of re-populating per CPU c->freelist */ diff -Nru linux-4.19.98/mm/sparse.c linux-4.19.118/mm/sparse.c --- linux-4.19.98/mm/sparse.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/sparse.c 2020-04-23 08:30:24.000000000 +0000 @@ -576,7 +576,6 @@ vmemmap_free(start, end, altmap); } -#ifdef CONFIG_MEMORY_HOTREMOVE static void free_map_bootmem(struct page *memmap) { unsigned long start = (unsigned long)memmap; @@ -584,7 +583,6 @@ vmemmap_free(start, end, NULL); } -#endif /* CONFIG_MEMORY_HOTREMOVE */ #else static struct page *__kmalloc_section_memmap(void) { @@ -623,7 +621,6 @@ get_order(sizeof(struct page) * PAGES_PER_SECTION)); } -#ifdef CONFIG_MEMORY_HOTREMOVE static void free_map_bootmem(struct page *memmap) { unsigned long maps_section_nr, removing_section_nr, i; @@ -653,7 +650,6 @@ put_page_bootmem(page); } } -#endif /* CONFIG_MEMORY_HOTREMOVE */ #endif /* CONFIG_SPARSEMEM_VMEMMAP */ /* @@ -661,25 +657,24 @@ * set. If this is <=0, then that means that the passed-in * map was not consumed and must be freed. */ -int __meminit sparse_add_one_section(struct pglist_data *pgdat, - unsigned long start_pfn, struct vmem_altmap *altmap) +int __meminit sparse_add_one_section(int nid, unsigned long start_pfn, + struct vmem_altmap *altmap) { unsigned long section_nr = pfn_to_section_nr(start_pfn); struct mem_section *ms; struct page *memmap; unsigned long *usemap; - unsigned long flags; int ret; /* * no locking for this, because it does its own * plus, it does a kmalloc */ - ret = sparse_index_init(section_nr, pgdat->node_id); + ret = sparse_index_init(section_nr, nid); if (ret < 0 && ret != -EEXIST) return ret; ret = 0; - memmap = kmalloc_section_memmap(section_nr, pgdat->node_id, altmap); + memmap = kmalloc_section_memmap(section_nr, nid, altmap); if (!memmap) return -ENOMEM; usemap = __kmalloc_section_usemap(); @@ -688,8 +683,6 @@ return -ENOMEM; } - pgdat_resize_lock(pgdat, &flags); - ms = __pfn_to_section(start_pfn); if (ms->section_mem_map & SECTION_MARKED_PRESENT) { ret = -EEXIST; @@ -708,7 +701,6 @@ sparse_init_one_section(ms, section_nr, memmap, usemap); out: - pgdat_resize_unlock(pgdat, &flags); if (ret < 0) { kfree(usemap); __kfree_section_memmap(memmap, altmap); @@ -716,7 +708,6 @@ return ret; } -#ifdef CONFIG_MEMORY_HOTREMOVE #ifdef CONFIG_MEMORY_FAILURE static void clear_hwpoisoned_pages(struct page *memmap, int nr_pages) { @@ -766,14 +757,12 @@ free_map_bootmem(memmap); } -void sparse_remove_one_section(struct zone *zone, struct mem_section *ms, - unsigned long map_offset, struct vmem_altmap *altmap) +void sparse_remove_one_section(struct mem_section *ms, unsigned long map_offset, + struct vmem_altmap *altmap) { struct page *memmap = NULL; - unsigned long *usemap = NULL, flags; - struct pglist_data *pgdat = zone->zone_pgdat; + unsigned long *usemap = NULL; - pgdat_resize_lock(pgdat, &flags); if (ms->section_mem_map) { usemap = ms->pageblock_flags; memmap = sparse_decode_mem_map(ms->section_mem_map, @@ -781,11 +770,9 @@ ms->section_mem_map = 0; ms->pageblock_flags = NULL; } - pgdat_resize_unlock(pgdat, &flags); clear_hwpoisoned_pages(memmap + map_offset, PAGES_PER_SECTION - map_offset); free_section_usemap(memmap, usemap, altmap); } -#endif /* CONFIG_MEMORY_HOTREMOVE */ #endif /* CONFIG_MEMORY_HOTPLUG */ diff -Nru linux-4.19.98/mm/vmalloc.c linux-4.19.118/mm/vmalloc.c --- linux-4.19.98/mm/vmalloc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/vmalloc.c 2020-04-23 08:30:24.000000000 +0000 @@ -1668,7 +1668,6 @@ nr_pages = get_vm_area_size(area) >> PAGE_SHIFT; array_size = (nr_pages * sizeof(struct page *)); - area->nr_pages = nr_pages; /* Please note that the recursion is strictly bounded. */ if (array_size > PAGE_SIZE) { pages = __vmalloc_node(array_size, 1, nested_gfp|highmem_mask, @@ -1676,13 +1675,16 @@ } else { pages = kmalloc_node(array_size, nested_gfp, node); } - area->pages = pages; - if (!area->pages) { + + if (!pages) { remove_vm_area(area->addr); kfree(area); return NULL; } + area->pages = pages; + area->nr_pages = nr_pages; + for (i = 0; i < area->nr_pages; i++) { struct page *page; @@ -1755,7 +1757,7 @@ * First make sure the mappings are removed from all page-tables * before they are freed. */ - vmalloc_sync_all(); + vmalloc_sync_unmappings(); /* * In this function, newly allocated vm_struct has VM_UNINITIALIZED @@ -2300,16 +2302,19 @@ EXPORT_SYMBOL(remap_vmalloc_range); /* - * Implement a stub for vmalloc_sync_all() if the architecture chose not to - * have one. + * Implement stubs for vmalloc_sync_[un]mappings () if the architecture chose + * not to have one. * * The purpose of this function is to make sure the vmalloc area * mappings are identical in all page-tables in the system. */ -void __weak vmalloc_sync_all(void) +void __weak vmalloc_sync_mappings(void) { } +void __weak vmalloc_sync_unmappings(void) +{ +} static int f(pte_t *pte, pgtable_t table, unsigned long addr, void *data) { diff -Nru linux-4.19.98/mm/vmscan.c linux-4.19.118/mm/vmscan.c --- linux-4.19.98/mm/vmscan.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/mm/vmscan.c 2020-04-23 08:30:24.000000000 +0000 @@ -2446,10 +2446,13 @@ /* * Scan types proportional to swappiness and * their relative recent reclaim efficiency. - * Make sure we don't miss the last page - * because of a round-off error. + * Make sure we don't miss the last page on + * the offlined memory cgroups because of a + * round-off error. */ - scan = DIV64_U64_ROUND_UP(scan * fraction[file], + scan = mem_cgroup_online(memcg) ? + div64_u64(scan * fraction[file], denominator) : + DIV64_U64_ROUND_UP(scan * fraction[file], denominator); break; case SCAN_FILE: diff -Nru linux-4.19.98/net/6lowpan/nhc.c linux-4.19.118/net/6lowpan/nhc.c --- linux-4.19.98/net/6lowpan/nhc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/6lowpan/nhc.c 2020-04-23 08:30:24.000000000 +0000 @@ -18,7 +18,7 @@ #include "nhc.h" static struct rb_root rb_root = RB_ROOT; -static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX]; +static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1]; static DEFINE_SPINLOCK(lowpan_nhc_lock); static int lowpan_nhc_insert(struct lowpan_nhc *nhc) diff -Nru linux-4.19.98/net/batman-adv/bat_iv_ogm.c linux-4.19.118/net/batman-adv/bat_iv_ogm.c --- linux-4.19.98/net/batman-adv/bat_iv_ogm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/batman-adv/bat_iv_ogm.c 2020-04-23 08:30:24.000000000 +0000 @@ -970,6 +970,10 @@ lockdep_assert_held(&hard_iface->bat_iv.ogm_buff_mutex); + /* interface already disabled by batadv_iv_ogm_iface_disable */ + if (!*ogm_buff) + return; + /* the interface gets activated here to avoid race conditions between * the moment of activating the interface in * hardif_activate_interface() where the originator mac is set and diff -Nru linux-4.19.98/net/batman-adv/bat_v_ogm.c linux-4.19.118/net/batman-adv/bat_v_ogm.c --- linux-4.19.98/net/batman-adv/bat_v_ogm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/batman-adv/bat_v_ogm.c 2020-04-23 08:30:24.000000000 +0000 @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -128,14 +130,12 @@ } /** - * batadv_v_ogm_send() - periodic worker broadcasting the own OGM - * @work: work queue item + * batadv_v_ogm_send_softif() - periodic worker broadcasting the own OGM + * @bat_priv: the bat priv with all the soft interface information */ -static void batadv_v_ogm_send(struct work_struct *work) +static void batadv_v_ogm_send_softif(struct batadv_priv *bat_priv) { struct batadv_hard_iface *hard_iface; - struct batadv_priv_bat_v *bat_v; - struct batadv_priv *bat_priv; struct batadv_ogm2_packet *ogm_packet; struct sk_buff *skb, *skb_tmp; unsigned char *ogm_buff; @@ -143,8 +143,7 @@ u16 tvlv_len = 0; int ret; - bat_v = container_of(work, struct batadv_priv_bat_v, ogm_wq.work); - bat_priv = container_of(bat_v, struct batadv_priv, bat_v); + lockdep_assert_held(&bat_priv->bat_v.ogm_buff_mutex); if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) goto out; @@ -236,6 +235,23 @@ } /** + * batadv_v_ogm_send() - periodic worker broadcasting the own OGM + * @work: work queue item + */ +static void batadv_v_ogm_send(struct work_struct *work) +{ + struct batadv_priv_bat_v *bat_v; + struct batadv_priv *bat_priv; + + bat_v = container_of(work, struct batadv_priv_bat_v, ogm_wq.work); + bat_priv = container_of(bat_v, struct batadv_priv, bat_v); + + mutex_lock(&bat_priv->bat_v.ogm_buff_mutex); + batadv_v_ogm_send_softif(bat_priv); + mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex); +} + +/** * batadv_v_ogm_iface_enable() - prepare an interface for B.A.T.M.A.N. V * @hard_iface: the interface to prepare * @@ -261,11 +277,15 @@ struct batadv_priv *bat_priv = netdev_priv(primary_iface->soft_iface); struct batadv_ogm2_packet *ogm_packet; + mutex_lock(&bat_priv->bat_v.ogm_buff_mutex); if (!bat_priv->bat_v.ogm_buff) - return; + goto unlock; ogm_packet = (struct batadv_ogm2_packet *)bat_priv->bat_v.ogm_buff; ether_addr_copy(ogm_packet->orig, primary_iface->net_dev->dev_addr); + +unlock: + mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex); } /** @@ -887,6 +907,8 @@ atomic_set(&bat_priv->bat_v.ogm_seqno, random_seqno); INIT_DELAYED_WORK(&bat_priv->bat_v.ogm_wq, batadv_v_ogm_send); + mutex_init(&bat_priv->bat_v.ogm_buff_mutex); + return 0; } @@ -898,7 +920,11 @@ { cancel_delayed_work_sync(&bat_priv->bat_v.ogm_wq); + mutex_lock(&bat_priv->bat_v.ogm_buff_mutex); + kfree(bat_priv->bat_v.ogm_buff); bat_priv->bat_v.ogm_buff = NULL; bat_priv->bat_v.ogm_buff_len = 0; + + mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex); } diff -Nru linux-4.19.98/net/batman-adv/types.h linux-4.19.118/net/batman-adv/types.h --- linux-4.19.98/net/batman-adv/types.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/batman-adv/types.h 2020-04-23 08:30:24.000000000 +0000 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include /* for linux/wait.h */ @@ -1493,6 +1494,9 @@ /** @ogm_seqno: OGM sequence number - used to identify each OGM */ atomic_t ogm_seqno; + /** @ogm_buff_mutex: lock protecting ogm_buff and ogm_buff_len */ + struct mutex ogm_buff_mutex; + /** @ogm_wq: workqueue used to schedule OGM transmissions */ struct delayed_work ogm_wq; }; diff -Nru linux-4.19.98/net/bluetooth/hci_sock.c linux-4.19.118/net/bluetooth/hci_sock.c --- linux-4.19.98/net/bluetooth/hci_sock.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/bluetooth/hci_sock.c 2020-04-23 08:30:24.000000000 +0000 @@ -831,6 +831,8 @@ if (!sk) return 0; + lock_sock(sk); + switch (hci_pi(sk)->channel) { case HCI_CHANNEL_MONITOR: atomic_dec(&monitor_promisc); @@ -878,6 +880,7 @@ skb_queue_purge(&sk->sk_receive_queue); skb_queue_purge(&sk->sk_write_queue); + release_sock(sk); sock_put(sk); return 0; } diff -Nru linux-4.19.98/net/bluetooth/rfcomm/tty.c linux-4.19.118/net/bluetooth/rfcomm/tty.c --- linux-4.19.98/net/bluetooth/rfcomm/tty.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/bluetooth/rfcomm/tty.c 2020-04-23 08:30:24.000000000 +0000 @@ -413,10 +413,8 @@ dlc = rfcomm_dlc_exists(&req.src, &req.dst, req.channel); if (IS_ERR(dlc)) return PTR_ERR(dlc); - else if (dlc) { - rfcomm_dlc_put(dlc); + if (dlc) return -EBUSY; - } dlc = rfcomm_dlc_alloc(GFP_KERNEL); if (!dlc) return -ENOMEM; diff -Nru linux-4.19.98/net/bpfilter/bpfilter_kern.c linux-4.19.118/net/bpfilter/bpfilter_kern.c --- linux-4.19.98/net/bpfilter/bpfilter_kern.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/bpfilter/bpfilter_kern.c 2020-04-23 08:30:24.000000000 +0000 @@ -25,7 +25,7 @@ return; tsk = get_pid_task(find_vpid(info->pid), PIDTYPE_PID); if (tsk) { - force_sig(SIGKILL, tsk); + send_sig(SIGKILL, tsk, 1); put_task_struct(tsk); } fput(info->pipe_to_umh); diff -Nru linux-4.19.98/net/bridge/br_arp_nd_proxy.c linux-4.19.118/net/bridge/br_arp_nd_proxy.c --- linux-4.19.98/net/bridge/br_arp_nd_proxy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/bridge/br_arp_nd_proxy.c 2020-04-23 08:30:24.000000000 +0000 @@ -311,7 +311,7 @@ /* Neighbor Advertisement */ memset(na, 0, sizeof(*na) + na_olen); na->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; - na->icmph.icmp6_router = 0; /* XXX: should be 1 ? */ + na->icmph.icmp6_router = (n->flags & NTF_ROUTER) ? 1 : 0; na->icmph.icmp6_override = 1; na->icmph.icmp6_solicited = 1; na->target = ns->target; diff -Nru linux-4.19.98/net/bridge/netfilter/ebtables.c linux-4.19.118/net/bridge/netfilter/ebtables.c --- linux-4.19.98/net/bridge/netfilter/ebtables.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/bridge/netfilter/ebtables.c 2020-04-23 08:30:24.000000000 +0000 @@ -2165,7 +2165,9 @@ if (ret < 0) return ret; - WARN_ON(size_remaining); + if (size_remaining) + return -EINVAL; + return state->buf_kern_offset; } diff -Nru linux-4.19.98/net/ceph/osdmap.c linux-4.19.118/net/ceph/osdmap.c --- linux-4.19.98/net/ceph/osdmap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ceph/osdmap.c 2020-04-23 08:30:24.000000000 +0000 @@ -711,6 +711,15 @@ } EXPORT_SYMBOL(ceph_pg_poolid_by_name); +u64 ceph_pg_pool_flags(struct ceph_osdmap *map, u64 id) +{ + struct ceph_pg_pool_info *pi; + + pi = __lookup_pg_pool(&map->pg_pools, id); + return pi ? pi->flags : 0; +} +EXPORT_SYMBOL(ceph_pg_pool_flags); + static void __remove_pg_pool(struct rb_root *root, struct ceph_pg_pool_info *pi) { rb_erase(&pi->node, root); diff -Nru linux-4.19.98/net/core/dev.c linux-4.19.118/net/core/dev.c --- linux-4.19.98/net/core/dev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/dev.c 2020-04-23 08:30:24.000000000 +0000 @@ -2854,6 +2854,8 @@ if (skb_rx_queue_recorded(skb)) { hash = skb_get_rx_queue(skb); + if (hash >= qoffset) + hash -= qoffset; while (unlikely(hash >= qcount)) hash -= qcount; return hash + qoffset; @@ -3932,7 +3934,8 @@ int netdev_tstamp_prequeue __read_mostly = 1; int netdev_budget __read_mostly = 300; -unsigned int __read_mostly netdev_budget_usecs = 2000; +/* Must be at least 2 jiffes to guarantee 1 jiffy timeout */ +unsigned int __read_mostly netdev_budget_usecs = 2 * USEC_PER_SEC / HZ; int weight_p __read_mostly = 64; /* old backlog weight */ int dev_weight_rx_bias __read_mostly = 1; /* bias for backlog weight */ int dev_weight_tx_bias __read_mostly = 1; /* bias for output_queue quota */ @@ -4306,14 +4309,14 @@ /* Reinjected packets coming from act_mirred or similar should * not get XDP generic processing. */ - if (skb_cloned(skb) || skb_is_tc_redirected(skb)) + if (skb_is_tc_redirected(skb)) return XDP_PASS; /* XDP packets must be linear and must have sufficient headroom * of XDP_PACKET_HEADROOM bytes. This is the guarantee that also * native XDP provides, thus we need to do it here as well. */ - if (skb_is_nonlinear(skb) || + if (skb_cloned(skb) || skb_is_nonlinear(skb) || skb_headroom(skb) < XDP_PACKET_HEADROOM) { int hroom = XDP_PACKET_HEADROOM - skb_headroom(skb); int troom = skb->tail + skb->data_len - skb->end; @@ -4349,12 +4352,17 @@ act = bpf_prog_run_xdp(xdp_prog, xdp); + /* check if bpf_xdp_adjust_head was used */ off = xdp->data - orig_data; - if (off > 0) - __skb_pull(skb, off); - else if (off < 0) - __skb_push(skb, -off); - skb->mac_header += off; + if (off) { + if (off > 0) + __skb_pull(skb, off); + else if (off < 0) + __skb_push(skb, -off); + + skb->mac_header += off; + skb_reset_network_header(skb); + } /* check if bpf_xdp_adjust_tail was used. it can only "shrink" * pckt. @@ -4465,23 +4473,6 @@ trace_netif_rx(skb); - if (static_branch_unlikely(&generic_xdp_needed_key)) { - int ret; - - preempt_disable(); - rcu_read_lock(); - ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); - rcu_read_unlock(); - preempt_enable(); - - /* Consider XDP consuming the packet a success from - * the netdev point of view we do not want to count - * this as an error. - */ - if (ret != XDP_PASS) - return NET_RX_SUCCESS; - } - #ifdef CONFIG_RPS if (static_key_false(&rps_needed)) { struct rps_dev_flow voidflow, *rflow = &voidflow; @@ -4815,6 +4806,18 @@ __this_cpu_inc(softnet_data.processed); + if (static_branch_unlikely(&generic_xdp_needed_key)) { + int ret2; + + preempt_disable(); + ret2 = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); + preempt_enable(); + + if (ret2 != XDP_PASS) + return NET_RX_DROP; + skb_reset_mac_len(skb); + } + if (skb->protocol == cpu_to_be16(ETH_P_8021Q) || skb->protocol == cpu_to_be16(ETH_P_8021AD)) { skb = skb_vlan_untag(skb); @@ -5133,19 +5136,6 @@ if (skb_defer_rx_timestamp(skb)) return NET_RX_SUCCESS; - if (static_branch_unlikely(&generic_xdp_needed_key)) { - int ret; - - preempt_disable(); - rcu_read_lock(); - ret = do_xdp_generic(rcu_dereference(skb->dev->xdp_prog), skb); - rcu_read_unlock(); - preempt_enable(); - - if (ret != XDP_PASS) - return NET_RX_DROP; - } - rcu_read_lock(); #ifdef CONFIG_RPS if (static_key_false(&rps_needed)) { @@ -5166,7 +5156,6 @@ static void netif_receive_skb_list_internal(struct list_head *head) { - struct bpf_prog *xdp_prog = NULL; struct sk_buff *skb, *next; struct list_head sublist; @@ -5179,21 +5168,6 @@ } list_splice_init(&sublist, head); - if (static_branch_unlikely(&generic_xdp_needed_key)) { - preempt_disable(); - rcu_read_lock(); - list_for_each_entry_safe(skb, next, head, list) { - xdp_prog = rcu_dereference(skb->dev->xdp_prog); - skb_list_del_init(skb); - if (do_xdp_generic(xdp_prog, skb) == XDP_PASS) - list_add_tail(&skb->list, &sublist); - } - rcu_read_unlock(); - preempt_enable(); - /* Put passed packets back on main list */ - list_splice_init(&sublist, head); - } - rcu_read_lock(); #ifdef CONFIG_RPS if (static_key_false(&rps_needed)) { @@ -7781,6 +7755,22 @@ } EXPORT_SYMBOL(__dev_set_mtu); +int dev_validate_mtu(struct net_device *dev, int new_mtu, + struct netlink_ext_ack *extack) +{ + /* MTU must be positive, and in range */ + if (new_mtu < 0 || new_mtu < dev->min_mtu) { + NL_SET_ERR_MSG(extack, "mtu less than device minimum"); + return -EINVAL; + } + + if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) { + NL_SET_ERR_MSG(extack, "mtu greater than device maximum"); + return -EINVAL; + } + return 0; +} + /** * dev_set_mtu_ext - Change maximum transfer unit * @dev: device @@ -7797,16 +7787,9 @@ if (new_mtu == dev->mtu) return 0; - /* MTU must be positive, and in range */ - if (new_mtu < 0 || new_mtu < dev->min_mtu) { - NL_SET_ERR_MSG(extack, "mtu less than device minimum"); - return -EINVAL; - } - - if (dev->max_mtu > 0 && new_mtu > dev->max_mtu) { - NL_SET_ERR_MSG(extack, "mtu greater than device maximum"); - return -EINVAL; - } + err = dev_validate_mtu(dev, new_mtu, extack); + if (err) + return err; if (!netif_device_present(dev)) return -ENODEV; @@ -8725,8 +8708,10 @@ goto err_uninit; ret = netdev_register_kobject(dev); - if (ret) + if (ret) { + dev->reg_state = NETREG_UNREGISTERED; goto err_uninit; + } dev->reg_state = NETREG_REGISTERED; __netdev_update_features(dev); diff -Nru linux-4.19.98/net/core/devlink.c linux-4.19.118/net/core/devlink.c --- linux-4.19.98/net/core/devlink.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/devlink.c 2020-04-23 08:30:24.000000000 +0000 @@ -2995,34 +2995,41 @@ struct genl_info *info, union devlink_param_value *value) { + struct nlattr *param_data; int len; - if (param->type != DEVLINK_PARAM_TYPE_BOOL && - !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) + param_data = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]; + + if (param->type != DEVLINK_PARAM_TYPE_BOOL && !param_data) return -EINVAL; switch (param->type) { case DEVLINK_PARAM_TYPE_U8: - value->vu8 = nla_get_u8(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); + if (nla_len(param_data) != sizeof(u8)) + return -EINVAL; + value->vu8 = nla_get_u8(param_data); break; case DEVLINK_PARAM_TYPE_U16: - value->vu16 = nla_get_u16(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); + if (nla_len(param_data) != sizeof(u16)) + return -EINVAL; + value->vu16 = nla_get_u16(param_data); break; case DEVLINK_PARAM_TYPE_U32: - value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); + if (nla_len(param_data) != sizeof(u32)) + return -EINVAL; + value->vu32 = nla_get_u32(param_data); break; case DEVLINK_PARAM_TYPE_STRING: - len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]), - nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); - if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) || + len = strnlen(nla_data(param_data), nla_len(param_data)); + if (len == nla_len(param_data) || len >= __DEVLINK_PARAM_MAX_STRING_VALUE) return -EINVAL; - strcpy(value->vstr, - nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])); + strcpy(value->vstr, nla_data(param_data)); break; case DEVLINK_PARAM_TYPE_BOOL: - value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ? - true : false; + if (param_data && nla_len(param_data)) + return -EINVAL; + value->vbool = nla_get_flag(param_data); break; } return 0; @@ -3600,6 +3607,8 @@ [DEVLINK_ATTR_PARAM_VALUE_CMODE] = { .type = NLA_U8 }, [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING }, [DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32 }, + [DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .type = NLA_U64 }, + [DEVLINK_ATTR_REGION_CHUNK_LEN] = { .type = NLA_U64 }, }; static const struct genl_ops devlink_nl_ops[] = { diff -Nru linux-4.19.98/net/core/fib_rules.c linux-4.19.118/net/core/fib_rules.c --- linux-4.19.98/net/core/fib_rules.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/fib_rules.c 2020-04-23 08:30:24.000000000 +0000 @@ -968,7 +968,7 @@ frh = nlmsg_data(nlh); frh->family = ops->family; - frh->table = rule->table; + frh->table = rule->table < 256 ? rule->table : RT_TABLE_COMPAT; if (nla_put_u32(skb, FRA_TABLE, rule->table)) goto nla_put_failure; if (nla_put_u32(skb, FRA_SUPPRESS_PREFIXLEN, rule->suppress_prefixlen)) diff -Nru linux-4.19.98/net/core/filter.c linux-4.19.118/net/core/filter.c --- linux-4.19.98/net/core/filter.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/filter.c 2020-04-23 08:30:24.000000000 +0000 @@ -3207,7 +3207,7 @@ return err; } default: - break; + return -EBADRQC; } return 0; } @@ -4367,7 +4367,7 @@ return -ENODEV; idev = __in6_dev_get_safely(dev); - if (unlikely(!idev || !net->ipv6.devconf_all->forwarding)) + if (unlikely(!idev || !idev->cnf.forwarding)) return BPF_FIB_LKUP_RET_FWD_DISABLED; if (flags & BPF_FIB_LOOKUP_OUTPUT) { diff -Nru linux-4.19.98/net/core/neighbour.c linux-4.19.118/net/core/neighbour.c --- linux-4.19.98/net/core/neighbour.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/neighbour.c 2020-04-23 08:30:24.000000000 +0000 @@ -1885,8 +1885,8 @@ goto nla_put_failure; { unsigned long now = jiffies; - unsigned int flush_delta = now - tbl->last_flush; - unsigned int rand_delta = now - tbl->last_rand; + long flush_delta = now - tbl->last_flush; + long rand_delta = now - tbl->last_rand; struct neigh_hash_table *nht; struct ndt_config ndc = { .ndtc_key_len = tbl->key_len, diff -Nru linux-4.19.98/net/core/net-sysfs.c linux-4.19.118/net/core/net-sysfs.c --- linux-4.19.98/net/core/net-sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/net-sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -928,25 +928,30 @@ struct kobject *kobj = &queue->kobj; int error = 0; + /* Kobject_put later will trigger rx_queue_release call which + * decreases dev refcount: Take that reference here + */ + dev_hold(queue->dev); + kobj->kset = dev->queues_kset; error = kobject_init_and_add(kobj, &rx_queue_ktype, NULL, "rx-%u", index); if (error) - return error; - - dev_hold(queue->dev); + goto err; if (dev->sysfs_rx_queue_group) { error = sysfs_create_group(kobj, dev->sysfs_rx_queue_group); - if (error) { - kobject_put(kobj); - return error; - } + if (error) + goto err; } kobject_uevent(kobj, KOBJ_ADD); return error; + +err: + kobject_put(kobj); + return error; } #endif /* CONFIG_SYSFS */ @@ -1467,25 +1472,29 @@ struct kobject *kobj = &queue->kobj; int error = 0; + /* Kobject_put later will trigger netdev_queue_release call + * which decreases dev refcount: Take that reference here + */ + dev_hold(queue->dev); + kobj->kset = dev->queues_kset; error = kobject_init_and_add(kobj, &netdev_queue_ktype, NULL, "tx-%u", index); if (error) - return error; - - dev_hold(queue->dev); + goto err; #ifdef CONFIG_BQL error = sysfs_create_group(kobj, &dql_group); - if (error) { - kobject_put(kobj); - return error; - } + if (error) + goto err; #endif kobject_uevent(kobj, KOBJ_ADD); - return 0; + +err: + kobject_put(kobj); + return error; } #endif /* CONFIG_SYSFS */ diff -Nru linux-4.19.98/net/core/netclassid_cgroup.c linux-4.19.118/net/core/netclassid_cgroup.c --- linux-4.19.98/net/core/netclassid_cgroup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/netclassid_cgroup.c 2020-04-23 08:30:24.000000000 +0000 @@ -57,30 +57,60 @@ kfree(css_cls_state(css)); } +/* + * To avoid freezing of sockets creation for tasks with big number of threads + * and opened sockets lets release file_lock every 1000 iterated descriptors. + * New sockets will already have been created with new classid. + */ + +struct update_classid_context { + u32 classid; + unsigned int batch; +}; + +#define UPDATE_CLASSID_BATCH 1000 + static int update_classid_sock(const void *v, struct file *file, unsigned n) { int err; + struct update_classid_context *ctx = (void *)v; struct socket *sock = sock_from_file(file, &err); if (sock) { spin_lock(&cgroup_sk_update_lock); - sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, - (unsigned long)v); + sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, ctx->classid); spin_unlock(&cgroup_sk_update_lock); } + if (--ctx->batch == 0) { + ctx->batch = UPDATE_CLASSID_BATCH; + return n + 1; + } return 0; } +static void update_classid_task(struct task_struct *p, u32 classid) +{ + struct update_classid_context ctx = { + .classid = classid, + .batch = UPDATE_CLASSID_BATCH + }; + unsigned int fd = 0; + + do { + task_lock(p); + fd = iterate_fd(p->files, fd, update_classid_sock, &ctx); + task_unlock(p); + cond_resched(); + } while (fd); +} + static void cgrp_attach(struct cgroup_taskset *tset) { struct cgroup_subsys_state *css; struct task_struct *p; cgroup_taskset_for_each(p, css, tset) { - task_lock(p); - iterate_fd(p->files, 0, update_classid_sock, - (void *)(unsigned long)css_cls_state(css)->classid); - task_unlock(p); + update_classid_task(p, css_cls_state(css)->classid); } } @@ -102,10 +132,7 @@ css_task_iter_start(css, 0, &it); while ((p = css_task_iter_next(&it))) { - task_lock(p); - iterate_fd(p->files, 0, update_classid_sock, - (void *)(unsigned long)cs->classid); - task_unlock(p); + update_classid_task(p, cs->classid); cond_resched(); } css_task_iter_end(&it); diff -Nru linux-4.19.98/net/core/rtnetlink.c linux-4.19.118/net/core/rtnetlink.c --- linux-4.19.98/net/core/rtnetlink.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/rtnetlink.c 2020-04-23 08:30:24.000000000 +0000 @@ -2875,8 +2875,17 @@ dev->rtnl_link_ops = ops; dev->rtnl_link_state = RTNL_LINK_INITIALIZING; - if (tb[IFLA_MTU]) - dev->mtu = nla_get_u32(tb[IFLA_MTU]); + if (tb[IFLA_MTU]) { + u32 mtu = nla_get_u32(tb[IFLA_MTU]); + int err; + + err = dev_validate_mtu(dev, mtu, NULL); + if (err) { + free_netdev(dev); + return ERR_PTR(err); + } + dev->mtu = mtu; + } if (tb[IFLA_ADDRESS]) { memcpy(dev->dev_addr, nla_data(tb[IFLA_ADDRESS]), nla_len(tb[IFLA_ADDRESS])); diff -Nru linux-4.19.98/net/core/sock.c linux-4.19.118/net/core/sock.c --- linux-4.19.98/net/core/sock.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/sock.c 2020-04-23 08:30:24.000000000 +0000 @@ -1689,7 +1689,10 @@ atomic_set(&newsk->sk_zckey, 0); sock_reset_flag(newsk, SOCK_DONE); - mem_cgroup_sk_alloc(newsk); + + /* sk->sk_memcg will be populated at accept() time */ + newsk->sk_memcg = NULL; + cgroup_sk_alloc(&newsk->sk_cgrp_data); rcu_read_lock(); @@ -2179,8 +2182,8 @@ } else { unsigned long *memory_pressure = sk->sk_prot->memory_pressure; - if (memory_pressure && *memory_pressure) - *memory_pressure = 0; + if (memory_pressure && READ_ONCE(*memory_pressure)) + WRITE_ONCE(*memory_pressure, 0); } } diff -Nru linux-4.19.98/net/core/utils.c linux-4.19.118/net/core/utils.c --- linux-4.19.98/net/core/utils.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/core/utils.c 2020-04-23 08:30:24.000000000 +0000 @@ -442,6 +442,23 @@ } EXPORT_SYMBOL(inet_proto_csum_replace4); +/** + * inet_proto_csum_replace16 - update layer 4 header checksum field + * @sum: Layer 4 header checksum field + * @skb: sk_buff for the packet + * @from: old IPv6 address + * @to: new IPv6 address + * @pseudohdr: True if layer 4 header checksum includes pseudoheader + * + * Update layer 4 header as per the update in IPv6 src/dst address. + * + * There is no need to update skb->csum in this function, because update in two + * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other + * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to + * update skb->csum, because update in 3 fields a.) IPv4 src/dst address, + * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as + * L4 Header checksum for skb->csum calculation. + */ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb, const __be32 *from, const __be32 *to, bool pseudohdr) @@ -453,9 +470,6 @@ if (skb->ip_summed != CHECKSUM_PARTIAL) { *sum = csum_fold(csum_partial(diff, sizeof(diff), ~csum_unfold(*sum))); - if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr) - skb->csum = ~csum_partial(diff, sizeof(diff), - ~skb->csum); } else if (pseudohdr) *sum = ~csum_fold(csum_partial(diff, sizeof(diff), csum_unfold(*sum))); diff -Nru linux-4.19.98/net/dns_resolver/dns_key.c linux-4.19.118/net/dns_resolver/dns_key.c --- linux-4.19.98/net/dns_resolver/dns_key.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/dns_resolver/dns_key.c 2020-04-23 08:30:24.000000000 +0000 @@ -241,7 +241,7 @@ * - the key's semaphore is read-locked */ static long dns_resolver_read(const struct key *key, - char __user *buffer, size_t buflen) + char *buffer, size_t buflen) { int err = PTR_ERR(key->payload.data[dns_key_error]); diff -Nru linux-4.19.98/net/dsa/port.c linux-4.19.118/net/dsa/port.c --- linux-4.19.98/net/dsa/port.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/dsa/port.c 2020-04-23 08:30:24.000000000 +0000 @@ -69,7 +69,6 @@ int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) { - u8 stp_state = dp->bridge_dev ? BR_STATE_BLOCKING : BR_STATE_FORWARDING; struct dsa_switch *ds = dp->ds; int port = dp->index; int err; @@ -80,7 +79,8 @@ return err; } - dsa_port_set_state_now(dp, stp_state); + if (!dp->bridge_dev) + dsa_port_set_state_now(dp, BR_STATE_FORWARDING); return 0; } @@ -90,7 +90,8 @@ struct dsa_switch *ds = dp->ds; int port = dp->index; - dsa_port_set_state_now(dp, BR_STATE_DISABLED); + if (!dp->bridge_dev) + dsa_port_set_state_now(dp, BR_STATE_DISABLED); if (ds->ops->port_disable) ds->ops->port_disable(ds, port, phy); diff -Nru linux-4.19.98/net/dsa/slave.c linux-4.19.118/net/dsa/slave.c --- linux-4.19.98/net/dsa/slave.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/dsa/slave.c 2020-04-23 08:30:24.000000000 +0000 @@ -1219,9 +1219,9 @@ phy_flags = ds->ops->get_phy_flags(ds, dp->index); ret = phylink_of_phy_connect(dp->pl, port_dn, phy_flags); - if (ret == -ENODEV) { - /* We could not connect to a designated PHY or SFP, so use the - * switch internal MDIO bus instead + if (ret == -ENODEV && ds->slave_mii_bus) { + /* We could not connect to a designated PHY or SFP, so try to + * use the switch internal MDIO bus instead */ ret = dsa_slave_phy_connect(slave_dev, dp->index); if (ret) { @@ -1233,7 +1233,7 @@ } } - return 0; + return ret; } static struct lock_class_key dsa_slave_netdev_xmit_lock_key; diff -Nru linux-4.19.98/net/dsa/tag_brcm.c linux-4.19.118/net/dsa/tag_brcm.c --- linux-4.19.98/net/dsa/tag_brcm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/dsa/tag_brcm.c 2020-04-23 08:30:24.000000000 +0000 @@ -141,6 +141,8 @@ /* Remove Broadcom tag and update checksum */ skb_pull_rcsum(skb, BRCM_TAG_LEN); + skb->offload_fwd_mark = 1; + return skb; } diff -Nru linux-4.19.98/net/dsa/tag_qca.c linux-4.19.118/net/dsa/tag_qca.c --- linux-4.19.98/net/dsa/tag_qca.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/dsa/tag_qca.c 2020-04-23 08:30:24.000000000 +0000 @@ -41,7 +41,7 @@ struct dsa_port *dp = dsa_slave_to_port(dev); u16 *phdr, hdr; - if (skb_cow_head(skb, 0) < 0) + if (skb_cow_head(skb, QCA_HDR_LEN) < 0) return NULL; skb_push(skb, QCA_HDR_LEN); diff -Nru linux-4.19.98/net/hsr/hsr_framereg.c linux-4.19.118/net/hsr/hsr_framereg.c --- linux-4.19.98/net/hsr/hsr_framereg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/hsr/hsr_framereg.c 2020-04-23 08:30:24.000000000 +0000 @@ -466,13 +466,9 @@ struct hsr_port *port; unsigned long tdiff; - - rcu_read_lock(); node = find_node_by_AddrA(&hsr->node_db, addr); - if (!node) { - rcu_read_unlock(); - return -ENOENT; /* No such entry */ - } + if (!node) + return -ENOENT; ether_addr_copy(addr_b, node->MacAddressB); @@ -507,7 +503,5 @@ *addr_b_ifindex = -1; } - rcu_read_unlock(); - return 0; } diff -Nru linux-4.19.98/net/hsr/hsr_netlink.c linux-4.19.118/net/hsr/hsr_netlink.c --- linux-4.19.98/net/hsr/hsr_netlink.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/hsr/hsr_netlink.c 2020-04-23 08:30:24.000000000 +0000 @@ -64,10 +64,16 @@ else multicast_spec = nla_get_u8(data[IFLA_HSR_MULTICAST_SPEC]); - if (!data[IFLA_HSR_VERSION]) + if (!data[IFLA_HSR_VERSION]) { hsr_version = 0; - else + } else { hsr_version = nla_get_u8(data[IFLA_HSR_VERSION]); + if (hsr_version > 1) { + NL_SET_ERR_MSG_MOD(extack, + "Only versions 0..1 are supported"); + return -EINVAL; + } + } return hsr_dev_finalize(dev, link, multicast_spec, hsr_version); } @@ -259,17 +265,16 @@ if (!na) goto invalid; - hsr_dev = __dev_get_by_index(genl_info_net(info), - nla_get_u32(info->attrs[HSR_A_IFINDEX])); + rcu_read_lock(); + hsr_dev = dev_get_by_index_rcu(genl_info_net(info), + nla_get_u32(info->attrs[HSR_A_IFINDEX])); if (!hsr_dev) - goto invalid; + goto rcu_unlock; if (!is_hsr_master(hsr_dev)) - goto invalid; - + goto rcu_unlock; /* Send reply */ - - skb_out = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); + skb_out = genlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC); if (!skb_out) { res = -ENOMEM; goto fail; @@ -321,12 +326,10 @@ res = nla_put_u16(skb_out, HSR_A_IF1_SEQ, hsr_node_if1_seq); if (res < 0) goto nla_put_failure; - rcu_read_lock(); port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_A); if (port) res = nla_put_u32(skb_out, HSR_A_IF1_IFINDEX, port->dev->ifindex); - rcu_read_unlock(); if (res < 0) goto nla_put_failure; @@ -336,20 +339,22 @@ res = nla_put_u16(skb_out, HSR_A_IF2_SEQ, hsr_node_if2_seq); if (res < 0) goto nla_put_failure; - rcu_read_lock(); port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_B); if (port) res = nla_put_u32(skb_out, HSR_A_IF2_IFINDEX, port->dev->ifindex); - rcu_read_unlock(); if (res < 0) goto nla_put_failure; + rcu_read_unlock(); + genlmsg_end(skb_out, msg_head); genlmsg_unicast(genl_info_net(info), skb_out, info->snd_portid); return 0; +rcu_unlock: + rcu_read_unlock(); invalid: netlink_ack(skb_in, nlmsg_hdr(skb_in), -EINVAL, NULL); return 0; @@ -359,6 +364,7 @@ /* Fall through */ fail: + rcu_read_unlock(); return res; } @@ -366,16 +372,14 @@ */ static int hsr_get_node_list(struct sk_buff *skb_in, struct genl_info *info) { - /* For receiving */ - struct nlattr *na; + unsigned char addr[ETH_ALEN]; struct net_device *hsr_dev; - - /* For sending */ struct sk_buff *skb_out; - void *msg_head; struct hsr_priv *hsr; - void *pos; - unsigned char addr[ETH_ALEN]; + bool restart = false; + struct nlattr *na; + void *pos = NULL; + void *msg_head; int res; if (!info) @@ -385,17 +389,17 @@ if (!na) goto invalid; - hsr_dev = __dev_get_by_index(genl_info_net(info), - nla_get_u32(info->attrs[HSR_A_IFINDEX])); + rcu_read_lock(); + hsr_dev = dev_get_by_index_rcu(genl_info_net(info), + nla_get_u32(info->attrs[HSR_A_IFINDEX])); if (!hsr_dev) - goto invalid; + goto rcu_unlock; if (!is_hsr_master(hsr_dev)) - goto invalid; - + goto rcu_unlock; +restart: /* Send reply */ - - skb_out = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); + skb_out = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_ATOMIC); if (!skb_out) { res = -ENOMEM; goto fail; @@ -409,18 +413,26 @@ goto nla_put_failure; } - res = nla_put_u32(skb_out, HSR_A_IFINDEX, hsr_dev->ifindex); - if (res < 0) - goto nla_put_failure; + if (!restart) { + res = nla_put_u32(skb_out, HSR_A_IFINDEX, hsr_dev->ifindex); + if (res < 0) + goto nla_put_failure; + } hsr = netdev_priv(hsr_dev); - rcu_read_lock(); - pos = hsr_get_next_node(hsr, NULL, addr); + if (!pos) + pos = hsr_get_next_node(hsr, NULL, addr); while (pos) { res = nla_put(skb_out, HSR_A_NODE_ADDR, ETH_ALEN, addr); if (res < 0) { - rcu_read_unlock(); + if (res == -EMSGSIZE) { + genlmsg_end(skb_out, msg_head); + genlmsg_unicast(genl_info_net(info), skb_out, + info->snd_portid); + restart = true; + goto restart; + } goto nla_put_failure; } pos = hsr_get_next_node(hsr, pos, addr); @@ -432,15 +444,18 @@ return 0; +rcu_unlock: + rcu_read_unlock(); invalid: netlink_ack(skb_in, nlmsg_hdr(skb_in), -EINVAL, NULL); return 0; nla_put_failure: - kfree_skb(skb_out); + nlmsg_free(skb_out); /* Fall through */ fail: + rcu_read_unlock(); return res; } @@ -467,6 +482,7 @@ .name = "HSR", .version = 1, .maxattr = HSR_A_MAX, + .netnsok = true, .module = THIS_MODULE, .ops = hsr_ops, .n_ops = ARRAY_SIZE(hsr_ops), diff -Nru linux-4.19.98/net/hsr/hsr_slave.c linux-4.19.118/net/hsr/hsr_slave.c --- linux-4.19.98/net/hsr/hsr_slave.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/hsr/hsr_slave.c 2020-04-23 08:30:24.000000000 +0000 @@ -32,6 +32,8 @@ rcu_read_lock(); /* hsr->node_db, hsr->ports */ port = hsr_port_get_rcu(skb->dev); + if (!port) + goto finish_pass; if (hsr_addr_is_self(port->hsr, eth_hdr(skb)->h_source)) { /* Directly kill frames sent by ourselves */ @@ -150,16 +152,16 @@ if (port == NULL) return -ENOMEM; + port->hsr = hsr; + port->dev = dev; + port->type = type; + if (type != HSR_PT_MASTER) { res = hsr_portdev_setup(dev, port); if (res) goto fail_dev_setup; } - port->hsr = hsr; - port->dev = dev; - port->type = type; - list_add_tail_rcu(&port->port_list, &hsr->ports); synchronize_rcu(); diff -Nru linux-4.19.98/net/ieee802154/6lowpan/reassembly.c linux-4.19.118/net/ieee802154/6lowpan/reassembly.c --- linux-4.19.98/net/ieee802154/6lowpan/reassembly.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ieee802154/6lowpan/reassembly.c 2020-04-23 08:30:24.000000000 +0000 @@ -629,7 +629,7 @@ void lowpan_net_frag_exit(void) { - inet_frags_fini(&lowpan_frags); lowpan_frags_sysctl_unregister(); unregister_pernet_subsys(&lowpan_frags_ops); + inet_frags_fini(&lowpan_frags); } diff -Nru linux-4.19.98/net/ieee802154/nl_policy.c linux-4.19.118/net/ieee802154/nl_policy.c --- linux-4.19.98/net/ieee802154/nl_policy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ieee802154/nl_policy.c 2020-04-23 08:30:24.000000000 +0000 @@ -30,7 +30,13 @@ [IEEE802154_ATTR_HW_ADDR] = { .type = NLA_HW_ADDR, }, [IEEE802154_ATTR_PAN_ID] = { .type = NLA_U16, }, [IEEE802154_ATTR_CHANNEL] = { .type = NLA_U8, }, + [IEEE802154_ATTR_BCN_ORD] = { .type = NLA_U8, }, + [IEEE802154_ATTR_SF_ORD] = { .type = NLA_U8, }, + [IEEE802154_ATTR_PAN_COORD] = { .type = NLA_U8, }, + [IEEE802154_ATTR_BAT_EXT] = { .type = NLA_U8, }, + [IEEE802154_ATTR_COORD_REALIGN] = { .type = NLA_U8, }, [IEEE802154_ATTR_PAGE] = { .type = NLA_U8, }, + [IEEE802154_ATTR_DEV_TYPE] = { .type = NLA_U8, }, [IEEE802154_ATTR_COORD_SHORT_ADDR] = { .type = NLA_U16, }, [IEEE802154_ATTR_COORD_HW_ADDR] = { .type = NLA_HW_ADDR, }, [IEEE802154_ATTR_COORD_PAN_ID] = { .type = NLA_U16, }, diff -Nru linux-4.19.98/net/ipv4/Kconfig linux-4.19.118/net/ipv4/Kconfig --- linux-4.19.98/net/ipv4/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -302,6 +302,7 @@ config NET_IPVTI tristate "Virtual (secure) IP: tunneling" + depends on IPV6 || IPV6=n select INET_TUNNEL select NET_IP_TUNNEL depends on INET_XFRM_MODE_TUNNEL diff -Nru linux-4.19.98/net/ipv4/af_inet.c linux-4.19.118/net/ipv4/af_inet.c --- linux-4.19.98/net/ipv4/af_inet.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/af_inet.c 2020-04-23 08:30:24.000000000 +0000 @@ -424,8 +424,8 @@ if (sock_flag(sk, SOCK_LINGER) && !(current->flags & PF_EXITING)) timeout = sk->sk_lingertime; - sock->sk = NULL; sk->sk_prot->close(sk, timeout); + sock->sk = NULL; } return 0; } diff -Nru linux-4.19.98/net/ipv4/cipso_ipv4.c linux-4.19.118/net/ipv4/cipso_ipv4.c --- linux-4.19.98/net/ipv4/cipso_ipv4.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/cipso_ipv4.c 2020-04-23 08:30:24.000000000 +0000 @@ -1738,6 +1738,7 @@ { unsigned char optbuf[sizeof(struct ip_options) + 40]; struct ip_options *opt = (struct ip_options *)optbuf; + int res; if (ip_hdr(skb)->protocol == IPPROTO_ICMP || error != -EACCES) return; @@ -1749,7 +1750,11 @@ memset(opt, 0, sizeof(struct ip_options)); opt->optlen = ip_hdr(skb)->ihl*4 - sizeof(struct iphdr); - if (__ip_options_compile(dev_net(skb->dev), opt, skb, NULL)) + rcu_read_lock(); + res = __ip_options_compile(dev_net(skb->dev), opt, skb, NULL); + rcu_read_unlock(); + + if (res) return; if (gateway) diff -Nru linux-4.19.98/net/ipv4/devinet.c linux-4.19.118/net/ipv4/devinet.c --- linux-4.19.98/net/ipv4/devinet.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/devinet.c 2020-04-23 08:30:24.000000000 +0000 @@ -587,12 +587,15 @@ return NULL; } -static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa) +static int ip_mc_autojoin_config(struct net *net, bool join, + const struct in_ifaddr *ifa) { +#if defined(CONFIG_IP_MULTICAST) struct ip_mreqn mreq = { .imr_multiaddr.s_addr = ifa->ifa_address, .imr_ifindex = ifa->ifa_dev->dev->ifindex, }; + struct sock *sk = net->ipv4.mc_autojoin_sk; int ret; ASSERT_RTNL(); @@ -605,6 +608,9 @@ release_sock(sk); return ret; +#else + return -EOPNOTSUPP; +#endif } static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, @@ -646,7 +652,7 @@ continue; if (ipv4_is_multicast(ifa->ifa_address)) - ip_mc_config(net->ipv4.mc_autojoin_sk, false, ifa); + ip_mc_autojoin_config(net, false, ifa); __inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid); return 0; } @@ -907,8 +913,7 @@ */ set_ifa_lifetime(ifa, valid_lft, prefered_lft); if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) { - int ret = ip_mc_config(net->ipv4.mc_autojoin_sk, - true, ifa); + int ret = ip_mc_autojoin_config(net, true, ifa); if (ret < 0) { inet_free_ifa(ifa); diff -Nru linux-4.19.98/net/ipv4/fib_trie.c linux-4.19.118/net/ipv4/fib_trie.c --- linux-4.19.98/net/ipv4/fib_trie.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/fib_trie.c 2020-04-23 08:30:24.000000000 +0000 @@ -2337,6 +2337,7 @@ " %zd bytes, size of tnode: %zd bytes.\n", LEAF_SIZE, TNODE_SIZE(0)); + rcu_read_lock(); for (h = 0; h < FIB_TABLE_HASHSZ; h++) { struct hlist_head *head = &net->ipv4.fib_table_hash[h]; struct fib_table *tb; @@ -2356,7 +2357,9 @@ trie_show_usage(seq, t->stats); #endif } + cond_resched_rcu(); } + rcu_read_unlock(); return 0; } diff -Nru linux-4.19.98/net/ipv4/gre_demux.c linux-4.19.118/net/ipv4/gre_demux.c --- linux-4.19.98/net/ipv4/gre_demux.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/gre_demux.c 2020-04-23 08:30:24.000000000 +0000 @@ -61,7 +61,9 @@ } EXPORT_SYMBOL_GPL(gre_del_protocol); -/* Fills in tpi and returns header length to be pulled. */ +/* Fills in tpi and returns header length to be pulled. + * Note that caller must use pskb_may_pull() before pulling GRE header. + */ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, bool *csum_err, __be16 proto, int nhs) { @@ -115,8 +117,14 @@ * - When dealing with WCCPv2, Skip extra 4 bytes in GRE header */ if (greh->flags == 0 && tpi->proto == htons(ETH_P_WCCP)) { + u8 _val, *val; + + val = skb_header_pointer(skb, nhs + hdr_len, + sizeof(_val), &_val); + if (!val) + return -EINVAL; tpi->proto = proto; - if ((*(u8 *)options & 0xF0) != 0x40) + if ((*val & 0xF0) != 0x40) hdr_len += 4; } tpi->hdr_len = hdr_len; diff -Nru linux-4.19.98/net/ipv4/inet_connection_sock.c linux-4.19.118/net/ipv4/inet_connection_sock.c --- linux-4.19.98/net/ipv4/inet_connection_sock.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/inet_connection_sock.c 2020-04-23 08:30:24.000000000 +0000 @@ -479,8 +479,28 @@ } spin_unlock_bh(&queue->fastopenq.lock); } + out: release_sock(sk); + if (newsk && mem_cgroup_sockets_enabled) { + int amt; + + /* atomically get the memory usage, set and charge the + * newsk->sk_memcg. + */ + lock_sock(newsk); + + /* The socket has not been accepted yet, no need to look at + * newsk->sk_wmem_queued. + */ + amt = sk_mem_pages(newsk->sk_forward_alloc + + atomic_read(&newsk->sk_rmem_alloc)); + mem_cgroup_sk_alloc(newsk); + if (newsk->sk_memcg && amt) + mem_cgroup_charge_skmem(newsk->sk_memcg, amt); + + release_sock(newsk); + } if (req) reqsk_put(req); return newsk; @@ -937,7 +957,7 @@ req->sk = child; req->dl_next = NULL; if (queue->rskq_accept_head == NULL) - queue->rskq_accept_head = req; + WRITE_ONCE(queue->rskq_accept_head, req); else queue->rskq_accept_tail->dl_next = req; queue->rskq_accept_tail = req; diff -Nru linux-4.19.98/net/ipv4/inet_diag.c linux-4.19.118/net/ipv4/inet_diag.c --- linux-4.19.98/net/ipv4/inet_diag.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/inet_diag.c 2020-04-23 08:30:24.000000000 +0000 @@ -104,13 +104,9 @@ aux = handler->idiag_get_aux_size(sk, net_admin); return nla_total_size(sizeof(struct tcp_info)) - + nla_total_size(1) /* INET_DIAG_SHUTDOWN */ - + nla_total_size(1) /* INET_DIAG_TOS */ - + nla_total_size(1) /* INET_DIAG_TCLASS */ - + nla_total_size(4) /* INET_DIAG_MARK */ - + nla_total_size(4) /* INET_DIAG_CLASS_ID */ - + nla_total_size(sizeof(struct inet_diag_meminfo)) + nla_total_size(sizeof(struct inet_diag_msg)) + + inet_diag_msg_attrs_size() + + nla_total_size(sizeof(struct inet_diag_meminfo)) + nla_total_size(SK_MEMINFO_VARS * sizeof(u32)) + nla_total_size(TCP_CA_NAME_MAX) + nla_total_size(sizeof(struct tcpvegas_info)) @@ -151,6 +147,24 @@ if (net_admin && nla_put_u32(skb, INET_DIAG_MARK, sk->sk_mark)) goto errout; + if (ext & (1 << (INET_DIAG_CLASS_ID - 1)) || + ext & (1 << (INET_DIAG_TCLASS - 1))) { + u32 classid = 0; + +#ifdef CONFIG_SOCK_CGROUP_DATA + classid = sock_cgroup_classid(&sk->sk_cgrp_data); +#endif + /* Fallback to socket priority if class id isn't set. + * Classful qdiscs use it as direct reference to class. + * For cgroup2 classid is always zero. + */ + if (!classid) + classid = sk->sk_priority; + + if (nla_put_u32(skb, INET_DIAG_CLASS_ID, classid)) + goto errout; + } + r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk)); r->idiag_inode = sock_i_ino(sk); @@ -288,24 +302,6 @@ goto errout; } - if (ext & (1 << (INET_DIAG_CLASS_ID - 1)) || - ext & (1 << (INET_DIAG_TCLASS - 1))) { - u32 classid = 0; - -#ifdef CONFIG_SOCK_CGROUP_DATA - classid = sock_cgroup_classid(&sk->sk_cgrp_data); -#endif - /* Fallback to socket priority if class id isn't set. - * Classful qdiscs use it as direct reference to class. - * For cgroup2 classid is always zero. - */ - if (!classid) - classid = sk->sk_priority; - - if (nla_put_u32(skb, INET_DIAG_CLASS_ID, classid)) - goto errout; - } - out: nlmsg_end(skb, nlh); return 0; diff -Nru linux-4.19.98/net/ipv4/ip_gre.c linux-4.19.118/net/ipv4/ip_gre.c --- linux-4.19.98/net/ipv4/ip_gre.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/ip_gre.c 2020-04-23 08:30:24.000000000 +0000 @@ -1226,6 +1226,24 @@ if (data[IFLA_GRE_FWMARK]) *fwmark = nla_get_u32(data[IFLA_GRE_FWMARK]); + return 0; +} + +static int erspan_netlink_parms(struct net_device *dev, + struct nlattr *data[], + struct nlattr *tb[], + struct ip_tunnel_parm *parms, + __u32 *fwmark) +{ + struct ip_tunnel *t = netdev_priv(dev); + int err; + + err = ipgre_netlink_parms(dev, data, tb, parms, fwmark); + if (err) + return err; + if (!data) + return 0; + if (data[IFLA_GRE_ERSPAN_VER]) { t->erspan_ver = nla_get_u8(data[IFLA_GRE_ERSPAN_VER]); @@ -1355,45 +1373,70 @@ } EXPORT_SYMBOL_GPL(is_gretap_dev); -static int ipgre_newlink(struct net *src_net, struct net_device *dev, - struct nlattr *tb[], struct nlattr *data[], - struct netlink_ext_ack *extack) +static int +ipgre_newlink_encap_setup(struct net_device *dev, struct nlattr *data[]) { - struct ip_tunnel_parm p; struct ip_tunnel_encap ipencap; - __u32 fwmark = 0; - int err; if (ipgre_netlink_encap_parms(data, &ipencap)) { struct ip_tunnel *t = netdev_priv(dev); - err = ip_tunnel_encap_setup(t, &ipencap); + int err = ip_tunnel_encap_setup(t, &ipencap); if (err < 0) return err; } + return 0; +} + +static int ipgre_newlink(struct net *src_net, struct net_device *dev, + struct nlattr *tb[], struct nlattr *data[], + struct netlink_ext_ack *extack) +{ + struct ip_tunnel_parm p; + __u32 fwmark = 0; + int err; + + err = ipgre_newlink_encap_setup(dev, data); + if (err) + return err; + err = ipgre_netlink_parms(dev, data, tb, &p, &fwmark); if (err < 0) return err; return ip_tunnel_newlink(dev, tb, &p, fwmark); } +static int erspan_newlink(struct net *src_net, struct net_device *dev, + struct nlattr *tb[], struct nlattr *data[], + struct netlink_ext_ack *extack) +{ + struct ip_tunnel_parm p; + __u32 fwmark = 0; + int err; + + err = ipgre_newlink_encap_setup(dev, data); + if (err) + return err; + + err = erspan_netlink_parms(dev, data, tb, &p, &fwmark); + if (err) + return err; + return ip_tunnel_newlink(dev, tb, &p, fwmark); +} + static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[], struct nlattr *data[], struct netlink_ext_ack *extack) { struct ip_tunnel *t = netdev_priv(dev); - struct ip_tunnel_encap ipencap; __u32 fwmark = t->fwmark; struct ip_tunnel_parm p; int err; - if (ipgre_netlink_encap_parms(data, &ipencap)) { - err = ip_tunnel_encap_setup(t, &ipencap); - - if (err < 0) - return err; - } + err = ipgre_newlink_encap_setup(dev, data); + if (err) + return err; err = ipgre_netlink_parms(dev, data, tb, &p, &fwmark); if (err < 0) @@ -1406,8 +1449,34 @@ t->parms.i_flags = p.i_flags; t->parms.o_flags = p.o_flags; - if (strcmp(dev->rtnl_link_ops->kind, "erspan")) - ipgre_link_update(dev, !tb[IFLA_MTU]); + ipgre_link_update(dev, !tb[IFLA_MTU]); + + return 0; +} + +static int erspan_changelink(struct net_device *dev, struct nlattr *tb[], + struct nlattr *data[], + struct netlink_ext_ack *extack) +{ + struct ip_tunnel *t = netdev_priv(dev); + __u32 fwmark = t->fwmark; + struct ip_tunnel_parm p; + int err; + + err = ipgre_newlink_encap_setup(dev, data); + if (err) + return err; + + err = erspan_netlink_parms(dev, data, tb, &p, &fwmark); + if (err < 0) + return err; + + err = ip_tunnel_changelink(dev, tb, &p, fwmark); + if (err < 0) + return err; + + t->parms.i_flags = p.i_flags; + t->parms.o_flags = p.o_flags; return 0; } @@ -1598,8 +1667,8 @@ .priv_size = sizeof(struct ip_tunnel), .setup = erspan_setup, .validate = erspan_validate, - .newlink = ipgre_newlink, - .changelink = ipgre_changelink, + .newlink = erspan_newlink, + .changelink = erspan_changelink, .dellink = ip_tunnel_dellink, .get_size = ipgre_get_size, .fill_info = ipgre_fill_info, diff -Nru linux-4.19.98/net/ipv4/ip_output.c linux-4.19.118/net/ipv4/ip_output.c --- linux-4.19.98/net/ipv4/ip_output.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/ip_output.c 2020-04-23 08:30:24.000000000 +0000 @@ -940,7 +940,7 @@ unsigned int fraglen; unsigned int fraggap; unsigned int alloclen; - unsigned int pagedlen = 0; + unsigned int pagedlen; struct sk_buff *skb_prev; alloc_new_skb: skb_prev = skb; @@ -957,6 +957,7 @@ if (datalen > mtu - fragheaderlen) datalen = maxfraglen - fragheaderlen; fraglen = datalen + fragheaderlen; + pagedlen = 0; if ((flags & MSG_MORE) && !(rt->dst.dev->features&NETIF_F_SG)) diff -Nru linux-4.19.98/net/ipv4/ip_tunnel.c linux-4.19.118/net/ipv4/ip_tunnel.c --- linux-4.19.98/net/ipv4/ip_tunnel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/ip_tunnel.c 2020-04-23 08:30:24.000000000 +0000 @@ -155,11 +155,8 @@ cand = t; } - if (flags & TUNNEL_NO_KEY) - goto skip_key_lookup; - hlist_for_each_entry_rcu(t, head, hash_node) { - if (t->parms.i_key != key || + if ((!(flags & TUNNEL_NO_KEY) && t->parms.i_key != key) || t->parms.iph.saddr != 0 || t->parms.iph.daddr != 0 || !(t->dev->flags & IFF_UP)) @@ -171,7 +168,6 @@ cand = t; } -skip_key_lookup: if (cand) return cand; @@ -574,8 +570,9 @@ else if (skb->protocol == htons(ETH_P_IPV6)) tos = ipv6_get_dsfield((const struct ipv6hdr *)inner_iph); } - ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, 0, - RT_TOS(tos), tunnel->parms.link, tunnel->fwmark); + ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, + tunnel_id_to_key32(key->tun_id), RT_TOS(tos), + 0, skb->mark); if (tunnel->encap.type != TUNNEL_ENCAP_NONE) goto tx_error; rt = ip_route_output_key(tunnel->net, &fl4); @@ -1202,10 +1199,8 @@ iph->version = 4; iph->ihl = 5; - if (tunnel->collect_md) { - dev->features |= NETIF_F_NETNS_LOCAL; + if (tunnel->collect_md) netif_keep_dst(dev); - } return 0; } EXPORT_SYMBOL_GPL(ip_tunnel_init); diff -Nru linux-4.19.98/net/ipv4/ip_vti.c linux-4.19.118/net/ipv4/ip_vti.c --- linux-4.19.98/net/ipv4/ip_vti.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/ip_vti.c 2020-04-23 08:30:24.000000000 +0000 @@ -208,8 +208,39 @@ int mtu; if (!dst) { - dev->stats.tx_carrier_errors++; - goto tx_error_icmp; + switch (skb->protocol) { + case htons(ETH_P_IP): { + struct rtable *rt; + + fl->u.ip4.flowi4_oif = dev->ifindex; + fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; + rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); + if (IS_ERR(rt)) { + dev->stats.tx_carrier_errors++; + goto tx_error_icmp; + } + dst = &rt->dst; + skb_dst_set(skb, dst); + break; + } +#if IS_ENABLED(CONFIG_IPV6) + case htons(ETH_P_IPV6): + fl->u.ip6.flowi6_oif = dev->ifindex; + fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; + dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); + if (dst->error) { + dst_release(dst); + dst = NULL; + dev->stats.tx_carrier_errors++; + goto tx_error_icmp; + } + skb_dst_set(skb, dst); + break; +#endif + default: + dev->stats.tx_carrier_errors++; + goto tx_error_icmp; + } } dst_hold(dst); diff -Nru linux-4.19.98/net/ipv4/raw_diag.c linux-4.19.118/net/ipv4/raw_diag.c --- linux-4.19.98/net/ipv4/raw_diag.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/raw_diag.c 2020-04-23 08:30:24.000000000 +0000 @@ -99,8 +99,9 @@ if (IS_ERR(sk)) return PTR_ERR(sk); - rep = nlmsg_new(sizeof(struct inet_diag_msg) + - sizeof(struct inet_diag_meminfo) + 64, + rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) + + inet_diag_msg_attrs_size() + + nla_total_size(sizeof(struct inet_diag_meminfo)) + 64, GFP_KERNEL); if (!rep) { sock_put(sk); diff -Nru linux-4.19.98/net/ipv4/tcp.c linux-4.19.118/net/ipv4/tcp.c --- linux-4.19.98/net/ipv4/tcp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/tcp.c 2020-04-23 08:30:24.000000000 +0000 @@ -325,7 +325,7 @@ { unsigned long val; - if (tcp_memory_pressure) + if (READ_ONCE(tcp_memory_pressure)) return; val = jiffies; @@ -340,7 +340,7 @@ { unsigned long val; - if (!tcp_memory_pressure) + if (!READ_ONCE(tcp_memory_pressure)) return; val = xchg(&tcp_memory_pressure, 0); if (val) @@ -2507,6 +2507,7 @@ { struct rb_node *p = rb_first(&sk->tcp_rtx_queue); + tcp_sk(sk)->highest_sack = NULL; while (p) { struct sk_buff *skb = rb_to_skb(p); @@ -2587,10 +2588,12 @@ tp->snd_ssthresh = TCP_INFINITE_SSTHRESH; tp->snd_cwnd_cnt = 0; tp->window_clamp = 0; + tp->delivered = 0; tp->delivered_ce = 0; tcp_set_ca_state(sk, TCP_CA_Open); tp->is_sack_reneg = 0; tcp_clear_retrans(tp); + tp->total_retrans = 0; inet_csk_delack_init(sk); /* Initialize rcv_mss to TCP_MIN_MSS to avoid division by 0 * issue in __tcp_select_window() @@ -2602,10 +2605,14 @@ sk->sk_rx_dst = NULL; tcp_saved_syn_free(tp); tp->compressed_ack = 0; + tp->segs_in = 0; + tp->segs_out = 0; tp->bytes_sent = 0; tp->bytes_acked = 0; tp->bytes_received = 0; tp->bytes_retrans = 0; + tp->data_segs_in = 0; + tp->data_segs_out = 0; tp->dsack_dups = 0; tp->reord_seen = 0; @@ -2863,8 +2870,10 @@ err = -EPERM; else if (tp->repair_queue == TCP_SEND_QUEUE) tp->write_seq = val; - else if (tp->repair_queue == TCP_RECV_QUEUE) + else if (tp->repair_queue == TCP_RECV_QUEUE) { WRITE_ONCE(tp->rcv_nxt, val); + WRITE_ONCE(tp->copied_seq, val); + } else err = -EINVAL; break; diff -Nru linux-4.19.98/net/ipv4/tcp_bbr.c linux-4.19.118/net/ipv4/tcp_bbr.c --- linux-4.19.98/net/ipv4/tcp_bbr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/tcp_bbr.c 2020-04-23 08:30:24.000000000 +0000 @@ -680,8 +680,7 @@ * bandwidth sample. Delivered is in packets and interval_us in uS and * ratio will be <<1 for most connections. So delivered is first scaled. */ - bw = (u64)rs->delivered * BW_UNIT; - do_div(bw, rs->interval_us); + bw = div64_long((u64)rs->delivered * BW_UNIT, rs->interval_us); /* If this sample is application-limited, it is likely to have a very * low delivered count that represents application behavior rather than diff -Nru linux-4.19.98/net/ipv4/tcp_input.c linux-4.19.118/net/ipv4/tcp_input.c --- linux-4.19.98/net/ipv4/tcp_input.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/tcp_input.c 2020-04-23 08:30:24.000000000 +0000 @@ -3149,6 +3149,7 @@ tp->retransmit_skb_hint = NULL; if (unlikely(skb == tp->lost_skb_hint)) tp->lost_skb_hint = NULL; + tcp_highest_sack_replace(sk, skb, next); tcp_rtx_queue_unlink_and_free(skb, sk); } diff -Nru linux-4.19.98/net/ipv4/tcp_output.c linux-4.19.118/net/ipv4/tcp_output.c --- linux-4.19.98/net/ipv4/tcp_output.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/tcp_output.c 2020-04-23 08:30:24.000000000 +0000 @@ -3165,6 +3165,7 @@ if (!nskb) return -ENOMEM; INIT_LIST_HEAD(&nskb->tcp_tsorted_anchor); + tcp_highest_sack_replace(sk, skb, nskb); tcp_rtx_queue_unlink_and_free(skb, sk); __skb_header_release(nskb); tcp_rbtree_insert(&sk->tcp_rtx_queue, nskb); diff -Nru linux-4.19.98/net/ipv4/udp.c linux-4.19.118/net/ipv4/udp.c --- linux-4.19.98/net/ipv4/udp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/udp.c 2020-04-23 08:30:24.000000000 +0000 @@ -1305,7 +1305,8 @@ if (likely(partial)) { up->forward_deficit += size; size = up->forward_deficit; - if (size < (sk->sk_rcvbuf >> 2)) + if (size < (sk->sk_rcvbuf >> 2) && + !skb_queue_empty(&up->reader_queue)) return; } else { size += up->forward_deficit; diff -Nru linux-4.19.98/net/ipv4/udp_diag.c linux-4.19.118/net/ipv4/udp_diag.c --- linux-4.19.98/net/ipv4/udp_diag.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/udp_diag.c 2020-04-23 08:30:24.000000000 +0000 @@ -67,8 +67,9 @@ goto out; err = -ENOMEM; - rep = nlmsg_new(sizeof(struct inet_diag_msg) + - sizeof(struct inet_diag_meminfo) + 64, + rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) + + inet_diag_msg_attrs_size() + + nla_total_size(sizeof(struct inet_diag_meminfo)) + 64, GFP_KERNEL); if (!rep) goto out; diff -Nru linux-4.19.98/net/ipv4/udp_offload.c linux-4.19.118/net/ipv4/udp_offload.c --- linux-4.19.98/net/ipv4/udp_offload.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv4/udp_offload.c 2020-04-23 08:30:24.000000000 +0000 @@ -227,6 +227,11 @@ seg = segs; uh = udp_hdr(seg); + /* preserve TX timestamp flags and TS key for first segment */ + skb_shinfo(seg)->tskey = skb_shinfo(gso_skb)->tskey; + skb_shinfo(seg)->tx_flags |= + (skb_shinfo(gso_skb)->tx_flags & SKBTX_ANY_TSTAMP); + /* compute checksum adjustment based on old length versus new */ newlen = htons(sizeof(*uh) + mss); check = csum16_add(csum16_sub(uh->check, uh->len), newlen); diff -Nru linux-4.19.98/net/ipv6/addrconf.c linux-4.19.118/net/ipv6/addrconf.c --- linux-4.19.98/net/ipv6/addrconf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/addrconf.c 2020-04-23 08:30:24.000000000 +0000 @@ -1175,11 +1175,12 @@ } static void -cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt) +cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, + bool del_rt, bool del_peer) { struct fib6_info *f6i; - f6i = addrconf_get_prefix_route(&ifp->addr, + f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr, ifp->prefix_len, ifp->idev->dev, 0, RTF_GATEWAY | RTF_DEFAULT); @@ -1244,7 +1245,7 @@ if (action != CLEANUP_PREFIX_RT_NOP) { cleanup_prefix_route(ifp, expires, - action == CLEANUP_PREFIX_RT_DEL); + action == CLEANUP_PREFIX_RT_DEL, false); } /* clean up prefsrc entries */ @@ -3240,6 +3241,10 @@ if (netif_is_l3_master(idev->dev)) return; + /* no link local addresses on devices flagged as slaves */ + if (idev->dev->flags & IFF_SLAVE) + return; + ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); switch (idev->cnf.addr_gen_mode) { @@ -3291,6 +3296,10 @@ (dev->type != ARPHRD_NONE) && (dev->type != ARPHRD_RAWIP)) { /* Alas, we support only Ethernet autoconfiguration. */ + idev = __in6_dev_get(dev); + if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP && + dev->flags & IFF_MULTICAST) + ipv6_mc_up(idev); return; } @@ -4531,12 +4540,13 @@ } static int modify_prefix_route(struct inet6_ifaddr *ifp, - unsigned long expires, u32 flags) + unsigned long expires, u32 flags, + bool modify_peer) { struct fib6_info *f6i; u32 prio; - f6i = addrconf_get_prefix_route(&ifp->addr, + f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, ifp->prefix_len, ifp->idev->dev, 0, RTF_GATEWAY | RTF_DEFAULT); @@ -4549,7 +4559,8 @@ ip6_del_rt(dev_net(ifp->idev->dev), f6i); /* add new one */ - addrconf_prefix_route(&ifp->addr, ifp->prefix_len, + addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr, + ifp->prefix_len, ifp->rt_priority, ifp->idev->dev, expires, flags, GFP_KERNEL); } else { @@ -4571,6 +4582,7 @@ unsigned long timeout; bool was_managetempaddr; bool had_prefixroute; + bool new_peer = false; ASSERT_RTNL(); @@ -4602,6 +4614,13 @@ cfg->preferred_lft = timeout; } + if (cfg->peer_pfx && + memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) { + if (!ipv6_addr_any(&ifp->peer_addr)) + cleanup_prefix_route(ifp, expires, true, true); + new_peer = true; + } + spin_lock_bh(&ifp->lock); was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR; had_prefixroute = ifp->flags & IFA_F_PERMANENT && @@ -4617,6 +4636,9 @@ if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority) ifp->rt_priority = cfg->rt_priority; + if (new_peer) + ifp->peer_addr = *cfg->peer_pfx; + spin_unlock_bh(&ifp->lock); if (!(ifp->flags&IFA_F_TENTATIVE)) ipv6_ifa_notify(0, ifp); @@ -4625,7 +4647,7 @@ int rc = -ENOENT; if (had_prefixroute) - rc = modify_prefix_route(ifp, expires, flags); + rc = modify_prefix_route(ifp, expires, flags, false); /* prefix route could have been deleted; if so restore it */ if (rc == -ENOENT) { @@ -4633,6 +4655,15 @@ ifp->rt_priority, ifp->idev->dev, expires, flags, GFP_KERNEL); } + + if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr)) + rc = modify_prefix_route(ifp, expires, flags, true); + + if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) { + addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len, + ifp->rt_priority, ifp->idev->dev, + expires, flags, GFP_KERNEL); + } } else if (had_prefixroute) { enum cleanup_prefix_rt_t action; unsigned long rt_expires; @@ -4643,7 +4674,7 @@ if (action != CLEANUP_PREFIX_RT_NOP) { cleanup_prefix_route(ifp, rt_expires, - action == CLEANUP_PREFIX_RT_DEL); + action == CLEANUP_PREFIX_RT_DEL, false); } } @@ -5702,9 +5733,9 @@ if (ifp->idev->cnf.forwarding) addrconf_join_anycast(ifp); if (!ipv6_addr_any(&ifp->peer_addr)) - addrconf_prefix_route(&ifp->peer_addr, 128, 0, - ifp->idev->dev, 0, 0, - GFP_ATOMIC); + addrconf_prefix_route(&ifp->peer_addr, 128, + ifp->rt_priority, ifp->idev->dev, + 0, 0, GFP_ATOMIC); break; case RTM_DELADDR: if (ifp->idev->cnf.forwarding) diff -Nru linux-4.19.98/net/ipv6/ip6_fib.c linux-4.19.118/net/ipv6/ip6_fib.c --- linux-4.19.98/net/ipv6/ip6_fib.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/ip6_fib.c 2020-04-23 08:30:24.000000000 +0000 @@ -981,8 +981,7 @@ found++; break; } - if (rt_can_ecmp) - fallback_ins = fallback_ins ?: ins; + fallback_ins = fallback_ins ?: ins; goto next_iter; } @@ -1025,7 +1024,9 @@ } if (fallback_ins && !found) { - /* No ECMP-able route found, replace first non-ECMP one */ + /* No matching route with same ecmp-able-ness found, replace + * first matching route + */ ins = fallback_ins; iter = rcu_dereference_protected(*ins, lockdep_is_held(&rt->fib6_table->tb6_lock)); @@ -1529,7 +1530,8 @@ if (plen == fn->fn_bit) return fn; - prev = fn; + if (fn->fn_flags & RTN_RTINFO) + prev = fn; next: /* diff -Nru linux-4.19.98/net/ipv6/ip6_gre.c linux-4.19.118/net/ipv6/ip6_gre.c --- linux-4.19.98/net/ipv6/ip6_gre.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/ip6_gre.c 2020-04-23 08:30:24.000000000 +0000 @@ -1486,7 +1486,6 @@ dev->mtu -= 8; if (tunnel->parms.collect_md) { - dev->features |= NETIF_F_NETNS_LOCAL; netif_keep_dst(dev); } ip6gre_tnl_init_features(dev); @@ -1914,7 +1913,6 @@ dev->needs_free_netdev = true; dev->priv_destructor = ip6gre_dev_free; - dev->features |= NETIF_F_NETNS_LOCAL; dev->priv_flags &= ~IFF_TX_SKB_SHARING; dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; netif_keep_dst(dev); @@ -2218,11 +2216,11 @@ { ether_setup(dev); + dev->max_mtu = 0; dev->netdev_ops = &ip6erspan_netdev_ops; dev->needs_free_netdev = true; dev->priv_destructor = ip6gre_dev_free; - dev->features |= NETIF_F_NETNS_LOCAL; dev->priv_flags &= ~IFF_TX_SKB_SHARING; dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; netif_keep_dst(dev); diff -Nru linux-4.19.98/net/ipv6/ip6_output.c linux-4.19.118/net/ipv6/ip6_output.c --- linux-4.19.98/net/ipv6/ip6_output.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/ip6_output.c 2020-04-23 08:30:24.000000000 +0000 @@ -1357,7 +1357,7 @@ unsigned int fraglen; unsigned int fraggap; unsigned int alloclen; - unsigned int pagedlen = 0; + unsigned int pagedlen; alloc_new_skb: /* There's no room in the current skb */ if (skb) @@ -1381,6 +1381,7 @@ if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen) datalen = maxfraglen - fragheaderlen - rt->dst.trailer_len; fraglen = datalen + fragheaderlen; + pagedlen = 0; if ((flags & MSG_MORE) && !(rt->dst.dev->features&NETIF_F_SG)) diff -Nru linux-4.19.98/net/ipv6/ip6_tunnel.c linux-4.19.118/net/ipv6/ip6_tunnel.c --- linux-4.19.98/net/ipv6/ip6_tunnel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/ip6_tunnel.c 2020-04-23 08:30:24.000000000 +0000 @@ -1882,10 +1882,8 @@ if (err) return err; ip6_tnl_link_config(t); - if (t->parms.collect_md) { - dev->features |= NETIF_F_NETNS_LOCAL; + if (t->parms.collect_md) netif_keep_dst(dev); - } return 0; } diff -Nru linux-4.19.98/net/ipv6/ip6_vti.c linux-4.19.118/net/ipv6/ip6_vti.c --- linux-4.19.98/net/ipv6/ip6_vti.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/ip6_vti.c 2020-04-23 08:30:24.000000000 +0000 @@ -315,7 +315,7 @@ if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { rcu_read_unlock(); - return 0; + goto discard; } ipv6h = ipv6_hdr(skb); @@ -453,8 +453,35 @@ int err = -1; int mtu; - if (!dst) - goto tx_err_link_failure; + if (!dst) { + switch (skb->protocol) { + case htons(ETH_P_IP): { + struct rtable *rt; + + fl->u.ip4.flowi4_oif = dev->ifindex; + fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; + rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4); + if (IS_ERR(rt)) + goto tx_err_link_failure; + dst = &rt->dst; + skb_dst_set(skb, dst); + break; + } + case htons(ETH_P_IPV6): + fl->u.ip6.flowi6_oif = dev->ifindex; + fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; + dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6); + if (dst->error) { + dst_release(dst); + dst = NULL; + goto tx_err_link_failure; + } + skb_dst_set(skb, dst); + break; + default: + goto tx_err_link_failure; + } + } dst_hold(dst); dst = xfrm_lookup(t->net, dst, fl, NULL, 0); diff -Nru linux-4.19.98/net/ipv6/ipv6_sockglue.c linux-4.19.118/net/ipv6/ipv6_sockglue.c --- linux-4.19.98/net/ipv6/ipv6_sockglue.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/ipv6_sockglue.c 2020-04-23 08:30:24.000000000 +0000 @@ -185,9 +185,15 @@ retv = -EBUSY; break; } - } else if (sk->sk_protocol != IPPROTO_TCP) + } else if (sk->sk_protocol == IPPROTO_TCP) { + if (sk->sk_prot != &tcpv6_prot) { + retv = -EBUSY; + break; + } + break; + } else { break; - + } if (sk->sk_state != TCP_ESTABLISHED) { retv = -ENOTCONN; break; diff -Nru linux-4.19.98/net/ipv6/raw.c linux-4.19.118/net/ipv6/raw.c --- linux-4.19.98/net/ipv6/raw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/raw.c 2020-04-23 08:30:24.000000000 +0000 @@ -660,6 +660,8 @@ skb->ip_summed = CHECKSUM_NONE; + sock_tx_timestamp(sk, sockc->tsflags, &skb_shinfo(skb)->tx_flags); + if (flags & MSG_CONFIRM) skb_set_dst_pending_confirm(skb, 1); diff -Nru linux-4.19.98/net/ipv6/reassembly.c linux-4.19.118/net/ipv6/reassembly.c --- linux-4.19.98/net/ipv6/reassembly.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/reassembly.c 2020-04-23 08:30:24.000000000 +0000 @@ -593,8 +593,8 @@ void ipv6_frag_exit(void) { - inet_frags_fini(&ip6_frags); ip6_frags_sysctl_unregister(); unregister_pernet_subsys(&ip6_frags_ops); inet6_del_protocol(&frag_protocol, IPPROTO_FRAGMENT); + inet_frags_fini(&ip6_frags); } diff -Nru linux-4.19.98/net/ipv6/route.c linux-4.19.118/net/ipv6/route.c --- linux-4.19.98/net/ipv6/route.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/route.c 2020-04-23 08:30:24.000000000 +0000 @@ -4514,6 +4514,7 @@ */ cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL | NLM_F_REPLACE); + cfg->fc_nlinfo.nlh->nlmsg_flags |= NLM_F_CREATE; nhn++; } diff -Nru linux-4.19.98/net/ipv6/seg6_local.c linux-4.19.118/net/ipv6/seg6_local.c --- linux-4.19.98/net/ipv6/seg6_local.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/seg6_local.c 2020-04-23 08:30:24.000000000 +0000 @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef CONFIG_IPV6_SEG6_HMAC #include #endif @@ -135,7 +136,8 @@ skb_reset_network_header(skb); skb_reset_transport_header(skb); - skb->encapsulation = 0; + if (iptunnel_pull_offloads(skb)) + return false; return true; } diff -Nru linux-4.19.98/net/ipv6/tcp_ipv6.c linux-4.19.118/net/ipv6/tcp_ipv6.c --- linux-4.19.98/net/ipv6/tcp_ipv6.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/ipv6/tcp_ipv6.c 2020-04-23 08:30:24.000000000 +0000 @@ -734,7 +734,6 @@ const struct sock *sk_listener, struct sk_buff *skb) { - bool l3_slave = ipv6_l3mdev_skb(TCP_SKB_CB(skb)->header.h6.flags); struct inet_request_sock *ireq = inet_rsk(req); const struct ipv6_pinfo *np = inet6_sk(sk_listener); @@ -742,7 +741,7 @@ ireq->ir_v6_loc_addr = ipv6_hdr(skb)->daddr; /* So that link locals have meaning */ - if ((!sk_listener->sk_bound_dev_if || l3_slave) && + if (!sk_listener->sk_bound_dev_if && ipv6_addr_type(&ireq->ir_v6_rmt_addr) & IPV6_ADDR_LINKLOCAL) ireq->ir_iif = tcp_v6_iif(skb); diff -Nru linux-4.19.98/net/iucv/af_iucv.c linux-4.19.118/net/iucv/af_iucv.c --- linux-4.19.98/net/iucv/af_iucv.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/iucv/af_iucv.c 2020-04-23 08:30:24.000000000 +0000 @@ -13,6 +13,7 @@ #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt #include +#include #include #include #include @@ -355,6 +356,9 @@ err = -ENODEV; goto err_free; } + + dev_hard_header(skb, skb->dev, ETH_P_AF_IUCV, NULL, NULL, skb->len); + if (!(skb->dev->flags & IFF_UP) || !netif_carrier_ok(skb->dev)) { err = -ENETDOWN; goto err_free; @@ -367,6 +371,8 @@ skb_trim(skb, skb->dev->mtu); } skb->protocol = cpu_to_be16(ETH_P_AF_IUCV); + + __skb_header_release(skb); nskb = skb_clone(skb, GFP_ATOMIC); if (!nskb) { err = -ENOMEM; @@ -466,12 +472,14 @@ /* Send controlling flags through an IUCV socket for HIPER transport */ static int iucv_send_ctrl(struct sock *sk, u8 flags) { + struct iucv_sock *iucv = iucv_sk(sk); int err = 0; int blen; struct sk_buff *skb; u8 shutdown = 0; - blen = sizeof(struct af_iucv_trans_hdr) + ETH_HLEN; + blen = sizeof(struct af_iucv_trans_hdr) + + LL_RESERVED_SPACE(iucv->hs_dev); if (sk->sk_shutdown & SEND_SHUTDOWN) { /* controlling flags should be sent anyway */ shutdown = sk->sk_shutdown; @@ -1131,7 +1139,8 @@ * segmented records using the MSG_EOR flag), but * for SOCK_STREAM we might want to improve it in future */ if (iucv->transport == AF_IUCV_TRANS_HIPER) { - headroom = sizeof(struct af_iucv_trans_hdr) + ETH_HLEN; + headroom = sizeof(struct af_iucv_trans_hdr) + + LL_RESERVED_SPACE(iucv->hs_dev); linear = len; } else { if (len < PAGE_SIZE) { @@ -2456,6 +2465,13 @@ return err; } +static void afiucv_iucv_exit(void) +{ + device_unregister(af_iucv_dev); + driver_unregister(&af_iucv_driver); + pr_iucv->iucv_unregister(&af_iucv_handler, 0); +} + static int __init afiucv_init(void) { int err; @@ -2489,11 +2505,18 @@ err = afiucv_iucv_init(); if (err) goto out_sock; - } else - register_netdevice_notifier(&afiucv_netdev_notifier); + } + + err = register_netdevice_notifier(&afiucv_netdev_notifier); + if (err) + goto out_notifier; + dev_add_pack(&iucv_packet_type); return 0; +out_notifier: + if (pr_iucv) + afiucv_iucv_exit(); out_sock: sock_unregister(PF_IUCV); out_proto: @@ -2507,12 +2530,11 @@ static void __exit afiucv_exit(void) { if (pr_iucv) { - device_unregister(af_iucv_dev); - driver_unregister(&af_iucv_driver); - pr_iucv->iucv_unregister(&af_iucv_handler, 0); + afiucv_iucv_exit(); symbol_put(iucv_if); - } else - unregister_netdevice_notifier(&afiucv_netdev_notifier); + } + + unregister_netdevice_notifier(&afiucv_netdev_notifier); dev_remove_pack(&iucv_packet_type); sock_unregister(PF_IUCV); proto_unregister(&iucv_proto); diff -Nru linux-4.19.98/net/l2tp/l2tp_core.c linux-4.19.118/net/l2tp/l2tp_core.c --- linux-4.19.98/net/l2tp/l2tp_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/l2tp/l2tp_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -325,8 +325,13 @@ spin_lock_bh(&pn->l2tp_session_hlist_lock); + /* IP encap expects session IDs to be globally unique, while + * UDP encap doesn't. + */ hlist_for_each_entry(session_walk, g_head, global_hlist) - if (session_walk->session_id == session->session_id) { + if (session_walk->session_id == session->session_id && + (session_walk->tunnel->encap == L2TP_ENCAPTYPE_IP || + tunnel->encap == L2TP_ENCAPTYPE_IP)) { err = -EEXIST; goto err_tlock_pnlock; } @@ -1735,7 +1740,8 @@ } rcu_read_unlock_bh(); - flush_workqueue(l2tp_wq); + if (l2tp_wq) + flush_workqueue(l2tp_wq); rcu_barrier(); for (hash = 0; hash < L2TP_HASH_SIZE_2; hash++) diff -Nru linux-4.19.98/net/llc/af_llc.c linux-4.19.118/net/llc/af_llc.c --- linux-4.19.98/net/llc/af_llc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/llc/af_llc.c 2020-04-23 08:30:24.000000000 +0000 @@ -113,22 +113,26 @@ * * Send data via reliable llc2 connection. * Returns 0 upon success, non-zero if action did not succeed. + * + * This function always consumes a reference to the skb. */ static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock) { struct llc_sock* llc = llc_sk(sk); - int rc = 0; if (unlikely(llc_data_accept_state(llc->state) || llc->remote_busy_flag || llc->p_flag)) { long timeout = sock_sndtimeo(sk, noblock); + int rc; rc = llc_ui_wait_for_busy_core(sk, timeout); + if (rc) { + kfree_skb(skb); + return rc; + } } - if (unlikely(!rc)) - rc = llc_build_and_send_pkt(sk, skb); - return rc; + return llc_build_and_send_pkt(sk, skb); } static void llc_ui_sk_init(struct socket *sock, struct sock *sk) @@ -900,7 +904,7 @@ DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name); int flags = msg->msg_flags; int noblock = flags & MSG_DONTWAIT; - struct sk_buff *skb; + struct sk_buff *skb = NULL; size_t size = 0; int rc = -EINVAL, copied = 0, hdrlen; @@ -909,10 +913,10 @@ lock_sock(sk); if (addr) { if (msg->msg_namelen < sizeof(*addr)) - goto release; + goto out; } else { if (llc_ui_addr_null(&llc->addr)) - goto release; + goto out; addr = &llc->addr; } /* must bind connection to sap if user hasn't done it. */ @@ -920,7 +924,7 @@ /* bind to sap with null dev, exclusive. */ rc = llc_ui_autobind(sock, addr); if (rc) - goto release; + goto out; } hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr); size = hdrlen + len; @@ -929,12 +933,12 @@ copied = size - hdrlen; rc = -EINVAL; if (copied < 0) - goto release; + goto out; release_sock(sk); skb = sock_alloc_send_skb(sk, size, noblock, &rc); lock_sock(sk); if (!skb) - goto release; + goto out; skb->dev = llc->dev; skb->protocol = llc_proto_type(addr->sllc_arphrd); skb_reserve(skb, hdrlen); @@ -944,29 +948,31 @@ if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) { llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac, addr->sllc_sap); + skb = NULL; goto out; } if (addr->sllc_test) { llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac, addr->sllc_sap); + skb = NULL; goto out; } if (addr->sllc_xid) { llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac, addr->sllc_sap); + skb = NULL; goto out; } rc = -ENOPROTOOPT; if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua)) goto out; rc = llc_ui_send_data(sk, skb, noblock); + skb = NULL; out: - if (rc) { - kfree_skb(skb); -release: + kfree_skb(skb); + if (rc) dprintk("%s: failed sending from %02X to %02X: %d\n", __func__, llc->laddr.lsap, llc->daddr.lsap, rc); - } release_sock(sk); return rc ? : copied; } diff -Nru linux-4.19.98/net/llc/llc_conn.c linux-4.19.118/net/llc/llc_conn.c --- linux-4.19.98/net/llc/llc_conn.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/llc/llc_conn.c 2020-04-23 08:30:24.000000000 +0000 @@ -55,6 +55,8 @@ * (executing it's actions and changing state), upper layer will be * indicated or confirmed, if needed. Returns 0 for success, 1 for * failure. The socket lock has to be held before calling this function. + * + * This function always consumes a reference to the skb. */ int llc_conn_state_process(struct sock *sk, struct sk_buff *skb) { @@ -62,12 +64,6 @@ struct llc_sock *llc = llc_sk(skb->sk); struct llc_conn_state_ev *ev = llc_conn_ev(skb); - /* - * We have to hold the skb, because llc_conn_service will kfree it in - * the sending path and we need to look at the skb->cb, where we encode - * llc_conn_state_ev. - */ - skb_get(skb); ev->ind_prim = ev->cfm_prim = 0; /* * Send event to state machine @@ -75,21 +71,12 @@ rc = llc_conn_service(skb->sk, skb); if (unlikely(rc != 0)) { printk(KERN_ERR "%s: llc_conn_service failed\n", __func__); - goto out_kfree_skb; - } - - if (unlikely(!ev->ind_prim && !ev->cfm_prim)) { - /* indicate or confirm not required */ - if (!skb->next) - goto out_kfree_skb; goto out_skb_put; } - if (unlikely(ev->ind_prim && ev->cfm_prim)) /* Paranoia */ - skb_get(skb); - switch (ev->ind_prim) { case LLC_DATA_PRIM: + skb_get(skb); llc_save_primitive(sk, skb, LLC_DATA_PRIM); if (unlikely(sock_queue_rcv_skb(sk, skb))) { /* @@ -106,6 +93,7 @@ * skb->sk pointing to the newly created struct sock in * llc_conn_handler. -acme */ + skb_get(skb); skb_queue_tail(&sk->sk_receive_queue, skb); sk->sk_state_change(sk); break; @@ -121,7 +109,6 @@ sk->sk_state_change(sk); } } - kfree_skb(skb); sock_put(sk); break; case LLC_RESET_PRIM: @@ -130,14 +117,11 @@ * RESET is not being notified to upper layers for now */ printk(KERN_INFO "%s: received a reset ind!\n", __func__); - kfree_skb(skb); break; default: - if (ev->ind_prim) { + if (ev->ind_prim) printk(KERN_INFO "%s: received unknown %d prim!\n", __func__, ev->ind_prim); - kfree_skb(skb); - } /* No indication */ break; } @@ -179,15 +163,12 @@ printk(KERN_INFO "%s: received a reset conf!\n", __func__); break; default: - if (ev->cfm_prim) { + if (ev->cfm_prim) printk(KERN_INFO "%s: received unknown %d prim!\n", __func__, ev->cfm_prim); - break; - } - goto out_skb_put; /* No confirmation */ + /* No confirmation */ + break; } -out_kfree_skb: - kfree_skb(skb); out_skb_put: kfree_skb(skb); return rc; diff -Nru linux-4.19.98/net/llc/llc_if.c linux-4.19.118/net/llc/llc_if.c --- linux-4.19.98/net/llc/llc_if.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/llc/llc_if.c 2020-04-23 08:30:24.000000000 +0000 @@ -38,6 +38,8 @@ * closed and -EBUSY when sending data is not permitted in this state or * LLC has send an I pdu with p bit set to 1 and is waiting for it's * response. + * + * This function always consumes a reference to the skb. */ int llc_build_and_send_pkt(struct sock *sk, struct sk_buff *skb) { @@ -46,20 +48,22 @@ struct llc_sock *llc = llc_sk(sk); if (unlikely(llc->state == LLC_CONN_STATE_ADM)) - goto out; + goto out_free; rc = -EBUSY; if (unlikely(llc_data_accept_state(llc->state) || /* data_conn_refuse */ llc->p_flag)) { llc->failed_data_req = 1; - goto out; + goto out_free; } ev = llc_conn_ev(skb); ev->type = LLC_CONN_EV_TYPE_PRIM; ev->prim = LLC_DATA_PRIM; ev->prim_type = LLC_PRIM_TYPE_REQ; skb->dev = llc->dev; - rc = llc_conn_state_process(sk, skb); -out: + return llc_conn_state_process(sk, skb); + +out_free: + kfree_skb(skb); return rc; } diff -Nru linux-4.19.98/net/mac80211/cfg.c linux-4.19.118/net/mac80211/cfg.c --- linux-4.19.98/net/mac80211/cfg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/cfg.c 2020-04-23 08:30:24.000000000 +0000 @@ -2825,6 +2825,28 @@ return err; } +static void ieee80211_end_cac(struct wiphy *wiphy, + struct net_device *dev) +{ + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); + struct ieee80211_local *local = sdata->local; + + mutex_lock(&local->mtx); + list_for_each_entry(sdata, &local->interfaces, list) { + /* it might be waiting for the local->mtx, but then + * by the time it gets it, sdata->wdev.cac_started + * will no longer be true + */ + cancel_delayed_work(&sdata->dfs_cac_timer_work); + + if (sdata->wdev.cac_started) { + ieee80211_vif_release_channel(sdata); + sdata->wdev.cac_started = false; + } + } + mutex_unlock(&local->mtx); +} + static struct cfg80211_beacon_data * cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon) { @@ -3848,6 +3870,7 @@ #endif .get_channel = ieee80211_cfg_get_channel, .start_radar_detection = ieee80211_start_radar_detection, + .end_cac = ieee80211_end_cac, .channel_switch = ieee80211_channel_switch, .set_qos_map = ieee80211_set_qos_map, .set_ap_chanwidth = ieee80211_set_ap_chanwidth, diff -Nru linux-4.19.98/net/mac80211/ieee80211_i.h linux-4.19.118/net/mac80211/ieee80211_i.h --- linux-4.19.98/net/mac80211/ieee80211_i.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/ieee80211_i.h 2020-04-23 08:30:24.000000000 +0000 @@ -1729,7 +1729,8 @@ struct net_device *dev); void __ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev, - u32 info_flags); + u32 info_flags, + u32 ctrl_flags); void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, struct sk_buff_head *skbs); struct sk_buff * diff -Nru linux-4.19.98/net/mac80211/mesh_hwmp.c linux-4.19.118/net/mac80211/mesh_hwmp.c --- linux-4.19.98/net/mac80211/mesh_hwmp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/mesh_hwmp.c 2020-04-23 08:30:24.000000000 +0000 @@ -326,6 +326,9 @@ unsigned long fail_avg = ewma_mesh_fail_avg_read(&sta->mesh->fail_avg); + if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) + return MAX_METRIC; + /* Try to get rate based on HW/SW RC algorithm. * Rate is returned in units of Kbps, correct this * to comply with airtime calculation units @@ -1134,7 +1137,8 @@ } } - if (!(mpath->flags & MESH_PATH_RESOLVING)) + if (!(mpath->flags & MESH_PATH_RESOLVING) && + mesh_path_sel_is_hwmp(sdata)) mesh_queue_preq(mpath, PREQ_Q_F_START); if (skb_queue_len(&mpath->frame_queue) >= MESH_FRAME_QUEUE_LEN) diff -Nru linux-4.19.98/net/mac80211/rc80211_minstrel_ht.c linux-4.19.118/net/mac80211/rc80211_minstrel_ht.c --- linux-4.19.98/net/mac80211/rc80211_minstrel_ht.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/rc80211_minstrel_ht.c 2020-04-23 08:30:24.000000000 +0000 @@ -529,7 +529,7 @@ /* (re)Initialize group rate indexes */ for(j = 0; j < MAX_THR_RATES; j++) - tmp_group_tp_rate[j] = group; + tmp_group_tp_rate[j] = MCS_GROUP_RATES * group; for (i = 0; i < MCS_GROUP_RATES; i++) { if (!(mi->supported[group] & BIT(i))) diff -Nru linux-4.19.98/net/mac80211/rx.c linux-4.19.118/net/mac80211/rx.c --- linux-4.19.98/net/mac80211/rx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/rx.c 2020-04-23 08:30:24.000000000 +0000 @@ -3391,9 +3391,18 @@ case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): /* process for all: mesh, mlme, ibss */ break; + case cpu_to_le16(IEEE80211_STYPE_DEAUTH): + if (is_multicast_ether_addr(mgmt->da) && + !is_broadcast_ether_addr(mgmt->da)) + return RX_DROP_MONITOR; + + /* process only for station/IBSS */ + if (sdata->vif.type != NL80211_IFTYPE_STATION && + sdata->vif.type != NL80211_IFTYPE_ADHOC) + return RX_DROP_MONITOR; + break; case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): - case cpu_to_le16(IEEE80211_STYPE_DEAUTH): case cpu_to_le16(IEEE80211_STYPE_DISASSOC): if (is_multicast_ether_addr(mgmt->da) && !is_broadcast_ether_addr(mgmt->da)) @@ -4033,7 +4042,7 @@ lockdep_assert_held(&local->sta_mtx); - list_for_each_entry_rcu(sta, &local->sta_list, list) { + list_for_each_entry(sta, &local->sta_list, list) { if (sdata != sta->sdata && (!sta->sdata->bss || sta->sdata->bss != sdata->bss)) continue; diff -Nru linux-4.19.98/net/mac80211/sta_info.c linux-4.19.118/net/mac80211/sta_info.c --- linux-4.19.98/net/mac80211/sta_info.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/sta_info.c 2020-04-23 08:30:24.000000000 +0000 @@ -3,7 +3,7 @@ * Copyright 2006-2007 Jiri Benc * Copyright 2013-2014 Intel Mobile Communications GmbH * Copyright (C) 2015 - 2017 Intel Deutschland GmbH - * Copyright (C) 2018 Intel Corporation + * Copyright (C) 2018-2020 Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -979,6 +979,11 @@ might_sleep(); lockdep_assert_held(&local->sta_mtx); + while (sta->sta_state == IEEE80211_STA_AUTHORIZED) { + ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC); + WARN_ON_ONCE(ret); + } + /* now keys can no longer be reached */ ieee80211_free_sta_keys(local, sta); diff -Nru linux-4.19.98/net/mac80211/tdls.c linux-4.19.118/net/mac80211/tdls.c --- linux-4.19.98/net/mac80211/tdls.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/tdls.c 2020-04-23 08:30:24.000000000 +0000 @@ -1055,7 +1055,7 @@ /* disable bottom halves when entering the Tx path */ local_bh_disable(); - __ieee80211_subif_start_xmit(skb, dev, flags); + __ieee80211_subif_start_xmit(skb, dev, flags, 0); local_bh_enable(); return ret; diff -Nru linux-4.19.98/net/mac80211/tkip.c linux-4.19.118/net/mac80211/tkip.c --- linux-4.19.98/net/mac80211/tkip.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/tkip.c 2020-04-23 08:30:24.000000000 +0000 @@ -266,9 +266,21 @@ if ((keyid >> 6) != key->conf.keyidx) return TKIP_DECRYPT_INVALID_KEYIDX; - if (rx_ctx->ctx.state != TKIP_STATE_NOT_INIT && - (iv32 < rx_ctx->iv32 || - (iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16))) + /* Reject replays if the received TSC is smaller than or equal to the + * last received value in a valid message, but with an exception for + * the case where a new key has been set and no valid frame using that + * key has yet received and the local RSC was initialized to 0. This + * exception allows the very first frame sent by the transmitter to be + * accepted even if that transmitter were to use TSC 0 (IEEE 802.11 + * described TSC to be initialized to 1 whenever a new key is taken into + * use). + */ + if (iv32 < rx_ctx->iv32 || + (iv32 == rx_ctx->iv32 && + (iv16 < rx_ctx->iv16 || + (iv16 == rx_ctx->iv16 && + (rx_ctx->iv32 || rx_ctx->iv16 || + rx_ctx->ctx.state != TKIP_STATE_NOT_INIT))))) return TKIP_DECRYPT_REPLAY; if (only_iv) { diff -Nru linux-4.19.98/net/mac80211/tx.c linux-4.19.118/net/mac80211/tx.c --- linux-4.19.98/net/mac80211/tx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/tx.c 2020-04-23 08:30:24.000000000 +0000 @@ -4,7 +4,7 @@ * Copyright 2006-2007 Jiri Benc * Copyright 2007 Johannes Berg * Copyright 2013-2014 Intel Mobile Communications GmbH - * Copyright (C) 2018 Intel Corporation + * Copyright (C) 2018, 2020 Intel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -2399,6 +2399,7 @@ * @sdata: virtual interface to build the header for * @skb: the skb to build the header in * @info_flags: skb flags to set + * @ctrl_flags: info control flags to set * * This function takes the skb with 802.3 header and reformats the header to * the appropriate IEEE 802.11 header based on which interface the packet is @@ -2414,7 +2415,7 @@ */ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, u32 info_flags, - struct sta_info *sta) + struct sta_info *sta, u32 ctrl_flags) { struct ieee80211_local *local = sdata->local; struct ieee80211_tx_info *info; @@ -2786,6 +2787,7 @@ info->flags = info_flags; info->ack_frame_id = info_id; info->band = band; + info->control.flags = ctrl_flags; return skb; free: @@ -3511,8 +3513,26 @@ tx.skb = skb; tx.sdata = vif_to_sdata(info->control.vif); - if (txq->sta) + if (txq->sta) { tx.sta = container_of(txq->sta, struct sta_info, sta); + /* + * Drop unicast frames to unauthorised stations unless they are + * EAPOL frames from the local station. + */ + if (unlikely(ieee80211_is_data(hdr->frame_control) && + !ieee80211_vif_is_mesh(&tx.sdata->vif) && + tx.sdata->vif.type != NL80211_IFTYPE_OCB && + !is_multicast_ether_addr(hdr->addr1) && + !test_sta_flag(tx.sta, WLAN_STA_AUTHORIZED) && + (!(info->control.flags & + IEEE80211_TX_CTRL_PORT_CTRL_PROTO) || + !ether_addr_equal(tx.sdata->vif.addr, + hdr->addr2)))) { + I802_DEBUG_INC(local->tx_handlers_drop_unauth_port); + ieee80211_free_txskb(&local->hw, skb); + goto begin; + } + } /* * The key can be removed while the packet was queued, so need to call @@ -3595,7 +3615,8 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb, struct net_device *dev, - u32 info_flags) + u32 info_flags, + u32 ctrl_flags) { struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); struct sta_info *sta; @@ -3666,7 +3687,8 @@ skb->prev = NULL; skb->next = NULL; - skb = ieee80211_build_hdr(sdata, skb, info_flags, sta); + skb = ieee80211_build_hdr(sdata, skb, info_flags, + sta, ctrl_flags); if (IS_ERR(skb)) goto out; @@ -3806,9 +3828,9 @@ __skb_queue_head_init(&queue); ieee80211_convert_to_unicast(skb, dev, &queue); while ((skb = __skb_dequeue(&queue))) - __ieee80211_subif_start_xmit(skb, dev, 0); + __ieee80211_subif_start_xmit(skb, dev, 0, 0); } else { - __ieee80211_subif_start_xmit(skb, dev, 0); + __ieee80211_subif_start_xmit(skb, dev, 0, 0); } return NETDEV_TX_OK; @@ -3833,7 +3855,7 @@ goto out; } - skb = ieee80211_build_hdr(sdata, skb, info_flags, sta); + skb = ieee80211_build_hdr(sdata, skb, info_flags, sta, 0); if (IS_ERR(skb)) goto out; @@ -4836,6 +4858,7 @@ struct ieee80211_local *local = sdata->local; struct sk_buff *skb; struct ethhdr *ehdr; + u32 ctrl_flags = 0; u32 flags; /* Only accept CONTROL_PORT_PROTOCOL configured in CONNECT/ASSOCIATE @@ -4845,6 +4868,9 @@ proto != cpu_to_be16(ETH_P_PREAUTH)) return -EINVAL; + if (proto == sdata->control_port_protocol) + ctrl_flags |= IEEE80211_TX_CTRL_PORT_CTRL_PROTO; + if (unencrypted) flags = IEEE80211_TX_INTFL_DONT_ENCRYPT; else @@ -4870,7 +4896,7 @@ skb_reset_mac_header(skb); local_bh_disable(); - __ieee80211_subif_start_xmit(skb, skb->dev, flags); + __ieee80211_subif_start_xmit(skb, skb->dev, flags, ctrl_flags); local_bh_enable(); return 0; diff -Nru linux-4.19.98/net/mac80211/util.c linux-4.19.118/net/mac80211/util.c --- linux-4.19.98/net/mac80211/util.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mac80211/util.c 2020-04-23 08:30:24.000000000 +0000 @@ -945,16 +945,22 @@ elem_parse_failed = true; break; case WLAN_EID_VHT_OPERATION: - if (elen >= sizeof(struct ieee80211_vht_operation)) + if (elen >= sizeof(struct ieee80211_vht_operation)) { elems->vht_operation = (void *)pos; - else - elem_parse_failed = true; + if (calc_crc) + crc = crc32_be(crc, pos - 2, elen + 2); + break; + } + elem_parse_failed = true; break; case WLAN_EID_OPMODE_NOTIF: - if (elen > 0) + if (elen > 0) { elems->opmode_notif = pos; - else - elem_parse_failed = true; + if (calc_crc) + crc = crc32_be(crc, pos - 2, elen + 2); + break; + } + elem_parse_failed = true; break; case WLAN_EID_MESH_ID: elems->mesh_id = pos; diff -Nru linux-4.19.98/net/mpls/mpls_iptunnel.c linux-4.19.118/net/mpls/mpls_iptunnel.c --- linux-4.19.98/net/mpls/mpls_iptunnel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/mpls/mpls_iptunnel.c 2020-04-23 08:30:24.000000000 +0000 @@ -28,7 +28,7 @@ #include "internal.h" static const struct nla_policy mpls_iptunnel_policy[MPLS_IPTUNNEL_MAX + 1] = { - [MPLS_IPTUNNEL_DST] = { .type = NLA_U32 }, + [MPLS_IPTUNNEL_DST] = { .len = sizeof(u32) }, [MPLS_IPTUNNEL_TTL] = { .type = NLA_U8 }, }; diff -Nru linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_gen.h linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_gen.h --- linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_gen.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_gen.h 2020-04-23 08:30:24.000000000 +0000 @@ -79,7 +79,7 @@ if (set->extensions & IPSET_EXT_DESTROY) mtype_ext_cleanup(set); - memset(map->members, 0, map->memsize); + bitmap_zero(map->members, map->elements); set->elements = 0; set->ext_size = 0; } diff -Nru linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_ip.c linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_ip.c --- linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_ip.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_ip.c 2020-04-23 08:30:24.000000000 +0000 @@ -40,7 +40,7 @@ /* Type structure */ struct bitmap_ip { - void *members; /* the set members */ + unsigned long *members; /* the set members */ u32 first_ip; /* host byte order, included in range */ u32 last_ip; /* host byte order, included in range */ u32 elements; /* number of max elements in the set */ @@ -223,7 +223,7 @@ u32 first_ip, u32 last_ip, u32 elements, u32 hosts, u8 netmask) { - map->members = ip_set_alloc(map->memsize); + map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); if (!map->members) return false; map->first_ip = first_ip; @@ -313,7 +313,7 @@ if (!map) return -ENOMEM; - map->memsize = bitmap_bytes(0, elements - 1); + map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); set->variant = &bitmap_ip; if (!init_map_ip(set, map, first_ip, last_ip, elements, hosts, netmask)) { diff -Nru linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_ipmac.c linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_ipmac.c --- linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_ipmac.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_ipmac.c 2020-04-23 08:30:24.000000000 +0000 @@ -46,7 +46,7 @@ /* Type structure */ struct bitmap_ipmac { - void *members; /* the set members */ + unsigned long *members; /* the set members */ u32 first_ip; /* host byte order, included in range */ u32 last_ip; /* host byte order, included in range */ u32 elements; /* number of max elements in the set */ @@ -303,7 +303,7 @@ init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map, u32 first_ip, u32 last_ip, u32 elements) { - map->members = ip_set_alloc(map->memsize); + map->members = bitmap_zalloc(elements, GFP_KERNEL | __GFP_NOWARN); if (!map->members) return false; map->first_ip = first_ip; @@ -364,7 +364,7 @@ if (!map) return -ENOMEM; - map->memsize = bitmap_bytes(0, elements - 1); + map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); set->variant = &bitmap_ipmac; if (!init_map_ipmac(set, map, first_ip, last_ip, elements)) { kfree(map); diff -Nru linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_port.c linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_port.c --- linux-4.19.98/net/netfilter/ipset/ip_set_bitmap_port.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/ipset/ip_set_bitmap_port.c 2020-04-23 08:30:24.000000000 +0000 @@ -34,7 +34,7 @@ /* Type structure */ struct bitmap_port { - void *members; /* the set members */ + unsigned long *members; /* the set members */ u16 first_port; /* host byte order, included in range */ u16 last_port; /* host byte order, included in range */ u32 elements; /* number of max elements in the set */ @@ -208,7 +208,7 @@ init_map_port(struct ip_set *set, struct bitmap_port *map, u16 first_port, u16 last_port) { - map->members = ip_set_alloc(map->memsize); + map->members = bitmap_zalloc(map->elements, GFP_KERNEL | __GFP_NOWARN); if (!map->members) return false; map->first_port = first_port; @@ -248,7 +248,7 @@ return -ENOMEM; map->elements = elements; - map->memsize = bitmap_bytes(0, map->elements); + map->memsize = BITS_TO_LONGS(elements) * sizeof(unsigned long); set->variant = &bitmap_port; if (!init_map_port(set, map, first_port, last_port)) { kfree(map); diff -Nru linux-4.19.98/net/netfilter/nf_conntrack_netlink.c linux-4.19.118/net/netfilter/nf_conntrack_netlink.c --- linux-4.19.98/net/netfilter/nf_conntrack_netlink.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nf_conntrack_netlink.c 2020-04-23 08:30:24.000000000 +0000 @@ -555,10 +555,8 @@ goto nla_put_failure; if (ctnetlink_dump_status(skb, ct) < 0 || - ctnetlink_dump_timeout(skb, ct) < 0 || ctnetlink_dump_acct(skb, ct, type) < 0 || ctnetlink_dump_timestamp(skb, ct) < 0 || - ctnetlink_dump_protoinfo(skb, ct) < 0 || ctnetlink_dump_helpinfo(skb, ct) < 0 || ctnetlink_dump_mark(skb, ct) < 0 || ctnetlink_dump_secctx(skb, ct) < 0 || @@ -570,6 +568,11 @@ ctnetlink_dump_ct_synproxy(skb, ct) < 0) goto nla_put_failure; + if (!test_bit(IPS_OFFLOAD_BIT, &ct->status) && + (ctnetlink_dump_timeout(skb, ct) < 0 || + ctnetlink_dump_protoinfo(skb, ct) < 0)) + goto nla_put_failure; + nlmsg_end(skb, nlh); return skb->len; diff -Nru linux-4.19.98/net/netfilter/nf_conntrack_standalone.c linux-4.19.118/net/netfilter/nf_conntrack_standalone.c --- linux-4.19.98/net/netfilter/nf_conntrack_standalone.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nf_conntrack_standalone.c 2020-04-23 08:30:24.000000000 +0000 @@ -390,7 +390,7 @@ *pos = cpu + 1; return per_cpu_ptr(net->ct.stat, cpu); } - + (*pos)++; return NULL; } diff -Nru linux-4.19.98/net/netfilter/nf_flow_table_core.c linux-4.19.118/net/netfilter/nf_flow_table_core.c --- linux-4.19.98/net/netfilter/nf_flow_table_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nf_flow_table_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -491,14 +491,17 @@ static void nf_flow_table_do_cleanup(struct flow_offload *flow, void *data) { struct net_device *dev = data; + struct flow_offload_entry *e; + + e = container_of(flow, struct flow_offload_entry, flow); if (!dev) { flow_offload_teardown(flow); return; } - - if (flow->tuplehash[0].tuple.iifidx == dev->ifindex || - flow->tuplehash[1].tuple.iifidx == dev->ifindex) + if (net_eq(nf_ct_net(e->ct), dev_net(dev)) && + (flow->tuplehash[0].tuple.iifidx == dev->ifindex || + flow->tuplehash[1].tuple.iifidx == dev->ifindex)) flow_offload_dead(flow); } diff -Nru linux-4.19.98/net/netfilter/nf_flow_table_ip.c linux-4.19.118/net/netfilter/nf_flow_table_ip.c --- linux-4.19.98/net/netfilter/nf_flow_table_ip.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nf_flow_table_ip.c 2020-04-23 08:30:24.000000000 +0000 @@ -188,6 +188,7 @@ if (!pskb_may_pull(skb, thoff + sizeof(*ports))) return -1; + iph = ip_hdr(skb); ports = (struct flow_ports *)(skb_network_header(skb) + thoff); tuple->src_v4.s_addr = iph->saddr; @@ -421,6 +422,7 @@ if (!pskb_may_pull(skb, thoff + sizeof(*ports))) return -1; + ip6h = ipv6_hdr(skb); ports = (struct flow_ports *)(skb_network_header(skb) + thoff); tuple->src_v6 = ip6h->saddr; diff -Nru linux-4.19.98/net/netfilter/nf_synproxy_core.c linux-4.19.118/net/netfilter/nf_synproxy_core.c --- linux-4.19.98/net/netfilter/nf_synproxy_core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nf_synproxy_core.c 2020-04-23 08:30:24.000000000 +0000 @@ -273,7 +273,7 @@ *pos = cpu + 1; return per_cpu_ptr(snet->stats, cpu); } - + (*pos)++; return NULL; } diff -Nru linux-4.19.98/net/netfilter/nf_tables_api.c linux-4.19.118/net/netfilter/nf_tables_api.c --- linux-4.19.98/net/netfilter/nf_tables_api.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nf_tables_api.c 2020-04-23 08:30:24.000000000 +0000 @@ -472,14 +472,27 @@ static const struct nft_chain_type *chain_type[NFPROTO_NUMPROTO][NFT_CHAIN_T_MAX]; static const struct nft_chain_type * +__nft_chain_type_get(u8 family, enum nft_chain_types type) +{ + if (family >= NFPROTO_NUMPROTO || + type >= NFT_CHAIN_T_MAX) + return NULL; + + return chain_type[family][type]; +} + +static const struct nft_chain_type * __nf_tables_chain_type_lookup(const struct nlattr *nla, u8 family) { + const struct nft_chain_type *type; int i; for (i = 0; i < NFT_CHAIN_T_MAX; i++) { - if (chain_type[family][i] != NULL && - !nla_strcmp(nla, chain_type[family][i]->name)) - return chain_type[family][i]; + type = __nft_chain_type_get(family, i); + if (!type) + continue; + if (!nla_strcmp(nla, type->name)) + return type; } return NULL; } @@ -1050,11 +1063,8 @@ void nft_register_chain_type(const struct nft_chain_type *ctype) { - if (WARN_ON(ctype->family >= NFPROTO_NUMPROTO)) - return; - nfnl_lock(NFNL_SUBSYS_NFTABLES); - if (WARN_ON(chain_type[ctype->family][ctype->type] != NULL)) { + if (WARN_ON(__nft_chain_type_get(ctype->family, ctype->type))) { nfnl_unlock(NFNL_SUBSYS_NFTABLES); return; } @@ -1511,7 +1521,10 @@ hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM])); hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY])); - type = chain_type[family][NFT_CHAIN_T_DEFAULT]; + type = __nft_chain_type_get(family, NFT_CHAIN_T_DEFAULT); + if (!type) + return -EOPNOTSUPP; + if (nla[NFTA_CHAIN_TYPE]) { type = nf_tables_chain_type_lookup(net, nla[NFTA_CHAIN_TYPE], family, autoload); @@ -3437,7 +3450,7 @@ NFT_SET_INTERVAL | NFT_SET_TIMEOUT | NFT_SET_MAP | NFT_SET_EVAL | NFT_SET_OBJECT)) - return -EINVAL; + return -EOPNOTSUPP; /* Only one of these operations is supported */ if ((flags & (NFT_SET_MAP | NFT_SET_OBJECT)) == (NFT_SET_MAP | NFT_SET_OBJECT)) @@ -3475,7 +3488,7 @@ objtype = ntohl(nla_get_be32(nla[NFTA_SET_OBJ_TYPE])); if (objtype == NFT_OBJECT_UNSPEC || objtype > NFT_OBJECT_MAX) - return -EINVAL; + return -EOPNOTSUPP; } else if (flags & NFT_SET_OBJECT) return -EINVAL; else diff -Nru linux-4.19.98/net/netfilter/nfnetlink_cthelper.c linux-4.19.118/net/netfilter/nfnetlink_cthelper.c --- linux-4.19.98/net/netfilter/nfnetlink_cthelper.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nfnetlink_cthelper.c 2020-04-23 08:30:24.000000000 +0000 @@ -744,6 +744,8 @@ [NFCTH_NAME] = { .type = NLA_NUL_STRING, .len = NF_CT_HELPER_NAME_LEN-1 }, [NFCTH_QUEUE_NUM] = { .type = NLA_U32, }, + [NFCTH_PRIV_DATA_LEN] = { .type = NLA_U32, }, + [NFCTH_STATUS] = { .type = NLA_U32, }, }; static const struct nfnl_callback nfnl_cthelper_cb[NFNL_MSG_CTHELPER_MAX] = { diff -Nru linux-4.19.98/net/netfilter/nft_flow_offload.c linux-4.19.118/net/netfilter/nft_flow_offload.c --- linux-4.19.98/net/netfilter/nft_flow_offload.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nft_flow_offload.c 2020-04-23 08:30:24.000000000 +0000 @@ -103,8 +103,7 @@ ct->status & IPS_SEQ_ADJUST) goto out; - if (ctinfo == IP_CT_NEW || - ctinfo == IP_CT_RELATED) + if (!nf_ct_is_confirmed(ct)) goto out; if (test_and_set_bit(IPS_OFFLOAD_BIT, &ct->status)) diff -Nru linux-4.19.98/net/netfilter/nft_fwd_netdev.c linux-4.19.118/net/netfilter/nft_fwd_netdev.c --- linux-4.19.98/net/netfilter/nft_fwd_netdev.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nft_fwd_netdev.c 2020-04-23 08:30:24.000000000 +0000 @@ -186,6 +186,13 @@ return -1; } +static int nft_fwd_validate(const struct nft_ctx *ctx, + const struct nft_expr *expr, + const struct nft_data **data) +{ + return nft_chain_validate_hooks(ctx->chain, (1 << NF_NETDEV_INGRESS)); +} + static struct nft_expr_type nft_fwd_netdev_type; static const struct nft_expr_ops nft_fwd_neigh_netdev_ops = { .type = &nft_fwd_netdev_type, @@ -193,6 +200,7 @@ .eval = nft_fwd_neigh_eval, .init = nft_fwd_neigh_init, .dump = nft_fwd_neigh_dump, + .validate = nft_fwd_validate, }; static const struct nft_expr_ops nft_fwd_netdev_ops = { @@ -201,6 +209,7 @@ .eval = nft_fwd_netdev_eval, .init = nft_fwd_netdev_init, .dump = nft_fwd_netdev_dump, + .validate = nft_fwd_validate, }; static const struct nft_expr_ops * diff -Nru linux-4.19.98/net/netfilter/nft_osf.c linux-4.19.118/net/netfilter/nft_osf.c --- linux-4.19.98/net/netfilter/nft_osf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nft_osf.c 2020-04-23 08:30:24.000000000 +0000 @@ -47,6 +47,9 @@ struct nft_osf *priv = nft_expr_priv(expr); int err; + if (!tb[NFTA_OSF_DREG]) + return -EINVAL; + priv->dreg = nft_parse_register(tb[NFTA_OSF_DREG]); err = nft_validate_register_store(ctx, priv->dreg, NULL, NFT_DATA_VALUE, NFT_OSF_MAXGENRELEN); @@ -69,6 +72,15 @@ return -1; } +static int nft_osf_validate(const struct nft_ctx *ctx, + const struct nft_expr *expr, + const struct nft_data **data) +{ + return nft_chain_validate_hooks(ctx->chain, (1 << NF_INET_LOCAL_IN) | + (1 << NF_INET_PRE_ROUTING) | + (1 << NF_INET_FORWARD)); +} + static struct nft_expr_type nft_osf_type; static const struct nft_expr_ops nft_osf_op = { .eval = nft_osf_eval, @@ -76,6 +88,7 @@ .init = nft_osf_init, .dump = nft_osf_dump, .type = &nft_osf_type, + .validate = nft_osf_validate, }; static struct nft_expr_type nft_osf_type __read_mostly = { diff -Nru linux-4.19.98/net/netfilter/nft_payload.c linux-4.19.118/net/netfilter/nft_payload.c --- linux-4.19.98/net/netfilter/nft_payload.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nft_payload.c 2020-04-23 08:30:24.000000000 +0000 @@ -121,6 +121,7 @@ [NFTA_PAYLOAD_LEN] = { .type = NLA_U32 }, [NFTA_PAYLOAD_CSUM_TYPE] = { .type = NLA_U32 }, [NFTA_PAYLOAD_CSUM_OFFSET] = { .type = NLA_U32 }, + [NFTA_PAYLOAD_CSUM_FLAGS] = { .type = NLA_U32 }, }; static int nft_payload_init(const struct nft_ctx *ctx, diff -Nru linux-4.19.98/net/netfilter/nft_set_hash.c linux-4.19.118/net/netfilter/nft_set_hash.c --- linux-4.19.98/net/netfilter/nft_set_hash.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nft_set_hash.c 2020-04-23 08:30:24.000000000 +0000 @@ -488,6 +488,23 @@ return false; } +static u32 nft_jhash(const struct nft_set *set, const struct nft_hash *priv, + const struct nft_set_ext *ext) +{ + const struct nft_data *key = nft_set_ext_key(ext); + u32 hash, k1; + + if (set->klen == 4) { + k1 = *(u32 *)key; + hash = jhash_1word(k1, priv->seed); + } else { + hash = jhash(key, set->klen, priv->seed); + } + hash = reciprocal_scale(hash, priv->buckets); + + return hash; +} + static int nft_hash_insert(const struct net *net, const struct nft_set *set, const struct nft_set_elem *elem, struct nft_set_ext **ext) @@ -497,8 +514,7 @@ u8 genmask = nft_genmask_next(net); u32 hash; - hash = jhash(nft_set_ext_key(&this->ext), set->klen, priv->seed); - hash = reciprocal_scale(hash, priv->buckets); + hash = nft_jhash(set, priv, &this->ext); hlist_for_each_entry(he, &priv->table[hash], node) { if (!memcmp(nft_set_ext_key(&this->ext), nft_set_ext_key(&he->ext), set->klen) && @@ -537,10 +553,9 @@ u8 genmask = nft_genmask_next(net); u32 hash; - hash = jhash(nft_set_ext_key(&this->ext), set->klen, priv->seed); - hash = reciprocal_scale(hash, priv->buckets); + hash = nft_jhash(set, priv, &this->ext); hlist_for_each_entry(he, &priv->table[hash], node) { - if (!memcmp(nft_set_ext_key(&this->ext), &elem->key.val, + if (!memcmp(nft_set_ext_key(&he->ext), &elem->key.val, set->klen) && nft_set_elem_active(&he->ext, genmask)) { nft_set_elem_change_active(net, set, &he->ext); diff -Nru linux-4.19.98/net/netfilter/nft_tunnel.c linux-4.19.118/net/netfilter/nft_tunnel.c --- linux-4.19.98/net/netfilter/nft_tunnel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/nft_tunnel.c 2020-04-23 08:30:24.000000000 +0000 @@ -218,8 +218,9 @@ } static const struct nla_policy nft_tunnel_opts_erspan_policy[NFTA_TUNNEL_KEY_ERSPAN_MAX + 1] = { + [NFTA_TUNNEL_KEY_ERSPAN_VERSION] = { .type = NLA_U32 }, [NFTA_TUNNEL_KEY_ERSPAN_V1_INDEX] = { .type = NLA_U32 }, - [NFTA_TUNNEL_KEY_ERSPAN_V2_DIR] = { .type = NLA_U8 }, + [NFTA_TUNNEL_KEY_ERSPAN_V2_DIR] = { .type = NLA_U8 }, [NFTA_TUNNEL_KEY_ERSPAN_V2_HWID] = { .type = NLA_U8 }, }; @@ -235,6 +236,9 @@ if (err < 0) return err; + if (!tb[NFTA_TUNNEL_KEY_ERSPAN_VERSION]) + return -EINVAL; + version = ntohl(nla_get_be32(tb[NFTA_TUNNEL_KEY_ERSPAN_VERSION])); switch (version) { case ERSPAN_VERSION: @@ -304,6 +308,8 @@ [NFTA_TUNNEL_KEY_FLAGS] = { .type = NLA_U32, }, [NFTA_TUNNEL_KEY_TOS] = { .type = NLA_U8, }, [NFTA_TUNNEL_KEY_TTL] = { .type = NLA_U8, }, + [NFTA_TUNNEL_KEY_SPORT] = { .type = NLA_U16, }, + [NFTA_TUNNEL_KEY_DPORT] = { .type = NLA_U16, }, [NFTA_TUNNEL_KEY_OPTS] = { .type = NLA_NESTED, }, }; @@ -463,8 +469,8 @@ static int nft_tunnel_ports_dump(struct sk_buff *skb, struct ip_tunnel_info *info) { - if (nla_put_be16(skb, NFTA_TUNNEL_KEY_SPORT, htons(info->key.tp_src)) < 0 || - nla_put_be16(skb, NFTA_TUNNEL_KEY_DPORT, htons(info->key.tp_dst)) < 0) + if (nla_put_be16(skb, NFTA_TUNNEL_KEY_SPORT, info->key.tp_src) < 0 || + nla_put_be16(skb, NFTA_TUNNEL_KEY_DPORT, info->key.tp_dst) < 0) return -1; return 0; diff -Nru linux-4.19.98/net/netfilter/x_tables.c linux-4.19.118/net/netfilter/x_tables.c --- linux-4.19.98/net/netfilter/x_tables.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/x_tables.c 2020-04-23 08:30:24.000000000 +0000 @@ -1556,6 +1556,9 @@ uint8_t nfproto = (unsigned long)PDE_DATA(file_inode(seq->file)); struct nf_mttg_trav *trav = seq->private; + if (ppos != NULL) + ++(*ppos); + switch (trav->class) { case MTTG_TRAV_INIT: trav->class = MTTG_TRAV_NFP_UNSPEC; @@ -1581,9 +1584,6 @@ default: return NULL; } - - if (ppos != NULL) - ++*ppos; return trav; } diff -Nru linux-4.19.98/net/netfilter/xt_hashlimit.c linux-4.19.118/net/netfilter/xt_hashlimit.c --- linux-4.19.98/net/netfilter/xt_hashlimit.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/xt_hashlimit.c 2020-04-23 08:30:24.000000000 +0000 @@ -845,6 +845,8 @@ return hashlimit_mt_common(skb, par, hinfo, &info->cfg, 3); } +#define HASHLIMIT_MAX_SIZE 1048576 + static int hashlimit_mt_check_common(const struct xt_mtchk_param *par, struct xt_hashlimit_htable **hinfo, struct hashlimit_cfg3 *cfg, @@ -855,6 +857,14 @@ if (cfg->gc_interval == 0 || cfg->expire == 0) return -EINVAL; + if (cfg->size > HASHLIMIT_MAX_SIZE) { + cfg->size = HASHLIMIT_MAX_SIZE; + pr_info_ratelimited("size too large, truncated to %u\n", cfg->size); + } + if (cfg->max > HASHLIMIT_MAX_SIZE) { + cfg->max = HASHLIMIT_MAX_SIZE; + pr_info_ratelimited("max too large, truncated to %u\n", cfg->max); + } if (par->family == NFPROTO_IPV4) { if (cfg->srcmask > 32 || cfg->dstmask > 32) return -EINVAL; diff -Nru linux-4.19.98/net/netfilter/xt_recent.c linux-4.19.118/net/netfilter/xt_recent.c --- linux-4.19.98/net/netfilter/xt_recent.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netfilter/xt_recent.c 2020-04-23 08:30:24.000000000 +0000 @@ -497,12 +497,12 @@ const struct recent_entry *e = v; const struct list_head *head = e->list.next; + (*pos)++; while (head == &t->iphash[st->bucket]) { if (++st->bucket >= ip_list_hash_size) return NULL; head = t->iphash[st->bucket].next; } - (*pos)++; return list_entry(head, struct recent_entry, list); } diff -Nru linux-4.19.98/net/netlink/af_netlink.c linux-4.19.118/net/netlink/af_netlink.c --- linux-4.19.98/net/netlink/af_netlink.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/netlink/af_netlink.c 2020-04-23 08:30:24.000000000 +0000 @@ -1029,7 +1029,8 @@ if (nlk->netlink_bind && groups) { int group; - for (group = 0; group < nlk->ngroups; group++) { + /* nl_groups is a u32, so cap the maximum groups we can bind */ + for (group = 0; group < BITS_PER_TYPE(u32); group++) { if (!test_bit(group, &groups)) continue; err = nlk->netlink_bind(net, group + 1); @@ -1048,7 +1049,7 @@ netlink_insert(sk, nladdr->nl_pid) : netlink_autobind(sock); if (err) { - netlink_undo_bind(nlk->ngroups, groups, sk); + netlink_undo_bind(BITS_PER_TYPE(u32), groups, sk); goto unlock; } } @@ -2410,7 +2411,7 @@ in_skb->len)) WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_OFFS, (u8 *)extack->bad_attr - - in_skb->data)); + (u8 *)nlh)); } else { if (extack->cookie_len) WARN_ON(nla_put(skb, NLMSGERR_ATTR_COOKIE, diff -Nru linux-4.19.98/net/nfc/hci/core.c linux-4.19.118/net/nfc/hci/core.c --- linux-4.19.98/net/nfc/hci/core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/nfc/hci/core.c 2020-04-23 08:30:24.000000000 +0000 @@ -193,13 +193,20 @@ void nfc_hci_cmd_received(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd, struct sk_buff *skb) { - u8 gate = hdev->pipes[pipe].gate; u8 status = NFC_HCI_ANY_OK; struct hci_create_pipe_resp *create_info; struct hci_delete_pipe_noti *delete_info; struct hci_all_pipe_cleared_noti *cleared_info; + u8 gate; - pr_debug("from gate %x pipe %x cmd %x\n", gate, pipe, cmd); + pr_debug("from pipe %x cmd %x\n", pipe, cmd); + + if (pipe >= NFC_HCI_MAX_PIPES) { + status = NFC_HCI_ANY_E_NOK; + goto exit; + } + + gate = hdev->pipes[pipe].gate; switch (cmd) { case NFC_HCI_ADM_NOTIFY_PIPE_CREATED: @@ -387,8 +394,14 @@ struct sk_buff *skb) { int r = 0; - u8 gate = hdev->pipes[pipe].gate; + u8 gate; + + if (pipe >= NFC_HCI_MAX_PIPES) { + pr_err("Discarded event %x to invalid pipe %x\n", event, pipe); + goto exit; + } + gate = hdev->pipes[pipe].gate; if (gate == NFC_HCI_INVALID_GATE) { pr_err("Discarded event %x to unopened pipe %x\n", event, pipe); goto exit; diff -Nru linux-4.19.98/net/nfc/netlink.c linux-4.19.118/net/nfc/netlink.c --- linux-4.19.98/net/nfc/netlink.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/nfc/netlink.c 2020-04-23 08:30:24.000000000 +0000 @@ -44,6 +44,7 @@ [NFC_ATTR_DEVICE_NAME] = { .type = NLA_STRING, .len = NFC_DEVICE_NAME_MAXSIZE }, [NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 }, + [NFC_ATTR_TARGET_INDEX] = { .type = NLA_U32 }, [NFC_ATTR_COMM_MODE] = { .type = NLA_U8 }, [NFC_ATTR_RF_MODE] = { .type = NLA_U8 }, [NFC_ATTR_DEVICE_POWERED] = { .type = NLA_U8 }, @@ -55,7 +56,10 @@ [NFC_ATTR_LLC_SDP] = { .type = NLA_NESTED }, [NFC_ATTR_FIRMWARE_NAME] = { .type = NLA_STRING, .len = NFC_FIRMWARE_NAME_MAXSIZE }, + [NFC_ATTR_SE_INDEX] = { .type = NLA_U32 }, [NFC_ATTR_SE_APDU] = { .type = NLA_BINARY }, + [NFC_ATTR_VENDOR_ID] = { .type = NLA_U32 }, + [NFC_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 }, [NFC_ATTR_VENDOR_DATA] = { .type = NLA_BINARY }, }; diff -Nru linux-4.19.98/net/packet/af_packet.c linux-4.19.118/net/packet/af_packet.c --- linux-4.19.98/net/packet/af_packet.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/packet/af_packet.c 2020-04-23 08:30:24.000000000 +0000 @@ -1297,15 +1297,21 @@ static bool fanout_flow_is_huge(struct packet_sock *po, struct sk_buff *skb) { - u32 rxhash; + u32 *history = po->rollover->history; + u32 victim, rxhash; int i, count = 0; rxhash = skb_get_hash(skb); for (i = 0; i < ROLLOVER_HLEN; i++) - if (po->rollover->history[i] == rxhash) + if (READ_ONCE(history[i]) == rxhash) count++; - po->rollover->history[prandom_u32() % ROLLOVER_HLEN] = rxhash; + victim = prandom_u32() % ROLLOVER_HLEN; + + /* Avoid dirtying the cache line if possible */ + if (READ_ONCE(history[victim]) != rxhash) + WRITE_ONCE(history[victim], rxhash); + return count > (ROLLOVER_HLEN >> 1); } @@ -2159,6 +2165,7 @@ struct timespec ts; __u32 ts_status; bool is_drop_n_account = false; + unsigned int slot_id = 0; bool do_vnet = false; /* struct tpacket{2,3}_hdr is aligned to a multiple of TPACKET_ALIGNMENT. @@ -2254,6 +2261,20 @@ TP_STATUS_KERNEL, (macoff+snaplen)); if (!h.raw) goto drop_n_account; + + if (po->tp_version <= TPACKET_V2) { + slot_id = po->rx_ring.head; + if (test_bit(slot_id, po->rx_ring.rx_owner_map)) + goto drop_n_account; + __set_bit(slot_id, po->rx_ring.rx_owner_map); + } + + if (do_vnet && + virtio_net_hdr_from_skb(skb, h.raw + macoff - + sizeof(struct virtio_net_hdr), + vio_le(), true, 0)) + goto drop_n_account; + if (po->tp_version <= TPACKET_V2) { packet_increment_rx_head(po, &po->rx_ring); /* @@ -2266,12 +2287,6 @@ status |= TP_STATUS_LOSING; } - if (do_vnet && - virtio_net_hdr_from_skb(skb, h.raw + macoff - - sizeof(struct virtio_net_hdr), - vio_le(), true, 0)) - goto drop_n_account; - po->stats.stats1.tp_packets++; if (copy_skb) { status |= TP_STATUS_COPY; @@ -2359,7 +2374,10 @@ #endif if (po->tp_version <= TPACKET_V2) { + spin_lock(&sk->sk_receive_queue.lock); __packet_set_status(po, h.raw, status); + __clear_bit(slot_id, po->rx_ring.rx_owner_map); + spin_unlock(&sk->sk_receive_queue.lock); sk->sk_data_ready(sk); } else { prb_clear_blk_fill_status(&po->rx_ring); @@ -3371,20 +3389,29 @@ sock_recv_ts_and_drops(msg, sk, skb); if (msg->msg_name) { + int copy_len; + /* If the address length field is there to be filled * in, we fill it in now. */ if (sock->type == SOCK_PACKET) { __sockaddr_check_size(sizeof(struct sockaddr_pkt)); msg->msg_namelen = sizeof(struct sockaddr_pkt); + copy_len = msg->msg_namelen; } else { struct sockaddr_ll *sll = &PACKET_SKB_CB(skb)->sa.ll; msg->msg_namelen = sll->sll_halen + offsetof(struct sockaddr_ll, sll_addr); + copy_len = msg->msg_namelen; + if (msg->msg_namelen < sizeof(struct sockaddr_ll)) { + memset(msg->msg_name + + offsetof(struct sockaddr_ll, sll_addr), + 0, sizeof(sll->sll_addr)); + msg->msg_namelen = sizeof(struct sockaddr_ll); + } } - memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, - msg->msg_namelen); + memcpy(msg->msg_name, &PACKET_SKB_CB(skb)->sa, copy_len); } if (pkt_sk(sk)->auxdata) { @@ -4244,6 +4271,7 @@ { struct pgv *pg_vec = NULL; struct packet_sock *po = pkt_sk(sk); + unsigned long *rx_owner_map = NULL; int was_running, order = 0; struct packet_ring_buffer *rb; struct sk_buff_head *rb_queue; @@ -4329,6 +4357,12 @@ } break; default: + if (!tx_ring) { + rx_owner_map = bitmap_alloc(req->tp_frame_nr, + GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO); + if (!rx_owner_map) + goto out_free_pg_vec; + } break; } } @@ -4358,6 +4392,8 @@ err = 0; spin_lock_bh(&rb_queue->lock); swap(rb->pg_vec, pg_vec); + if (po->tp_version <= TPACKET_V2) + swap(rb->rx_owner_map, rx_owner_map); rb->frame_max = (req->tp_frame_nr - 1); rb->head = 0; rb->frame_size = req->tp_frame_size; @@ -4389,6 +4425,7 @@ } out_free_pg_vec: + bitmap_free(rx_owner_map); if (pg_vec) free_pg_vec(pg_vec, order, req->tp_block_nr); out: diff -Nru linux-4.19.98/net/packet/internal.h linux-4.19.118/net/packet/internal.h --- linux-4.19.98/net/packet/internal.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/packet/internal.h 2020-04-23 08:30:24.000000000 +0000 @@ -70,7 +70,10 @@ unsigned int __percpu *pending_refcnt; - struct tpacket_kbdq_core prb_bdqc; + union { + unsigned long *rx_owner_map; + struct tpacket_kbdq_core prb_bdqc; + }; }; extern struct mutex fanout_mutex; diff -Nru linux-4.19.98/net/qrtr/qrtr.c linux-4.19.118/net/qrtr/qrtr.c --- linux-4.19.98/net/qrtr/qrtr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/qrtr/qrtr.c 2020-04-23 08:30:24.000000000 +0000 @@ -203,7 +203,7 @@ hdr->size = cpu_to_le32(len); hdr->confirm_rx = 0; - skb_put_padto(skb, ALIGN(len, 4)); + skb_put_padto(skb, ALIGN(len, 4) + sizeof(*hdr)); mutex_lock(&node->ep_lock); if (node->ep) @@ -769,20 +769,21 @@ node = NULL; if (addr->sq_node == QRTR_NODE_BCAST) { - enqueue_fn = qrtr_bcast_enqueue; - if (addr->sq_port != QRTR_PORT_CTRL) { + if (addr->sq_port != QRTR_PORT_CTRL && + qrtr_local_nid != QRTR_NODE_BCAST) { release_sock(sk); return -ENOTCONN; } + enqueue_fn = qrtr_bcast_enqueue; } else if (addr->sq_node == ipc->us.sq_node) { enqueue_fn = qrtr_local_enqueue; } else { - enqueue_fn = qrtr_node_enqueue; node = qrtr_node_lookup(addr->sq_node); if (!node) { release_sock(sk); return -ECONNRESET; } + enqueue_fn = qrtr_node_enqueue; } plen = (len + 3) & ~3; diff -Nru linux-4.19.98/net/rds/ib_stats.c linux-4.19.118/net/rds/ib_stats.c --- linux-4.19.98/net/rds/ib_stats.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rds/ib_stats.c 2020-04-23 08:30:24.000000000 +0000 @@ -42,7 +42,7 @@ static const char *const rds_ib_stat_names[] = { "ib_connect_raced", "ib_listen_closed_stale", - "s_ib_evt_handler_call", + "ib_evt_handler_call", "ib_tasklet_call", "ib_tx_cq_event", "ib_tx_ring_full", diff -Nru linux-4.19.98/net/rds/stats.c linux-4.19.118/net/rds/stats.c --- linux-4.19.98/net/rds/stats.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rds/stats.c 2020-04-23 08:30:24.000000000 +0000 @@ -76,6 +76,8 @@ "cong_update_received", "cong_send_error", "cong_send_blocked", + "recv_bytes_added_to_sock", + "recv_bytes_freed_fromsock", }; void rds_stats_info_copy(struct rds_info_iterator *iter, diff -Nru linux-4.19.98/net/rxrpc/af_rxrpc.c linux-4.19.118/net/rxrpc/af_rxrpc.c --- linux-4.19.98/net/rxrpc/af_rxrpc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/af_rxrpc.c 2020-04-23 08:30:24.000000000 +0000 @@ -196,6 +196,7 @@ service_in_use: write_unlock(&local->services_lock); rxrpc_unuse_local(local); + rxrpc_put_local(local); ret = -EADDRINUSE; error_unlock: release_sock(&rx->sk); @@ -869,7 +870,6 @@ static int rxrpc_release_sock(struct sock *sk) { struct rxrpc_sock *rx = rxrpc_sk(sk); - struct rxrpc_net *rxnet = rxrpc_net(sock_net(&rx->sk)); _enter("%p{%d,%d}", sk, sk->sk_state, refcount_read(&sk->sk_refcnt)); @@ -905,10 +905,9 @@ rxrpc_release_calls_on_socket(rx); flush_workqueue(rxrpc_workqueue); rxrpc_purge_queue(&sk->sk_receive_queue); - rxrpc_queue_work(&rxnet->service_conn_reaper); - rxrpc_queue_work(&rxnet->client_conn_reaper); rxrpc_unuse_local(rx->local); + rxrpc_put_local(rx->local); rx->local = NULL; key_put(rx->key); rx->key = NULL; diff -Nru linux-4.19.98/net/rxrpc/ar-internal.h linux-4.19.118/net/rxrpc/ar-internal.h --- linux-4.19.98/net/rxrpc/ar-internal.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/ar-internal.h 2020-04-23 08:30:24.000000000 +0000 @@ -484,6 +484,7 @@ RXRPC_CALL_BEGAN_RX_TIMER, /* We began the expect_rx_by timer */ RXRPC_CALL_RX_HEARD, /* The peer responded at least once to this call */ RXRPC_CALL_RX_UNDERRUN, /* Got data underrun */ + RXRPC_CALL_DISCONNECTED, /* The call has been disconnected */ }; /* @@ -644,6 +645,7 @@ u8 ackr_reason; /* reason to ACK */ u16 ackr_skew; /* skew on packet being ACK'd */ rxrpc_serial_t ackr_serial; /* serial of packet being ACK'd */ + rxrpc_serial_t ackr_first_seq; /* first sequence number received */ rxrpc_seq_t ackr_prev_seq; /* previous sequence number received */ rxrpc_seq_t ackr_consumed; /* Highest packet shown consumed */ rxrpc_seq_t ackr_seen; /* Highest packet shown seen */ @@ -902,6 +904,7 @@ void rxrpc_put_client_conn(struct rxrpc_connection *); void rxrpc_discard_expired_client_conns(struct work_struct *); void rxrpc_destroy_all_client_connections(struct rxrpc_net *); +void rxrpc_clean_up_local_conns(struct rxrpc_local *); /* * conn_event.c @@ -1004,6 +1007,16 @@ void rxrpc_queue_local(struct rxrpc_local *); void rxrpc_destroy_all_locals(struct rxrpc_net *); +static inline bool __rxrpc_unuse_local(struct rxrpc_local *local) +{ + return atomic_dec_return(&local->active_users) == 0; +} + +static inline bool __rxrpc_use_local(struct rxrpc_local *local) +{ + return atomic_fetch_add_unless(&local->active_users, 1, 0) != 0; +} + /* * misc.c */ diff -Nru linux-4.19.98/net/rxrpc/call_accept.c linux-4.19.118/net/rxrpc/call_accept.c --- linux-4.19.98/net/rxrpc/call_accept.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/call_accept.c 2020-04-23 08:30:24.000000000 +0000 @@ -88,7 +88,7 @@ smp_store_release(&b->conn_backlog_head, (head + 1) & (size - 1)); - trace_rxrpc_conn(conn, rxrpc_conn_new_service, + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_service, atomic_read(&conn->usage), here); } diff -Nru linux-4.19.98/net/rxrpc/call_object.c linux-4.19.118/net/rxrpc/call_object.c --- linux-4.19.98/net/rxrpc/call_object.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/call_object.c 2020-04-23 08:30:24.000000000 +0000 @@ -520,7 +520,7 @@ _debug("RELEASE CALL %p (%d CONN %p)", call, call->debug_id, conn); - if (conn) + if (conn && !test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) rxrpc_disconnect_call(call); for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) { @@ -647,13 +647,14 @@ } /* - * Final call destruction under RCU. + * Final call destruction - but must be done in process context. */ -static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) +static void rxrpc_destroy_call(struct work_struct *work) { - struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu); + struct rxrpc_call *call = container_of(work, struct rxrpc_call, processor); struct rxrpc_net *rxnet = call->rxnet; + rxrpc_put_connection(call->conn); rxrpc_put_peer(call->peer); kfree(call->rxtx_buffer); kfree(call->rxtx_annotations); @@ -663,6 +664,22 @@ } /* + * Final call destruction under RCU. + */ +static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) +{ + struct rxrpc_call *call = container_of(rcu, struct rxrpc_call, rcu); + + if (in_softirq()) { + INIT_WORK(&call->processor, rxrpc_destroy_call); + if (!rxrpc_queue_work(&call->processor)) + BUG(); + } else { + rxrpc_destroy_call(&call->processor); + } +} + +/* * clean up a call */ void rxrpc_cleanup_call(struct rxrpc_call *call) @@ -677,7 +694,6 @@ ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE); ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags)); - ASSERTCMP(call->conn, ==, NULL); /* Clean up the Rx/Tx buffer */ for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) diff -Nru linux-4.19.98/net/rxrpc/conn_client.c linux-4.19.118/net/rxrpc/conn_client.c --- linux-4.19.98/net/rxrpc/conn_client.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/conn_client.c 2020-04-23 08:30:24.000000000 +0000 @@ -217,7 +217,8 @@ rxrpc_get_local(conn->params.local); key_get(conn->params.key); - trace_rxrpc_conn(conn, rxrpc_conn_new_client, atomic_read(&conn->usage), + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_client, + atomic_read(&conn->usage), __builtin_return_address(0)); trace_rxrpc_client(conn, -1, rxrpc_client_alloc); _leave(" = %p", conn); @@ -785,6 +786,7 @@ u32 cid; spin_lock(&conn->channel_lock); + set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); cid = call->cid; if (cid) { @@ -792,7 +794,6 @@ chan = &conn->channels[channel]; } trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect); - call->conn = NULL; /* Calls that have never actually been assigned a channel can simply be * discarded. If the conn didn't get used either, it will follow @@ -908,7 +909,6 @@ spin_unlock(&rxnet->client_conn_cache_lock); out_2: spin_unlock(&conn->channel_lock); - rxrpc_put_connection(conn); _leave(""); return; @@ -989,11 +989,12 @@ void rxrpc_put_client_conn(struct rxrpc_connection *conn) { const void *here = __builtin_return_address(0); + unsigned int debug_id = conn->debug_id; int n; do { n = atomic_dec_return(&conn->usage); - trace_rxrpc_conn(conn, rxrpc_conn_put_client, n, here); + trace_rxrpc_conn(debug_id, rxrpc_conn_put_client, n, here); if (n > 0) return; ASSERTCMP(n, >=, 0); @@ -1166,3 +1167,47 @@ _leave(""); } + +/* + * Clean up the client connections on a local endpoint. + */ +void rxrpc_clean_up_local_conns(struct rxrpc_local *local) +{ + struct rxrpc_connection *conn, *tmp; + struct rxrpc_net *rxnet = local->rxnet; + unsigned int nr_active; + LIST_HEAD(graveyard); + + _enter(""); + + spin_lock(&rxnet->client_conn_cache_lock); + nr_active = rxnet->nr_active_client_conns; + + list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, + cache_link) { + if (conn->params.local == local) { + ASSERTCMP(conn->cache_state, ==, RXRPC_CONN_CLIENT_IDLE); + + trace_rxrpc_client(conn, -1, rxrpc_client_discard); + if (!test_and_clear_bit(RXRPC_CONN_EXPOSED, &conn->flags)) + BUG(); + conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; + list_move(&conn->cache_link, &graveyard); + nr_active--; + } + } + + rxnet->nr_active_client_conns = nr_active; + spin_unlock(&rxnet->client_conn_cache_lock); + ASSERTCMP(nr_active, >=, 0); + + while (!list_empty(&graveyard)) { + conn = list_entry(graveyard.next, + struct rxrpc_connection, cache_link); + list_del_init(&conn->cache_link); + + rxrpc_put_connection(conn); + } + + _leave(" [culled]"); +} diff -Nru linux-4.19.98/net/rxrpc/conn_event.c linux-4.19.118/net/rxrpc/conn_event.c --- linux-4.19.98/net/rxrpc/conn_event.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/conn_event.c 2020-04-23 08:30:24.000000000 +0000 @@ -453,16 +453,12 @@ /* * connection-level event processor */ -void rxrpc_process_connection(struct work_struct *work) +static void rxrpc_do_process_connection(struct rxrpc_connection *conn) { - struct rxrpc_connection *conn = - container_of(work, struct rxrpc_connection, processor); struct sk_buff *skb; u32 abort_code = RX_PROTOCOL_ERROR; int ret; - rxrpc_see_connection(conn); - if (test_and_clear_bit(RXRPC_CONN_EV_CHALLENGE, &conn->events)) rxrpc_secure_connection(conn); @@ -490,18 +486,33 @@ } } -out: - rxrpc_put_connection(conn); - _leave(""); return; requeue_and_leave: skb_queue_head(&conn->rx_queue, skb); - goto out; + return; protocol_error: if (rxrpc_abort_connection(conn, ret, abort_code) < 0) goto requeue_and_leave; rxrpc_free_skb(skb, rxrpc_skb_rx_freed); - goto out; + return; +} + +void rxrpc_process_connection(struct work_struct *work) +{ + struct rxrpc_connection *conn = + container_of(work, struct rxrpc_connection, processor); + + rxrpc_see_connection(conn); + + if (__rxrpc_use_local(conn->params.local)) { + rxrpc_do_process_connection(conn); + rxrpc_unuse_local(conn->params.local); + } + + rxrpc_put_connection(conn); + _leave(""); + return; } + diff -Nru linux-4.19.98/net/rxrpc/conn_object.c linux-4.19.118/net/rxrpc/conn_object.c --- linux-4.19.98/net/rxrpc/conn_object.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/conn_object.c 2020-04-23 08:30:24.000000000 +0000 @@ -226,9 +226,8 @@ __rxrpc_disconnect_call(conn, call); spin_unlock(&conn->channel_lock); - call->conn = NULL; + set_bit(RXRPC_CALL_DISCONNECTED, &call->flags); conn->idle_timestamp = jiffies; - rxrpc_put_connection(conn); } /* @@ -272,7 +271,7 @@ if (n == 0) return false; if (rxrpc_queue_work(&conn->processor)) - trace_rxrpc_conn(conn, rxrpc_conn_queued, n + 1, here); + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_queued, n + 1, here); else rxrpc_put_connection(conn); return true; @@ -287,7 +286,7 @@ if (conn) { int n = atomic_read(&conn->usage); - trace_rxrpc_conn(conn, rxrpc_conn_seen, n, here); + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_seen, n, here); } } @@ -299,7 +298,7 @@ const void *here = __builtin_return_address(0); int n = atomic_inc_return(&conn->usage); - trace_rxrpc_conn(conn, rxrpc_conn_got, n, here); + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_got, n, here); } /* @@ -313,7 +312,7 @@ if (conn) { int n = atomic_fetch_add_unless(&conn->usage, 1, 0); if (n > 0) - trace_rxrpc_conn(conn, rxrpc_conn_got, n + 1, here); + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_got, n + 1, here); else conn = NULL; } @@ -336,10 +335,11 @@ void rxrpc_put_service_conn(struct rxrpc_connection *conn) { const void *here = __builtin_return_address(0); + unsigned int debug_id = conn->debug_id; int n; n = atomic_dec_return(&conn->usage); - trace_rxrpc_conn(conn, rxrpc_conn_put_service, n, here); + trace_rxrpc_conn(debug_id, rxrpc_conn_put_service, n, here); ASSERTCMP(n, >=, 0); if (n == 1) rxrpc_set_service_reap_timer(conn->params.local->rxnet, @@ -401,7 +401,7 @@ if (conn->state == RXRPC_CONN_SERVICE_PREALLOC) continue; - if (rxnet->live) { + if (rxnet->live && !conn->params.local->dead) { idle_timestamp = READ_ONCE(conn->idle_timestamp); expire_at = idle_timestamp + rxrpc_connection_expiry * HZ; if (conn->params.local->service_closed) @@ -423,7 +423,7 @@ */ if (atomic_cmpxchg(&conn->usage, 1, 0) != 1) continue; - trace_rxrpc_conn(conn, rxrpc_conn_reap_service, 0, NULL); + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_reap_service, 0, NULL); if (rxrpc_conn_is_client(conn)) BUG(); diff -Nru linux-4.19.98/net/rxrpc/conn_service.c linux-4.19.118/net/rxrpc/conn_service.c --- linux-4.19.98/net/rxrpc/conn_service.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/conn_service.c 2020-04-23 08:30:24.000000000 +0000 @@ -138,7 +138,7 @@ list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); write_unlock(&rxnet->conn_lock); - trace_rxrpc_conn(conn, rxrpc_conn_new_service, + trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_service, atomic_read(&conn->usage), __builtin_return_address(0)); } diff -Nru linux-4.19.98/net/rxrpc/input.c linux-4.19.118/net/rxrpc/input.c --- linux-4.19.98/net/rxrpc/input.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/input.c 2020-04-23 08:30:24.000000000 +0000 @@ -612,10 +612,8 @@ false, true, rxrpc_propose_ack_input_data); - if (sp->hdr.seq == READ_ONCE(call->rx_hard_ack) + 1) { - trace_rxrpc_notify_socket(call->debug_id, serial); - rxrpc_notify_socket(call); - } + trace_rxrpc_notify_socket(call->debug_id, serial); + rxrpc_notify_socket(call); unlock: spin_unlock(&call->input_lock); @@ -837,7 +835,7 @@ u8 acks[RXRPC_MAXACKS]; } buf; rxrpc_serial_t acked_serial; - rxrpc_seq_t first_soft_ack, hard_ack; + rxrpc_seq_t first_soft_ack, hard_ack, prev_pkt; int nr_acks, offset, ioffset; _enter(""); @@ -851,13 +849,14 @@ acked_serial = ntohl(buf.ack.serial); first_soft_ack = ntohl(buf.ack.firstPacket); + prev_pkt = ntohl(buf.ack.previousPacket); hard_ack = first_soft_ack - 1; nr_acks = buf.ack.nAcks; summary.ack_reason = (buf.ack.reason < RXRPC_ACK__INVALID ? buf.ack.reason : RXRPC_ACK__INVALID); trace_rxrpc_rx_ack(call, sp->hdr.serial, acked_serial, - first_soft_ack, ntohl(buf.ack.previousPacket), + first_soft_ack, prev_pkt, summary.ack_reason, nr_acks); if (buf.ack.reason == RXRPC_ACK_PING_RESPONSE) @@ -878,8 +877,9 @@ rxrpc_propose_ack_respond_to_ack); } - /* Discard any out-of-order or duplicate ACKs. */ - if (before_eq(sp->hdr.serial, call->acks_latest)) + /* Discard any out-of-order or duplicate ACKs (outside lock). */ + if (before(first_soft_ack, call->ackr_first_seq) || + before(prev_pkt, call->ackr_prev_seq)) return; buf.info.rxMTU = 0; @@ -890,12 +890,16 @@ spin_lock(&call->input_lock); - /* Discard any out-of-order or duplicate ACKs. */ - if (before_eq(sp->hdr.serial, call->acks_latest)) + /* Discard any out-of-order or duplicate ACKs (inside lock). */ + if (before(first_soft_ack, call->ackr_first_seq) || + before(prev_pkt, call->ackr_prev_seq)) goto out; call->acks_latest_ts = skb->tstamp; call->acks_latest = sp->hdr.serial; + call->ackr_first_seq = first_soft_ack; + call->ackr_prev_seq = prev_pkt; + /* Parse rwind and mtu sizes if provided. */ if (buf.info.rxMTU) rxrpc_input_ackinfo(call, skb, &buf.info); diff -Nru linux-4.19.98/net/rxrpc/key.c linux-4.19.118/net/rxrpc/key.c --- linux-4.19.98/net/rxrpc/key.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/key.c 2020-04-23 08:30:24.000000000 +0000 @@ -35,7 +35,7 @@ static void rxrpc_destroy(struct key *); static void rxrpc_destroy_s(struct key *); static void rxrpc_describe(const struct key *, struct seq_file *); -static long rxrpc_read(const struct key *, char __user *, size_t); +static long rxrpc_read(const struct key *, char *, size_t); /* * rxrpc defined keys take an arbitrary string as the description and an @@ -1044,12 +1044,12 @@ * - this returns the result in XDR form */ static long rxrpc_read(const struct key *key, - char __user *buffer, size_t buflen) + char *buffer, size_t buflen) { const struct rxrpc_key_token *token; const struct krb5_principal *princ; size_t size; - __be32 __user *xdr, *oldxdr; + __be32 *xdr, *oldxdr; u32 cnlen, toksize, ntoks, tok, zero; u16 toksizes[AFSTOKEN_MAX]; int loop; @@ -1126,30 +1126,25 @@ if (!buffer || buflen < size) return size; - xdr = (__be32 __user *) buffer; + xdr = (__be32 *)buffer; zero = 0; #define ENCODE(x) \ do { \ - __be32 y = htonl(x); \ - if (put_user(y, xdr++) < 0) \ - goto fault; \ + *xdr++ = htonl(x); \ } while(0) #define ENCODE_DATA(l, s) \ do { \ u32 _l = (l); \ ENCODE(l); \ - if (copy_to_user(xdr, (s), _l) != 0) \ - goto fault; \ - if (_l & 3 && \ - copy_to_user((u8 __user *)xdr + _l, &zero, 4 - (_l & 3)) != 0) \ - goto fault; \ + memcpy(xdr, (s), _l); \ + if (_l & 3) \ + memcpy((u8 *)xdr + _l, &zero, 4 - (_l & 3)); \ xdr += (_l + 3) >> 2; \ } while(0) #define ENCODE64(x) \ do { \ __be64 y = cpu_to_be64(x); \ - if (copy_to_user(xdr, &y, 8) != 0) \ - goto fault; \ + memcpy(xdr, &y, 8); \ xdr += 8 >> 2; \ } while(0) #define ENCODE_STR(s) \ @@ -1240,8 +1235,4 @@ ASSERTCMP((char __user *) xdr - buffer, ==, size); _leave(" = %zu", size); return size; - -fault: - _leave(" = -EFAULT"); - return -EFAULT; } diff -Nru linux-4.19.98/net/rxrpc/local_object.c linux-4.19.118/net/rxrpc/local_object.c --- linux-4.19.98/net/rxrpc/local_object.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/local_object.c 2020-04-23 08:30:24.000000000 +0000 @@ -368,11 +368,14 @@ void rxrpc_put_local(struct rxrpc_local *local) { const void *here = __builtin_return_address(0); + unsigned int debug_id; int n; if (local) { + debug_id = local->debug_id; + n = atomic_dec_return(&local->usage); - trace_rxrpc_local(local->debug_id, rxrpc_local_put, n, here); + trace_rxrpc_local(debug_id, rxrpc_local_put, n, here); if (n == 0) call_rcu(&local->rcu, rxrpc_local_rcu); @@ -384,14 +387,11 @@ */ struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local) { - unsigned int au; - local = rxrpc_get_local_maybe(local); if (!local) return NULL; - au = atomic_fetch_add_unless(&local->active_users, 1, 0); - if (au == 0) { + if (!__rxrpc_use_local(local)) { rxrpc_put_local(local); return NULL; } @@ -405,14 +405,11 @@ */ void rxrpc_unuse_local(struct rxrpc_local *local) { - unsigned int au; - if (local) { - au = atomic_dec_return(&local->active_users); - if (au == 0) + if (__rxrpc_unuse_local(local)) { + rxrpc_get_local(local); rxrpc_queue_local(local); - else - rxrpc_put_local(local); + } } } @@ -430,11 +427,14 @@ _enter("%d", local->debug_id); + local->dead = true; + mutex_lock(&rxnet->local_mutex); list_del_init(&local->link); mutex_unlock(&rxnet->local_mutex); - ASSERT(RB_EMPTY_ROOT(&local->client_conns)); + rxrpc_clean_up_local_conns(local); + rxrpc_service_connection_reaper(&rxnet->service_conn_reaper); ASSERT(!local->service); if (socket) { @@ -466,7 +466,7 @@ do { again = false; - if (atomic_read(&local->active_users) == 0) { + if (!__rxrpc_use_local(local)) { rxrpc_local_destroyer(local); break; } @@ -480,6 +480,8 @@ rxrpc_process_local_events(local); again = true; } + + __rxrpc_unuse_local(local); } while (again); rxrpc_put_local(local); diff -Nru linux-4.19.98/net/rxrpc/output.c linux-4.19.118/net/rxrpc/output.c --- linux-4.19.98/net/rxrpc/output.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/output.c 2020-04-23 08:30:24.000000000 +0000 @@ -133,7 +133,7 @@ int rxrpc_send_ack_packet(struct rxrpc_call *call, bool ping, rxrpc_serial_t *_serial) { - struct rxrpc_connection *conn = NULL; + struct rxrpc_connection *conn; struct rxrpc_ack_buffer *pkt; struct msghdr msg; struct kvec iov[2]; @@ -143,18 +143,14 @@ int ret; u8 reason; - spin_lock_bh(&call->lock); - if (call->conn) - conn = rxrpc_get_connection_maybe(call->conn); - spin_unlock_bh(&call->lock); - if (!conn) + if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) return -ECONNRESET; pkt = kzalloc(sizeof(*pkt), GFP_KERNEL); - if (!pkt) { - rxrpc_put_connection(conn); + if (!pkt) return -ENOMEM; - } + + conn = call->conn; msg.msg_name = &call->peer->srx.transport; msg.msg_namelen = call->peer->srx.transport_len; @@ -249,7 +245,6 @@ } out: - rxrpc_put_connection(conn); kfree(pkt); return ret; } @@ -259,7 +254,7 @@ */ int rxrpc_send_abort_packet(struct rxrpc_call *call) { - struct rxrpc_connection *conn = NULL; + struct rxrpc_connection *conn; struct rxrpc_abort_buffer pkt; struct msghdr msg; struct kvec iov[1]; @@ -276,13 +271,11 @@ test_bit(RXRPC_CALL_TX_LAST, &call->flags)) return 0; - spin_lock_bh(&call->lock); - if (call->conn) - conn = rxrpc_get_connection_maybe(call->conn); - spin_unlock_bh(&call->lock); - if (!conn) + if (test_bit(RXRPC_CALL_DISCONNECTED, &call->flags)) return -ECONNRESET; + conn = call->conn; + msg.msg_name = &call->peer->srx.transport; msg.msg_namelen = call->peer->srx.transport_len; msg.msg_control = NULL; @@ -317,8 +310,6 @@ trace_rxrpc_tx_packet(call->debug_id, &pkt.whdr, rxrpc_tx_point_call_abort); rxrpc_tx_backoff(call, ret); - - rxrpc_put_connection(conn); return ret; } @@ -524,6 +515,9 @@ } break; #endif + + default: + BUG(); } if (ret < 0) diff -Nru linux-4.19.98/net/rxrpc/peer_event.c linux-4.19.118/net/rxrpc/peer_event.c --- linux-4.19.98/net/rxrpc/peer_event.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/peer_event.c 2020-04-23 08:30:24.000000000 +0000 @@ -357,27 +357,31 @@ if (!rxrpc_get_peer_maybe(peer)) continue; - spin_unlock_bh(&rxnet->peer_hash_lock); + if (__rxrpc_use_local(peer->local)) { + spin_unlock_bh(&rxnet->peer_hash_lock); - keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; - slot = keepalive_at - base; - _debug("%02x peer %u t=%d {%pISp}", - cursor, peer->debug_id, slot, &peer->srx.transport); + keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; + slot = keepalive_at - base; + _debug("%02x peer %u t=%d {%pISp}", + cursor, peer->debug_id, slot, &peer->srx.transport); - if (keepalive_at <= base || - keepalive_at > base + RXRPC_KEEPALIVE_TIME) { - rxrpc_send_keepalive(peer); - slot = RXRPC_KEEPALIVE_TIME; - } + if (keepalive_at <= base || + keepalive_at > base + RXRPC_KEEPALIVE_TIME) { + rxrpc_send_keepalive(peer); + slot = RXRPC_KEEPALIVE_TIME; + } - /* A transmission to this peer occurred since last we examined - * it so put it into the appropriate future bucket. - */ - slot += cursor; - slot &= mask; - spin_lock_bh(&rxnet->peer_hash_lock); - list_add_tail(&peer->keepalive_link, - &rxnet->peer_keepalive[slot & mask]); + /* A transmission to this peer occurred since last we + * examined it so put it into the appropriate future + * bucket. + */ + slot += cursor; + slot &= mask; + spin_lock_bh(&rxnet->peer_hash_lock); + list_add_tail(&peer->keepalive_link, + &rxnet->peer_keepalive[slot & mask]); + rxrpc_unuse_local(peer->local); + } rxrpc_put_peer_locked(peer); } diff -Nru linux-4.19.98/net/rxrpc/sendmsg.c linux-4.19.118/net/rxrpc/sendmsg.c --- linux-4.19.98/net/rxrpc/sendmsg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/rxrpc/sendmsg.c 2020-04-23 08:30:24.000000000 +0000 @@ -62,8 +62,8 @@ rtt = READ_ONCE(call->peer->rtt); rtt2 = nsecs_to_jiffies64(rtt) * 2; - if (rtt2 < 1) - rtt2 = 1; + if (rtt2 < 2) + rtt2 = 2; timeout = rtt2; tx_start = READ_ONCE(call->tx_hard_ack); diff -Nru linux-4.19.98/net/sched/act_csum.c linux-4.19.118/net/sched/act_csum.c --- linux-4.19.98/net/sched/act_csum.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/act_csum.c 2020-04-23 08:30:24.000000000 +0000 @@ -560,8 +560,11 @@ struct tcf_result *res) { struct tcf_csum *p = to_tcf_csum(a); + bool orig_vlan_tag_present = false; + unsigned int vlan_hdr_count = 0; struct tcf_csum_params *params; u32 update_flags; + __be16 protocol; int action; params = rcu_dereference_bh(p->params); @@ -574,7 +577,9 @@ goto drop; update_flags = params->update_flags; - switch (tc_skb_protocol(skb)) { + protocol = tc_skb_protocol(skb); +again: + switch (protocol) { case cpu_to_be16(ETH_P_IP): if (!tcf_csum_ipv4(skb, update_flags)) goto drop; @@ -583,13 +588,35 @@ if (!tcf_csum_ipv6(skb, update_flags)) goto drop; break; + case cpu_to_be16(ETH_P_8021AD): /* fall through */ + case cpu_to_be16(ETH_P_8021Q): + if (skb_vlan_tag_present(skb) && !orig_vlan_tag_present) { + protocol = skb->protocol; + orig_vlan_tag_present = true; + } else { + struct vlan_hdr *vlan = (struct vlan_hdr *)skb->data; + + protocol = vlan->h_vlan_encapsulated_proto; + skb_pull(skb, VLAN_HLEN); + skb_reset_network_header(skb); + vlan_hdr_count++; + } + goto again; + } + +out: + /* Restore the skb for the pulled VLAN tags */ + while (vlan_hdr_count--) { + skb_push(skb, VLAN_HLEN); + skb_reset_network_header(skb); } return action; drop: qstats_drop_inc(this_cpu_ptr(p->common.cpu_qstats)); - return TC_ACT_SHOT; + action = TC_ACT_SHOT; + goto out; } static int tcf_csum_dump(struct sk_buff *skb, struct tc_action *a, int bind, diff -Nru linux-4.19.98/net/sched/act_mirred.c linux-4.19.118/net/sched/act_mirred.c --- linux-4.19.98/net/sched/act_mirred.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/act_mirred.c 2020-04-23 08:30:24.000000000 +0000 @@ -445,7 +445,11 @@ return err; pr_info("Mirror/redirect action on\n"); - return tcf_register_action(&act_mirred_ops, &mirred_net_ops); + err = tcf_register_action(&act_mirred_ops, &mirred_net_ops); + if (err) + unregister_netdevice_notifier(&mirred_device_notifier); + + return err; } static void __exit mirred_cleanup_module(void) diff -Nru linux-4.19.98/net/sched/cls_basic.c linux-4.19.118/net/sched/cls_basic.c --- linux-4.19.98/net/sched/cls_basic.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_basic.c 2020-04-23 08:30:24.000000000 +0000 @@ -254,12 +254,17 @@ } } -static void basic_bind_class(void *fh, u32 classid, unsigned long cl) +static void basic_bind_class(void *fh, u32 classid, unsigned long cl, void *q, + unsigned long base) { struct basic_filter *f = fh; - if (f && f->res.classid == classid) - f->res.class = cl; + if (f && f->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &f->res, base); + else + __tcf_unbind_filter(q, &f->res); + } } static int basic_dump(struct net *net, struct tcf_proto *tp, void *fh, diff -Nru linux-4.19.98/net/sched/cls_bpf.c linux-4.19.118/net/sched/cls_bpf.c --- linux-4.19.98/net/sched/cls_bpf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_bpf.c 2020-04-23 08:30:24.000000000 +0000 @@ -627,12 +627,17 @@ return -1; } -static void cls_bpf_bind_class(void *fh, u32 classid, unsigned long cl) +static void cls_bpf_bind_class(void *fh, u32 classid, unsigned long cl, + void *q, unsigned long base) { struct cls_bpf_prog *prog = fh; - if (prog && prog->res.classid == classid) - prog->res.class = cl; + if (prog && prog->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &prog->res, base); + else + __tcf_unbind_filter(q, &prog->res); + } } static void cls_bpf_walk(struct tcf_proto *tp, struct tcf_walker *arg) diff -Nru linux-4.19.98/net/sched/cls_flower.c linux-4.19.118/net/sched/cls_flower.c --- linux-4.19.98/net/sched/cls_flower.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_flower.c 2020-04-23 08:30:24.000000000 +0000 @@ -196,6 +196,7 @@ struct fl_flow_key skb_mkey; list_for_each_entry_rcu(mask, &head->masks, list) { + flow_dissector_init_keys(&skb_key.control, &skb_key.basic); fl_clear_masked_range(&skb_key, mask); skb_key.indev_ifindex = skb->skb_iif; @@ -486,6 +487,7 @@ [TCA_FLOWER_KEY_ENC_IP_TTL_MASK] = { .type = NLA_U8 }, [TCA_FLOWER_KEY_ENC_OPTS] = { .type = NLA_NESTED }, [TCA_FLOWER_KEY_ENC_OPTS_MASK] = { .type = NLA_NESTED }, + [TCA_FLOWER_FLAGS] = { .type = NLA_U32 }, }; static const struct nla_policy @@ -1942,12 +1944,17 @@ return -EMSGSIZE; } -static void fl_bind_class(void *fh, u32 classid, unsigned long cl) +static void fl_bind_class(void *fh, u32 classid, unsigned long cl, void *q, + unsigned long base) { struct cls_fl_filter *f = fh; - if (f && f->res.classid == classid) - f->res.class = cl; + if (f && f->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &f->res, base); + else + __tcf_unbind_filter(q, &f->res); + } } static struct tcf_proto_ops cls_fl_ops __read_mostly = { diff -Nru linux-4.19.98/net/sched/cls_fw.c linux-4.19.118/net/sched/cls_fw.c --- linux-4.19.98/net/sched/cls_fw.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_fw.c 2020-04-23 08:30:24.000000000 +0000 @@ -432,12 +432,17 @@ return -1; } -static void fw_bind_class(void *fh, u32 classid, unsigned long cl) +static void fw_bind_class(void *fh, u32 classid, unsigned long cl, void *q, + unsigned long base) { struct fw_filter *f = fh; - if (f && f->res.classid == classid) - f->res.class = cl; + if (f && f->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &f->res, base); + else + __tcf_unbind_filter(q, &f->res); + } } static struct tcf_proto_ops cls_fw_ops __read_mostly = { diff -Nru linux-4.19.98/net/sched/cls_matchall.c linux-4.19.118/net/sched/cls_matchall.c --- linux-4.19.98/net/sched/cls_matchall.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_matchall.c 2020-04-23 08:30:24.000000000 +0000 @@ -137,6 +137,7 @@ static const struct nla_policy mall_policy[TCA_MATCHALL_MAX + 1] = { [TCA_MATCHALL_UNSPEC] = { .type = NLA_UNSPEC }, [TCA_MATCHALL_CLASSID] = { .type = NLA_U32 }, + [TCA_MATCHALL_FLAGS] = { .type = NLA_U32 }, }; static int mall_set_parms(struct net *net, struct tcf_proto *tp, @@ -310,12 +311,17 @@ return -1; } -static void mall_bind_class(void *fh, u32 classid, unsigned long cl) +static void mall_bind_class(void *fh, u32 classid, unsigned long cl, void *q, + unsigned long base) { struct cls_mall_head *head = fh; - if (head && head->res.classid == classid) - head->res.class = cl; + if (head && head->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &head->res, base); + else + __tcf_unbind_filter(q, &head->res); + } } static struct tcf_proto_ops cls_mall_ops __read_mostly = { diff -Nru linux-4.19.98/net/sched/cls_route.c linux-4.19.118/net/sched/cls_route.c --- linux-4.19.98/net/sched/cls_route.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_route.c 2020-04-23 08:30:24.000000000 +0000 @@ -536,8 +536,8 @@ fp = &b->ht[h]; for (pfp = rtnl_dereference(*fp); pfp; fp = &pfp->next, pfp = rtnl_dereference(*fp)) { - if (pfp == f) { - *fp = f->next; + if (pfp == fold) { + rcu_assign_pointer(*fp, fold->next); break; } } @@ -645,12 +645,17 @@ return -1; } -static void route4_bind_class(void *fh, u32 classid, unsigned long cl) +static void route4_bind_class(void *fh, u32 classid, unsigned long cl, void *q, + unsigned long base) { struct route4_filter *f = fh; - if (f && f->res.classid == classid) - f->res.class = cl; + if (f && f->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &f->res, base); + else + __tcf_unbind_filter(q, &f->res); + } } static struct tcf_proto_ops cls_route4_ops __read_mostly = { diff -Nru linux-4.19.98/net/sched/cls_rsvp.h linux-4.19.118/net/sched/cls_rsvp.h --- linux-4.19.98/net/sched/cls_rsvp.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_rsvp.h 2020-04-23 08:30:24.000000000 +0000 @@ -466,10 +466,8 @@ static const struct nla_policy rsvp_policy[TCA_RSVP_MAX + 1] = { [TCA_RSVP_CLASSID] = { .type = NLA_U32 }, - [TCA_RSVP_DST] = { .type = NLA_BINARY, - .len = RSVP_DST_LEN * sizeof(u32) }, - [TCA_RSVP_SRC] = { .type = NLA_BINARY, - .len = RSVP_DST_LEN * sizeof(u32) }, + [TCA_RSVP_DST] = { .len = RSVP_DST_LEN * sizeof(u32) }, + [TCA_RSVP_SRC] = { .len = RSVP_DST_LEN * sizeof(u32) }, [TCA_RSVP_PINFO] = { .len = sizeof(struct tc_rsvp_pinfo) }, }; @@ -736,12 +734,17 @@ return -1; } -static void rsvp_bind_class(void *fh, u32 classid, unsigned long cl) +static void rsvp_bind_class(void *fh, u32 classid, unsigned long cl, void *q, + unsigned long base) { struct rsvp_filter *f = fh; - if (f && f->res.classid == classid) - f->res.class = cl; + if (f && f->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &f->res, base); + else + __tcf_unbind_filter(q, &f->res); + } } static struct tcf_proto_ops RSVP_OPS __read_mostly = { diff -Nru linux-4.19.98/net/sched/cls_tcindex.c linux-4.19.118/net/sched/cls_tcindex.c --- linux-4.19.98/net/sched/cls_tcindex.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_tcindex.c 2020-04-23 08:30:24.000000000 +0000 @@ -333,12 +333,32 @@ cp->fall_through = p->fall_through; cp->tp = tp; + if (tb[TCA_TCINDEX_HASH]) + cp->hash = nla_get_u32(tb[TCA_TCINDEX_HASH]); + + if (tb[TCA_TCINDEX_MASK]) + cp->mask = nla_get_u16(tb[TCA_TCINDEX_MASK]); + + if (tb[TCA_TCINDEX_SHIFT]) + cp->shift = nla_get_u32(tb[TCA_TCINDEX_SHIFT]); + + if (!cp->hash) { + /* Hash not specified, use perfect hash if the upper limit + * of the hashing index is below the threshold. + */ + if ((cp->mask >> cp->shift) < PERFECT_HASH_THRESHOLD) + cp->hash = (cp->mask >> cp->shift) + 1; + else + cp->hash = DEFAULT_HASH_SIZE; + } + if (p->perfect) { int i; if (tcindex_alloc_perfect_hash(net, cp) < 0) goto errout; - for (i = 0; i < cp->hash; i++) + cp->alloc_hash = cp->hash; + for (i = 0; i < min(cp->hash, p->hash); i++) cp->perfect[i].res = p->perfect[i].res; balloc = 1; } @@ -346,19 +366,10 @@ err = tcindex_filter_result_init(&new_filter_result); if (err < 0) - goto errout1; + goto errout_alloc; if (old_r) cr = r->res; - if (tb[TCA_TCINDEX_HASH]) - cp->hash = nla_get_u32(tb[TCA_TCINDEX_HASH]); - - if (tb[TCA_TCINDEX_MASK]) - cp->mask = nla_get_u16(tb[TCA_TCINDEX_MASK]); - - if (tb[TCA_TCINDEX_SHIFT]) - cp->shift = nla_get_u32(tb[TCA_TCINDEX_SHIFT]); - err = -EBUSY; /* Hash already allocated, make sure that we still meet the @@ -376,16 +387,6 @@ if (tb[TCA_TCINDEX_FALL_THROUGH]) cp->fall_through = nla_get_u32(tb[TCA_TCINDEX_FALL_THROUGH]); - if (!cp->hash) { - /* Hash not specified, use perfect hash if the upper limit - * of the hashing index is below the threshold. - */ - if ((cp->mask >> cp->shift) < PERFECT_HASH_THRESHOLD) - cp->hash = (cp->mask >> cp->shift) + 1; - else - cp->hash = DEFAULT_HASH_SIZE; - } - if (!cp->perfect && !cp->h) cp->alloc_hash = cp->hash; @@ -484,7 +485,6 @@ tcindex_free_perfect_hash(cp); else if (balloc == 2) kfree(cp->h); -errout1: tcf_exts_destroy(&new_filter_result.exts); errout: kfree(cp); @@ -652,12 +652,17 @@ return -1; } -static void tcindex_bind_class(void *fh, u32 classid, unsigned long cl) +static void tcindex_bind_class(void *fh, u32 classid, unsigned long cl, + void *q, unsigned long base) { struct tcindex_filter_result *r = fh; - if (r && r->res.classid == classid) - r->res.class = cl; + if (r && r->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &r->res, base); + else + __tcf_unbind_filter(q, &r->res); + } } static struct tcf_proto_ops cls_tcindex_ops __read_mostly = { diff -Nru linux-4.19.98/net/sched/cls_u32.c linux-4.19.118/net/sched/cls_u32.c --- linux-4.19.98/net/sched/cls_u32.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/cls_u32.c 2020-04-23 08:30:24.000000000 +0000 @@ -1315,12 +1315,17 @@ return 0; } -static void u32_bind_class(void *fh, u32 classid, unsigned long cl) +static void u32_bind_class(void *fh, u32 classid, unsigned long cl, void *q, + unsigned long base) { struct tc_u_knode *n = fh; - if (n && n->res.classid == classid) - n->res.class = cl; + if (n && n->res.classid == classid) { + if (cl) + __tcf_bind_filter(q, &n->res, base); + else + __tcf_unbind_filter(q, &n->res); + } } static int u32_dump(struct net *net, struct tcf_proto *tp, void *fh, diff -Nru linux-4.19.98/net/sched/ematch.c linux-4.19.118/net/sched/ematch.c --- linux-4.19.98/net/sched/ematch.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/ematch.c 2020-04-23 08:30:24.000000000 +0000 @@ -242,6 +242,9 @@ goto errout; if (em->ops->change) { + err = -EINVAL; + if (em_hdr->flags & TCF_EM_SIMPLE) + goto errout; err = em->ops->change(net, data, data_len, em); if (err < 0) goto errout; @@ -267,12 +270,12 @@ } em->data = (unsigned long) v; } + em->datalen = data_len; } } em->matchid = em_hdr->matchid; em->flags = em_hdr->flags; - em->datalen = data_len; em->net = net; err = 0; diff -Nru linux-4.19.98/net/sched/sch_api.c linux-4.19.118/net/sched/sch_api.c --- linux-4.19.98/net/sched/sch_api.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/sch_api.c 2020-04-23 08:30:24.000000000 +0000 @@ -1803,8 +1803,9 @@ struct tcf_bind_args { struct tcf_walker w; - u32 classid; + unsigned long base; unsigned long cl; + u32 classid; }; static int tcf_node_bind(struct tcf_proto *tp, void *n, struct tcf_walker *arg) @@ -1815,7 +1816,7 @@ struct Qdisc *q = tcf_block_q(tp->chain->block); sch_tree_lock(q); - tp->ops->bind_class(n, a->classid, a->cl); + tp->ops->bind_class(n, a->classid, a->cl, q, a->base); sch_tree_unlock(q); } return 0; @@ -1846,6 +1847,7 @@ arg.w.fn = tcf_node_bind; arg.classid = clid; + arg.base = cl; arg.cl = new_cl; tp->ops->walk(tp, &arg.w); } diff -Nru linux-4.19.98/net/sched/sch_cbs.c linux-4.19.118/net/sched/sch_cbs.c --- linux-4.19.98/net/sched/sch_cbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/sch_cbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -61,16 +61,20 @@ #include #include #include +#include #include #include #include +static LIST_HEAD(cbs_list); +static DEFINE_SPINLOCK(cbs_list_lock); + #define BYTES_PER_KBIT (1000LL / 8) struct cbs_sched_data { bool offload; int queue; - s64 port_rate; /* in bytes/s */ + atomic64_t port_rate; /* in bytes/s */ s64 last; /* timestamp in ns */ s64 credits; /* in bytes */ s32 locredit; /* in bytes */ @@ -82,6 +86,7 @@ struct sk_buff **to_free); struct sk_buff *(*dequeue)(struct Qdisc *sch); struct Qdisc *qdisc; + struct list_head cbs_list; }; static int cbs_child_enqueue(struct sk_buff *skb, struct Qdisc *sch, @@ -180,6 +185,11 @@ s64 credits; int len; + /* The previous packet is still being sent */ + if (now < q->last) { + qdisc_watchdog_schedule_ns(&q->watchdog, q->last); + return NULL; + } if (q->credits < 0) { credits = timediff_to_credits(now - q->last, q->idleslope); @@ -206,11 +216,17 @@ /* As sendslope is a negative number, this will decrease the * amount of q->credits. */ - credits = credits_from_len(len, q->sendslope, q->port_rate); + credits = credits_from_len(len, q->sendslope, + atomic64_read(&q->port_rate)); credits += q->credits; q->credits = max_t(s64, credits, q->locredit); - q->last = now; + /* Estimate of the transmission of the last byte of the packet in ns */ + if (unlikely(atomic64_read(&q->port_rate) == 0)) + q->last = now; + else + q->last = now + div64_s64(len * NSEC_PER_SEC, + atomic64_read(&q->port_rate)); return skb; } @@ -293,6 +309,58 @@ return 0; } +static void cbs_set_port_rate(struct net_device *dev, struct cbs_sched_data *q) +{ + struct ethtool_link_ksettings ecmd; + int speed = SPEED_10; + int port_rate = -1; + int err; + + err = __ethtool_get_link_ksettings(dev, &ecmd); + if (err < 0) + goto skip; + + if (ecmd.base.speed && ecmd.base.speed != SPEED_UNKNOWN) + speed = ecmd.base.speed; + +skip: + port_rate = speed * 1000 * BYTES_PER_KBIT; + + atomic64_set(&q->port_rate, port_rate); + netdev_dbg(dev, "cbs: set %s's port_rate to: %lld, linkspeed: %d\n", + dev->name, (long long)atomic64_read(&q->port_rate), + ecmd.base.speed); +} + +static int cbs_dev_notifier(struct notifier_block *nb, unsigned long event, + void *ptr) +{ + struct net_device *dev = netdev_notifier_info_to_dev(ptr); + struct cbs_sched_data *q; + struct net_device *qdev; + bool found = false; + + ASSERT_RTNL(); + + if (event != NETDEV_UP && event != NETDEV_CHANGE) + return NOTIFY_DONE; + + spin_lock(&cbs_list_lock); + list_for_each_entry(q, &cbs_list, cbs_list) { + qdev = qdisc_dev(q->qdisc); + if (qdev == dev) { + found = true; + break; + } + } + spin_unlock(&cbs_list_lock); + + if (found) + cbs_set_port_rate(dev, q); + + return NOTIFY_DONE; +} + static int cbs_change(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack) { @@ -314,16 +382,7 @@ qopt = nla_data(tb[TCA_CBS_PARMS]); if (!qopt->offload) { - struct ethtool_link_ksettings ecmd; - s64 link_speed; - - if (!__ethtool_get_link_ksettings(dev, &ecmd)) - link_speed = ecmd.base.speed; - else - link_speed = SPEED_1000; - - q->port_rate = link_speed * 1000 * BYTES_PER_KBIT; - + cbs_set_port_rate(dev, q); cbs_disable_offload(dev, q); } else { err = cbs_enable_offload(dev, q, qopt, extack); @@ -346,6 +405,7 @@ { struct cbs_sched_data *q = qdisc_priv(sch); struct net_device *dev = qdisc_dev(sch); + int err; if (!opt) { NL_SET_ERR_MSG(extack, "Missing CBS qdisc options which are mandatory"); @@ -366,7 +426,17 @@ qdisc_watchdog_init(&q->watchdog, sch); - return cbs_change(sch, opt, extack); + err = cbs_change(sch, opt, extack); + if (err) + return err; + + if (!q->offload) { + spin_lock(&cbs_list_lock); + list_add(&q->cbs_list, &cbs_list); + spin_unlock(&cbs_list_lock); + } + + return 0; } static void cbs_destroy(struct Qdisc *sch) @@ -374,8 +444,11 @@ struct cbs_sched_data *q = qdisc_priv(sch); struct net_device *dev = qdisc_dev(sch); - qdisc_watchdog_cancel(&q->watchdog); + spin_lock(&cbs_list_lock); + list_del(&q->cbs_list); + spin_unlock(&cbs_list_lock); + qdisc_watchdog_cancel(&q->watchdog); cbs_disable_offload(dev, q); if (q->qdisc) @@ -486,14 +559,29 @@ .owner = THIS_MODULE, }; +static struct notifier_block cbs_device_notifier = { + .notifier_call = cbs_dev_notifier, +}; + static int __init cbs_module_init(void) { - return register_qdisc(&cbs_qdisc_ops); + int err; + + err = register_netdevice_notifier(&cbs_device_notifier); + if (err) + return err; + + err = register_qdisc(&cbs_qdisc_ops); + if (err) + unregister_netdevice_notifier(&cbs_device_notifier); + + return err; } static void __exit cbs_module_exit(void) { unregister_qdisc(&cbs_qdisc_ops); + unregister_netdevice_notifier(&cbs_device_notifier); } module_init(cbs_module_init) module_exit(cbs_module_exit) diff -Nru linux-4.19.98/net/sched/sch_fq.c linux-4.19.118/net/sched/sch_fq.c --- linux-4.19.98/net/sched/sch_fq.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/sch_fq.c 2020-04-23 08:30:24.000000000 +0000 @@ -695,6 +695,7 @@ [TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 }, [TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 }, [TCA_FQ_FLOW_REFILL_DELAY] = { .type = NLA_U32 }, + [TCA_FQ_ORPHAN_MASK] = { .type = NLA_U32 }, [TCA_FQ_LOW_RATE_THRESHOLD] = { .type = NLA_U32 }, }; diff -Nru linux-4.19.98/net/sched/sch_netem.c linux-4.19.118/net/sched/sch_netem.c --- linux-4.19.98/net/sched/sch_netem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sched/sch_netem.c 2020-04-23 08:30:24.000000000 +0000 @@ -436,8 +436,7 @@ struct netem_skb_cb *cb; struct sk_buff *skb2; struct sk_buff *segs = NULL; - unsigned int len = 0, last_len, prev_len = qdisc_pkt_len(skb); - int nb = 0; + unsigned int prev_len = qdisc_pkt_len(skb); int count = 1; int rc = NET_XMIT_SUCCESS; int rc_drop = NET_XMIT_DROP; @@ -494,6 +493,7 @@ segs = netem_segment(skb, sch, to_free); if (!segs) return rc_drop; + qdisc_skb_cb(segs)->pkt_len = segs->len; } else { segs = skb; } @@ -509,6 +509,7 @@ if (skb->ip_summed == CHECKSUM_PARTIAL && skb_checksum_help(skb)) { qdisc_drop(skb, sch, to_free); + skb = NULL; goto finish_segs; } @@ -583,6 +584,12 @@ finish_segs: if (segs) { + unsigned int len, last_len; + int nb; + + len = skb ? skb->len : 0; + nb = skb ? 1 : 0; + while (segs) { skb2 = segs->next; segs->next = NULL; @@ -598,9 +605,10 @@ } segs = skb2; } - sch->q.qlen += nb; - if (nb > 1) - qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); + /* Parent qdiscs accounted for 1 skb of size @prev_len */ + qdisc_tree_reduce_backlog(sch, -(nb - 1), -(len - prev_len)); + } else if (!skb) { + return NET_XMIT_DROP; } return NET_XMIT_SUCCESS; } diff -Nru linux-4.19.98/net/sctp/diag.c linux-4.19.118/net/sctp/diag.c --- linux-4.19.98/net/sctp/diag.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sctp/diag.c 2020-04-23 08:30:24.000000000 +0000 @@ -252,15 +252,11 @@ addrcnt++; return nla_total_size(sizeof(struct sctp_info)) - + nla_total_size(1) /* INET_DIAG_SHUTDOWN */ - + nla_total_size(1) /* INET_DIAG_TOS */ - + nla_total_size(1) /* INET_DIAG_TCLASS */ - + nla_total_size(4) /* INET_DIAG_MARK */ - + nla_total_size(4) /* INET_DIAG_CLASS_ID */ + nla_total_size(addrlen * asoc->peer.transport_count) + nla_total_size(addrlen * addrcnt) - + nla_total_size(sizeof(struct inet_diag_meminfo)) + nla_total_size(sizeof(struct inet_diag_msg)) + + inet_diag_msg_attrs_size() + + nla_total_size(sizeof(struct inet_diag_meminfo)) + 64; } diff -Nru linux-4.19.98/net/sctp/input.c linux-4.19.118/net/sctp/input.c --- linux-4.19.98/net/sctp/input.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sctp/input.c 2020-04-23 08:30:24.000000000 +0000 @@ -255,7 +255,7 @@ bh_lock_sock(sk); } - if (sock_owned_by_user(sk)) { + if (sock_owned_by_user(sk) || !sctp_newsk_ready(sk)) { if (sctp_add_backlog(sk, skb)) { bh_unlock_sock(sk); sctp_chunk_free(chunk); @@ -333,7 +333,7 @@ local_bh_disable(); bh_lock_sock(sk); - if (sock_owned_by_user(sk)) { + if (sock_owned_by_user(sk) || !sctp_newsk_ready(sk)) { if (sk_add_backlog(sk, skb, sk->sk_rcvbuf)) sctp_chunk_free(chunk); else @@ -348,7 +348,13 @@ if (backloged) return 0; } else { - sctp_inq_push(inqueue, chunk); + if (!sctp_newsk_ready(sk)) { + if (!sk_add_backlog(sk, skb, sk->sk_rcvbuf)) + return 0; + sctp_chunk_free(chunk); + } else { + sctp_inq_push(inqueue, chunk); + } } done: diff -Nru linux-4.19.98/net/sctp/ipv6.c linux-4.19.118/net/sctp/ipv6.c --- linux-4.19.98/net/sctp/ipv6.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sctp/ipv6.c 2020-04-23 08:30:24.000000000 +0000 @@ -240,7 +240,8 @@ { struct sctp_association *asoc = t->asoc; struct dst_entry *dst = NULL; - struct flowi6 *fl6 = &fl->u.ip6; + struct flowi _fl; + struct flowi6 *fl6 = &_fl.u.ip6; struct sctp_bind_addr *bp; struct ipv6_pinfo *np = inet6_sk(sk); struct sctp_sockaddr_entry *laddr; @@ -250,7 +251,7 @@ enum sctp_scope scope; __u8 matchlen = 0; - memset(fl6, 0, sizeof(struct flowi6)); + memset(&_fl, 0, sizeof(_fl)); fl6->daddr = daddr->v6.sin6_addr; fl6->fl6_dport = daddr->v6.sin6_port; fl6->flowi6_proto = IPPROTO_SCTP; @@ -288,8 +289,11 @@ rcu_read_unlock(); dst = ip6_dst_lookup_flow(sk, fl6, final_p); - if (!asoc || saddr) + if (!asoc || saddr) { + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); goto out; + } bp = &asoc->base.bind_addr; scope = sctp_scope(daddr); @@ -312,6 +316,8 @@ if ((laddr->a.sa.sa_family == AF_INET6) && (sctp_v6_cmp_addr(&dst_saddr, &laddr->a))) { rcu_read_unlock(); + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); goto out; } } @@ -350,6 +356,8 @@ if (!IS_ERR_OR_NULL(dst)) dst_release(dst); dst = bdst; + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); break; } @@ -363,6 +371,8 @@ dst_release(dst); dst = bdst; matchlen = bmatchlen; + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); } rcu_read_unlock(); @@ -371,14 +381,12 @@ struct rt6_info *rt; rt = (struct rt6_info *)dst; - t->dst = dst; t->dst_cookie = rt6_get_cookie(rt); pr_debug("rt6_dst:%pI6/%d rt6_src:%pI6\n", &rt->rt6i_dst.addr, rt->rt6i_dst.plen, - &fl6->saddr); + &fl->u.ip6.saddr); } else { t->dst = NULL; - pr_debug("no route\n"); } } diff -Nru linux-4.19.98/net/sctp/protocol.c linux-4.19.118/net/sctp/protocol.c --- linux-4.19.98/net/sctp/protocol.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sctp/protocol.c 2020-04-23 08:30:24.000000000 +0000 @@ -424,7 +424,8 @@ { struct sctp_association *asoc = t->asoc; struct rtable *rt; - struct flowi4 *fl4 = &fl->u.ip4; + struct flowi _fl; + struct flowi4 *fl4 = &_fl.u.ip4; struct sctp_bind_addr *bp; struct sctp_sockaddr_entry *laddr; struct dst_entry *dst = NULL; @@ -434,7 +435,7 @@ if (t->dscp & SCTP_DSCP_SET_MASK) tos = t->dscp & SCTP_DSCP_VAL_MASK; - memset(fl4, 0x0, sizeof(struct flowi4)); + memset(&_fl, 0x0, sizeof(_fl)); fl4->daddr = daddr->v4.sin_addr.s_addr; fl4->fl4_dport = daddr->v4.sin_port; fl4->flowi4_proto = IPPROTO_SCTP; @@ -453,8 +454,11 @@ &fl4->saddr); rt = ip_route_output_key(sock_net(sk), fl4); - if (!IS_ERR(rt)) + if (!IS_ERR(rt)) { dst = &rt->dst; + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); + } /* If there is no association or if a source address is passed, no * more validation is required. @@ -517,27 +521,33 @@ odev = __ip_dev_find(sock_net(sk), laddr->a.v4.sin_addr.s_addr, false); if (!odev || odev->ifindex != fl4->flowi4_oif) { - if (!dst) + if (!dst) { dst = &rt->dst; - else + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); + } else { dst_release(&rt->dst); + } continue; } dst_release(dst); dst = &rt->dst; + t->dst = dst; + memcpy(fl, &_fl, sizeof(_fl)); break; } out_unlock: rcu_read_unlock(); out: - t->dst = dst; - if (dst) + if (dst) { pr_debug("rt_dst:%pI4, rt_src:%pI4\n", - &fl4->daddr, &fl4->saddr); - else + &fl->u.ip4.daddr, &fl->u.ip4.saddr); + } else { + t->dst = NULL; pr_debug("no route\n"); + } } /* For v4, the source address is cached in the route entry(dst). So no need diff -Nru linux-4.19.98/net/sctp/sm_statefuns.c linux-4.19.118/net/sctp/sm_statefuns.c --- linux-4.19.98/net/sctp/sm_statefuns.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sctp/sm_statefuns.c 2020-04-23 08:30:24.000000000 +0000 @@ -185,6 +185,16 @@ return true; } +/* Check for format error in an ABORT chunk */ +static inline bool sctp_err_chunk_valid(struct sctp_chunk *chunk) +{ + struct sctp_errhdr *err; + + sctp_walk_errors(err, chunk->chunk_hdr); + + return (void *)err == (void *)chunk->chunk_end; +} + /********************************************************** * These are the state functions for handling chunk events. **********************************************************/ @@ -2270,6 +2280,9 @@ sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest)) return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands); + if (!sctp_err_chunk_valid(chunk)) + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); + return __sctp_sf_do_9_1_abort(net, ep, asoc, type, arg, commands); } @@ -2313,6 +2326,9 @@ sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest)) return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands); + if (!sctp_err_chunk_valid(chunk)) + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); + /* Stop the T2-shutdown timer. */ sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); @@ -2580,6 +2596,9 @@ sctp_bind_addr_state(&asoc->base.bind_addr, &chunk->dest)) return sctp_sf_discard_chunk(net, ep, asoc, type, arg, commands); + if (!sctp_err_chunk_valid(chunk)) + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); + return __sctp_sf_do_9_1_abort(net, ep, asoc, type, arg, commands); } @@ -2597,16 +2616,8 @@ /* See if we have an error cause code in the chunk. */ len = ntohs(chunk->chunk_hdr->length); - if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr)) { - struct sctp_errhdr *err; - - sctp_walk_errors(err, chunk->chunk_hdr); - if ((void *)err != (void *)chunk->chunk_end) - return sctp_sf_pdiscard(net, ep, asoc, type, arg, - commands); - + if (len >= sizeof(struct sctp_chunkhdr) + sizeof(struct sctp_errhdr)) error = ((struct sctp_errhdr *)chunk->skb->data)->cause; - } sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET)); /* ASSOC_FAILED will DELETE_TCB. */ diff -Nru linux-4.19.98/net/sctp/socket.c linux-4.19.118/net/sctp/socket.c --- linux-4.19.98/net/sctp/socket.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sctp/socket.c 2020-04-23 08:30:24.000000000 +0000 @@ -165,29 +165,44 @@ skb_orphan(chunk->skb); } +#define traverse_and_process() \ +do { \ + msg = chunk->msg; \ + if (msg == prev_msg) \ + continue; \ + list_for_each_entry(c, &msg->chunks, frag_list) { \ + if ((clear && asoc->base.sk == c->skb->sk) || \ + (!clear && asoc->base.sk != c->skb->sk)) \ + cb(c); \ + } \ + prev_msg = msg; \ +} while (0) + static void sctp_for_each_tx_datachunk(struct sctp_association *asoc, + bool clear, void (*cb)(struct sctp_chunk *)) { + struct sctp_datamsg *msg, *prev_msg = NULL; struct sctp_outq *q = &asoc->outqueue; + struct sctp_chunk *chunk, *c; struct sctp_transport *t; - struct sctp_chunk *chunk; list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) list_for_each_entry(chunk, &t->transmitted, transmitted_list) - cb(chunk); + traverse_and_process(); list_for_each_entry(chunk, &q->retransmit, transmitted_list) - cb(chunk); + traverse_and_process(); list_for_each_entry(chunk, &q->sacked, transmitted_list) - cb(chunk); + traverse_and_process(); list_for_each_entry(chunk, &q->abandoned, transmitted_list) - cb(chunk); + traverse_and_process(); list_for_each_entry(chunk, &q->out_chunk_list, list) - cb(chunk); + traverse_and_process(); } static void sctp_for_each_rx_skb(struct sctp_association *asoc, struct sock *sk, @@ -8899,9 +8914,9 @@ * paths won't try to lock it and then oldsk. */ lock_sock_nested(newsk, SINGLE_DEPTH_NESTING); - sctp_for_each_tx_datachunk(assoc, sctp_clear_owner_w); + sctp_for_each_tx_datachunk(assoc, true, sctp_clear_owner_w); sctp_assoc_migrate(assoc, newsk); - sctp_for_each_tx_datachunk(assoc, sctp_set_owner_w); + sctp_for_each_tx_datachunk(assoc, false, sctp_set_owner_w); /* If the association on the newsk is already closed before accept() * is called, set RCV_SHUTDOWN flag. diff -Nru linux-4.19.98/net/smc/smc_clc.c linux-4.19.118/net/smc/smc_clc.c --- linux-4.19.98/net/smc/smc_clc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/smc/smc_clc.c 2020-04-23 08:30:24.000000000 +0000 @@ -364,7 +364,9 @@ dclc.hdr.length = htons(sizeof(struct smc_clc_msg_decline)); dclc.hdr.version = SMC_CLC_V1; dclc.hdr.flag = (peer_diag_info == SMC_CLC_DECL_SYNCERR) ? 1 : 0; - memcpy(dclc.id_for_peer, local_systemid, sizeof(local_systemid)); + if (smc->conn.lgr && !smc->conn.lgr->is_smcd) + memcpy(dclc.id_for_peer, local_systemid, + sizeof(local_systemid)); dclc.peer_diagnosis = htonl(peer_diag_info); memcpy(dclc.trl.eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER)); diff -Nru linux-4.19.98/net/smc/smc_diag.c linux-4.19.118/net/smc/smc_diag.c --- linux-4.19.98/net/smc/smc_diag.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/smc/smc_diag.c 2020-04-23 08:30:24.000000000 +0000 @@ -38,21 +38,19 @@ { struct smc_sock *smc = smc_sk(sk); + memset(r, 0, sizeof(*r)); + r->diag_family = sk->sk_family; + sock_diag_save_cookie(sk, r->id.idiag_cookie); if (!smc->clcsock) return; r->id.idiag_sport = htons(smc->clcsock->sk->sk_num); r->id.idiag_dport = smc->clcsock->sk->sk_dport; r->id.idiag_if = smc->clcsock->sk->sk_bound_dev_if; - sock_diag_save_cookie(sk, r->id.idiag_cookie); if (sk->sk_protocol == SMCPROTO_SMC) { - r->diag_family = PF_INET; - memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src)); - memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst)); r->id.idiag_src[0] = smc->clcsock->sk->sk_rcv_saddr; r->id.idiag_dst[0] = smc->clcsock->sk->sk_daddr; #if IS_ENABLED(CONFIG_IPV6) } else if (sk->sk_protocol == SMCPROTO_SMC6) { - r->diag_family = PF_INET6; memcpy(&r->id.idiag_src, &smc->clcsock->sk->sk_v6_rcv_saddr, sizeof(smc->clcsock->sk->sk_v6_rcv_saddr)); memcpy(&r->id.idiag_dst, &smc->clcsock->sk->sk_v6_daddr, diff -Nru linux-4.19.98/net/smc/smc_ib.c linux-4.19.118/net/smc/smc_ib.c --- linux-4.19.98/net/smc/smc_ib.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/smc/smc_ib.c 2020-04-23 08:30:24.000000000 +0000 @@ -552,6 +552,8 @@ struct smc_ib_device *smcibdev; smcibdev = ib_get_client_data(ibdev, &smc_ib_client); + if (!smcibdev || smcibdev->ibdev != ibdev) + return; ib_set_client_data(ibdev, &smc_ib_client, NULL); spin_lock(&smc_ib_devices.lock); list_del_init(&smcibdev->list); /* remove from smc_ib_devices */ @@ -559,6 +561,7 @@ smc_pnet_remove_by_ibdev(smcibdev); smc_ib_cleanup_per_ibdev(smcibdev); ib_unregister_event_handler(&smcibdev->event_handler); + cancel_work_sync(&smcibdev->port_event_work); kfree(smcibdev); } diff -Nru linux-4.19.98/net/smc/smc_rx.c linux-4.19.118/net/smc/smc_rx.c --- linux-4.19.98/net/smc/smc_rx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/smc/smc_rx.c 2020-04-23 08:30:24.000000000 +0000 @@ -212,8 +212,7 @@ rc = sk_wait_event(sk, timeo, sk->sk_err || sk->sk_shutdown & RCV_SHUTDOWN || - fcrit(conn) || - smc_cdc_rxed_any_close_or_senddone(conn), + fcrit(conn), &wait); remove_wait_queue(sk_sleep(sk), &wait); sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk); @@ -263,6 +262,18 @@ return -EAGAIN; } +static bool smc_rx_recvmsg_data_available(struct smc_sock *smc) +{ + struct smc_connection *conn = &smc->conn; + + if (smc_rx_data_available(conn)) + return true; + else if (conn->urg_state == SMC_URG_VALID) + /* we received a single urgent Byte - skip */ + smc_rx_update_cons(smc, 0); + return false; +} + /* smc_rx_recvmsg - receive data from RMBE * @msg: copy data to receive buffer * @pipe: copy data to pipe if set - indicates splice() call @@ -304,16 +315,18 @@ if (read_done >= target || (pipe && read_done)) break; - if (atomic_read(&conn->bytes_to_rcv)) + if (smc_rx_recvmsg_data_available(smc)) goto copy; - else if (conn->urg_state == SMC_URG_VALID) - /* we received a single urgent Byte - skip */ - smc_rx_update_cons(smc, 0); if (sk->sk_shutdown & RCV_SHUTDOWN || - smc_cdc_rxed_any_close_or_senddone(conn) || - conn->local_tx_ctrl.conn_state_flags.peer_conn_abort) + conn->local_tx_ctrl.conn_state_flags.peer_conn_abort) { + /* smc_cdc_msg_recv_action() could have run after + * above smc_rx_recvmsg_data_available() + */ + if (smc_rx_recvmsg_data_available(smc)) + goto copy; break; + } if (read_done) { if (sk->sk_err || diff -Nru linux-4.19.98/net/sunrpc/auth_gss/svcauth_gss.c linux-4.19.118/net/sunrpc/auth_gss/svcauth_gss.c --- linux-4.19.98/net/sunrpc/auth_gss/svcauth_gss.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sunrpc/auth_gss/svcauth_gss.c 2020-04-23 08:30:24.000000000 +0000 @@ -1054,24 +1054,32 @@ return 0; } -/* Ok this is really heavily depending on a set of semantics in - * how rqstp is set up by svc_recv and pages laid down by the - * server when reading a request. We are basically guaranteed that - * the token lays all down linearly across a set of pages, starting - * at iov_base in rq_arg.head[0] which happens to be the first of a - * set of pages stored in rq_pages[]. - * rq_arg.head[0].iov_base will provide us the page_base to pass - * to the upcall. - */ -static inline int -gss_read_proxy_verf(struct svc_rqst *rqstp, - struct rpc_gss_wire_cred *gc, __be32 *authp, - struct xdr_netobj *in_handle, - struct gssp_in_token *in_token) +static void gss_free_in_token_pages(struct gssp_in_token *in_token) { - struct kvec *argv = &rqstp->rq_arg.head[0]; u32 inlen; - int res; + int i; + + i = 0; + inlen = in_token->page_len; + while (inlen) { + if (in_token->pages[i]) + put_page(in_token->pages[i]); + inlen -= inlen > PAGE_SIZE ? PAGE_SIZE : inlen; + } + + kfree(in_token->pages); + in_token->pages = NULL; +} + +static int gss_read_proxy_verf(struct svc_rqst *rqstp, + struct rpc_gss_wire_cred *gc, __be32 *authp, + struct xdr_netobj *in_handle, + struct gssp_in_token *in_token) +{ + struct kvec *argv = &rqstp->rq_arg.head[0]; + unsigned int page_base, length; + int pages, i, res; + size_t inlen; res = gss_read_common_verf(gc, argv, authp, in_handle); if (res) @@ -1081,10 +1089,36 @@ if (inlen > (argv->iov_len + rqstp->rq_arg.page_len)) return SVC_DENIED; - in_token->pages = rqstp->rq_pages; - in_token->page_base = (ulong)argv->iov_base & ~PAGE_MASK; + pages = DIV_ROUND_UP(inlen, PAGE_SIZE); + in_token->pages = kcalloc(pages, sizeof(struct page *), GFP_KERNEL); + if (!in_token->pages) + return SVC_DENIED; + in_token->page_base = 0; in_token->page_len = inlen; + for (i = 0; i < pages; i++) { + in_token->pages[i] = alloc_page(GFP_KERNEL); + if (!in_token->pages[i]) { + gss_free_in_token_pages(in_token); + return SVC_DENIED; + } + } + length = min_t(unsigned int, inlen, argv->iov_len); + memcpy(page_address(in_token->pages[0]), argv->iov_base, length); + inlen -= length; + + i = 1; + page_base = rqstp->rq_arg.page_base; + while (inlen) { + length = min_t(unsigned int, inlen, PAGE_SIZE); + memcpy(page_address(in_token->pages[i]), + page_address(rqstp->rq_arg.pages[i]) + page_base, + length); + + inlen -= length; + page_base = 0; + i++; + } return 0; } @@ -1190,6 +1224,7 @@ dprintk("RPC: No creds found!\n"); goto out; } else { + struct timespec64 boot; /* steal creds */ rsci.cred = ud->creds; @@ -1210,6 +1245,9 @@ &expiry, GFP_KERNEL); if (status) goto out; + + getboottime64(&boot); + expiry -= boot.tv_sec; } rsci.h.expiry_time = expiry; @@ -1259,8 +1297,11 @@ break; case GSS_S_COMPLETE: status = gss_proxy_save_rsc(sn->rsc_cache, &ud, &handle); - if (status) + if (status) { + pr_info("%s: gss_proxy_save_rsc failed (%d)\n", + __func__, status); goto out; + } cli_handle.data = (u8 *)&handle; cli_handle.len = sizeof(handle); break; @@ -1271,15 +1312,20 @@ /* Got an answer to the upcall; use it: */ if (gss_write_init_verf(sn->rsc_cache, rqstp, - &cli_handle, &ud.major_status)) + &cli_handle, &ud.major_status)) { + pr_info("%s: gss_write_init_verf failed\n", __func__); goto out; + } if (gss_write_resv(resv, PAGE_SIZE, &cli_handle, &ud.out_token, - ud.major_status, ud.minor_status)) + ud.major_status, ud.minor_status)) { + pr_info("%s: gss_write_resv failed\n", __func__); goto out; + } ret = SVC_COMPLETE; out: + gss_free_in_token_pages(&ud.in_token); gssp_free_upcall_data(&ud); return ret; } diff -Nru linux-4.19.98/net/sunrpc/xprtrdma/verbs.c linux-4.19.118/net/sunrpc/xprtrdma/verbs.c --- linux-4.19.98/net/sunrpc/xprtrdma/verbs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/sunrpc/xprtrdma/verbs.c 2020-04-23 08:30:24.000000000 +0000 @@ -1558,10 +1558,11 @@ rc = ib_post_recv(r_xprt->rx_ia.ri_id->qp, wr, (const struct ib_recv_wr **)&bad_wr); if (rc) { - for (wr = bad_wr; wr; wr = wr->next) { + for (wr = bad_wr; wr;) { struct rpcrdma_rep *rep; rep = container_of(wr, struct rpcrdma_rep, rr_recv_wr); + wr = wr->next; rpcrdma_recv_buffer_put(rep); --count; } diff -Nru linux-4.19.98/net/tipc/link.c linux-4.19.118/net/tipc/link.c --- linux-4.19.98/net/tipc/link.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/link.c 2020-04-23 08:30:24.000000000 +0000 @@ -830,18 +830,31 @@ */ static void link_prepare_wakeup(struct tipc_link *l) { + struct sk_buff_head *wakeupq = &l->wakeupq; + struct sk_buff_head *inputq = l->inputq; struct sk_buff *skb, *tmp; - int imp, i = 0; + struct sk_buff_head tmpq; + int avail[5] = {0,}; + int imp = 0; - skb_queue_walk_safe(&l->wakeupq, skb, tmp) { + __skb_queue_head_init(&tmpq); + + for (; imp <= TIPC_SYSTEM_IMPORTANCE; imp++) + avail[imp] = l->backlog[imp].limit - l->backlog[imp].len; + + skb_queue_walk_safe(wakeupq, skb, tmp) { imp = TIPC_SKB_CB(skb)->chain_imp; - if (l->backlog[imp].len < l->backlog[imp].limit) { - skb_unlink(skb, &l->wakeupq); - skb_queue_tail(l->inputq, skb); - } else if (i++ > 10) { - break; - } + if (avail[imp] <= 0) + continue; + avail[imp]--; + __skb_unlink(skb, wakeupq); + __skb_queue_tail(&tmpq, skb); } + + spin_lock_bh(&inputq->lock); + skb_queue_splice_tail(&tmpq, inputq); + spin_unlock_bh(&inputq->lock); + } void tipc_link_reset(struct tipc_link *l) diff -Nru linux-4.19.98/net/tipc/monitor.c linux-4.19.118/net/tipc/monitor.c --- linux-4.19.98/net/tipc/monitor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/monitor.c 2020-04-23 08:30:24.000000000 +0000 @@ -665,6 +665,21 @@ kfree(mon); } +void tipc_mon_reinit_self(struct net *net) +{ + struct tipc_monitor *mon; + int bearer_id; + + for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) { + mon = tipc_monitor(net, bearer_id); + if (!mon) + continue; + write_lock_bh(&mon->lock); + mon->self->addr = tipc_own_addr(net); + write_unlock_bh(&mon->lock); + } +} + int tipc_nl_monitor_set_threshold(struct net *net, u32 cluster_size) { struct tipc_net *tn = tipc_net(net); diff -Nru linux-4.19.98/net/tipc/monitor.h linux-4.19.118/net/tipc/monitor.h --- linux-4.19.98/net/tipc/monitor.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/monitor.h 2020-04-23 08:30:24.000000000 +0000 @@ -77,6 +77,7 @@ u32 bearer_id); int tipc_nl_add_monitor_peer(struct net *net, struct tipc_nl_msg *msg, u32 bearer_id, u32 *prev_node); +void tipc_mon_reinit_self(struct net *net); extern const int tipc_max_domain_size; #endif diff -Nru linux-4.19.98/net/tipc/name_distr.c linux-4.19.118/net/tipc/name_distr.c --- linux-4.19.98/net/tipc/name_distr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/name_distr.c 2020-04-23 08:30:24.000000000 +0000 @@ -94,8 +94,9 @@ list_add_tail_rcu(&publ->binding_node, &nt->node_scope); return NULL; } - list_add_tail_rcu(&publ->binding_node, &nt->cluster_scope); - + write_lock_bh(&nt->cluster_scope_lock); + list_add_tail(&publ->binding_node, &nt->cluster_scope); + write_unlock_bh(&nt->cluster_scope_lock); skb = named_prepare_buf(net, PUBLICATION, ITEM_SIZE, 0); if (!skb) { pr_warn("Publication distribution failure\n"); @@ -112,11 +113,13 @@ */ struct sk_buff *tipc_named_withdraw(struct net *net, struct publication *publ) { + struct name_table *nt = tipc_name_table(net); struct sk_buff *buf; struct distr_item *item; - list_del_rcu(&publ->binding_node); - + write_lock_bh(&nt->cluster_scope_lock); + list_del(&publ->binding_node); + write_unlock_bh(&nt->cluster_scope_lock); if (publ->scope == TIPC_NODE_SCOPE) return NULL; @@ -147,7 +150,7 @@ ITEM_SIZE) * ITEM_SIZE; u32 msg_rem = msg_dsz; - list_for_each_entry_rcu(publ, pls, binding_node) { + list_for_each_entry(publ, pls, binding_node) { /* Prepare next buffer: */ if (!skb) { skb = named_prepare_buf(net, PUBLICATION, msg_rem, @@ -189,11 +192,10 @@ __skb_queue_head_init(&head); - rcu_read_lock(); + read_lock_bh(&nt->cluster_scope_lock); named_distribute(net, &head, dnode, &nt->cluster_scope); - rcu_read_unlock(); - tipc_node_xmit(net, &head, dnode, 0); + read_unlock_bh(&nt->cluster_scope_lock); } /** diff -Nru linux-4.19.98/net/tipc/name_table.c linux-4.19.118/net/tipc/name_table.c --- linux-4.19.98/net/tipc/name_table.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/name_table.c 2020-04-23 08:30:24.000000000 +0000 @@ -744,6 +744,7 @@ INIT_LIST_HEAD(&nt->node_scope); INIT_LIST_HEAD(&nt->cluster_scope); + rwlock_init(&nt->cluster_scope_lock); tn->nametbl = nt; spin_lock_init(&tn->nametbl_lock); return 0; diff -Nru linux-4.19.98/net/tipc/name_table.h linux-4.19.118/net/tipc/name_table.h --- linux-4.19.98/net/tipc/name_table.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/name_table.h 2020-04-23 08:30:24.000000000 +0000 @@ -100,6 +100,7 @@ struct hlist_head services[TIPC_NAMETBL_SIZE]; struct list_head node_scope; struct list_head cluster_scope; + rwlock_t cluster_scope_lock; u32 local_publ_count; }; diff -Nru linux-4.19.98/net/tipc/net.c linux-4.19.118/net/tipc/net.c --- linux-4.19.98/net/tipc/net.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/net.c 2020-04-23 08:30:24.000000000 +0000 @@ -42,6 +42,7 @@ #include "node.h" #include "bcast.h" #include "netlink.h" +#include "monitor.h" /* * The TIPC locking policy is designed to ensure a very fine locking @@ -136,6 +137,7 @@ tipc_set_node_addr(net, addr); tipc_named_reinit(net); tipc_sk_reinit(net); + tipc_mon_reinit_self(net); tipc_nametbl_publish(net, TIPC_CFG_SRV, addr, addr, TIPC_CLUSTER_SCOPE, 0, addr); } diff -Nru linux-4.19.98/net/tipc/netlink.c linux-4.19.118/net/tipc/netlink.c --- linux-4.19.98/net/tipc/netlink.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/netlink.c 2020-04-23 08:30:24.000000000 +0000 @@ -110,7 +110,8 @@ [TIPC_NLA_PROP_UNSPEC] = { .type = NLA_UNSPEC }, [TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 }, [TIPC_NLA_PROP_TOL] = { .type = NLA_U32 }, - [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 } + [TIPC_NLA_PROP_WIN] = { .type = NLA_U32 }, + [TIPC_NLA_PROP_MTU] = { .type = NLA_U32 } }; const struct nla_policy tipc_nl_bearer_policy[TIPC_NLA_BEARER_MAX + 1] = { diff -Nru linux-4.19.98/net/tipc/node.c linux-4.19.118/net/tipc/node.c --- linux-4.19.98/net/tipc/node.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/node.c 2020-04-23 08:30:24.000000000 +0000 @@ -810,10 +810,10 @@ static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) { struct tipc_link_entry *le = &n->links[bearer_id]; + struct tipc_media_addr *maddr = NULL; struct tipc_link *l = le->link; - struct tipc_media_addr *maddr; - struct sk_buff_head xmitq; int old_bearer_id = bearer_id; + struct sk_buff_head xmitq; if (!l) return; @@ -835,7 +835,8 @@ tipc_node_write_unlock(n); if (delete) tipc_mon_remove_peer(n->net, n->addr, old_bearer_id); - tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); + if (!skb_queue_empty(&xmitq)) + tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); tipc_sk_rcv(n->net, &le->inputq); } diff -Nru linux-4.19.98/net/tipc/socket.c linux-4.19.118/net/tipc/socket.c --- linux-4.19.98/net/tipc/socket.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/socket.c 2020-04-23 08:30:24.000000000 +0000 @@ -501,7 +501,7 @@ struct sock *sk = sock->sk; struct tipc_sock *tsk = tipc_sk(sk); struct net *net = sock_net(sk); - long timeout = CONN_TIMEOUT_DEFAULT; + long timeout = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT); u32 dnode = tsk_peer_node(tsk); struct sk_buff *skb; diff -Nru linux-4.19.98/net/tipc/sysctl.c linux-4.19.118/net/tipc/sysctl.c --- linux-4.19.98/net/tipc/sysctl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tipc/sysctl.c 2020-04-23 08:30:24.000000000 +0000 @@ -37,6 +37,8 @@ #include +static int zero; +static int one = 1; static struct ctl_table_header *tipc_ctl_hdr; static struct ctl_table tipc_table[] = { @@ -45,14 +47,16 @@ .data = &sysctl_tipc_rmem, .maxlen = sizeof(sysctl_tipc_rmem), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_dointvec_minmax, + .extra1 = &one, }, { .procname = "named_timeout", .data = &sysctl_tipc_named_timeout, .maxlen = sizeof(sysctl_tipc_named_timeout), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_dointvec_minmax, + .extra1 = &zero, }, {} }; diff -Nru linux-4.19.98/net/tls/tls_device.c linux-4.19.118/net/tls/tls_device.c --- linux-4.19.98/net/tls/tls_device.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tls/tls_device.c 2020-04-23 08:30:24.000000000 +0000 @@ -506,7 +506,7 @@ u32 seq, u64 *p_record_sn) { u64 record_sn = context->hint_record_sn; - struct tls_record_info *info; + struct tls_record_info *info, *last; info = context->retransmit_hint; if (!info || @@ -516,6 +516,25 @@ */ info = list_first_entry(&context->records_list, struct tls_record_info, list); + + /* send the start_marker record if seq number is before the + * tls offload start marker sequence number. This record is + * required to handle TCP packets which are before TLS offload + * started. + * And if it's not start marker, look if this seq number + * belongs to the list. + */ + if (likely(!tls_record_is_start_marker(info))) { + /* we have the first record, get the last record to see + * if this seq number belongs to the list. + */ + last = list_last_entry(&context->records_list, + struct tls_record_info, list); + + if (!between(seq, tls_record_start_seq(info), + last->end_seq)) + return NULL; + } record_sn = context->unacked_record_sn; } diff -Nru linux-4.19.98/net/tls/tls_device_fallback.c linux-4.19.118/net/tls/tls_device_fallback.c --- linux-4.19.98/net/tls/tls_device_fallback.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/tls/tls_device_fallback.c 2020-04-23 08:30:24.000000000 +0000 @@ -208,6 +208,10 @@ update_chksum(nskb, headln); + /* sock_efree means skb must gone through skb_orphan_partial() */ + if (nskb->destructor == sock_efree) + return; + delta = nskb->truesize - skb->truesize; if (likely(delta < 0)) WARN_ON_ONCE(refcount_sub_and_test(-delta, &sk->sk_wmem_alloc)); diff -Nru linux-4.19.98/net/vmw_vsock/hyperv_transport.c linux-4.19.118/net/vmw_vsock/hyperv_transport.c --- linux-4.19.98/net/vmw_vsock/hyperv_transport.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/vmw_vsock/hyperv_transport.c 2020-04-23 08:30:24.000000000 +0000 @@ -144,28 +144,15 @@ **************************************************************************** * The only valid Service GUIDs, from the perspectives of both the host and * * Linux VM, that can be connected by the other end, must conform to this * - * format: -facb-11e6-bd58-64006a7986d3, and the "port" must be in * - * this range [0, 0x7FFFFFFF]. * + * format: -facb-11e6-bd58-64006a7986d3. * **************************************************************************** * * When we write apps on the host to connect(), the GUID ServiceID is used. * When we write apps in Linux VM to connect(), we only need to specify the * port and the driver will form the GUID and use that to request the host. * - * From the perspective of Linux VM: - * 1. the local ephemeral port (i.e. the local auto-bound port when we call - * connect() without explicit bind()) is generated by __vsock_bind_stream(), - * and the range is [1024, 0xFFFFFFFF). - * 2. the remote ephemeral port (i.e. the auto-generated remote port for - * a connect request initiated by the host's connect()) is generated by - * hvs_remote_addr_init() and the range is [0x80000000, 0xFFFFFFFF). */ -#define MAX_LISTEN_PORT ((u32)0x7FFFFFFF) -#define MAX_VM_LISTEN_PORT MAX_LISTEN_PORT -#define MAX_HOST_LISTEN_PORT MAX_LISTEN_PORT -#define MIN_HOST_EPHEMERAL_PORT (MAX_HOST_LISTEN_PORT + 1) - /* 00000000-facb-11e6-bd58-64006a7986d3 */ static const uuid_le srv_id_template = UUID_LE(0x00000000, 0xfacb, 0x11e6, 0xbd, 0x58, @@ -188,33 +175,6 @@ vsock_addr_init(addr, VMADDR_CID_ANY, port); } -static void hvs_remote_addr_init(struct sockaddr_vm *remote, - struct sockaddr_vm *local) -{ - static u32 host_ephemeral_port = MIN_HOST_EPHEMERAL_PORT; - struct sock *sk; - - vsock_addr_init(remote, VMADDR_CID_ANY, VMADDR_PORT_ANY); - - while (1) { - /* Wrap around ? */ - if (host_ephemeral_port < MIN_HOST_EPHEMERAL_PORT || - host_ephemeral_port == VMADDR_PORT_ANY) - host_ephemeral_port = MIN_HOST_EPHEMERAL_PORT; - - remote->svm_port = host_ephemeral_port++; - - sk = vsock_find_connected_socket(remote, local); - if (!sk) { - /* Found an available ephemeral port */ - return; - } - - /* Release refcnt got in vsock_find_connected_socket */ - sock_put(sk); - } -} - static void hvs_set_channel_pending_send_size(struct vmbus_channel *chan) { set_channel_pending_send_size(chan, @@ -342,12 +302,7 @@ if_type = &chan->offermsg.offer.if_type; if_instance = &chan->offermsg.offer.if_instance; conn_from_host = chan->offermsg.offer.u.pipe.user_def[0]; - - /* The host or the VM should only listen on a port in - * [0, MAX_LISTEN_PORT] - */ - if (!is_valid_srv_id(if_type) || - get_port_by_srv_id(if_type) > MAX_LISTEN_PORT) + if (!is_valid_srv_id(if_type)) return; hvs_addr_init(&addr, conn_from_host ? if_type : if_instance); @@ -371,6 +326,13 @@ new->sk_state = TCP_SYN_SENT; vnew = vsock_sk(new); + + hvs_addr_init(&vnew->local_addr, if_type); + + /* Remote peer is always the host */ + vsock_addr_init(&vnew->remote_addr, + VMADDR_CID_HOST, VMADDR_PORT_ANY); + vnew->remote_addr.svm_port = get_port_by_srv_id(if_instance); hvs_new = vnew->trans; hvs_new->chan = chan; } else { @@ -410,8 +372,6 @@ sk->sk_ack_backlog++; hvs_addr_init(&vnew->local_addr, if_type); - hvs_remote_addr_init(&vnew->remote_addr, &vnew->local_addr); - hvs_new->vm_srv_id = *if_type; hvs_new->host_srv_id = *if_instance; @@ -716,16 +676,6 @@ static bool hvs_stream_allow(u32 cid, u32 port) { - /* The host's port range [MIN_HOST_EPHEMERAL_PORT, 0xFFFFFFFF) is - * reserved as ephemeral ports, which are used as the host's ports - * when the host initiates connections. - * - * Perform this check in the guest so an immediate error is produced - * instead of a timeout. - */ - if (port > MAX_HOST_LISTEN_PORT) - return false; - if (cid == VMADDR_CID_HOST) return true; diff -Nru linux-4.19.98/net/wireless/ethtool.c linux-4.19.118/net/wireless/ethtool.c --- linux-4.19.98/net/wireless/ethtool.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/wireless/ethtool.c 2020-04-23 08:30:24.000000000 +0000 @@ -7,9 +7,13 @@ void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { struct wireless_dev *wdev = dev->ieee80211_ptr; + struct device *pdev = wiphy_dev(wdev->wiphy); - strlcpy(info->driver, wiphy_dev(wdev->wiphy)->driver->name, - sizeof(info->driver)); + if (pdev->driver) + strlcpy(info->driver, pdev->driver->name, + sizeof(info->driver)); + else + strlcpy(info->driver, "N/A", sizeof(info->driver)); strlcpy(info->version, init_utsname()->release, sizeof(info->version)); diff -Nru linux-4.19.98/net/wireless/nl80211.c linux-4.19.118/net/wireless/nl80211.c --- linux-4.19.98/net/wireless/nl80211.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/wireless/nl80211.c 2020-04-23 08:30:24.000000000 +0000 @@ -323,6 +323,7 @@ [NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT] = { .type = NLA_FLAG }, [NL80211_ATTR_CONTROL_PORT_OVER_NL80211] = { .type = NLA_FLAG }, [NL80211_ATTR_PRIVACY] = { .type = NLA_FLAG }, + [NL80211_ATTR_STATUS_CODE] = { .type = NLA_U16 }, [NL80211_ATTR_CIPHER_SUITE_GROUP] = { .type = NLA_U32 }, [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, [NL80211_ATTR_PID] = { .type = NLA_U32 }, @@ -348,6 +349,8 @@ [NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED }, [NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED }, [NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 }, + [NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 }, + [NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG }, [NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 }, [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, @@ -396,6 +399,8 @@ [NL80211_ATTR_MDID] = { .type = NLA_U16 }, [NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY, .len = IEEE80211_MAX_DATA_LEN }, + [NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 }, + [NL80211_ATTR_MAX_CRIT_PROT_DURATION] = { .type = NLA_U16 }, [NL80211_ATTR_PEER_AID] = { .type = NLA_U16 }, [NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 }, [NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG }, @@ -421,6 +426,7 @@ [NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 }, [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, + [NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 }, [NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN }, [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, @@ -15601,7 +15607,7 @@ goto nla_put_failure; if ((sta_opmode->changed & STA_OPMODE_MAX_BW_CHANGED) && - nla_put_u8(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) + nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, sta_opmode->bw)) goto nla_put_failure; if ((sta_opmode->changed & STA_OPMODE_N_SS_CHANGED) && diff -Nru linux-4.19.98/net/wireless/rdev-ops.h linux-4.19.118/net/wireless/rdev-ops.h --- linux-4.19.98/net/wireless/rdev-ops.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/wireless/rdev-ops.h 2020-04-23 08:30:24.000000000 +0000 @@ -1170,6 +1170,16 @@ return ret; } +static inline void +rdev_end_cac(struct cfg80211_registered_device *rdev, + struct net_device *dev) +{ + trace_rdev_end_cac(&rdev->wiphy, dev); + if (rdev->ops->end_cac) + rdev->ops->end_cac(&rdev->wiphy, dev); + trace_rdev_return_void(&rdev->wiphy); +} + static inline int rdev_set_mcast_rate(struct cfg80211_registered_device *rdev, struct net_device *dev, diff -Nru linux-4.19.98/net/wireless/reg.c linux-4.19.118/net/wireless/reg.c --- linux-4.19.98/net/wireless/reg.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/wireless/reg.c 2020-04-23 08:30:24.000000000 +0000 @@ -2254,21 +2254,22 @@ static void handle_channel_custom(struct wiphy *wiphy, struct ieee80211_channel *chan, - const struct ieee80211_regdomain *regd) + const struct ieee80211_regdomain *regd, + u32 min_bw) { u32 bw_flags = 0; const struct ieee80211_reg_rule *reg_rule = NULL; const struct ieee80211_power_rule *power_rule = NULL; u32 bw; - for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) { + for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) { reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), regd, bw); if (!IS_ERR(reg_rule)) break; } - if (IS_ERR(reg_rule)) { + if (IS_ERR_OR_NULL(reg_rule)) { pr_debug("Disabling freq %d MHz as custom regd has no rule that fits it\n", chan->center_freq); if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) { @@ -2317,8 +2318,14 @@ if (!sband) return; + /* + * We currently assume that you always want at least 20 MHz, + * otherwise channel 12 might get enabled if this rule is + * compatible to US, which permits 2402 - 2472 MHz. + */ for (i = 0; i < sband->n_channels; i++) - handle_channel_custom(wiphy, &sband->channels[i], regd); + handle_channel_custom(wiphy, &sband->channels[i], regd, + MHZ_TO_KHZ(20)); } /* Used by drivers prior to wiphy registration */ @@ -3833,6 +3840,25 @@ return pre_cac_allowed; } +static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev) +{ + struct wireless_dev *wdev; + /* If we finished CAC or received radar, we should end any + * CAC running on the same channels. + * the check !cfg80211_chandef_dfs_usable contain 2 options: + * either all channels are available - those the CAC_FINISHED + * event has effected another wdev state, or there is a channel + * in unavailable state in wdev chandef - those the RADAR_DETECTED + * event has effected another wdev state. + * In both cases we should end the CAC on the wdev. + */ + list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { + if (wdev->cac_started && + !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef)) + rdev_end_cac(rdev, wdev->netdev); + } +} + void regulatory_propagate_dfs_state(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, enum nl80211_dfs_state dfs_state, @@ -3859,8 +3885,10 @@ cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state); if (event == NL80211_RADAR_DETECTED || - event == NL80211_RADAR_CAC_FINISHED) + event == NL80211_RADAR_CAC_FINISHED) { cfg80211_sched_dfs_chan_update(rdev); + cfg80211_check_and_end_cac(rdev); + } nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL); } @@ -3870,6 +3898,15 @@ { int err; + /* + * It's possible that - due to other bugs/issues - cfg80211 + * never called regulatory_init() below, or that it failed; + * in that case, don't try to do any further work here as + * it's doomed to lead to crashes. + */ + if (IS_ERR_OR_NULL(reg_pdev)) + return -EINVAL; + err = load_builtin_regdb_keys(); if (err) return err; diff -Nru linux-4.19.98/net/wireless/trace.h linux-4.19.118/net/wireless/trace.h --- linux-4.19.98/net/wireless/trace.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/wireless/trace.h 2020-04-23 08:30:24.000000000 +0000 @@ -607,6 +607,11 @@ TP_ARGS(wiphy, netdev) ); +DEFINE_EVENT(wiphy_netdev_evt, rdev_end_cac, + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), + TP_ARGS(wiphy, netdev) +); + DECLARE_EVENT_CLASS(station_add_change, TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac, struct station_parameters *params), diff -Nru linux-4.19.98/net/wireless/wext-core.c linux-4.19.118/net/wireless/wext-core.c --- linux-4.19.98/net/wireless/wext-core.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/wireless/wext-core.c 2020-04-23 08:30:24.000000000 +0000 @@ -657,7 +657,8 @@ return NULL; } -static int iw_handler_get_iwstats(struct net_device * dev, +/* noinline to avoid a bogus warning with -O3 */ +static noinline int iw_handler_get_iwstats(struct net_device * dev, struct iw_request_info * info, union iwreq_data * wrqu, char * extra) diff -Nru linux-4.19.98/net/x25/af_x25.c linux-4.19.118/net/x25/af_x25.c --- linux-4.19.98/net/x25/af_x25.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/x25/af_x25.c 2020-04-23 08:30:24.000000000 +0000 @@ -765,6 +765,10 @@ if (sk->sk_state == TCP_ESTABLISHED) goto out; + rc = -EALREADY; /* Do nothing if call is already in progress */ + if (sk->sk_state == TCP_SYN_SENT) + goto out; + sk->sk_state = TCP_CLOSE; sock->state = SS_UNCONNECTED; @@ -811,7 +815,7 @@ /* Now the loop */ rc = -EINPROGRESS; if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) - goto out_put_neigh; + goto out; rc = x25_wait_for_connection_establishment(sk); if (rc) diff -Nru linux-4.19.98/net/xdp/xdp_umem.c linux-4.19.118/net/xdp/xdp_umem.c --- linux-4.19.98/net/xdp/xdp_umem.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/xdp/xdp_umem.c 2020-04-23 08:30:24.000000000 +0000 @@ -23,6 +23,9 @@ { unsigned long flags; + if (!xs->tx) + return; + spin_lock_irqsave(&umem->xsk_list_lock, flags); list_add_rcu(&xs->list, &umem->xsk_list); spin_unlock_irqrestore(&umem->xsk_list_lock, flags); @@ -32,6 +35,9 @@ { unsigned long flags; + if (!xs->tx) + return; + spin_lock_irqsave(&umem->xsk_list_lock, flags); list_del_rcu(&xs->list); spin_unlock_irqrestore(&umem->xsk_list_lock, flags); @@ -254,7 +260,7 @@ u32 chunk_size = mr->chunk_size, headroom = mr->headroom; unsigned int chunks, chunks_per_page; u64 addr = mr->addr, size = mr->len; - int size_chk, err, i; + int err, i; if (chunk_size < XDP_UMEM_MIN_CHUNK_SIZE || chunk_size > PAGE_SIZE) { /* Strictly speaking we could support this, if: @@ -289,8 +295,7 @@ headroom = ALIGN(headroom, 64); - size_chk = chunk_size - headroom - XDP_PACKET_HEADROOM; - if (size_chk < 0) + if (headroom >= chunk_size - XDP_PACKET_HEADROOM) return -EINVAL; umem->address = (unsigned long)addr; diff -Nru linux-4.19.98/net/xdp/xsk.c linux-4.19.118/net/xdp/xsk.c --- linux-4.19.98/net/xdp/xsk.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/xdp/xsk.c 2020-04-23 08:30:24.000000000 +0000 @@ -218,6 +218,9 @@ mutex_lock(&xs->mutex); + if (xs->queue_id >= xs->dev->real_num_tx_queues) + goto out; + while (xskq_peek_desc(xs->tx, &desc)) { char *buffer; u64 addr; @@ -228,12 +231,6 @@ goto out; } - if (xskq_reserve_addr(xs->umem->cq)) - goto out; - - if (xs->queue_id >= xs->dev->real_num_tx_queues) - goto out; - len = desc.len; skb = sock_alloc_send_skb(sk, len, 1, &err); if (unlikely(!skb)) { @@ -245,7 +242,7 @@ addr = desc.addr; buffer = xdp_umem_get_data(xs->umem, addr); err = skb_store_bits(skb, 0, buffer, len); - if (unlikely(err)) { + if (unlikely(err) || xskq_reserve_addr(xs->umem->cq)) { kfree_skb(skb); goto out; } @@ -323,7 +320,7 @@ /* Make sure queue is ready before it can be seen by others */ smp_wmb(); - *queue = q; + WRITE_ONCE(*queue, q); return 0; } @@ -457,7 +454,7 @@ } xdp_get_umem(umem_xs->umem); - xs->umem = umem_xs->umem; + WRITE_ONCE(xs->umem, umem_xs->umem); sockfd_put(sock); } else if (!xs->umem || !xdp_umem_validate_queues(xs->umem)) { err = -EINVAL; @@ -537,7 +534,7 @@ /* Make sure umem is ready before it can be seen by others */ smp_wmb(); - xs->umem = umem; + WRITE_ONCE(xs->umem, umem); mutex_unlock(&xs->mutex); return 0; } @@ -661,6 +658,8 @@ if (!umem) return -EINVAL; + /* Matches the smp_wmb() in XDP_UMEM_REG */ + smp_rmb(); if (offset == XDP_UMEM_PGOFF_FILL_RING) q = READ_ONCE(umem->fq); else if (offset == XDP_UMEM_PGOFF_COMPLETION_RING) @@ -670,6 +669,8 @@ if (!q) return -EINVAL; + /* Matches the smp_wmb() in xsk_init_queue */ + smp_rmb(); qpg = virt_to_head_page(q->ring); if (size > (PAGE_SIZE << compound_order(qpg))) return -EINVAL; diff -Nru linux-4.19.98/net/xfrm/xfrm_device.c linux-4.19.118/net/xfrm/xfrm_device.c --- linux-4.19.98/net/xfrm/xfrm_device.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/xfrm/xfrm_device.c 2020-04-23 08:30:24.000000000 +0000 @@ -332,6 +332,7 @@ return xfrm_dev_feat_change(dev); case NETDEV_DOWN: + case NETDEV_UNREGISTER: return xfrm_dev_down(dev); } return NOTIFY_DONE; diff -Nru linux-4.19.98/net/xfrm/xfrm_interface.c linux-4.19.118/net/xfrm/xfrm_interface.c --- linux-4.19.98/net/xfrm/xfrm_interface.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/xfrm/xfrm_interface.c 2020-04-23 08:30:24.000000000 +0000 @@ -145,8 +145,6 @@ if (err < 0) goto out; - strcpy(xi->p.name, dev->name); - dev_hold(dev); xfrmi_link(xfrmn, xi); @@ -270,9 +268,6 @@ int err = -1; int mtu; - if (!dst) - goto tx_err_link_failure; - dst_hold(dst); dst = xfrm_lookup_with_ifid(xi->net, dst, fl, NULL, 0, xi->p.if_id); if (IS_ERR(dst)) { @@ -293,13 +288,13 @@ if (tdev == dev) { stats->collisions++; net_warn_ratelimited("%s: Local routing loop detected!\n", - xi->p.name); + dev->name); goto tx_err_dst_release; } mtu = dst_mtu(dst); if (!skb->ignore_df && skb->len > mtu) { - skb_dst_update_pmtu(skb, mtu); + skb_dst_update_pmtu_no_confirm(skb, mtu); if (skb->protocol == htons(ETH_P_IPV6)) { if (mtu < IPV6_MIN_MTU) @@ -345,6 +340,7 @@ { struct xfrm_if *xi = netdev_priv(dev); struct net_device_stats *stats = &xi->dev->stats; + struct dst_entry *dst = skb_dst(skb); struct flowi fl; int ret; @@ -354,10 +350,33 @@ case htons(ETH_P_IPV6): xfrm_decode_session(skb, &fl, AF_INET6); memset(IP6CB(skb), 0, sizeof(*IP6CB(skb))); + if (!dst) { + fl.u.ip6.flowi6_oif = dev->ifindex; + fl.u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC; + dst = ip6_route_output(dev_net(dev), NULL, &fl.u.ip6); + if (dst->error) { + dst_release(dst); + stats->tx_carrier_errors++; + goto tx_err; + } + skb_dst_set(skb, dst); + } break; case htons(ETH_P_IP): xfrm_decode_session(skb, &fl, AF_INET); memset(IPCB(skb), 0, sizeof(*IPCB(skb))); + if (!dst) { + struct rtable *rt; + + fl.u.ip4.flowi4_oif = dev->ifindex; + fl.u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC; + rt = __ip_route_output_key(dev_net(dev), &fl.u.ip4); + if (IS_ERR(rt)) { + stats->tx_carrier_errors++; + goto tx_err; + } + skb_dst_set(skb, &rt->dst); + } break; default: goto tx_err; @@ -568,12 +587,9 @@ { dev->netdev_ops = &xfrmi_netdev_ops; dev->type = ARPHRD_NONE; - dev->hard_header_len = ETH_HLEN; - dev->min_header_len = ETH_HLEN; dev->mtu = ETH_DATA_LEN; dev->min_mtu = ETH_MIN_MTU; - dev->max_mtu = ETH_DATA_LEN; - dev->addr_len = ETH_ALEN; + dev->max_mtu = IP_MAX_MTU; dev->flags = IFF_NOARP; dev->needs_free_netdev = true; dev->priv_destructor = xfrmi_dev_free; @@ -648,12 +664,6 @@ int err; xfrmi_netlink_parms(data, &p); - - if (!tb[IFLA_IFNAME]) - return -EINVAL; - - nla_strlcpy(p.name, tb[IFLA_IFNAME], IFNAMSIZ); - xi = xfrmi_locate(net, &p); if (xi) return -EEXIST; diff -Nru linux-4.19.98/net/xfrm/xfrm_policy.c linux-4.19.118/net/xfrm/xfrm_policy.c --- linux-4.19.98/net/xfrm/xfrm_policy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/xfrm/xfrm_policy.c 2020-04-23 08:30:24.000000000 +0000 @@ -309,7 +309,9 @@ static void xfrm_policy_kill(struct xfrm_policy *policy) { + write_lock_bh(&policy->lock); policy->walk.dead = 1; + write_unlock_bh(&policy->lock); atomic_inc(&policy->genid); diff -Nru linux-4.19.98/net/xfrm/xfrm_user.c linux-4.19.118/net/xfrm/xfrm_user.c --- linux-4.19.98/net/xfrm/xfrm_user.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/net/xfrm/xfrm_user.c 2020-04-23 08:30:24.000000000 +0000 @@ -109,7 +109,8 @@ return 0; uctx = nla_data(rt); - if (uctx->len != (sizeof(struct xfrm_user_sec_ctx) + uctx->ctx_len)) + if (uctx->len > nla_len(rt) || + uctx->len != (sizeof(struct xfrm_user_sec_ctx) + uctx->ctx_len)) return -EINVAL; return 0; @@ -2274,6 +2275,9 @@ err = verify_newpolicy_info(&ua->policy); if (err) goto free_state; + err = verify_sec_ctx_len(attrs); + if (err) + goto free_state; /* build an XP */ xp = xfrm_policy_construct(net, &ua->policy, attrs, &err); diff -Nru linux-4.19.98/samples/bpf/Makefile linux-4.19.118/samples/bpf/Makefile --- linux-4.19.98/samples/bpf/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/samples/bpf/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -221,7 +221,7 @@ clean: $(MAKE) -C ../../ M=$(CURDIR) clean - @rm -f *~ + @find $(CURDIR) -type f -name '*~' -delete $(LIBBPF): FORCE # Fix up variables inherited from Kbuild that tools/ build system won't like diff -Nru linux-4.19.98/samples/bpf/xdp_rxq_info_user.c linux-4.19.118/samples/bpf/xdp_rxq_info_user.c --- linux-4.19.98/samples/bpf/xdp_rxq_info_user.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/samples/bpf/xdp_rxq_info_user.c 2020-04-23 08:30:24.000000000 +0000 @@ -472,9 +472,9 @@ if (bpf_prog_load_xattr(&prog_load_attr, &obj, &prog_fd)) return EXIT_FAIL; - map = bpf_map__next(NULL, obj); - stats_global_map = bpf_map__next(map, obj); - rx_queue_index_map = bpf_map__next(stats_global_map, obj); + map = bpf_object__find_map_by_name(obj, "config_map"); + stats_global_map = bpf_object__find_map_by_name(obj, "stats_global_map"); + rx_queue_index_map = bpf_object__find_map_by_name(obj, "rx_queue_index_map"); if (!map || !stats_global_map || !rx_queue_index_map) { printf("finding a map in obj file failed\n"); return EXIT_FAIL; diff -Nru linux-4.19.98/scripts/Kconfig.include linux-4.19.118/scripts/Kconfig.include --- linux-4.19.98/scripts/Kconfig.include 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/Kconfig.include 2020-04-23 08:30:24.000000000 +0000 @@ -20,7 +20,7 @@ # $(cc-option,) # Return y if the compiler supports , n otherwise -cc-option = $(success,$(CC) -Werror $(CLANG_FLAGS) $(1) -E -x c /dev/null -o /dev/null) +cc-option = $(success,$(CC) -Werror $(CLANG_FLAGS) $(1) -S -x c /dev/null -o /dev/null) # $(ld-option,) # Return y if the linker supports , n otherwise diff -Nru linux-4.19.98/scripts/Makefile.extrawarn linux-4.19.118/scripts/Makefile.extrawarn --- linux-4.19.98/scripts/Makefile.extrawarn 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/Makefile.extrawarn 2020-04-23 08:30:24.000000000 +0000 @@ -72,5 +72,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare) KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length) KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized) +KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) endif endif diff -Nru linux-4.19.98/scripts/dtc/dtc-lexer.l linux-4.19.118/scripts/dtc/dtc-lexer.l --- linux-4.19.98/scripts/dtc/dtc-lexer.l 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/dtc-lexer.l 2020-04-23 08:30:24.000000000 +0000 @@ -38,7 +38,6 @@ #include "srcpos.h" #include "dtc-parser.tab.h" -YYLTYPE yylloc; extern bool treesource_error; /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arc/axs10x_mb.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arc/axs10x_mb.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arc/axs10x_mb.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arc/axs10x_mb.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -80,6 +80,7 @@ interrupt-names = "macirq"; phy-mode = "rgmii"; snps,pbl = < 32 >; + snps,multicast-filter-bins = <256>; clocks = <&apbclk>; clock-names = "stmmaceth"; max-speed = <100>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/am335x-boneblack-common.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/am335x-boneblack-common.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/am335x-boneblack-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/am335x-boneblack-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -131,6 +131,11 @@ }; / { + memory@80000000 { + device_type = "memory"; + reg = <0x80000000 0x20000000>; /* 512 MB */ + }; + clk_mcasp0_fixed: clk_mcasp0_fixed { #clock-cells = <0>; compatible = "fixed-clock"; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/am437x-idk-evm.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/am437x-idk-evm.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/am437x-idk-evm.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/am437x-idk-evm.dts 2020-04-23 08:30:24.000000000 +0000 @@ -525,11 +525,11 @@ * Supply voltage supervisor on board will not allow opp50 so * disable it and set opp100 as suspend OPP. */ - opp50@300000000 { + opp50-300000000 { status = "disabled"; }; - opp100@600000000 { + opp100-600000000 { opp-suspend; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/am43x-epos-evm.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/am43x-epos-evm.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/am43x-epos-evm.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/am43x-epos-evm.dts 2020-04-23 08:30:24.000000000 +0000 @@ -839,6 +839,7 @@ pinctrl-names = "default", "sleep"; pinctrl-0 = <&spi0_pins_default>; pinctrl-1 = <&spi0_pins_sleep>; + ti,pindir-d0-out-d1-in = <1>; }; &spi1 { @@ -846,6 +847,7 @@ pinctrl-names = "default", "sleep"; pinctrl-0 = <&spi1_pins_default>; pinctrl-1 = <&spi1_pins_sleep>; + ti,pindir-d0-out-d1-in = <1>; }; &usb2_phy1 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/am43xx-clocks.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/am43xx-clocks.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/am43xx-clocks.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/am43xx-clocks.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -707,6 +707,60 @@ ti,bit-shift = <8>; reg = <0x2a48>; }; + + clkout1_osc_div_ck: clkout1-osc-div-ck { + #clock-cells = <0>; + compatible = "ti,divider-clock"; + clocks = <&sys_clkin_ck>; + ti,bit-shift = <20>; + ti,max-div = <4>; + reg = <0x4100>; + }; + + clkout1_src2_mux_ck: clkout1-src2-mux-ck { + #clock-cells = <0>; + compatible = "ti,mux-clock"; + clocks = <&clk_rc32k_ck>, <&sysclk_div>, <&dpll_ddr_m2_ck>, + <&dpll_per_m2_ck>, <&dpll_disp_m2_ck>, + <&dpll_mpu_m2_ck>; + reg = <0x4100>; + }; + + clkout1_src2_pre_div_ck: clkout1-src2-pre-div-ck { + #clock-cells = <0>; + compatible = "ti,divider-clock"; + clocks = <&clkout1_src2_mux_ck>; + ti,bit-shift = <4>; + ti,max-div = <8>; + reg = <0x4100>; + }; + + clkout1_src2_post_div_ck: clkout1-src2-post-div-ck { + #clock-cells = <0>; + compatible = "ti,divider-clock"; + clocks = <&clkout1_src2_pre_div_ck>; + ti,bit-shift = <8>; + ti,max-div = <32>; + ti,index-power-of-two; + reg = <0x4100>; + }; + + clkout1_mux_ck: clkout1-mux-ck { + #clock-cells = <0>; + compatible = "ti,mux-clock"; + clocks = <&clkout1_osc_div_ck>, <&clk_rc32k_ck>, + <&clkout1_src2_post_div_ck>, <&dpll_extdev_m2_ck>; + ti,bit-shift = <16>; + reg = <0x4100>; + }; + + clkout1_ck: clkout1-ck { + #clock-cells = <0>; + compatible = "ti,gate-clock"; + clocks = <&clkout1_mux_ck>; + ti,bit-shift = <23>; + reg = <0x4100>; + }; }; &prcm { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/am571x-idk.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/am571x-idk.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/am571x-idk.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/am571x-idk.dts 2020-04-23 08:30:24.000000000 +0000 @@ -93,10 +93,6 @@ gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>; }; -&pcie1_ep { - gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; -}; - &mmc1 { pinctrl-names = "default", "hs"; pinctrl-0 = <&mmc1_pins_default_no_clk_pu>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/am572x-idk-common.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/am572x-idk-common.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/am572x-idk-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/am572x-idk-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -71,10 +71,6 @@ gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; }; -&pcie1_ep { - gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>; -}; - &mailbox5 { status = "okay"; mbox_ipu1_ipc3x: mbox_ipu1_ipc3x { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/am57xx-beagle-x15-common.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/am57xx-beagle-x15-common.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/am57xx-beagle-x15-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/am57xx-beagle-x15-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -32,6 +32,27 @@ reg = <0x0 0x80000000 0x0 0x80000000>; }; + main_12v0: fixedregulator-main_12v0 { + /* main supply */ + compatible = "regulator-fixed"; + regulator-name = "main_12v0"; + regulator-min-microvolt = <12000000>; + regulator-max-microvolt = <12000000>; + regulator-always-on; + regulator-boot-on; + }; + + evm_5v0: fixedregulator-evm_5v0 { + /* Output of TPS54531D */ + compatible = "regulator-fixed"; + regulator-name = "evm_5v0"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&main_12v0>; + regulator-always-on; + regulator-boot-on; + }; + vdd_3v3: fixedregulator-vdd_3v3 { compatible = "regulator-fixed"; regulator-name = "vdd_3v3"; @@ -550,10 +571,6 @@ gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; }; -&pcie1_ep { - gpios = <&gpio2 8 GPIO_ACTIVE_LOW>; -}; - &mcasp3 { #sound-dai-cells = <0>; assigned-clocks = <&l4per_clkctrl DRA7_MCASP3_CLKCTRL 24>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/aspeed-g5.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/aspeed-g5.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/aspeed-g5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/aspeed-g5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -247,7 +247,7 @@ compatible = "aspeed,ast2500-gpio"; reg = <0x1e780000 0x1000>; interrupts = <20>; - gpio-ranges = <&pinctrl 0 0 220>; + gpio-ranges = <&pinctrl 0 0 232>; clocks = <&syscon ASPEED_CLK_APB>; interrupt-controller; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/at91-nattis-2-natte-2.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/at91-nattis-2-natte-2.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/at91-nattis-2-natte-2.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/at91-nattis-2-natte-2.dts 2020-04-23 08:30:24.000000000 +0000 @@ -38,14 +38,16 @@ atmel,pins = ; + (AT91_PINCTRL_OUTPUT | + AT91_PINCTRL_OUTPUT_VAL(0))>; }; pinctrl_lcd_hipow0: lcd_hipow0 { atmel,pins = ; + (AT91_PINCTRL_OUTPUT | + AT91_PINCTRL_OUTPUT_VAL(0))>; }; }; }; @@ -219,6 +221,7 @@ reg = <0>; bus-width = <4>; cd-gpios = <&pioD 5 GPIO_ACTIVE_HIGH>; + cd-inverted; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9260.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9260.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9260.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9260.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -434,7 +434,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - ; }; @@ -468,7 +468,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - ; }; @@ -486,7 +486,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - ; }; @@ -504,7 +504,7 @@ usart3 { pinctrl_usart3: usart3-0 { atmel,pins = - ; }; @@ -522,7 +522,7 @@ uart0 { pinctrl_uart0: uart0-0 { atmel,pins = - ; }; }; @@ -530,7 +530,7 @@ uart1 { pinctrl_uart1: uart1-0 { atmel,pins = - ; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9261.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9261.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9261.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9261.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -328,7 +328,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - , + , ; }; @@ -346,7 +346,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - , + , ; }; @@ -364,7 +364,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - , + , ; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9263.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9263.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9263.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9263.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -437,7 +437,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - ; }; @@ -455,7 +455,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - ; }; @@ -473,7 +473,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - ; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9g45.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9g45.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9g45.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9g45.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -555,7 +555,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - ; }; @@ -573,7 +573,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - ; }; @@ -591,7 +591,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - ; }; @@ -609,7 +609,7 @@ usart3 { pinctrl_usart3: usart3-0 { atmel,pins = - ; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9rl.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9rl.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/at91sam9rl.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/at91sam9rl.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -681,7 +681,7 @@ usart0 { pinctrl_usart0: usart0-0 { atmel,pins = - , + , ; }; @@ -720,7 +720,7 @@ usart1 { pinctrl_usart1: usart1-0 { atmel,pins = - , + , ; }; @@ -743,7 +743,7 @@ usart2 { pinctrl_usart2: usart2-0 { atmel,pins = - , + , ; }; @@ -766,7 +766,7 @@ usart3 { pinctrl_usart3: usart3-0 { atmel,pins = - , + , ; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/bcm2835-rpi-zero-w.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/bcm2835-rpi-zero-w.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/bcm2835-rpi-zero-w.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/bcm2835-rpi-zero-w.dts 2020-04-23 08:30:24.000000000 +0000 @@ -118,6 +118,7 @@ &sdhci { #address-cells = <1>; #size-cells = <0>; + pinctrl-names = "default"; pinctrl-0 = <&emmc_gpio34 &gpclk2_gpio43>; mmc-pwrseq = <&wifi_pwrseq>; non-removable; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/bcm2835-rpi.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/bcm2835-rpi.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/bcm2835-rpi.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/bcm2835-rpi.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -32,7 +32,7 @@ mailbox@7e00b840 { compatible = "brcm,bcm2835-vchiq"; - reg = <0x7e00b840 0xf>; + reg = <0x7e00b840 0x3c>; interrupts = <0 2>; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/dra7.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/dra7.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/dra7.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/dra7.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -150,6 +150,7 @@ #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0x0 0x0 0xc0000000>; + dma-ranges = <0x80000000 0x0 0x80000000 0x80000000>; ti,hwmods = "l3_main_1", "l3_main_2"; reg = <0x0 0x44000000 0x0 0x1000000>, <0x0 0x45000000 0x0 0x1000>; @@ -324,6 +325,7 @@ device_type = "pci"; ranges = <0x81000000 0 0 0x03000 0 0x00010000 0x82000000 0 0x20013000 0x13000 0 0xffed000>; + dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>; bus-range = <0x00 0xff>; #interrupt-cells = <1>; num-lanes = <1>; @@ -376,6 +378,7 @@ device_type = "pci"; ranges = <0x81000000 0 0 0x03000 0 0x00010000 0x82000000 0 0x30013000 0x13000 0 0xffed000>; + dma-ranges = <0x02000000 0x0 0x00000000 0x00000000 0x1 0x00000000>; bus-range = <0x00 0xff>; #interrupt-cells = <1>; num-lanes = <1>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/dra76x.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/dra76x.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/dra76x.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/dra76x.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -81,3 +81,8 @@ reg = <0x3fc>; }; }; + +&mmc3 { + /* dra76x is not affected by i887 */ + max-frequency = <96000000>; +}; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qdl-phytec-phycore-som.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qdl-phytec-phycore-som.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qdl-phytec-phycore-som.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qdl-phytec-phycore-som.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -107,14 +107,14 @@ regulators { vdd_arm: buck1 { regulator-name = "vdd_arm"; - regulator-min-microvolt = <730000>; + regulator-min-microvolt = <925000>; regulator-max-microvolt = <1380000>; regulator-always-on; }; vdd_soc: buck2 { regulator-name = "vdd_soc"; - regulator-min-microvolt = <730000>; + regulator-min-microvolt = <1150000>; regulator-max-microvolt = <1380000>; regulator-always-on; }; @@ -183,7 +183,6 @@ pinctrl-0 = <&pinctrl_usdhc4>; bus-width = <8>; non-removable; - vmmc-supply = <&vdd_emmc_1p8>; status = "disabled"; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qdl-zii-rdu2.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qdl-zii-rdu2.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qdl-zii-rdu2.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qdl-zii-rdu2.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -657,7 +657,7 @@ pinctrl-0 = <&pinctrl_usdhc2>; bus-width = <4>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; - wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>; + disable-wp; vmmc-supply = <®_3p3v_sd>; vqmmc-supply = <®_3p3v>; no-1-8-v; @@ -670,7 +670,7 @@ pinctrl-0 = <&pinctrl_usdhc3>; bus-width = <4>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>; - wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; + disable-wp; vmmc-supply = <®_3p3v_sd>; vqmmc-supply = <®_3p3v>; no-1-8-v; @@ -804,6 +804,7 @@ &usbh1 { vbus-supply = <®_5p0v_main>; disable-over-current; + maximum-speed = "full-speed"; status = "okay"; }; @@ -1081,7 +1082,6 @@ MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059 MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059 MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x17059 - MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x40010040 MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x40010040 >; }; @@ -1094,7 +1094,6 @@ MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059 MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059 MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059 - MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x40010040 MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x40010040 >; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qdl.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qdl.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qdl.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qdl.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -1013,9 +1013,8 @@ compatible = "fsl,imx6q-fec"; reg = <0x02188000 0x4000>; interrupt-names = "int0", "pps"; - interrupts-extended = - <&intc 0 118 IRQ_TYPE_LEVEL_HIGH>, - <&intc 0 119 IRQ_TYPE_LEVEL_HIGH>; + interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>, + <0 119 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6QDL_CLK_ENET>, <&clks IMX6QDL_CLK_ENET>, <&clks IMX6QDL_CLK_ENET_REF>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qp.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qp.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/imx6qp.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/imx6qp.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -77,7 +77,6 @@ }; &fec { - /delete-property/interrupts-extended; interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>, <0 119 IRQ_TYPE_LEVEL_HIGH>; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/imx7-colibri.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/imx7-colibri.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/imx7-colibri.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/imx7-colibri.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -319,7 +319,6 @@ assigned-clock-rates = <400000000>; bus-width = <8>; fsl,tuning-step = <2>; - max-frequency = <100000000>; vmmc-supply = <®_module_3v3>; vqmmc-supply = <®_DCDC3>; non-removable; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/iwg20d-q7-common.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/iwg20d-q7-common.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/iwg20d-q7-common.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/iwg20d-q7-common.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -87,7 +87,7 @@ regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; - gpios = <&gpio2 30 GPIO_ACTIVE_LOW>; + gpios = <&gpio2 30 GPIO_ACTIVE_HIGH>; gpios-states = <1>; states = <3300000 1 1800000 0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/logicpd-som-lv-baseboard.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/logicpd-som-lv-baseboard.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/logicpd-som-lv-baseboard.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/logicpd-som-lv-baseboard.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -153,7 +153,7 @@ pinctrl-names = "default"; pinctrl-0 = <&mmc1_pins>; wp-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; /* gpio_126 */ - cd-gpios = <&gpio4 14 IRQ_TYPE_LEVEL_LOW>; /* gpio_110 */ + cd-gpios = <&gpio4 14 GPIO_ACTIVE_LOW>; /* gpio_110 */ vmmc-supply = <&vmmc1>; bus-width = <4>; cap-power-off-card; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/logicpd-som-lv.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/logicpd-som-lv.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/logicpd-som-lv.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/logicpd-som-lv.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -232,6 +232,20 @@ >; }; + i2c2_pins: pinmux_i2c2_pins { + pinctrl-single,pins = < + OMAP3_CORE1_IOPAD(0x21be, PIN_INPUT | MUX_MODE0) /* i2c2_scl */ + OMAP3_CORE1_IOPAD(0x21c0, PIN_INPUT | MUX_MODE0) /* i2c2_sda */ + >; + }; + + i2c3_pins: pinmux_i2c3_pins { + pinctrl-single,pins = < + OMAP3_CORE1_IOPAD(0x21c2, PIN_INPUT | MUX_MODE0) /* i2c3_scl */ + OMAP3_CORE1_IOPAD(0x21c4, PIN_INPUT | MUX_MODE0) /* i2c3_sda */ + >; + }; + tsc2004_pins: pinmux_tsc2004_pins { pinctrl-single,pins = < OMAP3_CORE1_IOPAD(0x2186, PIN_INPUT | MUX_MODE4) /* mcbsp4_dr.gpio_153 */ @@ -253,18 +267,6 @@ OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */ >; }; - i2c2_pins: pinmux_i2c2_pins { - pinctrl-single,pins = < - OMAP3_CORE1_IOPAD(0x21be, PIN_INPUT | MUX_MODE0) /* i2c2_scl */ - OMAP3_CORE1_IOPAD(0x21c0, PIN_INPUT | MUX_MODE0) /* i2c2_sda */ - >; - }; - i2c3_pins: pinmux_i2c3_pins { - pinctrl-single,pins = < - OMAP3_CORE1_IOPAD(0x21c2, PIN_INPUT | MUX_MODE0) /* i2c3_scl */ - OMAP3_CORE1_IOPAD(0x21c4, PIN_INPUT | MUX_MODE0) /* i2c3_sda */ - >; - }; }; &omap3_pmx_core2 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/lpc3250-phy3250.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/lpc3250-phy3250.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/lpc3250-phy3250.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/lpc3250-phy3250.dts 2020-04-23 08:30:24.000000000 +0000 @@ -49,8 +49,8 @@ sd_reg: regulator@2 { compatible = "regulator-fixed"; regulator-name = "sd_reg"; - regulator-min-microvolt = <1800000>; - regulator-max-microvolt = <1800000>; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; gpio = <&gpio 5 5 0>; enable-active-high; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/lpc32xx.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/lpc32xx.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/lpc32xx.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/lpc32xx.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -139,11 +139,11 @@ }; clcd: clcd@31040000 { - compatible = "arm,pl110", "arm,primecell"; + compatible = "arm,pl111", "arm,primecell"; reg = <0x31040000 0x1000>; interrupts = <14 IRQ_TYPE_LEVEL_HIGH>; - clocks = <&clk LPC32XX_CLK_LCD>; - clock-names = "apb_pclk"; + clocks = <&clk LPC32XX_CLK_LCD>, <&clk LPC32XX_CLK_LCD>; + clock-names = "clcdclk", "apb_pclk"; status = "disabled"; }; @@ -462,7 +462,9 @@ key: key@40050000 { compatible = "nxp,lpc3220-key"; reg = <0x40050000 0x1000>; - interrupts = <54 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clk LPC32XX_CLK_KEY>; + interrupt-parent = <&sic1>; + interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; status = "disabled"; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/ls1021a-twr.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/ls1021a-twr.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/ls1021a-twr.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/ls1021a-twr.dts 2020-04-23 08:30:24.000000000 +0000 @@ -143,7 +143,7 @@ }; &enet0 { - tbi-handle = <&tbi1>; + tbi-handle = <&tbi0>; phy-handle = <&sgmii_phy2>; phy-connection-type = "sgmii"; status = "okay"; @@ -222,6 +222,13 @@ sgmii_phy2: ethernet-phy@2 { reg = <0x2>; }; + tbi0: tbi-phy@1f { + reg = <0x1f>; + device_type = "tbi-phy"; + }; +}; + +&mdio1 { tbi1: tbi-phy@1f { reg = <0x1f>; device_type = "tbi-phy"; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/ls1021a.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/ls1021a.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/ls1021a.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/ls1021a.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -592,6 +592,15 @@ <0x0 0x2d10030 0x0 0x4>; }; + mdio1: mdio@2d64000 { + compatible = "gianfar"; + device_type = "mdio"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x0 0x2d64000 0x0 0x4000>, + <0x0 0x2d50030 0x0 0x4>; + }; + ptp_clock@2d10e00 { compatible = "fsl,etsec-ptp"; reg = <0x0 0x2d10e00 0x0 0xb0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/omap3-n900.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/omap3-n900.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/omap3-n900.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/omap3-n900.dts 2020-04-23 08:30:24.000000000 +0000 @@ -158,6 +158,12 @@ pwms = <&pwm9 0 26316 0>; /* 38000 Hz */ }; + rom_rng: rng { + compatible = "nokia,n900-rom-rng"; + clocks = <&rng_ick>; + clock-names = "ick"; + }; + /* controlled (enabled/disabled) directly by bcm2048 and wl1251 */ vctcxo: vctcxo { compatible = "fixed-clock"; @@ -846,34 +852,46 @@ compatible = "ti,omap2-onenand"; reg = <0 0 0x20000>; /* CS0, offset 0, IO size 128K */ + /* + * These timings are based on CONFIG_OMAP_GPMC_DEBUG=y reported + * bootloader set values when booted with v5.1 + * (OneNAND Manufacturer: Samsung): + * + * cs0 GPMC_CS_CONFIG1: 0xfb001202 + * cs0 GPMC_CS_CONFIG2: 0x00111100 + * cs0 GPMC_CS_CONFIG3: 0x00020200 + * cs0 GPMC_CS_CONFIG4: 0x11001102 + * cs0 GPMC_CS_CONFIG5: 0x03101616 + * cs0 GPMC_CS_CONFIG6: 0x90060000 + */ gpmc,sync-read; gpmc,sync-write; gpmc,burst-length = <16>; gpmc,burst-read; gpmc,burst-wrap; gpmc,burst-write; - gpmc,device-width = <2>; /* GPMC_DEVWIDTH_16BIT */ - gpmc,mux-add-data = <2>; /* GPMC_MUX_AD */ + gpmc,device-width = <2>; + gpmc,mux-add-data = <2>; gpmc,cs-on-ns = <0>; - gpmc,cs-rd-off-ns = <87>; - gpmc,cs-wr-off-ns = <87>; + gpmc,cs-rd-off-ns = <102>; + gpmc,cs-wr-off-ns = <102>; gpmc,adv-on-ns = <0>; - gpmc,adv-rd-off-ns = <10>; - gpmc,adv-wr-off-ns = <10>; - gpmc,oe-on-ns = <15>; - gpmc,oe-off-ns = <87>; + gpmc,adv-rd-off-ns = <12>; + gpmc,adv-wr-off-ns = <12>; + gpmc,oe-on-ns = <12>; + gpmc,oe-off-ns = <102>; gpmc,we-on-ns = <0>; - gpmc,we-off-ns = <87>; - gpmc,rd-cycle-ns = <112>; - gpmc,wr-cycle-ns = <112>; - gpmc,access-ns = <81>; - gpmc,page-burst-access-ns = <15>; + gpmc,we-off-ns = <102>; + gpmc,rd-cycle-ns = <132>; + gpmc,wr-cycle-ns = <132>; + gpmc,access-ns = <96>; + gpmc,page-burst-access-ns = <18>; gpmc,bus-turnaround-ns = <0>; gpmc,cycle2cycle-delay-ns = <0>; gpmc,wait-monitoring-ns = <0>; - gpmc,clk-activation-ns = <5>; - gpmc,wr-data-mux-bus-ns = <30>; - gpmc,wr-access-ns = <81>; + gpmc,clk-activation-ns = <6>; + gpmc,wr-data-mux-bus-ns = <36>; + gpmc,wr-access-ns = <96>; gpmc,sync-clk-ps = <15000>; /* diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/omap5.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/omap5.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/omap5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/omap5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -144,6 +144,7 @@ #address-cells = <1>; #size-cells = <1>; ranges = <0 0 0 0xc0000000>; + dma-ranges = <0x80000000 0x0 0x80000000 0x80000000>; ti,hwmods = "l3_main_1", "l3_main_2", "l3_main_3"; reg = <0 0x44000000 0 0x2000>, <0 0x44800000 0 0x3000>, diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/ox810se.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/ox810se.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/ox810se.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/ox810se.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -322,8 +322,8 @@ interrupt-controller; reg = <0 0x200>; #interrupt-cells = <1>; - valid-mask = <0xFFFFFFFF>; - clear-mask = <0>; + valid-mask = <0xffffffff>; + clear-mask = <0xffffffff>; }; timer0: timer@200 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/ox820.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/ox820.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/ox820.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/ox820.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -239,8 +239,8 @@ reg = <0 0x200>; interrupts = ; #interrupt-cells = <1>; - valid-mask = <0xFFFFFFFF>; - clear-mask = <0>; + valid-mask = <0xffffffff>; + clear-mask = <0xffffffff>; }; timer0: timer@200 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/r8a7743.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/r8a7743.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/r8a7743.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/r8a7743.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -565,9 +565,7 @@ /* doesn't need pinmux */ #address-cells = <1>; #size-cells = <0>; - compatible = "renesas,iic-r8a7743", - "renesas,rcar-gen2-iic", - "renesas,rmobile-iic"; + compatible = "renesas,iic-r8a7743"; reg = <0 0xe60b0000 0 0x425>; interrupts = ; clocks = <&cpg CPG_MOD 926>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/r8a7779.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/r8a7779.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/r8a7779.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/r8a7779.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -68,6 +68,14 @@ <0xf0000100 0x100>; }; + timer@f0000200 { + compatible = "arm,cortex-a9-global-timer"; + reg = <0xf0000200 0x100>; + interrupts = ; + clocks = <&cpg_clocks R8A7779_CLK_ZS>; + }; + timer@f0000600 { compatible = "arm,cortex-a9-twd-timer"; reg = <0xf0000600 0x20>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -1187,49 +1187,49 @@ usart0_clk: usart0_clk { #clock-cells = <0>; reg = <12>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; usart1_clk: usart1_clk { #clock-cells = <0>; reg = <13>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; usart2_clk: usart2_clk { #clock-cells = <0>; reg = <14>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; usart3_clk: usart3_clk { #clock-cells = <0>; reg = <15>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; uart0_clk: uart0_clk { #clock-cells = <0>; reg = <16>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; twi0_clk: twi0_clk { reg = <18>; #clock-cells = <0>; - atmel,clk-output-range = <0 16625000>; + atmel,clk-output-range = <0 41500000>; }; twi1_clk: twi1_clk { #clock-cells = <0>; reg = <19>; - atmel,clk-output-range = <0 16625000>; + atmel,clk-output-range = <0 41500000>; }; twi2_clk: twi2_clk { #clock-cells = <0>; reg = <20>; - atmel,clk-output-range = <0 16625000>; + atmel,clk-output-range = <0 41500000>; }; mci0_clk: mci0_clk { @@ -1245,19 +1245,19 @@ spi0_clk: spi0_clk { #clock-cells = <0>; reg = <24>; - atmel,clk-output-range = <0 133000000>; + atmel,clk-output-range = <0 166000000>; }; spi1_clk: spi1_clk { #clock-cells = <0>; reg = <25>; - atmel,clk-output-range = <0 133000000>; + atmel,clk-output-range = <0 166000000>; }; tcb0_clk: tcb0_clk { #clock-cells = <0>; reg = <26>; - atmel,clk-output-range = <0 133000000>; + atmel,clk-output-range = <0 166000000>; }; pwm_clk: pwm_clk { @@ -1268,7 +1268,7 @@ adc_clk: adc_clk { #clock-cells = <0>; reg = <29>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; dma0_clk: dma0_clk { @@ -1299,13 +1299,13 @@ ssc0_clk: ssc0_clk { #clock-cells = <0>; reg = <38>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; ssc1_clk: ssc1_clk { #clock-cells = <0>; reg = <39>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; sha_clk: sha_clk { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3_can.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3_can.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3_can.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3_can.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -37,13 +37,13 @@ can0_clk: can0_clk { #clock-cells = <0>; reg = <40>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; can1_clk: can1_clk { #clock-cells = <0>; reg = <41>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3_tcb1.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3_tcb1.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3_tcb1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3_tcb1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -23,6 +23,7 @@ tcb1_clk: tcb1_clk { #clock-cells = <0>; reg = <27>; + atmel,clk-output-range = <0 166000000>; }; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3_uart.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3_uart.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sama5d3_uart.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sama5d3_uart.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -42,13 +42,13 @@ uart0_clk: uart0_clk { #clock-cells = <0>; reg = <16>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; uart1_clk: uart1_clk { #clock-cells = <0>; reg = <17>; - atmel,clk-output-range = <0 66000000>; + atmel,clk-output-range = <0 83000000>; }; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/stihxxx-b2120.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/stihxxx-b2120.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/stihxxx-b2120.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/stihxxx-b2120.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -45,7 +45,7 @@ /* DAC */ format = "i2s"; mclk-fs = <256>; - frame-inversion = <1>; + frame-inversion; cpu { sound-dai = <&sti_uni_player2>; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/stm32f469-disco.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/stm32f469-disco.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/stm32f469-disco.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/stm32f469-disco.dts 2020-04-23 08:30:24.000000000 +0000 @@ -75,6 +75,13 @@ regulator-max-microvolt = <3300000>; }; + vdd_dsi: vdd-dsi { + compatible = "regulator-fixed"; + regulator-name = "vdd_dsi"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + soc { dma-ranges = <0xc0000000 0x0 0x10000000>; }; @@ -154,6 +161,7 @@ compatible = "orisetech,otm8009a"; reg = <0>; /* dsi virtual channel (0..3) */ reset-gpios = <&gpioh 7 GPIO_ACTIVE_LOW>; + power-supply = <&vdd_dsi>; status = "okay"; port { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/stm32h743i-eval.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/stm32h743i-eval.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/stm32h743i-eval.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/stm32h743i-eval.dts 2020-04-23 08:30:24.000000000 +0000 @@ -79,6 +79,7 @@ }; &adc_12 { + vdda-supply = <&vdda>; vref-supply = <&vdda>; status = "okay"; adc1: adc@0 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-a23-a33.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-a23-a33.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-a23-a33.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-a23-a33.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -155,6 +155,21 @@ #dma-cells = <1>; }; + nfc: nand@1c03000 { + compatible = "allwinner,sun4i-a10-nand"; + reg = <0x01c03000 0x1000>; + interrupts = ; + clocks = <&ccu CLK_BUS_NAND>, <&ccu CLK_NAND>; + clock-names = "ahb", "mod"; + resets = <&ccu RST_BUS_NAND>; + reset-names = "ahb"; + pinctrl-names = "default"; + pinctrl-0 = <&nand_pins &nand_pins_cs0 &nand_pins_rb0>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; + }; + mmc0: mmc@1c0f000 { compatible = "allwinner,sun7i-a20-mmc"; reg = <0x01c0f000 0x1000>; @@ -210,21 +225,6 @@ status = "disabled"; #address-cells = <1>; #size-cells = <0>; - }; - - nfc: nand@1c03000 { - compatible = "allwinner,sun4i-a10-nand"; - reg = <0x01c03000 0x1000>; - interrupts = ; - clocks = <&ccu CLK_BUS_NAND>, <&ccu CLK_NAND>; - clock-names = "ahb", "mod"; - resets = <&ccu RST_BUS_NAND>; - reset-names = "ahb"; - pinctrl-names = "default"; - pinctrl-0 = <&nand_pins &nand_pins_cs0 &nand_pins_rb0>; - status = "disabled"; - #address-cells = <1>; - #size-cells = <0>; }; usb_otg: usb@1c19000 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-a83t-cubietruck-plus.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-a83t-cubietruck-plus.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-a83t-cubietruck-plus.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-a83t-cubietruck-plus.dts 2020-04-23 08:30:24.000000000 +0000 @@ -90,7 +90,7 @@ initial-mode = <1>; /* initialize in HUB mode */ disabled-ports = <1>; intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ - reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ + reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ refclk-frequency = <19200000>; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-a83t-tbs-a711.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-a83t-tbs-a711.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-a83t-tbs-a711.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-a83t-tbs-a711.dts 2020-04-23 08:30:24.000000000 +0000 @@ -318,8 +318,8 @@ }; ®_dldo3 { - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; regulator-name = "vdd-csi"; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-h3-beelink-x2.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-h3-beelink-x2.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-h3-beelink-x2.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-h3-beelink-x2.dts 2020-04-23 08:30:24.000000000 +0000 @@ -90,6 +90,8 @@ wifi_pwrseq: wifi_pwrseq { compatible = "mmc-pwrseq-simple"; reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */ + clocks = <&rtc 1>; + clock-names = "ext_clock"; }; sound_spdif { @@ -155,6 +157,8 @@ &mmc1 { vmmc-supply = <®_vcc3v3>; + vqmmc-supply = <®_vcc3v3>; + mmc-pwrseq = <&wifi_pwrseq>; bus-width = <4>; non-removable; status = "okay"; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-h3.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-h3.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sun8i-h3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sun8i-h3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -80,7 +80,7 @@ #cooling-cells = <2>; }; - cpu@1 { + cpu1: cpu@1 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <1>; @@ -90,7 +90,7 @@ #cooling-cells = <2>; }; - cpu@2 { + cpu2: cpu@2 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <2>; @@ -100,7 +100,7 @@ #cooling-cells = <2>; }; - cpu@3 { + cpu3: cpu@3 { compatible = "arm,cortex-a7"; device_type = "cpu"; reg = <3>; @@ -111,6 +111,15 @@ }; }; + pmu { + compatible = "arm,cortex-a7-pmu"; + interrupts = , + , + , + ; + interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; + }; + timer { compatible = "arm,armv7-timer"; interrupts = , diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm/sun9i-a80-optimus.dts linux-4.19.118/scripts/dtc/include-prefixes/arm/sun9i-a80-optimus.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm/sun9i-a80-optimus.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm/sun9i-a80-optimus.dts 2020-04-23 08:30:24.000000000 +0000 @@ -82,7 +82,7 @@ reg_usb1_vbus: usb1-vbus { compatible = "regulator-fixed"; - pinctrl-names = "default"; + regulator-name = "usb1-vbus"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; enable-active-high; @@ -91,7 +91,7 @@ reg_usb3_vbus: usb3-vbus { compatible = "regulator-fixed"; - pinctrl-names = "default"; + regulator-name = "usb3-vbus"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; enable-active-high; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-a64.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-a64.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-a64.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-a64.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -366,7 +366,8 @@ interrupts = , , ; - clocks = <&ccu 58>; + clocks = <&ccu 58>, <&osc24M>, <&rtc 0>; + clock-names = "apb", "hosc", "losc"; gpio-controller; #gpio-cells = <3>; interrupt-controller; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6-pine-h64.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6-pine-h64.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6-pine-h64.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6-pine-h64.dts 2020-04-23 08:30:24.000000000 +0000 @@ -176,6 +176,8 @@ pcf8563: rtc@51 { compatible = "nxp,pcf8563"; reg = <0x51>; + interrupt-parent = <&r_intc>; + interrupts = <0 IRQ_TYPE_LEVEL_LOW>; #clock-cells = <0>; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/allwinner/sun50i-h6.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -69,6 +69,15 @@ clock-output-names = "osc32k"; }; + pmu { + compatible = "arm,cortex-a53-pmu"; + interrupts = , + , + , + ; + interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; + }; + psci { compatible = "arm,psci-0.2"; method = "smc"; @@ -101,17 +110,6 @@ #reset-cells = <1>; }; - gic: interrupt-controller@3021000 { - compatible = "arm,gic-400"; - reg = <0x03021000 0x1000>, - <0x03022000 0x2000>, - <0x03024000 0x2000>, - <0x03026000 0x2000>; - interrupts = ; - interrupt-controller; - #interrupt-cells = <3>; - }; - pio: pinctrl@300b000 { compatible = "allwinner,sun50i-h6-pinctrl"; reg = <0x0300b000 0x400>; @@ -149,6 +147,17 @@ }; }; + gic: interrupt-controller@3021000 { + compatible = "arm,gic-400"; + reg = <0x03021000 0x1000>, + <0x03022000 0x2000>, + <0x03024000 0x2000>, + <0x03026000 0x2000>; + interrupts = ; + interrupt-controller; + #interrupt-cells = <3>; + }; + mmc0: mmc@4020000 { compatible = "allwinner,sun50i-h6-mmc", "allwinner,sun50i-a64-mmc"; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gx-p23x-q20x.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gx-p23x-q20x.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gx-p23x-q20x.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gx-p23x-q20x.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -125,6 +125,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-khadas-vim.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-khadas-vim.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-khadas-vim.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-khadas-vim.dts 2020-04-23 08:30:24.000000000 +0000 @@ -76,6 +76,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-libretech-cc.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-libretech-cc.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-libretech-cc.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-libretech-cc.dts 2020-04-23 08:30:24.000000000 +0000 @@ -155,6 +155,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { @@ -255,7 +256,6 @@ cap-mmc-highspeed; mmc-ddr-3_3v; max-frequency = <50000000>; - non-removable; disable-wp; mmc-pwrseq = <&emmc_pwrseq>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-p212.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-p212.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-p212.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxl-s905x-p212.dts 2020-04-23 08:30:24.000000000 +0000 @@ -51,6 +51,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxm-khadas-vim2.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxm-khadas-vim2.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxm-khadas-vim2.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/amlogic/meson-gxm-khadas-vim2.dts 2020-04-23 08:30:24.000000000 +0000 @@ -18,7 +18,6 @@ aliases { serial0 = &uart_AO; - serial1 = &uart_A; serial2 = &uart_AO_B; }; @@ -63,11 +62,9 @@ gpio-keys-polled { compatible = "gpio-keys-polled"; - #address-cells = <1>; - #size-cells = <0>; poll-interval = <100>; - button@0 { + power-button { label = "power"; linux,code = ; gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>; @@ -271,6 +268,7 @@ status = "okay"; pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>; pinctrl-names = "default"; + hdmi-supply = <&hdmi_5v>; }; &hdmi_tx_tmds_port { @@ -408,8 +406,17 @@ /* This one is connected to the Bluetooth module */ &uart_A { status = "okay"; - pinctrl-0 = <&uart_a_pins>; + pinctrl-0 = <&uart_a_pins>, <&uart_a_cts_rts_pins>; pinctrl-names = "default"; + uart-has-rtscts; + + bluetooth { + compatible = "brcm,bcm43438-bt"; + shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>; + max-speed = <2000000>; + clocks = <&wifi32k>; + clock-names = "lpo"; + }; }; /* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */ diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/arm/juno-clocks.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/arm/juno-clocks.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/arm/juno-clocks.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/arm/juno-clocks.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -8,10 +8,10 @@ */ / { /* SoC fixed clocks */ - soc_uartclk: refclk7273800hz { + soc_uartclk: refclk7372800hz { compatible = "fixed-clock"; #clock-cells = <0>; - clock-frequency = <7273800>; + clock-frequency = <7372800>; clock-output-names = "juno:uartclk"; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043-post.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043-post.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043-post.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043-post.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -20,6 +20,8 @@ }; &fman0 { + fsl,erratum-a050385; + /* these aliases provide the FMan ports mapping */ enet0: ethernet@e0000 { }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043a-rdb.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043a-rdb.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043a-rdb.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1043a-rdb.dts 2020-04-23 08:30:24.000000000 +0000 @@ -118,12 +118,12 @@ ethernet@e4000 { phy-handle = <&rgmii_phy1>; - phy-connection-type = "rgmii-txid"; + phy-connection-type = "rgmii-id"; }; ethernet@e6000 { phy-handle = <&rgmii_phy2>; - phy-connection-type = "rgmii-txid"; + phy-connection-type = "rgmii-id"; }; ethernet@e8000 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1046a-rdb.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1046a-rdb.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1046a-rdb.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/freescale/fsl-ls1046a-rdb.dts 2020-04-23 08:30:24.000000000 +0000 @@ -125,12 +125,12 @@ &fman0 { ethernet@e4000 { phy-handle = <&rgmii_phy1>; - phy-connection-type = "rgmii"; + phy-connection-type = "rgmii-id"; }; ethernet@e6000 { phy-handle = <&rgmii_phy2>; - phy-connection-type = "rgmii"; + phy-connection-type = "rgmii-id"; }; ethernet@e8000 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/qcom/apq8016-sbc.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/qcom/apq8016-sbc.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/qcom/apq8016-sbc.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/qcom/apq8016-sbc.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -630,6 +630,8 @@ l11 { regulator-min-microvolt = <1750000>; regulator-max-microvolt = <3337000>; + regulator-allow-set-load; + regulator-system-load = <200000>; }; l12 { diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/qcom/msm8916.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/qcom/msm8916.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/qcom/msm8916.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/qcom/msm8916.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -114,7 +114,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; @@ -126,7 +126,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; @@ -138,7 +138,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; @@ -150,7 +150,7 @@ next-level-cache = <&L2_0>; enable-method = "psci"; cpu-idle-states = <&CPU_SPC>; - clocks = <&apcs 0>; + clocks = <&apcs>; operating-points-v2 = <&cpu_opp_table>; #cooling-cells = <2>; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/qcom/msm8996.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/qcom/msm8996.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/qcom/msm8996.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/qcom/msm8996.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -918,6 +918,8 @@ interrupts = <0 138 IRQ_TYPE_LEVEL_HIGH>; phys = <&hsusb_phy2>; phy-names = "usb2-phy"; + snps,dis_u2_susphy_quirk; + snps,dis_enblslpm_quirk; }; }; @@ -947,6 +949,8 @@ interrupts = <0 131 IRQ_TYPE_LEVEL_HIGH>; phys = <&hsusb_phy1>, <&ssusb_phy_0>; phy-names = "usb2-phy", "usb3-phy"; + snps,dis_u2_susphy_quirk; + snps,dis_enblslpm_quirk; }; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/renesas/r8a7795-es1.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/renesas/r8a7795-es1.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/renesas/r8a7795-es1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/renesas/r8a7795-es1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -28,6 +28,7 @@ compatible = "renesas,ipmmu-r8a7795"; reg = <0 0xec680000 0 0x1000>; renesas,ipmmu-main = <&ipmmu_mm 5>; + power-domains = <&sysc R8A7795_PD_ALWAYS_ON>; #iommu-cells = <1>; }; @@ -35,6 +36,7 @@ compatible = "renesas,ipmmu-r8a7795"; reg = <0 0xe7730000 0 0x1000>; renesas,ipmmu-main = <&ipmmu_mm 8>; + power-domains = <&sysc R8A7795_PD_ALWAYS_ON>; #iommu-cells = <1>; }; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/renesas/r8a77990-ebisu.dts linux-4.19.118/scripts/dtc/include-prefixes/arm64/renesas/r8a77990-ebisu.dts --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/renesas/r8a77990-ebisu.dts 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/renesas/r8a77990-ebisu.dts 2020-04-23 08:30:24.000000000 +0000 @@ -33,7 +33,6 @@ &avb { pinctrl-0 = <&avb_pins>; pinctrl-names = "default"; - renesas,no-ether-link; phy-handle = <&phy0>; phy-mode = "rgmii-txid"; status = "okay"; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/arm64/renesas/r8a77995.dtsi linux-4.19.118/scripts/dtc/include-prefixes/arm64/renesas/r8a77995.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/arm64/renesas/r8a77995.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/arm64/renesas/r8a77995.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -938,7 +938,7 @@ du: display@feb00000 { compatible = "renesas,du-r8a77995"; - reg = <0 0xfeb00000 0 0x80000>; + reg = <0 0xfeb00000 0 0x40000>; interrupts = , ; clocks = <&cpg CPG_MOD 724>, diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -63,6 +63,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy0: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy6: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -63,6 +63,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy1: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-10g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy7: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-0.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-0.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy0: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-1.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-1.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy1: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-2.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-2.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-2.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-2.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe5000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy2: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-3.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-3.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe7000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy3: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-4.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-4.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-4.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-4.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe9000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy4: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-5.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-5.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-0-1g-5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xeb000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy5: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-0.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-0.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy14: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-1.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-1.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-10g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -60,6 +60,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xf3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy15: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-0.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-0.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-0.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-0.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe1000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy8: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-1.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-1.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-1.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-1.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe3000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy9: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-2.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-2.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-2.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-2.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe5000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy10: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-3.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-3.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-3.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-3.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe7000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy11: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-4.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-4.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-4.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-4.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xe9000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy12: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-5.dtsi linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-5.dtsi --- linux-4.19.98/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-5.dtsi 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/dtc/include-prefixes/powerpc/fsl/qoriq-fman3-1-1g-5.dtsi 2020-04-23 08:30:24.000000000 +0000 @@ -59,6 +59,7 @@ #size-cells = <0>; compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio"; reg = <0xeb000 0x1000>; + fsl,erratum-a011043; /* must ignore read errors */ pcsphy13: ethernet-phy@0 { reg = <0x0>; diff -Nru linux-4.19.98/scripts/find-unused-docs.sh linux-4.19.118/scripts/find-unused-docs.sh --- linux-4.19.98/scripts/find-unused-docs.sh 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/find-unused-docs.sh 2020-04-23 08:30:24.000000000 +0000 @@ -54,7 +54,7 @@ if [[ ${FILES_INCLUDED[$file]+_} ]]; then continue; fi - str=$(scripts/kernel-doc -text -export "$file" 2>/dev/null) + str=$(scripts/kernel-doc -export "$file" 2>/dev/null) if [[ -n "$str" ]]; then echo "$file" fi diff -Nru linux-4.19.98/scripts/kconfig/confdata.c linux-4.19.118/scripts/kconfig/confdata.c --- linux-4.19.98/scripts/kconfig/confdata.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/kconfig/confdata.c 2020-04-23 08:30:24.000000000 +0000 @@ -1314,7 +1314,7 @@ sym_calc_value(csym); if (mode == def_random) - has_changed = randomize_choice_values(csym); + has_changed |= randomize_choice_values(csym); else { set_all_choice_values(csym); has_changed = true; diff -Nru linux-4.19.98/scripts/recordmcount.c linux-4.19.118/scripts/recordmcount.c --- linux-4.19.98/scripts/recordmcount.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/scripts/recordmcount.c 2020-04-23 08:30:24.000000000 +0000 @@ -39,6 +39,10 @@ #define R_AARCH64_ABS64 257 #endif +#define R_ARM_PC24 1 +#define R_ARM_THM_CALL 10 +#define R_ARM_CALL 28 + static int fd_map; /* File descriptor for file being modified. */ static int mmap_failed; /* Boolean flag. */ static char gpfx; /* prefix for global symbol name (sometimes '_') */ @@ -414,6 +418,18 @@ #define RECORD_MCOUNT_64 #include "recordmcount.h" +static int arm_is_fake_mcount(Elf32_Rel const *rp) +{ + switch (ELF32_R_TYPE(w(rp->r_info))) { + case R_ARM_THM_CALL: + case R_ARM_CALL: + case R_ARM_PC24: + return 0; + } + + return 1; +} + /* 64-bit EM_MIPS has weird ELF64_Rela.r_info. * http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf * We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40] @@ -515,6 +531,7 @@ altmcount = "__gnu_mcount_nc"; make_nop = make_nop_arm; rel_type_nop = R_ARM_NONE; + is_fake_mcount32 = arm_is_fake_mcount; break; case EM_AARCH64: reltype = R_AARCH64_ABS64; diff -Nru linux-4.19.98/security/apparmor/include/cred.h linux-4.19.118/security/apparmor/include/cred.h --- linux-4.19.98/security/apparmor/include/cred.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/apparmor/include/cred.h 2020-04-23 08:30:24.000000000 +0000 @@ -151,6 +151,8 @@ { struct aa_label *label = aa_current_raw_label(); + might_sleep(); + if (label_is_stale(label)) { label = aa_get_newest_label(label); if (aa_replace_current_label(label) == 0) diff -Nru linux-4.19.98/security/apparmor/lsm.c linux-4.19.118/security/apparmor/lsm.c --- linux-4.19.98/security/apparmor/lsm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/apparmor/lsm.c 2020-04-23 08:30:24.000000000 +0000 @@ -114,13 +114,13 @@ struct aa_label *tracer, *tracee; int error; - tracer = begin_current_label_crit_section(); + tracer = __begin_current_label_crit_section(); tracee = aa_get_task_label(child); error = aa_may_ptrace(tracer, tracee, (mode & PTRACE_MODE_READ) ? AA_PTRACE_READ : AA_PTRACE_TRACE); aa_put_label(tracee); - end_current_label_crit_section(tracer); + __end_current_label_crit_section(tracer); return error; } diff -Nru linux-4.19.98/security/apparmor/net.c linux-4.19.118/security/apparmor/net.c --- linux-4.19.98/security/apparmor/net.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/apparmor/net.c 2020-04-23 08:30:24.000000000 +0000 @@ -146,17 +146,20 @@ static int aa_label_sk_perm(struct aa_label *label, const char *op, u32 request, struct sock *sk) { - struct aa_profile *profile; - DEFINE_AUDIT_SK(sa, op, sk); + int error = 0; AA_BUG(!label); AA_BUG(!sk); - if (unconfined(label)) - return 0; + if (!unconfined(label)) { + struct aa_profile *profile; + DEFINE_AUDIT_SK(sa, op, sk); - return fn_for_each_confined(label, profile, - aa_profile_af_sk_perm(profile, &sa, request, sk)); + error = fn_for_each_confined(label, profile, + aa_profile_af_sk_perm(profile, &sa, request, sk)); + } + + return error; } int aa_sk_perm(const char *op, u32 request, struct sock *sk) diff -Nru linux-4.19.98/security/keys/big_key.c linux-4.19.118/security/keys/big_key.c --- linux-4.19.98/security/keys/big_key.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/big_key.c 2020-04-23 08:30:24.000000000 +0000 @@ -356,7 +356,7 @@ * read the key data * - the key's semaphore is read-locked */ -long big_key_read(const struct key *key, char __user *buffer, size_t buflen) +long big_key_read(const struct key *key, char *buffer, size_t buflen) { size_t datalen = (size_t)key->payload.data[big_key_len]; long ret; @@ -395,9 +395,8 @@ ret = datalen; - /* copy decrypted data to user */ - if (copy_to_user(buffer, buf->virt, datalen) != 0) - ret = -EFAULT; + /* copy out decrypted data */ + memcpy(buffer, buf->virt, datalen); err_fput: fput(file); @@ -405,9 +404,7 @@ big_key_free_buffer(buf); } else { ret = datalen; - if (copy_to_user(buffer, key->payload.data[big_key_data], - datalen) != 0) - ret = -EFAULT; + memcpy(buffer, key->payload.data[big_key_data], datalen); } return ret; diff -Nru linux-4.19.98/security/keys/encrypted-keys/encrypted.c linux-4.19.118/security/keys/encrypted-keys/encrypted.c --- linux-4.19.98/security/keys/encrypted-keys/encrypted.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/encrypted-keys/encrypted.c 2020-04-23 08:30:24.000000000 +0000 @@ -895,14 +895,14 @@ } /* - * encrypted_read - format and copy the encrypted data to userspace + * encrypted_read - format and copy out the encrypted data * * The resulting datablob format is: * * * On success, return to userspace the encrypted key datablob size. */ -static long encrypted_read(const struct key *key, char __user *buffer, +static long encrypted_read(const struct key *key, char *buffer, size_t buflen) { struct encrypted_key_payload *epayload; @@ -950,8 +950,7 @@ key_put(mkey); memzero_explicit(derived_key, sizeof(derived_key)); - if (copy_to_user(buffer, ascii_buf, asciiblob_len) != 0) - ret = -EFAULT; + memcpy(buffer, ascii_buf, asciiblob_len); kzfree(ascii_buf); return asciiblob_len; diff -Nru linux-4.19.98/security/keys/key.c linux-4.19.118/security/keys/key.c --- linux-4.19.98/security/keys/key.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/key.c 2020-04-23 08:30:24.000000000 +0000 @@ -297,6 +297,7 @@ key->gid = gid; key->perm = perm; key->restrict_link = restrict_link; + key->last_used_at = ktime_get_real_seconds(); if (!(flags & KEY_ALLOC_NOT_IN_QUOTA)) key->flags |= 1 << KEY_FLAG_IN_QUOTA; @@ -382,7 +383,7 @@ spin_lock(&key->user->lock); if (delta > 0 && - (key->user->qnbytes + delta >= maxbytes || + (key->user->qnbytes + delta > maxbytes || key->user->qnbytes + delta < key->user->qnbytes)) { ret = -EDQUOT; } diff -Nru linux-4.19.98/security/keys/keyctl.c linux-4.19.118/security/keys/keyctl.c --- linux-4.19.98/security/keys/keyctl.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/keyctl.c 2020-04-23 08:30:24.000000000 +0000 @@ -743,6 +743,21 @@ } /* + * Call the read method + */ +static long __keyctl_read_key(struct key *key, char *buffer, size_t buflen) +{ + long ret; + + down_read(&key->sem); + ret = key_validate(key); + if (ret == 0) + ret = key->type->read(key, buffer, buflen); + up_read(&key->sem); + return ret; +} + +/* * Read a key's payload. * * The key must either grant the caller Read permission, or it must grant the @@ -757,26 +772,27 @@ struct key *key; key_ref_t key_ref; long ret; + char *key_data; /* find the key first */ key_ref = lookup_user_key(keyid, 0, 0); if (IS_ERR(key_ref)) { ret = -ENOKEY; - goto error; + goto out; } key = key_ref_to_ptr(key_ref); ret = key_read_state(key); if (ret < 0) - goto error2; /* Negatively instantiated */ + goto key_put_out; /* Negatively instantiated */ /* see if we can read it directly */ ret = key_permission(key_ref, KEY_NEED_READ); if (ret == 0) goto can_read_key; if (ret != -EACCES) - goto error2; + goto key_put_out; /* we can't; see if it's searchable from this process's keyrings * - we automatically take account of the fact that it may be @@ -784,26 +800,51 @@ */ if (!is_key_possessed(key_ref)) { ret = -EACCES; - goto error2; + goto key_put_out; } /* the key is probably readable - now try to read it */ can_read_key: - ret = -EOPNOTSUPP; - if (key->type->read) { - /* Read the data with the semaphore held (since we might sleep) - * to protect against the key being updated or revoked. - */ - down_read(&key->sem); - ret = key_validate(key); - if (ret == 0) - ret = key->type->read(key, buffer, buflen); - up_read(&key->sem); + if (!key->type->read) { + ret = -EOPNOTSUPP; + goto key_put_out; + } + + if (!buffer || !buflen) { + /* Get the key length from the read method */ + ret = __keyctl_read_key(key, NULL, 0); + goto key_put_out; + } + + /* + * Read the data with the semaphore held (since we might sleep) + * to protect against the key being updated or revoked. + * + * Allocating a temporary buffer to hold the keys before + * transferring them to user buffer to avoid potential + * deadlock involving page fault and mmap_sem. + */ + key_data = kmalloc(buflen, GFP_KERNEL); + + if (!key_data) { + ret = -ENOMEM; + goto key_put_out; + } + ret = __keyctl_read_key(key, key_data, buflen); + + /* + * Read methods will just return the required length without + * any copying if the provided length isn't large enough. + */ + if (ret > 0 && ret <= buflen) { + if (copy_to_user(buffer, key_data, ret)) + ret = -EFAULT; } + kzfree(key_data); -error2: +key_put_out: key_put(key); -error: +out: return ret; } @@ -882,8 +923,8 @@ key_quota_root_maxbytes : key_quota_maxbytes; spin_lock(&newowner->lock); - if (newowner->qnkeys + 1 >= maxkeys || - newowner->qnbytes + key->quotalen >= maxbytes || + if (newowner->qnkeys + 1 > maxkeys || + newowner->qnbytes + key->quotalen > maxbytes || newowner->qnbytes + key->quotalen < newowner->qnbytes) goto quota_overrun; diff -Nru linux-4.19.98/security/keys/keyring.c linux-4.19.118/security/keys/keyring.c --- linux-4.19.98/security/keys/keyring.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/keyring.c 2020-04-23 08:30:24.000000000 +0000 @@ -432,7 +432,6 @@ { struct keyring_read_iterator_context *ctx = data; const struct key *key = keyring_ptr_to_key(object); - int ret; kenter("{%s,%d},,{%zu/%zu}", key->type->name, key->serial, ctx->count, ctx->buflen); @@ -440,10 +439,7 @@ if (ctx->count >= ctx->buflen) return 1; - ret = put_user(key->serial, ctx->buffer); - if (ret < 0) - return ret; - ctx->buffer++; + *ctx->buffer++ = key->serial; ctx->count += sizeof(key->serial); return 0; } diff -Nru linux-4.19.98/security/keys/proc.c linux-4.19.118/security/keys/proc.c --- linux-4.19.98/security/keys/proc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/proc.c 2020-04-23 08:30:24.000000000 +0000 @@ -144,6 +144,8 @@ n = key_serial_next(p, v); if (n) *_pos = key_node_serial(n); + else + (*_pos)++; return n; } diff -Nru linux-4.19.98/security/keys/request_key_auth.c linux-4.19.118/security/keys/request_key_auth.c --- linux-4.19.98/security/keys/request_key_auth.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/request_key_auth.c 2020-04-23 08:30:24.000000000 +0000 @@ -27,7 +27,7 @@ static void request_key_auth_describe(const struct key *, struct seq_file *); static void request_key_auth_revoke(struct key *); static void request_key_auth_destroy(struct key *); -static long request_key_auth_read(const struct key *, char __user *, size_t); +static long request_key_auth_read(const struct key *, char *, size_t); /* * The request-key authorisation key type definition. @@ -85,7 +85,7 @@ * - the key's semaphore is read-locked */ static long request_key_auth_read(const struct key *key, - char __user *buffer, size_t buflen) + char *buffer, size_t buflen) { struct request_key_auth *rka = get_request_key_auth(key); size_t datalen; @@ -102,8 +102,7 @@ if (buflen > datalen) buflen = datalen; - if (copy_to_user(buffer, rka->callout_info, buflen) != 0) - ret = -EFAULT; + memcpy(buffer, rka->callout_info, buflen); } return ret; diff -Nru linux-4.19.98/security/keys/trusted.c linux-4.19.118/security/keys/trusted.c --- linux-4.19.98/security/keys/trusted.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/trusted.c 2020-04-23 08:30:24.000000000 +0000 @@ -1135,11 +1135,10 @@ * trusted_read - copy the sealed blob data to userspace in hex. * On success, return to userspace the trusted key datablob size. */ -static long trusted_read(const struct key *key, char __user *buffer, +static long trusted_read(const struct key *key, char *buffer, size_t buflen) { const struct trusted_key_payload *p; - char *ascii_buf; char *bufp; int i; @@ -1148,18 +1147,9 @@ return -EINVAL; if (buffer && buflen >= 2 * p->blob_len) { - ascii_buf = kmalloc_array(2, p->blob_len, GFP_KERNEL); - if (!ascii_buf) - return -ENOMEM; - - bufp = ascii_buf; + bufp = buffer; for (i = 0; i < p->blob_len; i++) bufp = hex_byte_pack(bufp, p->blob[i]); - if (copy_to_user(buffer, ascii_buf, 2 * p->blob_len) != 0) { - kzfree(ascii_buf); - return -EFAULT; - } - kzfree(ascii_buf); } return 2 * p->blob_len; } diff -Nru linux-4.19.98/security/keys/user_defined.c linux-4.19.118/security/keys/user_defined.c --- linux-4.19.98/security/keys/user_defined.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/keys/user_defined.c 2020-04-23 08:30:24.000000000 +0000 @@ -172,7 +172,7 @@ * read the key data * - the key's semaphore is read-locked */ -long user_read(const struct key *key, char __user *buffer, size_t buflen) +long user_read(const struct key *key, char *buffer, size_t buflen) { const struct user_key_payload *upayload; long ret; @@ -185,8 +185,7 @@ if (buflen > upayload->datalen) buflen = upayload->datalen; - if (copy_to_user(buffer, upayload->data, buflen) != 0) - ret = -EFAULT; + memcpy(buffer, upayload->data, buflen); } return ret; diff -Nru linux-4.19.98/security/selinux/avc.c linux-4.19.118/security/selinux/avc.c --- linux-4.19.98/security/selinux/avc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/selinux/avc.c 2020-04-23 08:30:24.000000000 +0000 @@ -496,7 +496,7 @@ if (likely(!audited)) return 0; return slow_avc_audit(state, ssid, tsid, tclass, requested, - audited, denied, result, ad, 0); + audited, denied, result, ad); } static void avc_node_free(struct rcu_head *rhead) @@ -689,40 +689,37 @@ struct avc_node *pos, *node = NULL; int hvalue; unsigned long flag; + spinlock_t *lock; + struct hlist_head *head; if (avc_latest_notif_update(avc, avd->seqno, 1)) - goto out; + return NULL; node = avc_alloc_node(avc); - if (node) { - struct hlist_head *head; - spinlock_t *lock; - int rc = 0; - - hvalue = avc_hash(ssid, tsid, tclass); - avc_node_populate(node, ssid, tsid, tclass, avd); - rc = avc_xperms_populate(node, xp_node); - if (rc) { - kmem_cache_free(avc_node_cachep, node); - return NULL; - } - head = &avc->avc_cache.slots[hvalue]; - lock = &avc->avc_cache.slots_lock[hvalue]; + if (!node) + return NULL; - spin_lock_irqsave(lock, flag); - hlist_for_each_entry(pos, head, list) { - if (pos->ae.ssid == ssid && - pos->ae.tsid == tsid && - pos->ae.tclass == tclass) { - avc_node_replace(avc, node, pos); - goto found; - } + avc_node_populate(node, ssid, tsid, tclass, avd); + if (avc_xperms_populate(node, xp_node)) { + avc_node_kill(avc, node); + return NULL; + } + + hvalue = avc_hash(ssid, tsid, tclass); + head = &avc->avc_cache.slots[hvalue]; + lock = &avc->avc_cache.slots_lock[hvalue]; + spin_lock_irqsave(lock, flag); + hlist_for_each_entry(pos, head, list) { + if (pos->ae.ssid == ssid && + pos->ae.tsid == tsid && + pos->ae.tclass == tclass) { + avc_node_replace(avc, node, pos); + goto found; } - hlist_add_head_rcu(&node->list, head); -found: - spin_unlock_irqrestore(lock, flag); } -out: + hlist_add_head_rcu(&node->list, head); +found: + spin_unlock_irqrestore(lock, flag); return node; } @@ -766,8 +763,7 @@ noinline int slow_avc_audit(struct selinux_state *state, u32 ssid, u32 tsid, u16 tclass, u32 requested, u32 audited, u32 denied, int result, - struct common_audit_data *a, - unsigned int flags) + struct common_audit_data *a) { struct common_audit_data stack_data; struct selinux_audit_data sad; @@ -777,17 +773,6 @@ a->type = LSM_AUDIT_DATA_NONE; } - /* - * When in a RCU walk do the audit on the RCU retry. This is because - * the collection of the dname in an inode audit message is not RCU - * safe. Note this may drop some audits when the situation changes - * during retry. However this is logically just as if the operation - * happened a little later. - */ - if ((a->type == LSM_AUDIT_DATA_INODE) && - (flags & MAY_NOT_BLOCK)) - return -ECHILD; - sad.tclass = tclass; sad.requested = requested; sad.ssid = ssid; @@ -860,16 +845,14 @@ /* * If we are in a non-blocking code path, e.g. VFS RCU walk, * then we must not add permissions to a cache entry - * because we cannot safely audit the denial. Otherwise, + * because we will not audit the denial. Otherwise, * during the subsequent blocking retry (e.g. VFS ref walk), we * will find the permissions already granted in the cache entry * and won't audit anything at all, leading to silent denials in * permissive mode that only appear when in enforcing mode. * - * See the corresponding handling in slow_avc_audit(), and the - * logic in selinux_inode_follow_link and selinux_inode_permission - * for the VFS MAY_NOT_BLOCK flag, which is transliterated into - * AVC_NONBLOCKING for avc_has_perm_noaudit(). + * See the corresponding handling of MAY_NOT_BLOCK in avc_audit() + * and selinux_inode_permission(). */ if (flags & AVC_NONBLOCKING) return 0; @@ -913,7 +896,7 @@ if (orig->ae.xp_node) { rc = avc_xperms_populate(node, orig->ae.xp_node); if (rc) { - kmem_cache_free(avc_node_cachep, node); + avc_node_kill(avc, node); goto out_unlock; } } diff -Nru linux-4.19.98/security/selinux/hooks.c linux-4.19.118/security/selinux/hooks.c --- linux-4.19.98/security/selinux/hooks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/selinux/hooks.c 2020-04-23 08:30:24.000000000 +0000 @@ -3171,8 +3171,7 @@ static noinline int audit_inode_permission(struct inode *inode, u32 perms, u32 audited, u32 denied, - int result, - unsigned flags) + int result) { struct common_audit_data ad; struct inode_security_struct *isec = inode->i_security; @@ -3183,7 +3182,7 @@ rc = slow_avc_audit(&selinux_state, current_sid(), isec->sid, isec->sclass, perms, - audited, denied, result, &ad, flags); + audited, denied, result, &ad); if (rc) return rc; return 0; @@ -3230,7 +3229,11 @@ if (likely(!audited)) return rc; - rc2 = audit_inode_permission(inode, perms, audited, denied, rc, flags); + /* fall back to ref-walk if we have to generate audit */ + if (flags & MAY_NOT_BLOCK) + return -ECHILD; + + rc2 = audit_inode_permission(inode, perms, audited, denied, rc); if (rc2) return rc2; return rc; diff -Nru linux-4.19.98/security/selinux/include/avc.h linux-4.19.118/security/selinux/include/avc.h --- linux-4.19.98/security/selinux/include/avc.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/selinux/include/avc.h 2020-04-23 08:30:24.000000000 +0000 @@ -100,8 +100,7 @@ int slow_avc_audit(struct selinux_state *state, u32 ssid, u32 tsid, u16 tclass, u32 requested, u32 audited, u32 denied, int result, - struct common_audit_data *a, - unsigned flags); + struct common_audit_data *a); /** * avc_audit - Audit the granting or denial of permissions. @@ -135,9 +134,12 @@ audited = avc_audit_required(requested, avd, result, 0, &denied); if (likely(!audited)) return 0; + /* fall back to ref-walk if we have to generate audit */ + if (flags & MAY_NOT_BLOCK) + return -ECHILD; return slow_avc_audit(state, ssid, tsid, tclass, requested, audited, denied, result, - a, flags); + a); } #define AVC_STRICT 1 /* Ignore permissive mode. */ diff -Nru linux-4.19.98/security/tomoyo/common.c linux-4.19.118/security/tomoyo/common.c --- linux-4.19.98/security/tomoyo/common.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/security/tomoyo/common.c 2020-04-23 08:30:24.000000000 +0000 @@ -2254,9 +2254,9 @@ [TOMOYO_MEMORY_QUERY] = "query message:", }; -/* Timestamp counter for last updated. */ -static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; /* Counter for number of updates. */ +static atomic_t tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT]; +/* Timestamp counter for last updated. */ static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT]; /** @@ -2268,10 +2268,7 @@ */ void tomoyo_update_stat(const u8 index) { - /* - * I don't use atomic operations because race condition is not fatal. - */ - tomoyo_stat_updated[index]++; + atomic_inc(&tomoyo_stat_updated[index]); tomoyo_stat_modified[index] = ktime_get_real_seconds(); } @@ -2291,7 +2288,7 @@ for (i = 0; i < TOMOYO_MAX_POLICY_STAT; i++) { tomoyo_io_printf(head, "Policy %-30s %10u", tomoyo_policy_headers[i], - tomoyo_stat_updated[i]); + atomic_read(&tomoyo_stat_updated[i])); if (tomoyo_stat_modified[i]) { struct tomoyo_time stamp; tomoyo_convert_time(tomoyo_stat_modified[i], &stamp); diff -Nru linux-4.19.98/sound/aoa/codecs/onyx.c linux-4.19.118/sound/aoa/codecs/onyx.c --- linux-4.19.98/sound/aoa/codecs/onyx.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/aoa/codecs/onyx.c 2020-04-23 08:30:24.000000000 +0000 @@ -74,8 +74,10 @@ return 0; } v = i2c_smbus_read_byte_data(onyx->i2c, reg); - if (v < 0) + if (v < 0) { + *value = 0; return -1; + } *value = (u8)v; onyx->cache[ONYX_REG_CONTROL-FIRSTREGISTER] = *value; return 0; diff -Nru linux-4.19.98/sound/core/control.c linux-4.19.118/sound/core/control.c --- linux-4.19.98/sound/core/control.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/control.c 2020-04-23 08:30:24.000000000 +0000 @@ -1468,8 +1468,9 @@ if (kctl->tlv.c == NULL) return -ENXIO; - /* When locked, this is unavailable. */ - if (vd->owner != NULL && vd->owner != file) + /* Write and command operations are not allowed for locked element. */ + if (op_flag != SNDRV_CTL_TLV_OP_READ && + vd->owner != NULL && vd->owner != file) return -EPERM; return kctl->tlv.c(kctl, op_flag, size, buf); diff -Nru linux-4.19.98/sound/core/oss/pcm_plugin.c linux-4.19.118/sound/core/oss/pcm_plugin.c --- linux-4.19.98/sound/core/oss/pcm_plugin.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/oss/pcm_plugin.c 2020-04-23 08:30:24.000000000 +0000 @@ -111,7 +111,7 @@ while (plugin->next) { if (plugin->dst_frames) frames = plugin->dst_frames(plugin, frames); - if (snd_BUG_ON((snd_pcm_sframes_t)frames <= 0)) + if ((snd_pcm_sframes_t)frames <= 0) return -ENXIO; plugin = plugin->next; err = snd_pcm_plugin_alloc(plugin, frames); @@ -123,7 +123,7 @@ while (plugin->prev) { if (plugin->src_frames) frames = plugin->src_frames(plugin, frames); - if (snd_BUG_ON((snd_pcm_sframes_t)frames <= 0)) + if ((snd_pcm_sframes_t)frames <= 0) return -ENXIO; plugin = plugin->prev; err = snd_pcm_plugin_alloc(plugin, frames); @@ -196,7 +196,9 @@ return 0; } -snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *plug, snd_pcm_uframes_t drv_frames) +static snd_pcm_sframes_t plug_client_size(struct snd_pcm_substream *plug, + snd_pcm_uframes_t drv_frames, + bool check_size) { struct snd_pcm_plugin *plugin, *plugin_prev, *plugin_next; int stream; @@ -209,6 +211,8 @@ if (stream == SNDRV_PCM_STREAM_PLAYBACK) { plugin = snd_pcm_plug_last(plug); while (plugin && drv_frames > 0) { + if (check_size && drv_frames > plugin->buf_frames) + drv_frames = plugin->buf_frames; plugin_prev = plugin->prev; if (plugin->src_frames) drv_frames = plugin->src_frames(plugin, drv_frames); @@ -220,6 +224,8 @@ plugin_next = plugin->next; if (plugin->dst_frames) drv_frames = plugin->dst_frames(plugin, drv_frames); + if (check_size && drv_frames > plugin->buf_frames) + drv_frames = plugin->buf_frames; plugin = plugin_next; } } else @@ -227,7 +233,9 @@ return drv_frames; } -snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *plug, snd_pcm_uframes_t clt_frames) +static snd_pcm_sframes_t plug_slave_size(struct snd_pcm_substream *plug, + snd_pcm_uframes_t clt_frames, + bool check_size) { struct snd_pcm_plugin *plugin, *plugin_prev, *plugin_next; snd_pcm_sframes_t frames; @@ -248,11 +256,15 @@ if (frames < 0) return frames; } + if (check_size && frames > plugin->buf_frames) + frames = plugin->buf_frames; plugin = plugin_next; } } else if (stream == SNDRV_PCM_STREAM_CAPTURE) { plugin = snd_pcm_plug_last(plug); while (plugin) { + if (check_size && frames > plugin->buf_frames) + frames = plugin->buf_frames; plugin_prev = plugin->prev; if (plugin->src_frames) { frames = plugin->src_frames(plugin, frames); @@ -266,6 +278,18 @@ return frames; } +snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *plug, + snd_pcm_uframes_t drv_frames) +{ + return plug_client_size(plug, drv_frames, false); +} + +snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *plug, + snd_pcm_uframes_t clt_frames) +{ + return plug_slave_size(plug, clt_frames, false); +} + static int snd_pcm_plug_formats(const struct snd_mask *mask, snd_pcm_format_t format) { @@ -622,7 +646,7 @@ src_channels = dst_channels; plugin = next; } - return snd_pcm_plug_client_size(plug, frames); + return plug_client_size(plug, frames, true); } snd_pcm_sframes_t snd_pcm_plug_read_transfer(struct snd_pcm_substream *plug, struct snd_pcm_plugin_channel *dst_channels_final, snd_pcm_uframes_t size) @@ -632,7 +656,7 @@ snd_pcm_sframes_t frames = size; int err; - frames = snd_pcm_plug_slave_size(plug, frames); + frames = plug_slave_size(plug, frames, true); if (frames < 0) return frames; diff -Nru linux-4.19.98/sound/core/seq/oss/seq_oss_midi.c linux-4.19.118/sound/core/seq/oss/seq_oss_midi.c --- linux-4.19.98/sound/core/seq/oss/seq_oss_midi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/seq/oss/seq_oss_midi.c 2020-04-23 08:30:24.000000000 +0000 @@ -615,6 +615,7 @@ len = snd_seq_oss_timer_start(dp->timer); if (ev->type == SNDRV_SEQ_EVENT_SYSEX) { snd_seq_oss_readq_sysex(dp->readq, mdev->seq_device, ev); + snd_midi_event_reset_decode(mdev->coder); } else { len = snd_midi_event_decode(mdev->coder, msg, sizeof(msg), ev); if (len > 0) diff -Nru linux-4.19.98/sound/core/seq/seq_clientmgr.c linux-4.19.118/sound/core/seq/seq_clientmgr.c --- linux-4.19.98/sound/core/seq/seq_clientmgr.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/seq/seq_clientmgr.c 2020-04-23 08:30:24.000000000 +0000 @@ -563,7 +563,7 @@ event->queue = queue; event->flags &= ~SNDRV_SEQ_TIME_STAMP_MASK; if (real_time) { - event->time.time = snd_seq_timer_get_cur_time(q->timer); + event->time.time = snd_seq_timer_get_cur_time(q->timer, true); event->flags |= SNDRV_SEQ_TIME_STAMP_REAL; } else { event->time.tick = snd_seq_timer_get_cur_tick(q->timer); @@ -1642,7 +1642,7 @@ tmr = queue->timer; status->events = queue->tickq->cells + queue->timeq->cells; - status->time = snd_seq_timer_get_cur_time(tmr); + status->time = snd_seq_timer_get_cur_time(tmr, true); status->tick = snd_seq_timer_get_cur_tick(tmr); status->running = tmr->running; diff -Nru linux-4.19.98/sound/core/seq/seq_queue.c linux-4.19.118/sound/core/seq/seq_queue.c --- linux-4.19.98/sound/core/seq/seq_queue.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/seq/seq_queue.c 2020-04-23 08:30:24.000000000 +0000 @@ -251,6 +251,8 @@ { unsigned long flags; struct snd_seq_event_cell *cell; + snd_seq_tick_time_t cur_tick; + snd_seq_real_time_t cur_time; if (q == NULL) return; @@ -267,17 +269,18 @@ __again: /* Process tick queue... */ + cur_tick = snd_seq_timer_get_cur_tick(q->timer); for (;;) { - cell = snd_seq_prioq_cell_out(q->tickq, - &q->timer->tick.cur_tick); + cell = snd_seq_prioq_cell_out(q->tickq, &cur_tick); if (!cell) break; snd_seq_dispatch_event(cell, atomic, hop); } /* Process time queue... */ + cur_time = snd_seq_timer_get_cur_time(q->timer, false); for (;;) { - cell = snd_seq_prioq_cell_out(q->timeq, &q->timer->cur_time); + cell = snd_seq_prioq_cell_out(q->timeq, &cur_time); if (!cell) break; snd_seq_dispatch_event(cell, atomic, hop); @@ -405,6 +408,7 @@ int snd_seq_queue_set_owner(int queueid, int client, int locked) { struct snd_seq_queue *q = queueptr(queueid); + unsigned long flags; if (q == NULL) return -EINVAL; @@ -414,8 +418,10 @@ return -EPERM; } + spin_lock_irqsave(&q->owner_lock, flags); q->locked = locked ? 1 : 0; q->owner = client; + spin_unlock_irqrestore(&q->owner_lock, flags); queue_access_unlock(q); queuefree(q); @@ -552,15 +558,17 @@ unsigned long flags; int i; struct snd_seq_queue *q; + bool matched; for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { if ((q = queueptr(i)) == NULL) continue; spin_lock_irqsave(&q->owner_lock, flags); - if (q->owner == client) + matched = (q->owner == client); + if (matched) q->klocked = 1; spin_unlock_irqrestore(&q->owner_lock, flags); - if (q->owner == client) { + if (matched) { if (q->timer->running) snd_seq_timer_stop(q->timer); snd_seq_timer_reset(q->timer); @@ -752,6 +760,8 @@ int i, bpm; struct snd_seq_queue *q; struct snd_seq_timer *tmr; + bool locked; + int owner; for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) { if ((q = queueptr(i)) == NULL) @@ -763,9 +773,14 @@ else bpm = 0; + spin_lock_irq(&q->owner_lock); + locked = q->locked; + owner = q->owner; + spin_unlock_irq(&q->owner_lock); + snd_iprintf(buffer, "queue %d: [%s]\n", q->queue, q->name); - snd_iprintf(buffer, "owned by client : %d\n", q->owner); - snd_iprintf(buffer, "lock status : %s\n", q->locked ? "Locked" : "Free"); + snd_iprintf(buffer, "owned by client : %d\n", owner); + snd_iprintf(buffer, "lock status : %s\n", locked ? "Locked" : "Free"); snd_iprintf(buffer, "queued time events : %d\n", snd_seq_prioq_avail(q->timeq)); snd_iprintf(buffer, "queued tick events : %d\n", snd_seq_prioq_avail(q->tickq)); snd_iprintf(buffer, "timer state : %s\n", tmr->running ? "Running" : "Stopped"); diff -Nru linux-4.19.98/sound/core/seq/seq_timer.c linux-4.19.118/sound/core/seq/seq_timer.c --- linux-4.19.98/sound/core/seq/seq_timer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/seq/seq_timer.c 2020-04-23 08:30:24.000000000 +0000 @@ -437,14 +437,15 @@ } /* return current 'real' time. use timeofday() to get better granularity. */ -snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr) +snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr, + bool adjust_ktime) { snd_seq_real_time_t cur_time; unsigned long flags; spin_lock_irqsave(&tmr->lock, flags); cur_time = tmr->cur_time; - if (tmr->running) { + if (adjust_ktime && tmr->running) { struct timespec64 tm; ktime_get_ts64(&tm); @@ -461,7 +462,13 @@ high PPQ values) */ snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr) { - return tmr->tick.cur_tick; + snd_seq_tick_time_t cur_tick; + unsigned long flags; + + spin_lock_irqsave(&tmr->lock, flags); + cur_tick = tmr->tick.cur_tick; + spin_unlock_irqrestore(&tmr->lock, flags); + return cur_tick; } diff -Nru linux-4.19.98/sound/core/seq/seq_timer.h linux-4.19.118/sound/core/seq/seq_timer.h --- linux-4.19.98/sound/core/seq/seq_timer.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/seq/seq_timer.h 2020-04-23 08:30:24.000000000 +0000 @@ -135,7 +135,8 @@ int snd_seq_timer_set_position_tick(struct snd_seq_timer *tmr, snd_seq_tick_time_t position); int snd_seq_timer_set_position_time(struct snd_seq_timer *tmr, snd_seq_real_time_t position); int snd_seq_timer_set_skew(struct snd_seq_timer *tmr, unsigned int skew, unsigned int base); -snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr); +snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr, + bool adjust_ktime); snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr); extern int seq_default_timer_class; diff -Nru linux-4.19.98/sound/core/seq/seq_virmidi.c linux-4.19.118/sound/core/seq/seq_virmidi.c --- linux-4.19.98/sound/core/seq/seq_virmidi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/core/seq/seq_virmidi.c 2020-04-23 08:30:24.000000000 +0000 @@ -95,6 +95,7 @@ if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) continue; snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream); + snd_midi_event_reset_decode(vmidi->parser); } else { len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev); if (len > 0) diff -Nru linux-4.19.98/sound/drivers/dummy.c linux-4.19.118/sound/drivers/dummy.c --- linux-4.19.98/sound/drivers/dummy.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/drivers/dummy.c 2020-04-23 08:30:24.000000000 +0000 @@ -929,7 +929,7 @@ { int i; - for (i = 0; i < SNDRV_PCM_FORMAT_LAST; i++) { + for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) { if (dummy->pcm_hw.formats & (1ULL << i)) snd_iprintf(buffer, " %s", snd_pcm_format_name(i)); } diff -Nru linux-4.19.98/sound/hda/ext/hdac_ext_controller.c linux-4.19.118/sound/hda/ext/hdac_ext_controller.c --- linux-4.19.98/sound/hda/ext/hdac_ext_controller.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/hda/ext/hdac_ext_controller.c 2020-04-23 08:30:24.000000000 +0000 @@ -262,6 +262,7 @@ int snd_hdac_ext_bus_link_get(struct hdac_bus *bus, struct hdac_ext_link *link) { + unsigned long codec_mask; int ret = 0; mutex_lock(&bus->lock); @@ -283,9 +284,11 @@ * HDA spec section 4.3 - Codec Discovery */ udelay(521); - bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS); - dev_dbg(bus->dev, "codec_mask = 0x%lx\n", bus->codec_mask); - snd_hdac_chip_writew(bus, STATESTS, bus->codec_mask); + codec_mask = snd_hdac_chip_readw(bus, STATESTS); + dev_dbg(bus->dev, "codec_mask = 0x%lx\n", codec_mask); + snd_hdac_chip_writew(bus, STATESTS, codec_mask); + if (!bus->codec_mask) + bus->codec_mask = codec_mask; } mutex_unlock(&bus->lock); diff -Nru linux-4.19.98/sound/hda/hdmi_chmap.c linux-4.19.118/sound/hda/hdmi_chmap.c --- linux-4.19.98/sound/hda/hdmi_chmap.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/hda/hdmi_chmap.c 2020-04-23 08:30:24.000000000 +0000 @@ -249,7 +249,7 @@ for (i = 0, j = 0; i < ARRAY_SIZE(cea_speaker_allocation_names); i++) { if (spk_alloc & (1 << i)) - j += snprintf(buf + j, buflen - j, " %s", + j += scnprintf(buf + j, buflen - j, " %s", cea_speaker_allocation_names[i]); } buf[j] = '\0'; /* necessary when j == 0 */ diff -Nru linux-4.19.98/sound/pci/hda/hda_beep.c linux-4.19.118/sound/pci/hda/hda_beep.c --- linux-4.19.98/sound/pci/hda/hda_beep.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/hda_beep.c 2020-04-23 08:30:24.000000000 +0000 @@ -297,8 +297,12 @@ { struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_beep *beep = codec->beep; + int chs = get_amp_channels(kcontrol); + if (beep && (!beep->enabled || !ctl_has_mute(kcontrol))) { - ucontrol->value.integer.value[0] = + if (chs & 1) + ucontrol->value.integer.value[0] = beep->enabled; + if (chs & 2) ucontrol->value.integer.value[1] = beep->enabled; return 0; } diff -Nru linux-4.19.98/sound/pci/hda/hda_codec.c linux-4.19.118/sound/pci/hda/hda_codec.c --- linux-4.19.98/sound/pci/hda/hda_codec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/hda_codec.c 2020-04-23 08:30:24.000000000 +0000 @@ -4019,7 +4019,7 @@ for (i = 0, j = 0; i < ARRAY_SIZE(bits); i++) if (pcm & (AC_SUPPCM_BITS_8 << i)) - j += snprintf(buf + j, buflen - j, " %d", bits[i]); + j += scnprintf(buf + j, buflen - j, " %d", bits[i]); buf[j] = '\0'; /* necessary when j == 0 */ } diff -Nru linux-4.19.98/sound/pci/hda/hda_controller.h linux-4.19.118/sound/pci/hda/hda_controller.h --- linux-4.19.98/sound/pci/hda/hda_controller.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/hda_controller.h 2020-04-23 08:30:24.000000000 +0000 @@ -176,11 +176,10 @@ #define azx_bus(chip) (&(chip)->bus.core) #define bus_to_azx(_bus) container_of(_bus, struct azx, bus.core) -#ifdef CONFIG_X86 -#define azx_snoop(chip) ((chip)->snoop) -#else -#define azx_snoop(chip) true -#endif +static inline bool azx_snoop(struct azx *chip) +{ + return !IS_ENABLED(CONFIG_X86) || chip->snoop; +} /* * macros for easy use diff -Nru linux-4.19.98/sound/pci/hda/hda_eld.c linux-4.19.118/sound/pci/hda/hda_eld.c --- linux-4.19.98/sound/pci/hda/hda_eld.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/hda_eld.c 2020-04-23 08:30:24.000000000 +0000 @@ -373,7 +373,7 @@ for (i = 0, j = 0; i < ARRAY_SIZE(alsa_rates); i++) if (pcm & (1 << i)) - j += snprintf(buf + j, buflen - j, " %d", + j += scnprintf(buf + j, buflen - j, " %d", alsa_rates[i]); buf[j] = '\0'; /* necessary when j == 0 */ diff -Nru linux-4.19.98/sound/pci/hda/hda_intel.c linux-4.19.118/sound/pci/hda/hda_intel.c --- linux-4.19.98/sound/pci/hda/hda_intel.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/hda_intel.c 2020-04-23 08:30:24.000000000 +0000 @@ -2076,24 +2076,15 @@ { struct snd_card *card = context; struct azx *chip = card->private_data; - struct pci_dev *pci = chip->pci; - if (!fw) { - dev_err(card->dev, "Cannot load firmware, aborting\n"); - goto error; - } - - chip->fw = fw; + if (fw) + chip->fw = fw; + else + dev_err(card->dev, "Cannot load firmware, continue without patching\n"); if (!chip->disabled) { /* continue probing */ - if (azx_probe_continue(chip)) - goto error; + azx_probe_continue(chip); } - return; /* OK */ - - error: - snd_card_free(card); - pci_set_drvdata(pci, NULL); } #endif @@ -2219,6 +2210,17 @@ .dma_free_pages = dma_free_pages, }; +/* Blacklist for skipping the whole probe: + * some HD-audio PCI entries are exposed without any codecs, and such devices + * should be ignored from the beginning. + */ +static const struct snd_pci_quirk driver_blacklist[] = { + SND_PCI_QUIRK(0x1043, 0x874f, "ASUS ROG Zenith II / Strix", 0), + SND_PCI_QUIRK(0x1462, 0xcb59, "MSI TRX40 Creator", 0), + SND_PCI_QUIRK(0x1462, 0xcb60, "MSI TRX40", 0), + {} +}; + static const struct hda_controller_ops pci_hda_ops = { .disable_msi_reset_irq = disable_msi_reset_irq, .substream_alloc_pages = substream_alloc_pages, @@ -2238,6 +2240,11 @@ bool schedule_probe; int err; + if (snd_pci_quirk_lookup(pci, driver_blacklist)) { + dev_info(&pci->dev, "Skipping the blacklisted device\n"); + return -ENODEV; + } + if (dev >= SNDRV_CARDS) return -ENODEV; if (!enable[dev]) { @@ -2324,6 +2331,8 @@ /* https://bugzilla.redhat.com/show_bug.cgi?id=1581607 */ SND_PCI_QUIRK(0x1558, 0x3501, "Clevo W35xSS_370SS", 0), /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ + SND_PCI_QUIRK(0x1558, 0x6504, "Clevo W65_67SB", 0), + /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ SND_PCI_QUIRK(0x1028, 0x0497, "Dell Precision T3600", 0), /* https://bugzilla.redhat.com/show_bug.cgi?id=1525104 */ /* Note the P55A-UD3 and Z87-D3HP share the subsys id for the HDA dev */ diff -Nru linux-4.19.98/sound/pci/hda/hda_sysfs.c linux-4.19.118/sound/pci/hda/hda_sysfs.c --- linux-4.19.98/sound/pci/hda/hda_sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/hda_sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -221,7 +221,7 @@ int i, len = 0; mutex_lock(&codec->user_mutex); snd_array_for_each(&codec->init_verbs, i, v) { - len += snprintf(buf + len, PAGE_SIZE - len, + len += scnprintf(buf + len, PAGE_SIZE - len, "0x%02x 0x%03x 0x%04x\n", v->nid, v->verb, v->param); } @@ -271,7 +271,7 @@ int i, len = 0; mutex_lock(&codec->user_mutex); snd_array_for_each(&codec->hints, i, hint) { - len += snprintf(buf + len, PAGE_SIZE - len, + len += scnprintf(buf + len, PAGE_SIZE - len, "%s = %s\n", hint->key, hint->val); } mutex_unlock(&codec->user_mutex); diff -Nru linux-4.19.98/sound/pci/hda/patch_ca0132.c linux-4.19.118/sound/pci/hda/patch_ca0132.c --- linux-4.19.98/sound/pci/hda/patch_ca0132.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/patch_ca0132.c 2020-04-23 08:30:24.000000000 +0000 @@ -1069,6 +1069,7 @@ SND_PCI_QUIRK(0x1458, 0xA016, "Recon3Di", QUIRK_R3DI), SND_PCI_QUIRK(0x1458, 0xA026, "Gigabyte G1.Sniper Z97", QUIRK_R3DI), SND_PCI_QUIRK(0x1458, 0xA036, "Gigabyte GA-Z170X-Gaming 7", QUIRK_R3DI), + SND_PCI_QUIRK(0x3842, 0x1038, "EVGA X99 Classified", QUIRK_R3DI), SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D), {} }; diff -Nru linux-4.19.98/sound/pci/hda/patch_conexant.c linux-4.19.118/sound/pci/hda/patch_conexant.c --- linux-4.19.98/sound/pci/hda/patch_conexant.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/patch_conexant.c 2020-04-23 08:30:24.000000000 +0000 @@ -935,6 +935,7 @@ SND_PCI_QUIRK(0x17aa, 0x215f, "Lenovo T510", CXT_PINCFG_LENOVO_TP410), SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410), SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410), + SND_PCI_QUIRK(0x17aa, 0x21d2, "Lenovo T420s", CXT_PINCFG_LENOVO_TP410), SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT_PINCFG_LENOVO_TP410), SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT_PINCFG_LENOVO_TP410), SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo IdeaPad Z560", CXT_FIXUP_MUTE_LED_EAPD), diff -Nru linux-4.19.98/sound/pci/hda/patch_hdmi.c linux-4.19.118/sound/pci/hda/patch_hdmi.c --- linux-4.19.98/sound/pci/hda/patch_hdmi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/patch_hdmi.c 2020-04-23 08:30:24.000000000 +0000 @@ -2604,9 +2604,12 @@ /* parse and post-process for Intel codecs */ static int parse_intel_hdmi(struct hda_codec *codec) { - int err; + int err, retries = 3; + + do { + err = hdmi_parse_codec(codec); + } while (err < 0 && retries--); - err = hdmi_parse_codec(codec); if (err < 0) { generic_spec_free(codec); return err; diff -Nru linux-4.19.98/sound/pci/hda/patch_realtek.c linux-4.19.118/sound/pci/hda/patch_realtek.c --- linux-4.19.98/sound/pci/hda/patch_realtek.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/hda/patch_realtek.c 2020-04-23 08:30:24.000000000 +0000 @@ -379,7 +379,9 @@ case 0x10ec0215: case 0x10ec0233: case 0x10ec0235: + case 0x10ec0236: case 0x10ec0255: + case 0x10ec0256: case 0x10ec0257: case 0x10ec0282: case 0x10ec0283: @@ -391,11 +393,6 @@ case 0x10ec0300: alc_update_coef_idx(codec, 0x10, 1<<9, 0); break; - case 0x10ec0236: - case 0x10ec0256: - alc_write_coef_idx(codec, 0x36, 0x5757); - alc_update_coef_idx(codec, 0x10, 1<<9, 0); - break; case 0x10ec0275: alc_update_coef_idx(codec, 0xe, 0, 1<<0); break; @@ -2442,6 +2439,11 @@ SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE), SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), + SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950), + SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950), + SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950), + SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950), + SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950), SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD), SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3), @@ -3245,7 +3247,13 @@ alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); - alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ + /* + * Expose headphone mic (or possibly Line In on some machines) instead + * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See + * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of + * this register. + */ + alc_write_coef_idx(codec, 0x36, 0x5757); } static void alc256_shutup(struct hda_codec *codec) @@ -5265,17 +5273,6 @@ } } -static void alc256_fixup_dell_xps_13_headphone_noise2(struct hda_codec *codec, - const struct hda_fixup *fix, - int action) -{ - if (action != HDA_FIXUP_ACT_PRE_PROBE) - return; - - snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 0, HDA_AMP_VOLMASK, 1); - snd_hda_override_wcaps(codec, 0x1a, get_wcaps(codec, 0x1a) & ~AC_WCAP_IN_AMP); -} - static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec, const struct hda_fixup *fix, int action) @@ -5667,8 +5664,6 @@ ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, ALC275_FIXUP_DELL_XPS, - ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, - ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2, ALC293_FIXUP_LENOVO_SPK_NOISE, ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, ALC255_FIXUP_DELL_SPK_NOISE, @@ -6380,23 +6375,6 @@ {} } }, - [ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE] = { - .type = HDA_FIXUP_VERBS, - .v.verbs = (const struct hda_verb[]) { - /* Disable pass-through path for FRONT 14h */ - {0x20, AC_VERB_SET_COEF_INDEX, 0x36}, - {0x20, AC_VERB_SET_PROC_COEF, 0x1737}, - {} - }, - .chained = true, - .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE - }, - [ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2] = { - .type = HDA_FIXUP_FUNC, - .v.func = alc256_fixup_dell_xps_13_headphone_noise2, - .chained = true, - .chain_id = ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE - }, [ALC293_FIXUP_LENOVO_SPK_NOISE] = { .type = HDA_FIXUP_FUNC, .v.func = alc_fixup_disable_aamix, @@ -6462,6 +6440,8 @@ [ALC285_FIXUP_SPEAKER2_TO_DAC1] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_speaker2_to_dac1, + .chained = true, + .chain_id = ALC269_FIXUP_THINKPAD_ACPI }, [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = { .type = HDA_FIXUP_PINS, @@ -6862,17 +6842,14 @@ SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK), - SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2), SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP), - SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2), SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME), SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3), SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE), - SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2), SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC), @@ -6883,6 +6860,8 @@ SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB), SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK), SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK), + SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), @@ -7221,7 +7200,6 @@ {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"}, {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"}, {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"}, - {.id = ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, .name = "alc256-dell-xps13"}, {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"}, {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"}, {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"}, @@ -7820,6 +7798,8 @@ spec->gen.mixer_nid = 0; break; case 0x10ec0225: + codec->power_save_node = 1; + /* fall through */ case 0x10ec0295: case 0x10ec0299: spec->codec_variant = ALC269_TYPE_ALC225; diff -Nru linux-4.19.98/sound/pci/ice1712/prodigy_hifi.c linux-4.19.118/sound/pci/ice1712/prodigy_hifi.c --- linux-4.19.98/sound/pci/ice1712/prodigy_hifi.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/pci/ice1712/prodigy_hifi.c 2020-04-23 08:30:24.000000000 +0000 @@ -550,7 +550,7 @@ struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); mutex_lock(&ice->gpio_mutex); - ucontrol->value.integer.value[0] = wm_get(ice, WM_ADC_MUX) & 0x1f; + ucontrol->value.enumerated.item[0] = wm_get(ice, WM_ADC_MUX) & 0x1f; mutex_unlock(&ice->gpio_mutex); return 0; } @@ -564,7 +564,7 @@ mutex_lock(&ice->gpio_mutex); oval = wm_get(ice, WM_ADC_MUX); - nval = (oval & 0xe0) | ucontrol->value.integer.value[0]; + nval = (oval & 0xe0) | ucontrol->value.enumerated.item[0]; if (nval != oval) { wm_put(ice, WM_ADC_MUX, nval); change = 1; diff -Nru linux-4.19.98/sound/sh/aica.c linux-4.19.118/sound/sh/aica.c --- linux-4.19.98/sound/sh/aica.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/sh/aica.c 2020-04-23 08:30:24.000000000 +0000 @@ -117,10 +117,10 @@ } /* spu_memload - write to SPU address space */ -static void spu_memload(u32 toi, void *from, int length) +static void spu_memload(u32 toi, const void *from, int length) { unsigned long flags; - u32 *froml = from; + const u32 *froml = from; u32 __iomem *to = (u32 __iomem *) (SPU_MEMORY_BASE + toi); int i; u32 val; @@ -303,7 +303,7 @@ { struct snd_card_aica *dreamcastcard = from_timer(dreamcastcard, t, timer); - struct snd_pcm_substream *substream = dreamcastcard->timer_substream; + struct snd_pcm_substream *substream = dreamcastcard->substream; /*timer function - so cannot sleep */ int play_period; struct snd_pcm_runtime *runtime; @@ -335,13 +335,6 @@ dreamcastcard = substream->pcm->private_data; /*get the queue to do the work */ schedule_work(&(dreamcastcard->spu_dma_work)); - /* Timer may already be running */ - if (unlikely(dreamcastcard->timer_substream)) { - mod_timer(&dreamcastcard->timer, jiffies + 4); - return; - } - timer_setup(&dreamcastcard->timer, aica_period_elapsed, 0); - dreamcastcard->timer_substream = substream; mod_timer(&dreamcastcard->timer, jiffies + 4); } @@ -379,8 +372,8 @@ { struct snd_card_aica *dreamcastcard = substream->pcm->private_data; flush_work(&(dreamcastcard->spu_dma_work)); - if (dreamcastcard->timer_substream) - del_timer(&dreamcastcard->timer); + del_timer(&dreamcastcard->timer); + dreamcastcard->substream = NULL; kfree(dreamcastcard->channel); spu_disable(); return 0; @@ -615,6 +608,7 @@ "Yamaha AICA Super Intelligent Sound Processor for SEGA Dreamcast"); /* Prepare to use the queue */ INIT_WORK(&(dreamcastcard->spu_dma_work), run_spu_dma); + timer_setup(&dreamcastcard->timer, aica_period_elapsed, 0); /* Load the PCM 'chip' */ err = snd_aicapcmchip(dreamcastcard, 0); if (unlikely(err < 0)) diff -Nru linux-4.19.98/sound/sh/sh_dac_audio.c linux-4.19.118/sound/sh/sh_dac_audio.c --- linux-4.19.98/sound/sh/sh_dac_audio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/sh/sh_dac_audio.c 2020-04-23 08:30:24.000000000 +0000 @@ -190,7 +190,6 @@ { /* channel is not used (interleaved data) */ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream); - struct snd_pcm_runtime *runtime = substream->runtime; if (copy_from_user_toio(chip->data_buffer + pos, src, count)) return -EFAULT; @@ -210,7 +209,6 @@ { /* channel is not used (interleaved data) */ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream); - struct snd_pcm_runtime *runtime = substream->runtime; memcpy_toio(chip->data_buffer + pos, src, count); chip->buffer_end = chip->data_buffer + pos + count; @@ -229,7 +227,6 @@ { /* channel is not used (interleaved data) */ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream); - struct snd_pcm_runtime *runtime = substream->runtime; memset_io(chip->data_buffer + pos, 0, count); chip->buffer_end = chip->data_buffer + pos + count; diff -Nru linux-4.19.98/sound/soc/atmel/Kconfig linux-4.19.118/sound/soc/atmel/Kconfig --- linux-4.19.98/sound/soc/atmel/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/atmel/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -25,6 +25,8 @@ config SND_ATMEL_SOC_SSC_DMA tristate + select SND_ATMEL_SOC_DMA + select SND_ATMEL_SOC_PDC config SND_ATMEL_SOC_SSC tristate diff -Nru linux-4.19.98/sound/soc/codecs/cs4349.c linux-4.19.118/sound/soc/codecs/cs4349.c --- linux-4.19.98/sound/soc/codecs/cs4349.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/cs4349.c 2020-04-23 08:30:24.000000000 +0000 @@ -381,6 +381,7 @@ .driver = { .name = "cs4349", .of_match_table = cs4349_of_match, + .pm = &cs4349_runtime_pm, }, .id_table = cs4349_i2c_id, .probe = cs4349_i2c_probe, diff -Nru linux-4.19.98/sound/soc/codecs/es8328.c linux-4.19.118/sound/soc/codecs/es8328.c --- linux-4.19.98/sound/soc/codecs/es8328.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/es8328.c 2020-04-23 08:30:24.000000000 +0000 @@ -231,7 +231,7 @@ ARRAY_SIZE(es8328_line_texts), es8328_line_texts); static const struct snd_kcontrol_new es8328_right_line_controls = - SOC_DAPM_ENUM("Route", es8328_lline_enum); + SOC_DAPM_ENUM("Route", es8328_rline_enum); /* Left Mixer */ static const struct snd_kcontrol_new es8328_left_mixer_controls[] = { diff -Nru linux-4.19.98/sound/soc/codecs/pcm512x.c linux-4.19.118/sound/soc/codecs/pcm512x.c --- linux-4.19.98/sound/soc/codecs/pcm512x.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/pcm512x.c 2020-04-23 08:30:24.000000000 +0000 @@ -1437,13 +1437,15 @@ } pcm512x->sclk = devm_clk_get(dev, NULL); - if (PTR_ERR(pcm512x->sclk) == -EPROBE_DEFER) - return -EPROBE_DEFER; + if (PTR_ERR(pcm512x->sclk) == -EPROBE_DEFER) { + ret = -EPROBE_DEFER; + goto err; + } if (!IS_ERR(pcm512x->sclk)) { ret = clk_prepare_enable(pcm512x->sclk); if (ret != 0) { dev_err(dev, "Failed to enable SCLK: %d\n", ret); - return ret; + goto err; } } diff -Nru linux-4.19.98/sound/soc/codecs/rt5640.c linux-4.19.118/sound/soc/codecs/rt5640.c --- linux-4.19.98/sound/soc/codecs/rt5640.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/rt5640.c 2020-04-23 08:30:24.000000000 +0000 @@ -2435,6 +2435,13 @@ { struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); + /* + * soc_remove_component() force-disables jack and thus rt5640->jack + * could be NULL at the time of driver's module unloading. + */ + if (!rt5640->jack) + return; + disable_irq(rt5640->irq); rt5640_cancel_work(rt5640); diff -Nru linux-4.19.98/sound/soc/codecs/wm8737.c linux-4.19.118/sound/soc/codecs/wm8737.c --- linux-4.19.98/sound/soc/codecs/wm8737.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/wm8737.c 2020-04-23 08:30:24.000000000 +0000 @@ -170,7 +170,7 @@ SOC_SINGLE("3D Switch", WM8737_3D_ENHANCE, 0, 1, 0), SOC_SINGLE("3D Depth", WM8737_3D_ENHANCE, 1, 15, 0), SOC_ENUM("3D Low Cut-off", low_3d), -SOC_ENUM("3D High Cut-off", low_3d), +SOC_ENUM("3D High Cut-off", high_3d), SOC_SINGLE_TLV("3D ADC Volume", WM8737_3D_ENHANCE, 7, 1, 1, adc_tlv), SOC_SINGLE("Noise Gate Switch", WM8737_NOISE_GATE, 0, 1, 0), diff -Nru linux-4.19.98/sound/soc/codecs/wm9705.c linux-4.19.118/sound/soc/codecs/wm9705.c --- linux-4.19.98/sound/soc/codecs/wm9705.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/wm9705.c 2020-04-23 08:30:24.000000000 +0000 @@ -325,8 +325,7 @@ if (wm9705->mfd_pdata) { wm9705->ac97 = wm9705->mfd_pdata->ac97; regmap = wm9705->mfd_pdata->regmap; - } else { -#ifdef CONFIG_SND_SOC_AC97_BUS + } else if (IS_ENABLED(CONFIG_SND_SOC_AC97_BUS)) { wm9705->ac97 = snd_soc_new_ac97_component(component, WM9705_VENDOR_ID, WM9705_VENDOR_ID_MASK); if (IS_ERR(wm9705->ac97)) { @@ -339,7 +338,8 @@ snd_soc_free_ac97_component(wm9705->ac97); return PTR_ERR(regmap); } -#endif + } else { + return -ENXIO; } snd_soc_component_set_drvdata(component, wm9705->ac97); @@ -350,14 +350,12 @@ static void wm9705_soc_remove(struct snd_soc_component *component) { -#ifdef CONFIG_SND_SOC_AC97_BUS struct wm9705_priv *wm9705 = snd_soc_component_get_drvdata(component); - if (!wm9705->mfd_pdata) { + if (IS_ENABLED(CONFIG_SND_SOC_AC97_BUS) && !wm9705->mfd_pdata) { snd_soc_component_exit_regmap(component); snd_soc_free_ac97_component(wm9705->ac97); } -#endif } static const struct snd_soc_component_driver soc_component_dev_wm9705 = { diff -Nru linux-4.19.98/sound/soc/codecs/wm9712.c linux-4.19.118/sound/soc/codecs/wm9712.c --- linux-4.19.98/sound/soc/codecs/wm9712.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/wm9712.c 2020-04-23 08:30:24.000000000 +0000 @@ -638,13 +638,13 @@ { struct wm9712_priv *wm9712 = snd_soc_component_get_drvdata(component); struct regmap *regmap; - int ret; if (wm9712->mfd_pdata) { wm9712->ac97 = wm9712->mfd_pdata->ac97; regmap = wm9712->mfd_pdata->regmap; - } else { -#ifdef CONFIG_SND_SOC_AC97_BUS + } else if (IS_ENABLED(CONFIG_SND_SOC_AC97_BUS)) { + int ret; + wm9712->ac97 = snd_soc_new_ac97_component(component, WM9712_VENDOR_ID, WM9712_VENDOR_ID_MASK); if (IS_ERR(wm9712->ac97)) { @@ -659,7 +659,8 @@ snd_soc_free_ac97_component(wm9712->ac97); return PTR_ERR(regmap); } -#endif + } else { + return -ENXIO; } snd_soc_component_init_regmap(component, regmap); @@ -672,14 +673,12 @@ static void wm9712_soc_remove(struct snd_soc_component *component) { -#ifdef CONFIG_SND_SOC_AC97_BUS struct wm9712_priv *wm9712 = snd_soc_component_get_drvdata(component); - if (!wm9712->mfd_pdata) { + if (IS_ENABLED(CONFIG_SND_SOC_AC97_BUS) && !wm9712->mfd_pdata) { snd_soc_component_exit_regmap(component); snd_soc_free_ac97_component(wm9712->ac97); } -#endif } static const struct snd_soc_component_driver soc_component_dev_wm9712 = { diff -Nru linux-4.19.98/sound/soc/codecs/wm9713.c linux-4.19.118/sound/soc/codecs/wm9713.c --- linux-4.19.98/sound/soc/codecs/wm9713.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/codecs/wm9713.c 2020-04-23 08:30:24.000000000 +0000 @@ -1214,8 +1214,7 @@ if (wm9713->mfd_pdata) { wm9713->ac97 = wm9713->mfd_pdata->ac97; regmap = wm9713->mfd_pdata->regmap; - } else { -#ifdef CONFIG_SND_SOC_AC97_BUS + } else if (IS_ENABLED(CONFIG_SND_SOC_AC97_BUS)) { wm9713->ac97 = snd_soc_new_ac97_component(component, WM9713_VENDOR_ID, WM9713_VENDOR_ID_MASK); if (IS_ERR(wm9713->ac97)) @@ -1225,7 +1224,8 @@ snd_soc_free_ac97_component(wm9713->ac97); return PTR_ERR(regmap); } -#endif + } else { + return -ENXIO; } snd_soc_component_init_regmap(component, regmap); @@ -1238,14 +1238,12 @@ static void wm9713_soc_remove(struct snd_soc_component *component) { -#ifdef CONFIG_SND_SOC_AC97_BUS struct wm9713_priv *wm9713 = snd_soc_component_get_drvdata(component); - if (!wm9713->mfd_pdata) { + if (IS_ENABLED(CONFIG_SND_SOC_AC97_BUS) && !wm9713->mfd_pdata) { snd_soc_component_exit_regmap(component); snd_soc_free_ac97_component(wm9713->ac97); } -#endif } static const struct snd_soc_component_driver soc_component_dev_wm9713 = { diff -Nru linux-4.19.98/sound/soc/davinci/davinci-mcasp.c linux-4.19.118/sound/soc/davinci/davinci-mcasp.c --- linux-4.19.98/sound/soc/davinci/davinci-mcasp.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/davinci/davinci-mcasp.c 2020-04-23 08:30:24.000000000 +0000 @@ -874,14 +874,13 @@ active_slots = hweight32(mcasp->tdm_mask[stream]); active_serializers = (channels + active_slots - 1) / active_slots; - if (active_serializers == 1) { + if (active_serializers == 1) active_slots = channels; - for (i = 0; i < total_slots; i++) { - if ((1 << i) & mcasp->tdm_mask[stream]) { - mask |= (1 << i); - if (--active_slots <= 0) - break; - } + for (i = 0; i < total_slots; i++) { + if ((1 << i) & mcasp->tdm_mask[stream]) { + mask |= (1 << i); + if (--active_slots <= 0) + break; } } } else { diff -Nru linux-4.19.98/sound/soc/fsl/imx-sgtl5000.c linux-4.19.118/sound/soc/fsl/imx-sgtl5000.c --- linux-4.19.98/sound/soc/fsl/imx-sgtl5000.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/fsl/imx-sgtl5000.c 2020-04-23 08:30:24.000000000 +0000 @@ -112,7 +112,8 @@ codec_dev = of_find_i2c_device_by_node(codec_np); if (!codec_dev) { dev_err(&pdev->dev, "failed to find codec platform device\n"); - return -EPROBE_DEFER; + ret = -EPROBE_DEFER; + goto fail; } data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); diff -Nru linux-4.19.98/sound/soc/intel/atom/sst/sst_pci.c linux-4.19.118/sound/soc/intel/atom/sst/sst_pci.c --- linux-4.19.98/sound/soc/intel/atom/sst/sst_pci.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/intel/atom/sst/sst_pci.c 2020-04-23 08:30:24.000000000 +0000 @@ -107,7 +107,7 @@ dev_dbg(ctx->dev, "DRAM Ptr %p\n", ctx->dram); do_release_regions: pci_release_regions(pci); - return 0; + return ret; } /* diff -Nru linux-4.19.98/sound/soc/intel/atom/sst-atom-controls.c linux-4.19.118/sound/soc/intel/atom/sst-atom-controls.c --- linux-4.19.98/sound/soc/intel/atom/sst-atom-controls.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/intel/atom/sst-atom-controls.c 2020-04-23 08:30:24.000000000 +0000 @@ -1341,7 +1341,7 @@ dai->capture_widget->name); w = dai->capture_widget; snd_soc_dapm_widget_for_each_source_path(w, p) { - if (p->connected && !p->connected(w, p->sink)) + if (p->connected && !p->connected(w, p->source)) continue; if (p->connect && p->source->power && diff -Nru linux-4.19.98/sound/soc/intel/skylake/skl-debug.c linux-4.19.118/sound/soc/intel/skylake/skl-debug.c --- linux-4.19.98/sound/soc/intel/skylake/skl-debug.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/intel/skylake/skl-debug.c 2020-04-23 08:30:24.000000000 +0000 @@ -42,8 +42,8 @@ int i; ssize_t ret = 0; - for (i = 0; i < max_pin; i++) - ret += snprintf(buf + size, MOD_BUF - size, + for (i = 0; i < max_pin; i++) { + ret += scnprintf(buf + size, MOD_BUF - size, "%s %d\n\tModule %d\n\tInstance %d\n\t" "In-used %s\n\tType %s\n" "\tState %d\n\tIndex %d\n", @@ -53,13 +53,15 @@ m_pin[i].in_use ? "Used" : "Unused", m_pin[i].is_dynamic ? "Dynamic" : "Static", m_pin[i].pin_state, i); + size += ret; + } return ret; } static ssize_t skl_print_fmt(struct skl_module_fmt *fmt, char *buf, ssize_t size, bool direction) { - return snprintf(buf + size, MOD_BUF - size, + return scnprintf(buf + size, MOD_BUF - size, "%s\n\tCh %d\n\tFreq %d\n\tBit depth %d\n\t" "Valid bit depth %d\n\tCh config %#x\n\tInterleaving %d\n\t" "Sample Type %d\n\tCh Map %#x\n", @@ -81,16 +83,16 @@ if (!buf) return -ENOMEM; - ret = snprintf(buf, MOD_BUF, "Module:\n\tUUID %pUL\n\tModule id %d\n" + ret = scnprintf(buf, MOD_BUF, "Module:\n\tUUID %pUL\n\tModule id %d\n" "\tInstance id %d\n\tPvt_id %d\n", mconfig->guid, mconfig->id.module_id, mconfig->id.instance_id, mconfig->id.pvt_id); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "Resources:\n\tMCPS %#x\n\tIBS %#x\n\tOBS %#x\t\n", mconfig->mcps, mconfig->ibs, mconfig->obs); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "Module data:\n\tCore %d\n\tIn queue %d\n\t" "Out queue %d\n\tType %s\n", mconfig->core_id, mconfig->max_in_queue, @@ -100,38 +102,38 @@ ret += skl_print_fmt(mconfig->in_fmt, buf, ret, true); ret += skl_print_fmt(mconfig->out_fmt, buf, ret, false); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "Fixup:\n\tParams %#x\n\tConverter %#x\n", mconfig->params_fixup, mconfig->converter); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "Module Gateway:\n\tType %#x\n\tVbus %#x\n\tHW conn %#x\n\tSlot %#x\n", mconfig->dev_type, mconfig->vbus_id, mconfig->hw_conn_type, mconfig->time_slot); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "Pipeline:\n\tID %d\n\tPriority %d\n\tConn Type %d\n\t" "Pages %#x\n", mconfig->pipe->ppl_id, mconfig->pipe->pipe_priority, mconfig->pipe->conn_type, mconfig->pipe->memory_pages); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "\tParams:\n\t\tHost DMA %d\n\t\tLink DMA %d\n", mconfig->pipe->p_params->host_dma_id, mconfig->pipe->p_params->link_dma_id); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "\tPCM params:\n\t\tCh %d\n\t\tFreq %d\n\t\tFormat %d\n", mconfig->pipe->p_params->ch, mconfig->pipe->p_params->s_freq, mconfig->pipe->p_params->s_fmt); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "\tLink %#x\n\tStream %#x\n", mconfig->pipe->p_params->linktype, mconfig->pipe->p_params->stream); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "\tState %d\n\tPassthru %s\n", mconfig->pipe->state, mconfig->pipe->passthru ? "true" : "false"); @@ -141,7 +143,7 @@ ret += skl_print_pins(mconfig->m_out_pin, buf, mconfig->max_out_queue, ret, false); - ret += snprintf(buf + ret, MOD_BUF - ret, + ret += scnprintf(buf + ret, MOD_BUF - ret, "Other:\n\tDomain %d\n\tHomogeneous Input %s\n\t" "Homogeneous Output %s\n\tIn Queue Mask %d\n\t" "Out Queue Mask %d\n\tDMA ID %d\n\tMem Pages %d\n\t" @@ -199,7 +201,7 @@ __ioread32_copy(d->fw_read_buff, fw_reg_addr, w0_stat_sz >> 2); for (offset = 0; offset < FW_REG_SIZE; offset += 16) { - ret += snprintf(tmp + ret, FW_REG_BUF - ret, "%#.4x: ", offset); + ret += scnprintf(tmp + ret, FW_REG_BUF - ret, "%#.4x: ", offset); hex_dump_to_buffer(d->fw_read_buff + offset, 16, 16, 4, tmp + ret, FW_REG_BUF - ret, 0); ret += strlen(tmp + ret); diff -Nru linux-4.19.98/sound/soc/jz4740/jz4740-i2s.c linux-4.19.118/sound/soc/jz4740/jz4740-i2s.c --- linux-4.19.98/sound/soc/jz4740/jz4740-i2s.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/jz4740/jz4740-i2s.c 2020-04-23 08:30:24.000000000 +0000 @@ -92,7 +92,7 @@ #define JZ_AIC_I2S_STATUS_BUSY BIT(2) #define JZ_AIC_CLK_DIV_MASK 0xf -#define I2SDIV_DV_SHIFT 8 +#define I2SDIV_DV_SHIFT 0 #define I2SDIV_DV_MASK (0xf << I2SDIV_DV_SHIFT) #define I2SDIV_IDV_SHIFT 8 #define I2SDIV_IDV_MASK (0xf << I2SDIV_IDV_SHIFT) diff -Nru linux-4.19.98/sound/soc/meson/axg-tdmin.c linux-4.19.118/sound/soc/meson/axg-tdmin.c --- linux-4.19.98/sound/soc/meson/axg-tdmin.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/meson/axg-tdmin.c 2020-04-23 08:30:24.000000000 +0000 @@ -119,7 +119,6 @@ break; case SND_SOC_DAIFMT_LEFT_J: - case SND_SOC_DAIFMT_RIGHT_J: case SND_SOC_DAIFMT_DSP_B: val = TDMIN_CTRL_IN_BIT_SKEW(2); break; diff -Nru linux-4.19.98/sound/soc/meson/axg-tdmout.c linux-4.19.118/sound/soc/meson/axg-tdmout.c --- linux-4.19.98/sound/soc/meson/axg-tdmout.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/meson/axg-tdmout.c 2020-04-23 08:30:24.000000000 +0000 @@ -136,7 +136,6 @@ break; case SND_SOC_DAIFMT_LEFT_J: - case SND_SOC_DAIFMT_RIGHT_J: case SND_SOC_DAIFMT_DSP_B: val |= TDMOUT_CTRL0_INIT_BITNUM(2); break; diff -Nru linux-4.19.98/sound/soc/qcom/apq8016_sbc.c linux-4.19.118/sound/soc/qcom/apq8016_sbc.c --- linux-4.19.98/sound/soc/qcom/apq8016_sbc.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/qcom/apq8016_sbc.c 2020-04-23 08:30:24.000000000 +0000 @@ -164,41 +164,52 @@ if (!cpu || !codec) { dev_err(dev, "Can't find cpu/codec DT node\n"); - return ERR_PTR(-EINVAL); + ret = -EINVAL; + goto error; } link->cpu_of_node = of_parse_phandle(cpu, "sound-dai", 0); if (!link->cpu_of_node) { dev_err(card->dev, "error getting cpu phandle\n"); - return ERR_PTR(-EINVAL); + ret = -EINVAL; + goto error; } ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); if (ret) { dev_err(card->dev, "error getting cpu dai name\n"); - return ERR_PTR(ret); + goto error; } ret = snd_soc_of_get_dai_link_codecs(dev, codec, link); if (ret < 0) { dev_err(card->dev, "error getting codec dai name\n"); - return ERR_PTR(ret); + goto error; } link->platform_of_node = link->cpu_of_node; ret = of_property_read_string(np, "link-name", &link->name); if (ret) { dev_err(card->dev, "error getting codec dai_link name\n"); - return ERR_PTR(ret); + goto error; } link->stream_name = link->name; link->init = apq8016_sbc_dai_init; link++; + + of_node_put(cpu); + of_node_put(codec); } return data; + + error: + of_node_put(np); + of_node_put(cpu); + of_node_put(codec); + return ERR_PTR(ret); } static const struct snd_soc_dapm_widget apq8016_sbc_dapm_widgets[] = { diff -Nru linux-4.19.98/sound/soc/soc-dapm.c linux-4.19.118/sound/soc/soc-dapm.c --- linux-4.19.98/sound/soc/soc-dapm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/soc-dapm.c 2020-04-23 08:30:24.000000000 +0000 @@ -792,7 +792,13 @@ val = max - val; p->connect = !!val; } else { - p->connect = 0; + /* since a virtual mixer has no backing registers to + * decide which path to connect, it will try to match + * with initial state. This is to ensure + * that the default mixer choice will be + * correctly powered up during initialization. + */ + p->connect = invert; } } @@ -4551,7 +4557,7 @@ continue; if (w->power) { dapm_seq_insert(w, &down_list, false); - w->power = 0; + w->new_power = 0; powerdown = 1; } } diff -Nru linux-4.19.98/sound/soc/soc-ops.c linux-4.19.118/sound/soc/soc-ops.c --- linux-4.19.98/sound/soc/soc-ops.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/soc-ops.c 2020-04-23 08:30:24.000000000 +0000 @@ -832,7 +832,7 @@ unsigned int regbase = mc->regbase; unsigned int regcount = mc->regcount; unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; - unsigned int regwmask = (1<invert; unsigned long mask = (1UL<nbits)-1; long min = mc->min; @@ -881,7 +881,7 @@ unsigned int regbase = mc->regbase; unsigned int regcount = mc->regcount; unsigned int regwshift = component->val_bytes * BITS_PER_BYTE; - unsigned int regwmask = (1<invert; unsigned long mask = (1UL<nbits)-1; long max = mc->max; diff -Nru linux-4.19.98/sound/soc/soc-pcm.c linux-4.19.118/sound/soc/soc-pcm.c --- linux-4.19.98/sound/soc/soc-pcm.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/soc-pcm.c 2020-04-23 08:30:24.000000000 +0000 @@ -42,8 +42,8 @@ else codec_stream = &dai->driver->capture; - /* If the codec specifies any rate at all, it supports the stream. */ - return codec_stream->rates; + /* If the codec specifies any channels at all, it supports the stream */ + return codec_stream->channels_min; } /** @@ -2266,7 +2266,8 @@ switch (cmd) { case SNDRV_PCM_TRIGGER_START: if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) && - (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP)) + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) && + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED)) continue; ret = dpcm_do_trigger(dpcm, be_substream, cmd); @@ -2296,7 +2297,8 @@ be->dpcm[stream].state = SND_SOC_DPCM_STATE_START; break; case SNDRV_PCM_TRIGGER_STOP: - if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) + if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) && + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED)) continue; if (!snd_soc_dpcm_can_be_free_stop(fe, be, stream)) @@ -2341,42 +2343,81 @@ } EXPORT_SYMBOL_GPL(dpcm_be_dai_trigger); +static int dpcm_dai_trigger_fe_be(struct snd_pcm_substream *substream, + int cmd, bool fe_first) +{ + struct snd_soc_pcm_runtime *fe = substream->private_data; + int ret; + + /* call trigger on the frontend before the backend. */ + if (fe_first) { + dev_dbg(fe->dev, "ASoC: pre trigger FE %s cmd %d\n", + fe->dai_link->name, cmd); + + ret = soc_pcm_trigger(substream, cmd); + if (ret < 0) + return ret; + + ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); + return ret; + } + + /* call trigger on the frontend after the backend. */ + ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); + if (ret < 0) + return ret; + + dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n", + fe->dai_link->name, cmd); + + ret = soc_pcm_trigger(substream, cmd); + + return ret; +} + static int dpcm_fe_dai_do_trigger(struct snd_pcm_substream *substream, int cmd) { struct snd_soc_pcm_runtime *fe = substream->private_data; - int stream = substream->stream, ret; + int stream = substream->stream; + int ret = 0; enum snd_soc_dpcm_trigger trigger = fe->dai_link->trigger[stream]; fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_FE; switch (trigger) { case SND_SOC_DPCM_TRIGGER_PRE: - /* call trigger on the frontend before the backend. */ - - dev_dbg(fe->dev, "ASoC: pre trigger FE %s cmd %d\n", - fe->dai_link->name, cmd); - - ret = soc_pcm_trigger(substream, cmd); - if (ret < 0) { - dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret); - goto out; + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + ret = dpcm_dai_trigger_fe_be(substream, cmd, true); + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + ret = dpcm_dai_trigger_fe_be(substream, cmd, false); + break; + default: + ret = -EINVAL; + break; } - - ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); break; case SND_SOC_DPCM_TRIGGER_POST: - /* call trigger on the frontend after the backend. */ - - ret = dpcm_be_dai_trigger(fe, substream->stream, cmd); - if (ret < 0) { - dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret); - goto out; + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + ret = dpcm_dai_trigger_fe_be(substream, cmd, false); + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + ret = dpcm_dai_trigger_fe_be(substream, cmd, true); + break; + default: + ret = -EINVAL; + break; } - - dev_dbg(fe->dev, "ASoC: post trigger FE %s cmd %d\n", - fe->dai_link->name, cmd); - - ret = soc_pcm_trigger(substream, cmd); break; case SND_SOC_DPCM_TRIGGER_BESPOKE: /* bespoke trigger() - handles both FE and BEs */ @@ -2385,10 +2426,6 @@ fe->dai_link->name, cmd); ret = soc_pcm_bespoke_trigger(substream, cmd); - if (ret < 0) { - dev_err(fe->dev,"ASoC: trigger FE failed %d\n", ret); - goto out; - } break; default: dev_err(fe->dev, "ASoC: invalid trigger cmd %d for %s\n", cmd, @@ -2397,6 +2434,12 @@ goto out; } + if (ret < 0) { + dev_err(fe->dev, "ASoC: trigger FE cmd: %d failed: %d\n", + cmd, ret); + goto out; + } + switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: @@ -3316,16 +3359,16 @@ ssize_t offset = 0; /* FE state */ - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, "[%s - %s]\n", fe->dai_link->name, stream ? "Capture" : "Playback"); - offset += snprintf(buf + offset, size - offset, "State: %s\n", + offset += scnprintf(buf + offset, size - offset, "State: %s\n", dpcm_state_string(fe->dpcm[stream].state)); if ((fe->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) && (fe->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP)) - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, "Hardware Params: " "Format = %s, Channels = %d, Rate = %d\n", snd_pcm_format_name(params_format(params)), @@ -3333,10 +3376,10 @@ params_rate(params)); /* BEs state */ - offset += snprintf(buf + offset, size - offset, "Backends:\n"); + offset += scnprintf(buf + offset, size - offset, "Backends:\n"); if (list_empty(&fe->dpcm[stream].be_clients)) { - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, " No active DSP links\n"); goto out; } @@ -3345,16 +3388,16 @@ struct snd_soc_pcm_runtime *be = dpcm->be; params = &dpcm->hw_params; - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, "- %s\n", be->dai_link->name); - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, " State: %s\n", dpcm_state_string(be->dpcm[stream].state)); if ((be->dpcm[stream].state >= SND_SOC_DPCM_STATE_HW_PARAMS) && (be->dpcm[stream].state <= SND_SOC_DPCM_STATE_STOP)) - offset += snprintf(buf + offset, size - offset, + offset += scnprintf(buf + offset, size - offset, " Hardware Params: " "Format = %s, Channels = %d, Rate = %d\n", snd_pcm_format_name(params_format(params)), diff -Nru linux-4.19.98/sound/soc/soc-topology.c linux-4.19.118/sound/soc/soc-topology.c --- linux-4.19.98/sound/soc/soc-topology.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/soc-topology.c 2020-04-23 08:30:24.000000000 +0000 @@ -364,7 +364,7 @@ struct snd_soc_component *comp = tplg->comp; return soc_tplg_add_dcontrol(comp->card->snd_card, - comp->dev, k, NULL, comp, kcontrol); + comp->dev, k, comp->name_prefix, comp, kcontrol); } /* remove a mixer kcontrol */ @@ -2154,8 +2154,11 @@ } ret = soc_tplg_link_config(tplg, _link); - if (ret < 0) + if (ret < 0) { + if (!abi_match) + kfree(_link); return ret; + } /* offset by version-specific struct size and * real priv data size @@ -2310,7 +2313,7 @@ { struct snd_soc_tplg_manifest *manifest, *_manifest; bool abi_match; - int err; + int ret = 0; if (tplg->pass != SOC_TPLG_PASS_MANIFEST) return 0; @@ -2323,19 +2326,19 @@ _manifest = manifest; } else { abi_match = false; - err = manifest_new_ver(tplg, manifest, &_manifest); - if (err < 0) - return err; + ret = manifest_new_ver(tplg, manifest, &_manifest); + if (ret < 0) + return ret; } /* pass control to component driver for optional further init */ if (tplg->comp && tplg->ops && tplg->ops->manifest) - return tplg->ops->manifest(tplg->comp, tplg->index, _manifest); + ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest); if (!abi_match) /* free the duplicated one */ kfree(_manifest); - return 0; + return ret; } /* validate header magic, size and type */ diff -Nru linux-4.19.98/sound/soc/sti/uniperif_player.c linux-4.19.118/sound/soc/sti/uniperif_player.c --- linux-4.19.98/sound/soc/sti/uniperif_player.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/sti/uniperif_player.c 2020-04-23 08:30:24.000000000 +0000 @@ -226,7 +226,6 @@ * sampling frequency. If no sample rate is already specified, then * set one. */ - mutex_lock(&player->ctrl_lock); if (runtime) { switch (runtime->rate) { case 22050: @@ -303,7 +302,6 @@ player->stream_settings.iec958.status[3 + (n * 4)] << 24; SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status); } - mutex_unlock(&player->ctrl_lock); /* Update the channel status */ if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) @@ -365,8 +363,10 @@ SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player); + mutex_lock(&player->ctrl_lock); /* Update the channel status */ uni_player_set_channel_status(player, runtime); + mutex_unlock(&player->ctrl_lock); /* Clear the user validity user bits */ SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0); @@ -598,7 +598,6 @@ iec958->status[1] = ucontrol->value.iec958.status[1]; iec958->status[2] = ucontrol->value.iec958.status[2]; iec958->status[3] = ucontrol->value.iec958.status[3]; - mutex_unlock(&player->ctrl_lock); spin_lock_irqsave(&player->irq_lock, flags); if (player->substream && player->substream->runtime) @@ -608,6 +607,8 @@ uni_player_set_channel_status(player, NULL); spin_unlock_irqrestore(&player->irq_lock, flags); + mutex_unlock(&player->ctrl_lock); + return 0; } diff -Nru linux-4.19.98/sound/soc/sunxi/sun4i-i2s.c linux-4.19.118/sound/soc/sunxi/sun4i-i2s.c --- linux-4.19.98/sound/soc/sunxi/sun4i-i2s.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/sunxi/sun4i-i2s.c 2020-04-23 08:30:24.000000000 +0000 @@ -80,8 +80,8 @@ #define SUN4I_I2S_CLK_DIV_MCLK_MASK GENMASK(3, 0) #define SUN4I_I2S_CLK_DIV_MCLK(mclk) ((mclk) << 0) -#define SUN4I_I2S_RX_CNT_REG 0x28 -#define SUN4I_I2S_TX_CNT_REG 0x2c +#define SUN4I_I2S_TX_CNT_REG 0x28 +#define SUN4I_I2S_RX_CNT_REG 0x2c #define SUN4I_I2S_TX_CHAN_SEL_REG 0x30 #define SUN4I_I2S_CHAN_SEL(num_chan) (((num_chan) - 1) << 0) diff -Nru linux-4.19.98/sound/soc/sunxi/sun8i-codec.c linux-4.19.118/sound/soc/sunxi/sun8i-codec.c --- linux-4.19.98/sound/soc/sunxi/sun8i-codec.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/soc/sunxi/sun8i-codec.c 2020-04-23 08:30:24.000000000 +0000 @@ -89,6 +89,7 @@ #define SUN8I_SYS_SR_CTRL_AIF1_FS_MASK GENMASK(15, 12) #define SUN8I_SYS_SR_CTRL_AIF2_FS_MASK GENMASK(11, 8) +#define SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT_MASK GENMASK(3, 2) #define SUN8I_AIF1CLK_CTRL_AIF1_WORD_SIZ_MASK GENMASK(5, 4) #define SUN8I_AIF1CLK_CTRL_AIF1_LRCK_DIV_MASK GENMASK(8, 6) #define SUN8I_AIF1CLK_CTRL_AIF1_BCLK_DIV_MASK GENMASK(12, 9) @@ -250,7 +251,7 @@ return -EINVAL; } regmap_update_bits(scodec->regmap, SUN8I_AIF1CLK_CTRL, - BIT(SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT), + SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT_MASK, value << SUN8I_AIF1CLK_CTRL_AIF1_DATA_FMT); return 0; @@ -465,7 +466,11 @@ { "Right Digital DAC Mixer", "AIF1 Slot 0 Digital DAC Playback Switch", "AIF1 Slot 0 Right"}, - /* ADC routes */ + /* ADC Routes */ + { "AIF1 Slot 0 Right ADC", NULL, "ADC" }, + { "AIF1 Slot 0 Left ADC", NULL, "ADC" }, + + /* ADC Mixer Routes */ { "Left Digital ADC Mixer", "AIF1 Data Digital ADC Capture Switch", "AIF1 Slot 0 Left ADC" }, { "Right Digital ADC Mixer", "AIF1 Data Digital ADC Capture Switch", diff -Nru linux-4.19.98/sound/usb/clock.c linux-4.19.118/sound/usb/clock.c --- linux-4.19.98/sound/usb/clock.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/clock.c 2020-04-23 08:30:24.000000000 +0000 @@ -165,8 +165,34 @@ return ret; } +/* + * Assume the clock is valid if clock source supports only one single sample + * rate, the terminal is connected directly to it (there is no clock selector) + * and clock type is internal. This is to deal with some Denon DJ controllers + * that always reports that clock is invalid. + */ +static bool uac_clock_source_is_valid_quirk(struct snd_usb_audio *chip, + struct audioformat *fmt, + int source_id) +{ + if (fmt->protocol == UAC_VERSION_2) { + struct uac_clock_source_descriptor *cs_desc = + snd_usb_find_clock_source(chip->ctrl_intf, source_id); + + if (!cs_desc) + return false; + + return (fmt->nr_rates == 1 && + (fmt->clock & 0xff) == cs_desc->bClockID && + (cs_desc->bmAttributes & 0x3) != + UAC_CLOCK_SOURCE_TYPE_EXT); + } + + return false; +} + static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, - int protocol, + struct audioformat *fmt, int source_id) { int err; @@ -174,26 +200,26 @@ struct usb_device *dev = chip->dev; u32 bmControls; - if (protocol == UAC_VERSION_3) { + if (fmt->protocol == UAC_VERSION_3) { struct uac3_clock_source_descriptor *cs_desc = snd_usb_find_clock_source_v3(chip->ctrl_intf, source_id); if (!cs_desc) - return 0; + return false; bmControls = le32_to_cpu(cs_desc->bmControls); } else { /* UAC_VERSION_1/2 */ struct uac_clock_source_descriptor *cs_desc = snd_usb_find_clock_source(chip->ctrl_intf, source_id); if (!cs_desc) - return 0; + return false; bmControls = cs_desc->bmControls; } /* If a clock source can't tell us whether it's valid, we assume it is */ if (!uac_v2v3_control_is_readable(bmControls, UAC2_CS_CONTROL_CLOCK_VALID)) - return 1; + return true; err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0), UAC2_CS_CUR, USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, @@ -205,13 +231,17 @@ dev_warn(&dev->dev, "%s(): cannot get clock validity for id %d\n", __func__, source_id); - return 0; + return false; } - return !!data; + if (data) + return true; + else + return uac_clock_source_is_valid_quirk(chip, fmt, source_id); } -static int __uac_clock_find_source(struct snd_usb_audio *chip, int entity_id, +static int __uac_clock_find_source(struct snd_usb_audio *chip, + struct audioformat *fmt, int entity_id, unsigned long *visited, bool validate) { struct uac_clock_source_descriptor *source; @@ -231,7 +261,7 @@ source = snd_usb_find_clock_source(chip->ctrl_intf, entity_id); if (source) { entity_id = source->bClockID; - if (validate && !uac_clock_source_is_valid(chip, UAC_VERSION_2, + if (validate && !uac_clock_source_is_valid(chip, fmt, entity_id)) { usb_audio_err(chip, "clock source %d is not valid, cannot use\n", @@ -262,8 +292,9 @@ } cur = ret; - ret = __uac_clock_find_source(chip, selector->baCSourceID[ret - 1], - visited, validate); + ret = __uac_clock_find_source(chip, fmt, + selector->baCSourceID[ret - 1], + visited, validate); if (!validate || ret > 0 || !chip->autoclock) return ret; @@ -274,8 +305,9 @@ if (i == cur) continue; - ret = __uac_clock_find_source(chip, selector->baCSourceID[i - 1], - visited, true); + ret = __uac_clock_find_source(chip, fmt, + selector->baCSourceID[i - 1], + visited, true); if (ret < 0) continue; @@ -295,14 +327,16 @@ /* FIXME: multipliers only act as pass-thru element for now */ multiplier = snd_usb_find_clock_multiplier(chip->ctrl_intf, entity_id); if (multiplier) - return __uac_clock_find_source(chip, multiplier->bCSourceID, - visited, validate); + return __uac_clock_find_source(chip, fmt, + multiplier->bCSourceID, + visited, validate); return -EINVAL; } -static int __uac3_clock_find_source(struct snd_usb_audio *chip, int entity_id, - unsigned long *visited, bool validate) +static int __uac3_clock_find_source(struct snd_usb_audio *chip, + struct audioformat *fmt, int entity_id, + unsigned long *visited, bool validate) { struct uac3_clock_source_descriptor *source; struct uac3_clock_selector_descriptor *selector; @@ -321,7 +355,7 @@ source = snd_usb_find_clock_source_v3(chip->ctrl_intf, entity_id); if (source) { entity_id = source->bClockID; - if (validate && !uac_clock_source_is_valid(chip, UAC_VERSION_3, + if (validate && !uac_clock_source_is_valid(chip, fmt, entity_id)) { usb_audio_err(chip, "clock source %d is not valid, cannot use\n", @@ -352,7 +386,8 @@ } cur = ret; - ret = __uac3_clock_find_source(chip, selector->baCSourceID[ret - 1], + ret = __uac3_clock_find_source(chip, fmt, + selector->baCSourceID[ret - 1], visited, validate); if (!validate || ret > 0 || !chip->autoclock) return ret; @@ -364,8 +399,9 @@ if (i == cur) continue; - ret = __uac3_clock_find_source(chip, selector->baCSourceID[i - 1], - visited, true); + ret = __uac3_clock_find_source(chip, fmt, + selector->baCSourceID[i - 1], + visited, true); if (ret < 0) continue; @@ -386,7 +422,8 @@ multiplier = snd_usb_find_clock_multiplier_v3(chip->ctrl_intf, entity_id); if (multiplier) - return __uac3_clock_find_source(chip, multiplier->bCSourceID, + return __uac3_clock_find_source(chip, fmt, + multiplier->bCSourceID, visited, validate); return -EINVAL; @@ -403,18 +440,18 @@ * * Returns the clock source UnitID (>=0) on success, or an error. */ -int snd_usb_clock_find_source(struct snd_usb_audio *chip, int protocol, - int entity_id, bool validate) +int snd_usb_clock_find_source(struct snd_usb_audio *chip, + struct audioformat *fmt, bool validate) { DECLARE_BITMAP(visited, 256); memset(visited, 0, sizeof(visited)); - switch (protocol) { + switch (fmt->protocol) { case UAC_VERSION_2: - return __uac_clock_find_source(chip, entity_id, visited, + return __uac_clock_find_source(chip, fmt, fmt->clock, visited, validate); case UAC_VERSION_3: - return __uac3_clock_find_source(chip, entity_id, visited, + return __uac3_clock_find_source(chip, fmt, fmt->clock, visited, validate); default: return -EINVAL; @@ -515,8 +552,7 @@ * automatic clock selection if the current clock is not * valid. */ - clock = snd_usb_clock_find_source(chip, fmt->protocol, - fmt->clock, true); + clock = snd_usb_clock_find_source(chip, fmt, true); if (clock < 0) { /* We did not find a valid clock, but that might be * because the current sample rate does not match an @@ -524,8 +560,7 @@ * and we will do another validation after setting the * rate. */ - clock = snd_usb_clock_find_source(chip, fmt->protocol, - fmt->clock, false); + clock = snd_usb_clock_find_source(chip, fmt, false); if (clock < 0) return clock; } @@ -591,7 +626,7 @@ validation: /* validate clock after rate change */ - if (!uac_clock_source_is_valid(chip, fmt->protocol, clock)) + if (!uac_clock_source_is_valid(chip, fmt, clock)) return -ENXIO; return 0; } diff -Nru linux-4.19.98/sound/usb/clock.h linux-4.19.118/sound/usb/clock.h --- linux-4.19.98/sound/usb/clock.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/clock.h 2020-04-23 08:30:24.000000000 +0000 @@ -6,7 +6,7 @@ struct usb_host_interface *alts, struct audioformat *fmt, int rate); -int snd_usb_clock_find_source(struct snd_usb_audio *chip, int protocol, - int entity_id, bool validate); +int snd_usb_clock_find_source(struct snd_usb_audio *chip, + struct audioformat *fmt, bool validate); #endif /* __USBAUDIO_CLOCK_H */ diff -Nru linux-4.19.98/sound/usb/format.c linux-4.19.118/sound/usb/format.c --- linux-4.19.98/sound/usb/format.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/format.c 2020-04-23 08:30:24.000000000 +0000 @@ -306,8 +306,7 @@ struct usb_device *dev = chip->dev; unsigned char tmp[2], *data; int nr_triplets, data_size, ret = 0; - int clock = snd_usb_clock_find_source(chip, fp->protocol, - fp->clock, false); + int clock = snd_usb_clock_find_source(chip, fp, false); if (clock < 0) { dev_err(&dev->dev, diff -Nru linux-4.19.98/sound/usb/line6/driver.c linux-4.19.118/sound/usb/line6/driver.c --- linux-4.19.98/sound/usb/line6/driver.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/line6/driver.c 2020-04-23 08:30:24.000000000 +0000 @@ -320,7 +320,7 @@ line6_midibuf_read(mb, line6->buffer_message, LINE6_MIDI_MESSAGE_MAXLEN); - if (done == 0) + if (done <= 0) break; line6->message_length = done; diff -Nru linux-4.19.98/sound/usb/line6/midibuf.c linux-4.19.118/sound/usb/line6/midibuf.c --- linux-4.19.98/sound/usb/line6/midibuf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/line6/midibuf.c 2020-04-23 08:30:24.000000000 +0000 @@ -163,7 +163,7 @@ int midi_length_prev = midibuf_message_length(this->command_prev); - if (midi_length_prev > 0) { + if (midi_length_prev > 1) { midi_length = midi_length_prev - 1; repeat = 1; } else diff -Nru linux-4.19.98/sound/usb/mixer.c linux-4.19.118/sound/usb/mixer.c --- linux-4.19.98/sound/usb/mixer.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/mixer.c 2020-04-23 08:30:24.000000000 +0000 @@ -912,6 +912,15 @@ return 0; } +static int parse_term_effect_unit(struct mixer_build *state, + struct usb_audio_term *term, + void *p1, int id) +{ + term->type = UAC3_EFFECT_UNIT << 16; /* virtual type */ + term->id = id; + return 0; +} + static int parse_term_uac2_clock_source(struct mixer_build *state, struct usb_audio_term *term, void *p1, int id) @@ -996,8 +1005,7 @@ UAC3_PROCESSING_UNIT); case PTYPE(UAC_VERSION_2, UAC2_EFFECT_UNIT): case PTYPE(UAC_VERSION_3, UAC3_EFFECT_UNIT): - return parse_term_proc_unit(state, term, p1, id, - UAC3_EFFECT_UNIT); + return parse_term_effect_unit(state, term, p1, id); case PTYPE(UAC_VERSION_1, UAC1_EXTENSION_UNIT): case PTYPE(UAC_VERSION_2, UAC2_EXTENSION_UNIT_V2): case PTYPE(UAC_VERSION_3, UAC3_EXTENSION_UNIT): @@ -1453,7 +1461,7 @@ usb_audio_err(chip, "cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", UAC_GET_CUR, validx, idx, cval->val_type); - return ret; + return filter_error(cval, ret); } ucontrol->value.integer.value[0] = val; @@ -1757,11 +1765,15 @@ /* Build a mixer control for a UAC connector control (jack-detect) */ static void build_connector_control(struct usb_mixer_interface *mixer, + const struct usbmix_name_map *imap, struct usb_audio_term *term, bool is_input) { struct snd_kcontrol *kctl; struct usb_mixer_elem_info *cval; + if (check_ignored_ctl(find_map(imap, term->id, 0))) + return; + cval = kzalloc(sizeof(*cval), GFP_KERNEL); if (!cval) return; @@ -2099,8 +2111,9 @@ check_input_term(state, term_id, &iterm); /* Check for jack detection. */ - if (uac_v2v3_control_is_readable(bmctls, control)) - build_connector_control(state->mixer, &iterm, true); + if ((iterm.type & 0xff00) != 0x0100 && + uac_v2v3_control_is_readable(bmctls, control)) + build_connector_control(state->mixer, state->map, &iterm, true); return 0; } @@ -3061,13 +3074,13 @@ memset(&iterm, 0, sizeof(iterm)); iterm.id = UAC3_BADD_IT_ID4; iterm.type = UAC_BIDIR_TERMINAL_HEADSET; - build_connector_control(mixer, &iterm, true); + build_connector_control(mixer, map->map, &iterm, true); /* Output Term - Insertion control */ memset(&oterm, 0, sizeof(oterm)); oterm.id = UAC3_BADD_OT_ID3; oterm.type = UAC_BIDIR_TERMINAL_HEADSET; - build_connector_control(mixer, &oterm, false); + build_connector_control(mixer, map->map, &oterm, false); } return 0; @@ -3096,7 +3109,7 @@ if (map->id == state.chip->usb_id) { state.map = map->map; state.selector_map = map->selector_map; - mixer->ignore_ctl_error = map->ignore_ctl_error; + mixer->ignore_ctl_error |= map->ignore_ctl_error; break; } } @@ -3139,10 +3152,11 @@ if (err < 0 && err != -EINVAL) return err; - if (uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls), + if ((state.oterm.type & 0xff00) != 0x0100 && + uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls), UAC2_TE_CONNECTOR)) { - build_connector_control(state.mixer, &state.oterm, - false); + build_connector_control(state.mixer, state.map, + &state.oterm, false); } } else { /* UAC_VERSION_3 */ struct uac3_output_terminal_descriptor *desc = p; @@ -3164,10 +3178,11 @@ if (err < 0 && err != -EINVAL) return err; - if (uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls), + if ((state.oterm.type & 0xff00) != 0x0100 && + uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls), UAC3_TE_INSERTION)) { - build_connector_control(state.mixer, &state.oterm, - false); + build_connector_control(state.mixer, state.map, + &state.oterm, false); } } } @@ -3480,7 +3495,9 @@ if (err < 0) goto _error; - snd_usb_mixer_apply_create_quirk(mixer); + err = snd_usb_mixer_apply_create_quirk(mixer); + if (err < 0) + goto _error; err = snd_device_new(chip->card, SNDRV_DEV_CODEC, mixer, &dev_ops); if (err < 0) diff -Nru linux-4.19.98/sound/usb/mixer_maps.c linux-4.19.118/sound/usb/mixer_maps.c --- linux-4.19.98/sound/usb/mixer_maps.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/mixer_maps.c 2020-04-23 08:30:24.000000000 +0000 @@ -363,6 +363,16 @@ { 0 } }; +/* Some mobos shipped with a dummy HD-audio show the invalid GET_MIN/GET_MAX + * response for Input Gain Pad (id=19, control=12) and the connector status + * for SPDIF terminal (id=18). Skip them. + */ +static const struct usbmix_name_map asus_rog_map[] = { + { 18, NULL }, /* OT, connector control */ + { 19, NULL, 12 }, /* FU, Input Gain Pad */ + {} +}; + /* * Control map entries */ @@ -482,6 +492,26 @@ .id = USB_ID(0x05a7, 0x1020), .map = bose_companion5_map, }, + { /* Gigabyte TRX40 Aorus Pro WiFi */ + .id = USB_ID(0x0414, 0xa002), + .map = asus_rog_map, + }, + { /* ASUS ROG Zenith II */ + .id = USB_ID(0x0b05, 0x1916), + .map = asus_rog_map, + }, + { /* ASUS ROG Strix */ + .id = USB_ID(0x0b05, 0x1917), + .map = asus_rog_map, + }, + { /* MSI TRX40 Creator */ + .id = USB_ID(0x0db0, 0x0d64), + .map = asus_rog_map, + }, + { /* MSI TRX40 */ + .id = USB_ID(0x0db0, 0x543d), + .map = asus_rog_map, + }, { 0 } /* terminator */ }; diff -Nru linux-4.19.98/sound/usb/quirks-table.h linux-4.19.118/sound/usb/quirks-table.h --- linux-4.19.98/sound/usb/quirks-table.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/quirks-table.h 2020-04-23 08:30:24.000000000 +0000 @@ -3349,19 +3349,14 @@ .ifnum = 0, .type = QUIRK_AUDIO_STANDARD_MIXER, }, - /* Capture */ - { - .ifnum = 1, - .type = QUIRK_IGNORE_INTERFACE, - }, /* Playback */ { - .ifnum = 2, + .ifnum = 1, .type = QUIRK_AUDIO_FIXED_ENDPOINT, .data = &(const struct audioformat) { .formats = SNDRV_PCM_FMTBIT_S16_LE, .channels = 2, - .iface = 2, + .iface = 1, .altsetting = 1, .altset_idx = 1, .attributes = UAC_EP_CS_ATTR_FILL_MAX | diff -Nru linux-4.19.98/sound/usb/quirks.c linux-4.19.118/sound/usb/quirks.c --- linux-4.19.98/sound/usb/quirks.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/quirks.c 2020-04-23 08:30:24.000000000 +0000 @@ -1182,6 +1182,7 @@ case USB_ID(0x1395, 0x740a): /* Sennheiser DECT */ case USB_ID(0x1901, 0x0191): /* GE B850V3 CP2114 audio interface */ case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ + case USB_ID(0x2912, 0x30c8): /* Audioengine D1 */ return true; } diff -Nru linux-4.19.98/sound/usb/usx2y/usX2Yhwdep.c linux-4.19.118/sound/usb/usx2y/usX2Yhwdep.c --- linux-4.19.98/sound/usb/usx2y/usX2Yhwdep.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/usx2y/usX2Yhwdep.c 2020-04-23 08:30:24.000000000 +0000 @@ -131,7 +131,7 @@ info->num_dsps = 2; // 0: Prepad Data, 1: FPGA Code if (us428->chip_status & USX2Y_STAT_CHIP_INIT) info->chip_ready = 1; - info->version = USX2Y_DRIVER_VERSION; + info->version = USX2Y_DRIVER_VERSION; return 0; } diff -Nru linux-4.19.98/sound/usb/validate.c linux-4.19.118/sound/usb/validate.c --- linux-4.19.98/sound/usb/validate.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/sound/usb/validate.c 2020-04-23 08:30:24.000000000 +0000 @@ -110,7 +110,7 @@ default: if (v->type == UAC1_EXTENSION_UNIT) return true; /* OK */ - switch (d->wProcessType) { + switch (le16_to_cpu(d->wProcessType)) { case UAC_PROCESS_UP_DOWNMIX: case UAC_PROCESS_DOLBY_PROLOGIC: if (d->bLength < len + 1) /* bNrModes */ @@ -125,7 +125,7 @@ case UAC_VERSION_2: if (v->type == UAC2_EXTENSION_UNIT_V2) return true; /* OK */ - switch (d->wProcessType) { + switch (le16_to_cpu(d->wProcessType)) { case UAC2_PROCESS_UP_DOWNMIX: case UAC2_PROCESS_DOLBY_PROLOCIC: /* SiC! */ if (d->bLength < len + 1) /* bNrModes */ @@ -142,7 +142,7 @@ len += 2; /* wClusterDescrID */ break; } - switch (d->wProcessType) { + switch (le16_to_cpu(d->wProcessType)) { case UAC3_PROCESS_UP_DOWNMIX: if (d->bLength < len + 1) /* bNrModes */ return false; diff -Nru linux-4.19.98/tools/accounting/getdelays.c linux-4.19.118/tools/accounting/getdelays.c --- linux-4.19.98/tools/accounting/getdelays.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/accounting/getdelays.c 2020-04-23 08:30:24.000000000 +0000 @@ -136,7 +136,7 @@ msg.g.version = 0x1; na = (struct nlattr *) GENLMSG_DATA(&msg); na->nla_type = nla_type; - na->nla_len = nla_len + 1 + NLA_HDRLEN; + na->nla_len = nla_len + NLA_HDRLEN; memcpy(NLA_DATA(na), nla_data, nla_len); msg.n.nlmsg_len += NLMSG_ALIGN(na->nla_len); diff -Nru linux-4.19.98/tools/bpf/bpftool/btf_dumper.c linux-4.19.118/tools/bpf/bpftool/btf_dumper.c --- linux-4.19.98/tools/bpf/bpftool/btf_dumper.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/bpf/bpftool/btf_dumper.c 2020-04-23 08:30:24.000000000 +0000 @@ -26,9 +26,9 @@ bool is_plain_text) { if (is_plain_text) - jsonw_printf(jw, "%p", *(unsigned long *)data); + jsonw_printf(jw, "%p", data); else - jsonw_printf(jw, "%u", *(unsigned long *)data); + jsonw_printf(jw, "%lu", *(unsigned long *)data); } static int btf_dumper_modifier(const struct btf_dumper *d, __u32 type_id, @@ -129,7 +129,7 @@ switch (BTF_INT_ENCODING(*int_type)) { case 0: if (BTF_INT_BITS(*int_type) == 64) - jsonw_printf(jw, "%lu", *(__u64 *)data); + jsonw_printf(jw, "%llu", *(__u64 *)data); else if (BTF_INT_BITS(*int_type) == 32) jsonw_printf(jw, "%u", *(__u32 *)data); else if (BTF_INT_BITS(*int_type) == 16) @@ -142,7 +142,7 @@ break; case BTF_INT_SIGNED: if (BTF_INT_BITS(*int_type) == 64) - jsonw_printf(jw, "%ld", *(long long *)data); + jsonw_printf(jw, "%lld", *(long long *)data); else if (BTF_INT_BITS(*int_type) == 32) jsonw_printf(jw, "%d", *(int *)data); else if (BTF_INT_BITS(*int_type) == 16) diff -Nru linux-4.19.98/tools/bpf/bpftool/cgroup.c linux-4.19.118/tools/bpf/bpftool/cgroup.c --- linux-4.19.98/tools/bpf/bpftool/cgroup.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/bpf/bpftool/cgroup.c 2020-04-23 08:30:24.000000000 +0000 @@ -164,7 +164,7 @@ cgroup_fd = open(argv[0], O_RDONLY); if (cgroup_fd < 0) { - p_err("can't open cgroup %s", argv[1]); + p_err("can't open cgroup %s", argv[0]); goto exit; } @@ -345,7 +345,7 @@ cgroup_fd = open(argv[0], O_RDONLY); if (cgroup_fd < 0) { - p_err("can't open cgroup %s", argv[1]); + p_err("can't open cgroup %s", argv[0]); goto exit; } @@ -403,7 +403,7 @@ cgroup_fd = open(argv[0], O_RDONLY); if (cgroup_fd < 0) { - p_err("can't open cgroup %s", argv[1]); + p_err("can't open cgroup %s", argv[0]); goto exit; } diff -Nru linux-4.19.98/tools/bpf/bpftool/map_perf_ring.c linux-4.19.118/tools/bpf/bpftool/map_perf_ring.c --- linux-4.19.98/tools/bpf/bpftool/map_perf_ring.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/bpf/bpftool/map_perf_ring.c 2020-04-23 08:30:24.000000000 +0000 @@ -205,7 +205,7 @@ NEXT_ARG(); cpu = strtoul(*argv, &endptr, 0); if (*endptr) { - p_err("can't parse %s as CPU ID", **argv); + p_err("can't parse %s as CPU ID", *argv); goto err_close_map; } @@ -216,7 +216,7 @@ NEXT_ARG(); index = strtoul(*argv, &endptr, 0); if (*endptr) { - p_err("can't parse %s as index", **argv); + p_err("can't parse %s as index", *argv); goto err_close_map; } diff -Nru linux-4.19.98/tools/gpio/Makefile linux-4.19.118/tools/gpio/Makefile --- linux-4.19.98/tools/gpio/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/gpio/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -35,7 +35,7 @@ prepare: $(OUTPUT)include/linux/gpio.h -GPIO_UTILS_IN := $(output)gpio-utils-in.o +GPIO_UTILS_IN := $(OUTPUT)gpio-utils-in.o $(GPIO_UTILS_IN): prepare FORCE $(Q)$(MAKE) $(build)=gpio-utils diff -Nru linux-4.19.98/tools/include/linux/string.h linux-4.19.118/tools/include/linux/string.h --- linux-4.19.98/tools/include/linux/string.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/include/linux/string.h 2020-04-23 08:30:24.000000000 +0000 @@ -14,7 +14,15 @@ * However uClibc headers also define __GLIBC__ hence the hack below */ #if defined(__GLIBC__) && !defined(__UCLIBC__) +// pragma diagnostic was introduced in gcc 4.6 +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif extern size_t strlcpy(char *dest, const char *src, size_t size); +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic pop +#endif #endif char *str_error_r(int errnum, char *buf, size_t buflen); diff -Nru linux-4.19.98/tools/kvm/kvm_stat/kvm_stat linux-4.19.118/tools/kvm/kvm_stat/kvm_stat --- linux-4.19.98/tools/kvm/kvm_stat/kvm_stat 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/kvm/kvm_stat/kvm_stat 2020-04-23 08:30:24.000000000 +0000 @@ -271,6 +271,7 @@ def __init__(self, exit_reasons): self.sc_perf_evt_open = 298 self.ioctl_numbers = IOCTL_NUMBERS + self.exit_reason_field = 'exit_reason' self.exit_reasons = exit_reasons def debugfs_is_child(self, field): @@ -290,6 +291,7 @@ # numbers depend on the wordsize. char_ptr_size = ctypes.sizeof(ctypes.c_char_p) self.ioctl_numbers['SET_FILTER'] = 0x80002406 | char_ptr_size << 16 + self.exit_reason_field = 'exit_nr' self.exit_reasons = {} def debugfs_is_child(self, field): @@ -301,6 +303,7 @@ def __init__(self): self.sc_perf_evt_open = 241 self.ioctl_numbers = IOCTL_NUMBERS + self.exit_reason_field = 'esr_ec' self.exit_reasons = AARCH64_EXIT_REASONS def debugfs_is_child(self, field): @@ -312,6 +315,7 @@ def __init__(self): self.sc_perf_evt_open = 331 self.ioctl_numbers = IOCTL_NUMBERS + self.exit_reason_field = None self.exit_reasons = None def debugfs_is_child(self, field): @@ -542,8 +546,8 @@ """ filters = {} filters['kvm_userspace_exit'] = ('reason', USERSPACE_EXIT_REASONS) - if ARCH.exit_reasons: - filters['kvm_exit'] = ('exit_reason', ARCH.exit_reasons) + if ARCH.exit_reason_field and ARCH.exit_reasons: + filters['kvm_exit'] = (ARCH.exit_reason_field, ARCH.exit_reasons) return filters def _get_available_fields(self): diff -Nru linux-4.19.98/tools/lib/api/fs/fs.c linux-4.19.118/tools/lib/api/fs/fs.c --- linux-4.19.98/tools/lib/api/fs/fs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/lib/api/fs/fs.c 2020-04-23 08:30:24.000000000 +0000 @@ -210,6 +210,7 @@ size_t name_len = strlen(fs->name); /* name + "_PATH" + '\0' */ char upper_name[name_len + 5 + 1]; + memcpy(upper_name, fs->name, name_len); mem_toupper(upper_name, name_len); strcpy(&upper_name[name_len], "_PATH"); @@ -219,7 +220,8 @@ return false; fs->found = true; - strncpy(fs->path, override_path, sizeof(fs->path)); + strncpy(fs->path, override_path, sizeof(fs->path) - 1); + fs->path[sizeof(fs->path) - 1] = '\0'; return true; } diff -Nru linux-4.19.98/tools/lib/string.c linux-4.19.118/tools/lib/string.c --- linux-4.19.98/tools/lib/string.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/lib/string.c 2020-04-23 08:30:24.000000000 +0000 @@ -95,6 +95,10 @@ * If libc has strlcpy() then that version will override this * implementation: */ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wignored-attributes" +#endif size_t __weak strlcpy(char *dest, const char *src, size_t size) { size_t ret = strlen(src); @@ -106,3 +110,6 @@ } return ret; } +#ifdef __clang__ +#pragma clang diagnostic pop +#endif diff -Nru linux-4.19.98/tools/lib/traceevent/parse-filter.c linux-4.19.118/tools/lib/traceevent/parse-filter.c --- linux-4.19.98/tools/lib/traceevent/parse-filter.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/lib/traceevent/parse-filter.c 2020-04-23 08:30:24.000000000 +0000 @@ -1227,8 +1227,10 @@ } filter_type = add_filter_type(filter, event->id); - if (filter_type == NULL) + if (filter_type == NULL) { + free_arg(arg); return TEP_ERRNO__MEM_ALLOC_FAILED; + } if (filter_type->filter) free_arg(filter_type->filter); diff -Nru linux-4.19.98/tools/objtool/arch/x86/lib/x86-opcode-map.txt linux-4.19.118/tools/objtool/arch/x86/lib/x86-opcode-map.txt --- linux-4.19.98/tools/objtool/arch/x86/lib/x86-opcode-map.txt 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/objtool/arch/x86/lib/x86-opcode-map.txt 2020-04-23 08:30:24.000000000 +0000 @@ -909,7 +909,7 @@ GrpTable: Grp3_2 0: TEST Ev,Iz -1: +1: TEST Ev,Iz 2: NOT Ev 3: NEG Ev 4: MUL rAX,Ev diff -Nru linux-4.19.98/tools/objtool/check.c linux-4.19.118/tools/objtool/check.c --- linux-4.19.98/tools/objtool/check.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/objtool/check.c 2020-04-23 08:30:24.000000000 +0000 @@ -938,10 +938,7 @@ * it. */ for (; - &insn->list != &file->insn_list && - insn->sec == func->sec && - insn->offset >= func->offset; - + &insn->list != &file->insn_list && insn->func && insn->func->pfunc == func; insn = insn->first_jump_src ?: list_prev_entry(insn, list)) { if (insn != orig_insn && insn->type == INSN_JUMP_DYNAMIC) diff -Nru linux-4.19.98/tools/perf/Makefile linux-4.19.118/tools/perf/Makefile --- linux-4.19.98/tools/perf/Makefile 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/Makefile 2020-04-23 08:30:24.000000000 +0000 @@ -35,7 +35,7 @@ # Only pass canonical directory names as the output directory: # ifneq ($(O),) - FULL_O := $(shell readlink -f $(O) || echo $(O)) + FULL_O := $(shell cd $(PWD); readlink -f $(O) || echo $(O)) endif # diff -Nru linux-4.19.98/tools/perf/Makefile.config linux-4.19.118/tools/perf/Makefile.config --- linux-4.19.98/tools/perf/Makefile.config 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/Makefile.config 2020-04-23 08:30:24.000000000 +0000 @@ -205,8 +205,17 @@ PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG)) +# Python 3.8 changed the output of `python-config --ldflags` to not include the +# '-lpythonX.Y' flag unless '--embed' is also passed. The feature check for +# libpython fails if that flag is not included in LDFLAGS +ifeq ($(shell $(PYTHON_CONFIG_SQ) --ldflags --embed 2>&1 1>/dev/null; echo $$?), 0) + PYTHON_CONFIG_LDFLAGS := --ldflags --embed +else + PYTHON_CONFIG_LDFLAGS := --ldflags +endif + ifdef PYTHON_CONFIG - PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null) + PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) $(PYTHON_CONFIG_LDFLAGS) 2>/dev/null) PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS)) PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --includes 2>/dev/null) diff -Nru linux-4.19.98/tools/perf/bench/futex-wake.c linux-4.19.118/tools/perf/bench/futex-wake.c --- linux-4.19.98/tools/perf/bench/futex-wake.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/bench/futex-wake.c 2020-04-23 08:30:24.000000000 +0000 @@ -42,7 +42,7 @@ static pthread_mutex_t thread_lock; static pthread_cond_t thread_parent, thread_worker; static struct stats waketime_stats, wakeup_stats; -static unsigned int ncpus, threads_starting, nthreads = 0; +static unsigned int threads_starting, nthreads = 0; static int futex_flag = 0; static const struct option options[] = { @@ -140,7 +140,7 @@ sigaction(SIGINT, &act, NULL); if (!nthreads) - nthreads = ncpus; + nthreads = cpu->nr; worker = calloc(nthreads, sizeof(*worker)); if (!worker) diff -Nru linux-4.19.98/tools/perf/builtin-c2c.c linux-4.19.118/tools/perf/builtin-c2c.c --- linux-4.19.98/tools/perf/builtin-c2c.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/builtin-c2c.c 2020-04-23 08:30:24.000000000 +0000 @@ -586,8 +586,8 @@ { struct c2c_hist_entry *c2c_left; struct c2c_hist_entry *c2c_right; - unsigned int tot_hitm_left; - unsigned int tot_hitm_right; + uint64_t tot_hitm_left; + uint64_t tot_hitm_right; c2c_left = container_of(left, struct c2c_hist_entry, he); c2c_right = container_of(right, struct c2c_hist_entry, he); @@ -620,7 +620,8 @@ \ c2c_left = container_of(left, struct c2c_hist_entry, he); \ c2c_right = container_of(right, struct c2c_hist_entry, he); \ - return c2c_left->stats.__f - c2c_right->stats.__f; \ + return (uint64_t) c2c_left->stats.__f - \ + (uint64_t) c2c_right->stats.__f; \ } #define STAT_FN(__f) \ @@ -673,7 +674,8 @@ c2c_left = container_of(left, struct c2c_hist_entry, he); c2c_right = container_of(right, struct c2c_hist_entry, he); - return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats); + return (uint64_t) llc_miss(&c2c_left->stats) - + (uint64_t) llc_miss(&c2c_right->stats); } static uint64_t total_records(struct c2c_stats *stats) diff -Nru linux-4.19.98/tools/perf/builtin-report.c linux-4.19.118/tools/perf/builtin-report.c --- linux-4.19.98/tools/perf/builtin-report.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/builtin-report.c 2020-04-23 08:30:24.000000000 +0000 @@ -383,10 +383,10 @@ PERF_SAMPLE_BRANCH_ANY)) rep->nonany_branch_mode = true; -#ifndef HAVE_LIBUNWIND_SUPPORT +#if !defined(HAVE_LIBUNWIND_SUPPORT) && !defined(HAVE_DWARF_SUPPORT) if (dwarf_callchain_users) { - ui__warning("Please install libunwind development packages " - "during the perf build.\n"); + ui__warning("Please install libunwind or libdw " + "development packages during the perf build.\n"); } #endif diff -Nru linux-4.19.98/tools/perf/ui/browsers/hists.c linux-4.19.118/tools/perf/ui/browsers/hists.c --- linux-4.19.98/tools/perf/ui/browsers/hists.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/ui/browsers/hists.c 2020-04-23 08:30:24.000000000 +0000 @@ -2931,6 +2931,7 @@ continue; } + actions->ms.map = map; top = pstack__peek(browser->pstack); if (top == &browser->hists->dso_filter) { /* diff -Nru linux-4.19.98/tools/perf/util/machine.c linux-4.19.118/tools/perf/util/machine.c --- linux-4.19.98/tools/perf/util/machine.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/util/machine.c 2020-04-23 08:30:24.000000000 +0000 @@ -681,24 +681,6 @@ return 0; } -static void dso__adjust_kmod_long_name(struct dso *dso, const char *filename) -{ - const char *dup_filename; - - if (!filename || !dso || !dso->long_name) - return; - if (dso->long_name[0] != '[') - return; - if (!strchr(filename, '/')) - return; - - dup_filename = strdup(filename); - if (!dup_filename) - return; - - dso__set_long_name(dso, dup_filename, true); -} - struct map *machine__findnew_module_map(struct machine *machine, u64 start, const char *filename) { @@ -710,15 +692,8 @@ return NULL; map = map_groups__find_by_name(&machine->kmaps, m.name); - if (map) { - /* - * If the map's dso is an offline module, give dso__load() - * a chance to find the file path of that module by fixing - * long_name. - */ - dso__adjust_kmod_long_name(map->dso, filename); + if (map) goto out; - } dso = machine__findnew_module_dso(machine, &m, filename); if (dso == NULL) diff -Nru linux-4.19.98/tools/perf/util/map.c linux-4.19.118/tools/perf/util/map.c --- linux-4.19.98/tools/perf/util/map.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/util/map.c 2020-04-23 08:30:24.000000000 +0000 @@ -85,7 +85,7 @@ return true; } - if (!strncmp(filename, "/system/lib/", 11)) { + if (!strncmp(filename, "/system/lib/", 12)) { char *ndk, *app; const char *arch; size_t ndk_length; diff -Nru linux-4.19.98/tools/perf/util/probe-finder.c linux-4.19.118/tools/perf/util/probe-finder.c --- linux-4.19.98/tools/perf/util/probe-finder.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/util/probe-finder.c 2020-04-23 08:30:24.000000000 +0000 @@ -623,14 +623,19 @@ return -EINVAL; } - /* Try to get actual symbol name from symtab */ - symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL); + if (dwarf_entrypc(sp_die, &eaddr) == 0) { + /* If the DIE has entrypc, use it. */ + symbol = dwarf_diename(sp_die); + } else { + /* Try to get actual symbol name and address from symtab */ + symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL); + eaddr = sym.st_value; + } if (!symbol) { pr_warning("Failed to find symbol at 0x%lx\n", (unsigned long)paddr); return -ENOENT; } - eaddr = sym.st_value; tp->offset = (unsigned long)(paddr - eaddr); tp->address = (unsigned long)paddr; diff -Nru linux-4.19.98/tools/perf/util/stat-shadow.c linux-4.19.118/tools/perf/util/stat-shadow.c --- linux-4.19.98/tools/perf/util/stat-shadow.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/perf/util/stat-shadow.c 2020-04-23 08:30:24.000000000 +0000 @@ -209,12 +209,12 @@ int cpu, struct runtime_stat *st) { int ctx = evsel_context(counter); + u64 count_ns = count; count *= counter->scale; - if (perf_evsel__match(counter, SOFTWARE, SW_TASK_CLOCK) || - perf_evsel__match(counter, SOFTWARE, SW_CPU_CLOCK)) - update_runtime_stat(st, STAT_NSECS, 0, cpu, count); + if (perf_evsel__is_clock(counter)) + update_runtime_stat(st, STAT_NSECS, 0, cpu, count_ns); else if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES)) update_runtime_stat(st, STAT_CYCLES, ctx, cpu, count); else if (perf_stat_evsel__is(counter, CYCLES_IN_TX)) diff -Nru linux-4.19.98/tools/power/acpi/Makefile.config linux-4.19.118/tools/power/acpi/Makefile.config --- linux-4.19.98/tools/power/acpi/Makefile.config 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/power/acpi/Makefile.config 2020-04-23 08:30:24.000000000 +0000 @@ -18,7 +18,7 @@ OUTPUT=$(srctree)/ ifeq ("$(origin O)", "command line") - OUTPUT := $(O)/power/acpi/ + OUTPUT := $(O)/tools/power/acpi/ endif #$(info Determined 'OUTPUT' to be $(OUTPUT)) diff -Nru linux-4.19.98/tools/power/cpupower/utils/idle_monitor/amd_fam14h_idle.c linux-4.19.118/tools/power/cpupower/utils/idle_monitor/amd_fam14h_idle.c --- linux-4.19.98/tools/power/cpupower/utils/idle_monitor/amd_fam14h_idle.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/power/cpupower/utils/idle_monitor/amd_fam14h_idle.c 2020-04-23 08:30:24.000000000 +0000 @@ -83,7 +83,7 @@ static struct pci_dev *amd_fam14h_pci_dev; static int nbp1_entered; -struct timespec start_time; +static struct timespec start_time; static unsigned long long timediff; #ifdef DEBUG diff -Nru linux-4.19.98/tools/power/cpupower/utils/idle_monitor/cpuidle_sysfs.c linux-4.19.118/tools/power/cpupower/utils/idle_monitor/cpuidle_sysfs.c --- linux-4.19.98/tools/power/cpupower/utils/idle_monitor/cpuidle_sysfs.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/power/cpupower/utils/idle_monitor/cpuidle_sysfs.c 2020-04-23 08:30:24.000000000 +0000 @@ -21,7 +21,7 @@ static unsigned long long **previous_count; static unsigned long long **current_count; -struct timespec start_time; +static struct timespec start_time; static unsigned long long timediff; static int cpuidle_get_count_percent(unsigned int id, double *percent, diff -Nru linux-4.19.98/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.c linux-4.19.118/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.c --- linux-4.19.98/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.c 2020-04-23 08:30:24.000000000 +0000 @@ -29,6 +29,8 @@ 0 }; +int cpu_count; + static struct cpuidle_monitor *monitors[MONITORS_MAX]; static unsigned int avail_monitors; diff -Nru linux-4.19.98/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.h linux-4.19.118/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.h --- linux-4.19.98/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/power/cpupower/utils/idle_monitor/cpupower-monitor.h 2020-04-23 08:30:24.000000000 +0000 @@ -27,7 +27,7 @@ #endif #define CSTATE_DESC_LEN 60 -int cpu_count; +extern int cpu_count; /* Hard to define the right names ...: */ enum power_range_e { diff -Nru linux-4.19.98/tools/power/x86/turbostat/turbostat.c linux-4.19.118/tools/power/x86/turbostat/turbostat.c --- linux-4.19.98/tools/power/x86/turbostat/turbostat.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/power/x86/turbostat/turbostat.c 2020-04-23 08:30:24.000000000 +0000 @@ -299,6 +299,10 @@ void setup_all_buffers(void); +char *sys_lpi_file; +char *sys_lpi_file_sysfs = "/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us"; +char *sys_lpi_file_debugfs = "/sys/kernel/debug/pmc_core/slp_s0_residency_usec"; + int cpu_is_not_present(int cpu) { return !CPU_ISSET_S(cpu, cpu_present_setsize, cpu_present_set); @@ -2844,8 +2848,6 @@ * * record snapshot of * /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us - * - * return 1 if config change requires a restart, else return 0 */ int snapshot_cpu_lpi_us(void) { @@ -2865,17 +2867,14 @@ /* * snapshot_sys_lpi() * - * record snapshot of - * /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us - * - * return 1 if config change requires a restart, else return 0 + * record snapshot of sys_lpi_file */ int snapshot_sys_lpi_us(void) { FILE *fp; int retval; - fp = fopen_or_die("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", "r"); + fp = fopen_or_die(sys_lpi_file, "r"); retval = fscanf(fp, "%lld", &cpuidle_cur_sys_lpi_us); if (retval != 1) @@ -4743,10 +4742,16 @@ else BIC_NOT_PRESENT(BIC_CPU_LPI); - if (!access("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", R_OK)) + if (!access(sys_lpi_file_sysfs, R_OK)) { + sys_lpi_file = sys_lpi_file_sysfs; BIC_PRESENT(BIC_SYS_LPI); - else + } else if (!access(sys_lpi_file_debugfs, R_OK)) { + sys_lpi_file = sys_lpi_file_debugfs; + BIC_PRESENT(BIC_SYS_LPI); + } else { + sys_lpi_file_sysfs = NULL; BIC_NOT_PRESENT(BIC_SYS_LPI); + } if (!quiet) decode_misc_feature_control(); @@ -5144,9 +5149,9 @@ } msrp->msr_num = msr_num; - strncpy(msrp->name, name, NAME_BYTES); + strncpy(msrp->name, name, NAME_BYTES - 1); if (path) - strncpy(msrp->path, path, PATH_BYTES); + strncpy(msrp->path, path, PATH_BYTES - 1); msrp->width = width; msrp->type = type; msrp->format = format; diff -Nru linux-4.19.98/tools/scripts/Makefile.include linux-4.19.118/tools/scripts/Makefile.include --- linux-4.19.98/tools/scripts/Makefile.include 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/scripts/Makefile.include 2020-04-23 08:30:24.000000000 +0000 @@ -1,8 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 ifneq ($(O),) ifeq ($(origin O), command line) - dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),) - ABSOLUTE_O := $(shell cd $(O) ; pwd) + dummy := $(if $(shell cd $(PWD); test -d $(O) || echo $(O)),$(error O=$(O) does not exist),) + ABSOLUTE_O := $(shell cd $(PWD); cd $(O) ; pwd) OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/) COMMAND_O := O=$(ABSOLUTE_O) ifeq ($(objtree),) diff -Nru linux-4.19.98/tools/testing/ktest/ktest.pl linux-4.19.118/tools/testing/ktest/ktest.pl --- linux-4.19.98/tools/testing/ktest/ktest.pl 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/ktest/ktest.pl 2020-04-23 08:30:24.000000000 +0000 @@ -1372,7 +1372,7 @@ } else { # Make sure everything has been written to disk - run_ssh("sync"); + run_ssh("sync", 10); if (defined($time)) { start_monitor; diff -Nru linux-4.19.98/tools/testing/selftests/bpf/test_select_reuseport.c linux-4.19.118/tools/testing/selftests/bpf/test_select_reuseport.c --- linux-4.19.98/tools/testing/selftests/bpf/test_select_reuseport.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/bpf/test_select_reuseport.c 2020-04-23 08:30:24.000000000 +0000 @@ -30,7 +30,7 @@ #define REUSEPORT_ARRAY_SIZE 32 static int result_map, tmp_index_ovr_map, linum_map, data_check_map; -static enum result expected_results[NR_RESULTS]; +static __u32 expected_results[NR_RESULTS]; static int sk_fds[REUSEPORT_ARRAY_SIZE]; static int reuseport_array, outer_map; static int select_by_skb_data_prog; @@ -610,7 +610,19 @@ static void cleanup_per_test(void) { - int i, err; + int i, err, zero = 0; + + memset(expected_results, 0, sizeof(expected_results)); + + for (i = 0; i < NR_RESULTS; i++) { + err = bpf_map_update_elem(result_map, &i, &zero, BPF_ANY); + RET_IF(err, "reset elem in result_map", + "i:%u err:%d errno:%d\n", i, err, errno); + } + + err = bpf_map_update_elem(linum_map, &zero, &zero, BPF_ANY); + RET_IF(err, "reset line number in linum_map", "err:%d errno:%d\n", + err, errno); for (i = 0; i < REUSEPORT_ARRAY_SIZE; i++) close(sk_fds[i]); diff -Nru linux-4.19.98/tools/testing/selftests/ipc/msgque.c linux-4.19.118/tools/testing/selftests/ipc/msgque.c --- linux-4.19.98/tools/testing/selftests/ipc/msgque.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/ipc/msgque.c 2020-04-23 08:30:24.000000000 +0000 @@ -1,9 +1,10 @@ // SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE #include #include #include #include -#include +#include #include #include "../kselftest.h" @@ -73,7 +74,7 @@ return 0; destroy: - if (msgctl(id, IPC_RMID, 0)) + if (msgctl(id, IPC_RMID, NULL)) printf("Failed to destroy queue: %d\n", -errno); return ret; } @@ -120,7 +121,7 @@ ret = 0; err: - if (msgctl(msgque->msq_id, IPC_RMID, 0)) { + if (msgctl(msgque->msq_id, IPC_RMID, NULL)) { printf("Failed to destroy queue: %d\n", -errno); return -errno; } @@ -129,7 +130,7 @@ int dump_queue(struct msgque_data *msgque) { - struct msqid64_ds ds; + struct msqid_ds ds; int kern_id; int i, ret; @@ -245,7 +246,7 @@ return ksft_exit_pass(); err_destroy: - if (msgctl(msgque.msq_id, IPC_RMID, 0)) { + if (msgctl(msgque.msq_id, IPC_RMID, NULL)) { printf("Failed to destroy queue: %d\n", -errno); return ksft_exit_fail(); } diff -Nru linux-4.19.98/tools/testing/selftests/lib.mk linux-4.19.118/tools/testing/selftests/lib.mk --- linux-4.19.98/tools/testing/selftests/lib.mk 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/lib.mk 2020-04-23 08:30:24.000000000 +0000 @@ -85,17 +85,20 @@ $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS)) endif +define INSTALL_SINGLE_RULE + $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH)) + $(if $(INSTALL_LIST),@echo rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/) + $(if $(INSTALL_LIST),@rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/) +endef + define INSTALL_RULE - @if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \ - mkdir -p ${INSTALL_PATH}; \ - echo "rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/"; \ - rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/; \ - fi - @if [ "X$(TEST_GEN_PROGS)$(TEST_CUSTOM_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then \ - mkdir -p ${INSTALL_PATH}; \ - echo "rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/"; \ - rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/; \ - fi + $(eval INSTALL_LIST = $(TEST_PROGS)) $(INSTALL_SINGLE_RULE) + $(eval INSTALL_LIST = $(TEST_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE) + $(eval INSTALL_LIST = $(TEST_FILES)) $(INSTALL_SINGLE_RULE) + $(eval INSTALL_LIST = $(TEST_GEN_PROGS)) $(INSTALL_SINGLE_RULE) + $(eval INSTALL_LIST = $(TEST_CUSTOM_PROGS)) $(INSTALL_SINGLE_RULE) + $(eval INSTALL_LIST = $(TEST_GEN_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE) + $(eval INSTALL_LIST = $(TEST_GEN_FILES)) $(INSTALL_SINGLE_RULE) endef install: all diff -Nru linux-4.19.98/tools/testing/selftests/net/fib_tests.sh linux-4.19.118/tools/testing/selftests/net/fib_tests.sh --- linux-4.19.98/tools/testing/selftests/net/fib_tests.sh 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/net/fib_tests.sh 2020-04-23 08:30:24.000000000 +0000 @@ -848,6 +848,12 @@ check_route6 "2001:db8:104::/64 via 2001:db8:101::3 dev veth1 metric 1024" log_test $? 0 "Multipath with single path via multipath attribute" + # multipath with dev-only + add_initial_route6 "nexthop via 2001:db8:101::2 nexthop via 2001:db8:103::2" + run_cmd "$IP -6 ro replace 2001:db8:104::/64 dev veth1" + check_route6 "2001:db8:104::/64 dev veth1 metric 1024" + log_test $? 0 "Multipath with dev-only" + # route replace fails - invalid nexthop 1 add_initial_route6 "nexthop via 2001:db8:101::2 nexthop via 2001:db8:103::2" run_cmd "$IP -6 ro replace 2001:db8:104::/64 nexthop via 2001:db8:111::3 nexthop via 2001:db8:103::3" @@ -973,6 +979,27 @@ fi log_test $rc 0 "Prefix route with metric on link up" + # verify peer metric added correctly + set -e + run_cmd "$IP -6 addr flush dev dummy2" + run_cmd "$IP -6 addr add dev dummy2 2001:db8:104::1 peer 2001:db8:104::2 metric 260" + set +e + + check_route6 "2001:db8:104::1 dev dummy2 proto kernel metric 260" + log_test $? 0 "Set metric with peer route on local side" + log_test $? 0 "User specified metric on local address" + check_route6 "2001:db8:104::2 dev dummy2 proto kernel metric 260" + log_test $? 0 "Set metric with peer route on peer side" + + set -e + run_cmd "$IP -6 addr change dev dummy2 2001:db8:104::1 peer 2001:db8:104::3 metric 261" + set +e + + check_route6 "2001:db8:104::1 dev dummy2 proto kernel metric 261" + log_test $? 0 "Modify metric and peer address on local side" + check_route6 "2001:db8:104::3 dev dummy2 proto kernel metric 261" + log_test $? 0 "Modify metric and peer address on peer side" + $IP li del dummy1 $IP li del dummy2 cleanup @@ -1314,13 +1341,20 @@ run_cmd "$IP addr flush dev dummy2" run_cmd "$IP addr add dev dummy2 172.16.104.1/32 peer 172.16.104.2 metric 260" - run_cmd "$IP addr change dev dummy2 172.16.104.1/32 peer 172.16.104.2 metric 261" rc=$? if [ $rc -eq 0 ]; then - check_route "172.16.104.2 dev dummy2 proto kernel scope link src 172.16.104.1 metric 261" + check_route "172.16.104.2 dev dummy2 proto kernel scope link src 172.16.104.1 metric 260" + rc=$? + fi + log_test $rc 0 "Set metric of address with peer route" + + run_cmd "$IP addr change dev dummy2 172.16.104.1/32 peer 172.16.104.3 metric 261" + rc=$? + if [ $rc -eq 0 ]; then + check_route "172.16.104.3 dev dummy2 proto kernel scope link src 172.16.104.1 metric 261" rc=$? fi - log_test $rc 0 "Modify metric of address with peer route" + log_test $rc 0 "Modify metric and peer address for peer route" $IP li del dummy1 $IP li del dummy2 diff -Nru linux-4.19.98/tools/testing/selftests/net/forwarding/mirror_gre.sh linux-4.19.118/tools/testing/selftests/net/forwarding/mirror_gre.sh --- linux-4.19.98/tools/testing/selftests/net/forwarding/mirror_gre.sh 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/net/forwarding/mirror_gre.sh 2020-04-23 08:30:24.000000000 +0000 @@ -63,22 +63,23 @@ { local tundev=$1; shift local direction=$1; shift - local prot=$1; shift local what=$1; shift - local swp3mac=$(mac_get $swp3) - local h3mac=$(mac_get $h3) + case "$direction" in + ingress) local src_mac=$(mac_get $h1); local dst_mac=$(mac_get $h2) + ;; + egress) local src_mac=$(mac_get $h2); local dst_mac=$(mac_get $h1) + ;; + esac RET=0 mirror_install $swp1 $direction $tundev "matchall $tcflags" - tc filter add dev $h3 ingress pref 77 prot $prot \ - flower ip_proto 0x2f src_mac $swp3mac dst_mac $h3mac \ - action pass + icmp_capture_install h3-${tundev} "src_mac $src_mac dst_mac $dst_mac" - mirror_test v$h1 192.0.2.1 192.0.2.2 $h3 77 10 + mirror_test v$h1 192.0.2.1 192.0.2.2 h3-${tundev} 100 10 - tc filter del dev $h3 ingress pref 77 + icmp_capture_uninstall h3-${tundev} mirror_uninstall $swp1 $direction log_test "$direction $what: envelope MAC ($tcflags)" @@ -120,14 +121,14 @@ test_gretap_mac() { - test_span_gre_mac gt4 ingress ip "mirror to gretap" - test_span_gre_mac gt4 egress ip "mirror to gretap" + test_span_gre_mac gt4 ingress "mirror to gretap" + test_span_gre_mac gt4 egress "mirror to gretap" } test_ip6gretap_mac() { - test_span_gre_mac gt6 ingress ipv6 "mirror to ip6gretap" - test_span_gre_mac gt6 egress ipv6 "mirror to ip6gretap" + test_span_gre_mac gt6 ingress "mirror to ip6gretap" + test_span_gre_mac gt6 egress "mirror to ip6gretap" } test_all() diff -Nru linux-4.19.98/tools/testing/selftests/size/get_size.c linux-4.19.118/tools/testing/selftests/size/get_size.c --- linux-4.19.98/tools/testing/selftests/size/get_size.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/size/get_size.c 2020-04-23 08:30:24.000000000 +0000 @@ -12,23 +12,35 @@ * own execution. It also attempts to have as few dependencies * on kernel features as possible. * - * It should be statically linked, with startup libs avoided. - * It uses no library calls, and only the following 3 syscalls: + * It should be statically linked, with startup libs avoided. It uses + * no library calls except the syscall() function for the following 3 + * syscalls: * sysinfo(), write(), and _exit() * * For output, it avoids printf (which in some C libraries * has large external dependencies) by implementing it's own * number output and print routines, and using __builtin_strlen() + * + * The test may crash if any of the above syscalls fails because in some + * libc implementations (e.g. the GNU C Library) errno is saved in + * thread-local storage, which does not get initialized due to avoiding + * startup libs. */ #include #include +#include #define STDOUT_FILENO 1 static int print(const char *s) { - return write(STDOUT_FILENO, s, __builtin_strlen(s)); + size_t len = 0; + + while (s[len] != '\0') + len++; + + return syscall(SYS_write, STDOUT_FILENO, s, len); } static inline char *num_to_str(unsigned long num, char *buf, int len) @@ -80,12 +92,12 @@ print("TAP version 13\n"); print("# Testing system size.\n"); - ccode = sysinfo(&info); + ccode = syscall(SYS_sysinfo, &info); if (ccode < 0) { print("not ok 1"); print(test_name); print(" ---\n reason: \"could not get sysinfo\"\n ...\n"); - _exit(ccode); + syscall(SYS_exit, ccode); } print("ok 1"); print(test_name); @@ -101,5 +113,5 @@ print(" ...\n"); print("1..1\n"); - _exit(0); + syscall(SYS_exit, 0); } diff -Nru linux-4.19.98/tools/testing/selftests/vm/mlock2-tests.c linux-4.19.118/tools/testing/selftests/vm/mlock2-tests.c --- linux-4.19.98/tools/testing/selftests/vm/mlock2-tests.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/vm/mlock2-tests.c 2020-04-23 08:30:24.000000000 +0000 @@ -67,59 +67,6 @@ return ret; } -static uint64_t get_pageflags(unsigned long addr) -{ - FILE *file; - uint64_t pfn; - unsigned long offset; - - file = fopen("/proc/self/pagemap", "r"); - if (!file) { - perror("fopen pagemap"); - _exit(1); - } - - offset = addr / getpagesize() * sizeof(pfn); - - if (fseek(file, offset, SEEK_SET)) { - perror("fseek pagemap"); - _exit(1); - } - - if (fread(&pfn, sizeof(pfn), 1, file) != 1) { - perror("fread pagemap"); - _exit(1); - } - - fclose(file); - return pfn; -} - -static uint64_t get_kpageflags(unsigned long pfn) -{ - uint64_t flags; - FILE *file; - - file = fopen("/proc/kpageflags", "r"); - if (!file) { - perror("fopen kpageflags"); - _exit(1); - } - - if (fseek(file, pfn * sizeof(flags), SEEK_SET)) { - perror("fseek kpageflags"); - _exit(1); - } - - if (fread(&flags, sizeof(flags), 1, file) != 1) { - perror("fread kpageflags"); - _exit(1); - } - - fclose(file); - return flags; -} - #define VMFLAGS "VmFlags:" static bool is_vmflag_set(unsigned long addr, const char *vmflag) @@ -159,19 +106,13 @@ #define RSS "Rss:" #define LOCKED "lo" -static bool is_vma_lock_on_fault(unsigned long addr) +static unsigned long get_value_for_name(unsigned long addr, const char *name) { - bool ret = false; - bool locked; - FILE *smaps = NULL; - unsigned long vma_size, vma_rss; char *line = NULL; - char *value; size_t size = 0; - - locked = is_vmflag_set(addr, LOCKED); - if (!locked) - goto out; + char *value_ptr; + FILE *smaps = NULL; + unsigned long value = -1UL; smaps = seek_to_smaps_entry(addr); if (!smaps) { @@ -180,112 +121,70 @@ } while (getline(&line, &size, smaps) > 0) { - if (!strstr(line, SIZE)) { + if (!strstr(line, name)) { free(line); line = NULL; size = 0; continue; } - value = line + strlen(SIZE); - if (sscanf(value, "%lu kB", &vma_size) < 1) { + value_ptr = line + strlen(name); + if (sscanf(value_ptr, "%lu kB", &value) < 1) { printf("Unable to parse smaps entry for Size\n"); goto out; } break; } - while (getline(&line, &size, smaps) > 0) { - if (!strstr(line, RSS)) { - free(line); - line = NULL; - size = 0; - continue; - } - - value = line + strlen(RSS); - if (sscanf(value, "%lu kB", &vma_rss) < 1) { - printf("Unable to parse smaps entry for Rss\n"); - goto out; - } - break; - } - - ret = locked && (vma_rss < vma_size); out: - free(line); if (smaps) fclose(smaps); - return ret; + free(line); + return value; } -#define PRESENT_BIT 0x8000000000000000ULL -#define PFN_MASK 0x007FFFFFFFFFFFFFULL -#define UNEVICTABLE_BIT (1UL << 18) - -static int lock_check(char *map) +static bool is_vma_lock_on_fault(unsigned long addr) { - unsigned long page_size = getpagesize(); - uint64_t page1_flags, page2_flags; + bool locked; + unsigned long vma_size, vma_rss; + + locked = is_vmflag_set(addr, LOCKED); + if (!locked) + return false; - page1_flags = get_pageflags((unsigned long)map); - page2_flags = get_pageflags((unsigned long)map + page_size); + vma_size = get_value_for_name(addr, SIZE); + vma_rss = get_value_for_name(addr, RSS); - /* Both pages should be present */ - if (((page1_flags & PRESENT_BIT) == 0) || - ((page2_flags & PRESENT_BIT) == 0)) { - printf("Failed to make both pages present\n"); - return 1; - } + /* only one page is faulted in */ + return (vma_rss < vma_size); +} - page1_flags = get_kpageflags(page1_flags & PFN_MASK); - page2_flags = get_kpageflags(page2_flags & PFN_MASK); +#define PRESENT_BIT 0x8000000000000000ULL +#define PFN_MASK 0x007FFFFFFFFFFFFFULL +#define UNEVICTABLE_BIT (1UL << 18) - /* Both pages should be unevictable */ - if (((page1_flags & UNEVICTABLE_BIT) == 0) || - ((page2_flags & UNEVICTABLE_BIT) == 0)) { - printf("Failed to make both pages unevictable\n"); - return 1; - } +static int lock_check(unsigned long addr) +{ + bool locked; + unsigned long vma_size, vma_rss; - if (!is_vmflag_set((unsigned long)map, LOCKED)) { - printf("VMA flag %s is missing on page 1\n", LOCKED); - return 1; - } + locked = is_vmflag_set(addr, LOCKED); + if (!locked) + return false; - if (!is_vmflag_set((unsigned long)map + page_size, LOCKED)) { - printf("VMA flag %s is missing on page 2\n", LOCKED); - return 1; - } + vma_size = get_value_for_name(addr, SIZE); + vma_rss = get_value_for_name(addr, RSS); - return 0; + return (vma_rss == vma_size); } static int unlock_lock_check(char *map) { - unsigned long page_size = getpagesize(); - uint64_t page1_flags, page2_flags; - - page1_flags = get_pageflags((unsigned long)map); - page2_flags = get_pageflags((unsigned long)map + page_size); - page1_flags = get_kpageflags(page1_flags & PFN_MASK); - page2_flags = get_kpageflags(page2_flags & PFN_MASK); - - if ((page1_flags & UNEVICTABLE_BIT) || (page2_flags & UNEVICTABLE_BIT)) { - printf("A page is still marked unevictable after unlock\n"); - return 1; - } - if (is_vmflag_set((unsigned long)map, LOCKED)) { printf("VMA flag %s is present on page 1 after unlock\n", LOCKED); return 1; } - if (is_vmflag_set((unsigned long)map + page_size, LOCKED)) { - printf("VMA flag %s is present on page 2 after unlock\n", LOCKED); - return 1; - } - return 0; } @@ -311,7 +210,7 @@ goto unmap; } - if (lock_check(map)) + if (!lock_check((unsigned long)map)) goto unmap; /* Now unlock and recheck attributes */ @@ -330,64 +229,18 @@ static int onfault_check(char *map) { - unsigned long page_size = getpagesize(); - uint64_t page1_flags, page2_flags; - - page1_flags = get_pageflags((unsigned long)map); - page2_flags = get_pageflags((unsigned long)map + page_size); - - /* Neither page should be present */ - if ((page1_flags & PRESENT_BIT) || (page2_flags & PRESENT_BIT)) { - printf("Pages were made present by MLOCK_ONFAULT\n"); - return 1; - } - *map = 'a'; - page1_flags = get_pageflags((unsigned long)map); - page2_flags = get_pageflags((unsigned long)map + page_size); - - /* Only page 1 should be present */ - if ((page1_flags & PRESENT_BIT) == 0) { - printf("Page 1 is not present after fault\n"); - return 1; - } else if (page2_flags & PRESENT_BIT) { - printf("Page 2 was made present\n"); - return 1; - } - - page1_flags = get_kpageflags(page1_flags & PFN_MASK); - - /* Page 1 should be unevictable */ - if ((page1_flags & UNEVICTABLE_BIT) == 0) { - printf("Failed to make faulted page unevictable\n"); - return 1; - } - if (!is_vma_lock_on_fault((unsigned long)map)) { printf("VMA is not marked for lock on fault\n"); return 1; } - if (!is_vma_lock_on_fault((unsigned long)map + page_size)) { - printf("VMA is not marked for lock on fault\n"); - return 1; - } - return 0; } static int unlock_onfault_check(char *map) { unsigned long page_size = getpagesize(); - uint64_t page1_flags; - - page1_flags = get_pageflags((unsigned long)map); - page1_flags = get_kpageflags(page1_flags & PFN_MASK); - - if (page1_flags & UNEVICTABLE_BIT) { - printf("Page 1 is still marked unevictable after unlock\n"); - return 1; - } if (is_vma_lock_on_fault((unsigned long)map) || is_vma_lock_on_fault((unsigned long)map + page_size)) { @@ -445,7 +298,6 @@ char *map; int ret = 1; unsigned long page_size = getpagesize(); - uint64_t page1_flags, page2_flags; map = mmap(NULL, 2 * page_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); @@ -465,17 +317,6 @@ goto unmap; } - page1_flags = get_pageflags((unsigned long)map); - page2_flags = get_pageflags((unsigned long)map + page_size); - page1_flags = get_kpageflags(page1_flags & PFN_MASK); - page2_flags = get_kpageflags(page2_flags & PFN_MASK); - - /* Page 1 should be unevictable */ - if ((page1_flags & UNEVICTABLE_BIT) == 0) { - printf("Failed to make present page unevictable\n"); - goto unmap; - } - if (!is_vma_lock_on_fault((unsigned long)map) || !is_vma_lock_on_fault((unsigned long)map + page_size)) { printf("VMA with present pages is not marked lock on fault\n"); @@ -507,7 +348,7 @@ goto out; } - if (lock_check(map)) + if (!lock_check((unsigned long)map)) goto unmap; if (munlockall()) { @@ -549,7 +390,7 @@ goto out; } - if (lock_check(map)) + if (!lock_check((unsigned long)map)) goto unmap; if (munlockall()) { diff -Nru linux-4.19.98/tools/testing/selftests/x86/ptrace_syscall.c linux-4.19.118/tools/testing/selftests/x86/ptrace_syscall.c --- linux-4.19.98/tools/testing/selftests/x86/ptrace_syscall.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/testing/selftests/x86/ptrace_syscall.c 2020-04-23 08:30:24.000000000 +0000 @@ -414,8 +414,12 @@ #if defined(__i386__) && (!defined(__GLIBC__) || __GLIBC__ > 2 || __GLIBC_MINOR__ >= 16) vsyscall32 = (void *)getauxval(AT_SYSINFO); - printf("[RUN]\tCheck AT_SYSINFO return regs\n"); - test_sys32_regs(do_full_vsyscall32); + if (vsyscall32) { + printf("[RUN]\tCheck AT_SYSINFO return regs\n"); + test_sys32_regs(do_full_vsyscall32); + } else { + printf("[SKIP]\tAT_SYSINFO is not available\n"); + } #endif test_ptrace_syscall_restart(); diff -Nru linux-4.19.98/tools/usb/usbip/src/usbip_network.c linux-4.19.118/tools/usb/usbip/src/usbip_network.c --- linux-4.19.98/tools/usb/usbip/src/usbip_network.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/usb/usbip/src/usbip_network.c 2020-04-23 08:30:24.000000000 +0000 @@ -62,39 +62,39 @@ info("using port %d (\"%s\")", usbip_port, usbip_port_string); } -void usbip_net_pack_uint32_t(int pack, uint32_t *num) +uint32_t usbip_net_pack_uint32_t(int pack, uint32_t num) { uint32_t i; if (pack) - i = htonl(*num); + i = htonl(num); else - i = ntohl(*num); + i = ntohl(num); - *num = i; + return i; } -void usbip_net_pack_uint16_t(int pack, uint16_t *num) +uint16_t usbip_net_pack_uint16_t(int pack, uint16_t num) { uint16_t i; if (pack) - i = htons(*num); + i = htons(num); else - i = ntohs(*num); + i = ntohs(num); - *num = i; + return i; } void usbip_net_pack_usb_device(int pack, struct usbip_usb_device *udev) { - usbip_net_pack_uint32_t(pack, &udev->busnum); - usbip_net_pack_uint32_t(pack, &udev->devnum); - usbip_net_pack_uint32_t(pack, &udev->speed); - - usbip_net_pack_uint16_t(pack, &udev->idVendor); - usbip_net_pack_uint16_t(pack, &udev->idProduct); - usbip_net_pack_uint16_t(pack, &udev->bcdDevice); + udev->busnum = usbip_net_pack_uint32_t(pack, udev->busnum); + udev->devnum = usbip_net_pack_uint32_t(pack, udev->devnum); + udev->speed = usbip_net_pack_uint32_t(pack, udev->speed); + + udev->idVendor = usbip_net_pack_uint16_t(pack, udev->idVendor); + udev->idProduct = usbip_net_pack_uint16_t(pack, udev->idProduct); + udev->bcdDevice = usbip_net_pack_uint16_t(pack, udev->bcdDevice); } void usbip_net_pack_usb_interface(int pack __attribute__((unused)), @@ -141,6 +141,14 @@ return usbip_net_xmit(sockfd, buff, bufflen, 1); } +static inline void usbip_net_pack_op_common(int pack, + struct op_common *op_common) +{ + op_common->version = usbip_net_pack_uint16_t(pack, op_common->version); + op_common->code = usbip_net_pack_uint16_t(pack, op_common->code); + op_common->status = usbip_net_pack_uint32_t(pack, op_common->status); +} + int usbip_net_send_op_common(int sockfd, uint32_t code, uint32_t status) { struct op_common op_common; @@ -152,7 +160,7 @@ op_common.code = code; op_common.status = status; - PACK_OP_COMMON(1, &op_common); + usbip_net_pack_op_common(1, &op_common); rc = usbip_net_send(sockfd, &op_common, sizeof(op_common)); if (rc < 0) { @@ -176,7 +184,7 @@ goto err; } - PACK_OP_COMMON(0, &op_common); + usbip_net_pack_op_common(0, &op_common); if (op_common.version != USBIP_VERSION) { err("USBIP Kernel and tool version mismatch: %d %d:", diff -Nru linux-4.19.98/tools/usb/usbip/src/usbip_network.h linux-4.19.118/tools/usb/usbip/src/usbip_network.h --- linux-4.19.98/tools/usb/usbip/src/usbip_network.h 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/tools/usb/usbip/src/usbip_network.h 2020-04-23 08:30:24.000000000 +0000 @@ -32,12 +32,6 @@ } __attribute__((packed)); -#define PACK_OP_COMMON(pack, op_common) do {\ - usbip_net_pack_uint16_t(pack, &(op_common)->version);\ - usbip_net_pack_uint16_t(pack, &(op_common)->code);\ - usbip_net_pack_uint32_t(pack, &(op_common)->status);\ -} while (0) - /* ---------------------------------------------------------------------- */ /* Dummy Code */ #define OP_UNSPEC 0x00 @@ -163,11 +157,11 @@ } while (0) #define PACK_OP_DEVLIST_REPLY(pack, reply) do {\ - usbip_net_pack_uint32_t(pack, &(reply)->ndev);\ + (reply)->ndev = usbip_net_pack_uint32_t(pack, (reply)->ndev);\ } while (0) -void usbip_net_pack_uint32_t(int pack, uint32_t *num); -void usbip_net_pack_uint16_t(int pack, uint16_t *num); +uint32_t usbip_net_pack_uint32_t(int pack, uint32_t num); +uint16_t usbip_net_pack_uint16_t(int pack, uint16_t num); void usbip_net_pack_usb_device(int pack, struct usbip_usb_device *udev); void usbip_net_pack_usb_interface(int pack, struct usbip_usb_interface *uinf); diff -Nru linux-4.19.98/usr/Kconfig linux-4.19.118/usr/Kconfig --- linux-4.19.98/usr/Kconfig 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/usr/Kconfig 2020-04-23 08:30:24.000000000 +0000 @@ -131,17 +131,6 @@ If in doubt, select 'None' -config INITRAMFS_COMPRESSION_NONE - bool "None" - help - Do not compress the built-in initramfs at all. This may sound wasteful - in space, but, you should be aware that the built-in initramfs will be - compressed at a later stage anyways along with the rest of the kernel, - on those architectures that support this. However, not compressing the - initramfs may lead to slightly higher memory consumption during a - short time at boot, while both the cpio image and the unpacked - filesystem image will be present in memory simultaneously - config INITRAMFS_COMPRESSION_GZIP bool "Gzip" depends on RD_GZIP @@ -214,6 +203,17 @@ If you choose this, keep in mind that most distros don't provide lz4 by default which could cause a build failure. +config INITRAMFS_COMPRESSION_NONE + bool "None" + help + Do not compress the built-in initramfs at all. This may sound wasteful + in space, but, you should be aware that the built-in initramfs will be + compressed at a later stage anyways along with the rest of the kernel, + on those architectures that support this. However, not compressing the + initramfs may lead to slightly higher memory consumption during a + short time at boot, while both the cpio image and the unpacked + filesystem image will be present in memory simultaneously + endchoice config INITRAMFS_COMPRESSION diff -Nru linux-4.19.98/virt/kvm/arm/aarch32.c linux-4.19.118/virt/kvm/arm/aarch32.c --- linux-4.19.98/virt/kvm/arm/aarch32.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/virt/kvm/arm/aarch32.c 2020-04-23 08:30:24.000000000 +0000 @@ -21,10 +21,15 @@ * along with this program. If not, see . */ +#include #include #include #include +#define DFSR_FSC_EXTABT_LPAE 0x10 +#define DFSR_FSC_EXTABT_nLPAE 0x08 +#define DFSR_LPAE BIT(9) + /* * Table taken from ARMv8 ARM DDI0487B-B, table G1-10. */ @@ -39,25 +44,115 @@ [7] = { 4, 4 }, /* FIQ, unused */ }; -static void prepare_fault32(struct kvm_vcpu *vcpu, u32 mode, u32 vect_offset) +/* + * When an exception is taken, most CPSR fields are left unchanged in the + * handler. However, some are explicitly overridden (e.g. M[4:0]). + * + * The SPSR/SPSR_ELx layouts differ, and the below is intended to work with + * either format. Note: SPSR.J bit doesn't exist in SPSR_ELx, but this bit was + * obsoleted by the ARMv7 virtualization extensions and is RES0. + * + * For the SPSR layout seen from AArch32, see: + * - ARM DDI 0406C.d, page B1-1148 + * - ARM DDI 0487E.a, page G8-6264 + * + * For the SPSR_ELx layout for AArch32 seen from AArch64, see: + * - ARM DDI 0487E.a, page C5-426 + * + * Here we manipulate the fields in order of the AArch32 SPSR_ELx layout, from + * MSB to LSB. + */ +static unsigned long get_except32_cpsr(struct kvm_vcpu *vcpu, u32 mode) { - unsigned long cpsr; - unsigned long new_spsr_value = *vcpu_cpsr(vcpu); - bool is_thumb = (new_spsr_value & PSR_AA32_T_BIT); - u32 return_offset = return_offsets[vect_offset >> 2][is_thumb]; u32 sctlr = vcpu_cp15(vcpu, c1_SCTLR); + unsigned long old, new; + + old = *vcpu_cpsr(vcpu); + new = 0; + + new |= (old & PSR_AA32_N_BIT); + new |= (old & PSR_AA32_Z_BIT); + new |= (old & PSR_AA32_C_BIT); + new |= (old & PSR_AA32_V_BIT); + new |= (old & PSR_AA32_Q_BIT); + + // CPSR.IT[7:0] are set to zero upon any exception + // See ARM DDI 0487E.a, section G1.12.3 + // See ARM DDI 0406C.d, section B1.8.3 + + new |= (old & PSR_AA32_DIT_BIT); + + // CPSR.SSBS is set to SCTLR.DSSBS upon any exception + // See ARM DDI 0487E.a, page G8-6244 + if (sctlr & BIT(31)) + new |= PSR_AA32_SSBS_BIT; + + // CPSR.PAN is unchanged unless SCTLR.SPAN == 0b0 + // SCTLR.SPAN is RES1 when ARMv8.1-PAN is not implemented + // See ARM DDI 0487E.a, page G8-6246 + new |= (old & PSR_AA32_PAN_BIT); + if (!(sctlr & BIT(23))) + new |= PSR_AA32_PAN_BIT; + + // SS does not exist in AArch32, so ignore + + // CPSR.IL is set to zero upon any exception + // See ARM DDI 0487E.a, page G1-5527 + + new |= (old & PSR_AA32_GE_MASK); + + // CPSR.IT[7:0] are set to zero upon any exception + // See prior comment above + + // CPSR.E is set to SCTLR.EE upon any exception + // See ARM DDI 0487E.a, page G8-6245 + // See ARM DDI 0406C.d, page B4-1701 + if (sctlr & BIT(25)) + new |= PSR_AA32_E_BIT; + + // CPSR.A is unchanged upon an exception to Undefined, Supervisor + // CPSR.A is set upon an exception to other modes + // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 + // See ARM DDI 0406C.d, page B1-1182 + new |= (old & PSR_AA32_A_BIT); + if (mode != PSR_AA32_MODE_UND && mode != PSR_AA32_MODE_SVC) + new |= PSR_AA32_A_BIT; + + // CPSR.I is set upon any exception + // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 + // See ARM DDI 0406C.d, page B1-1182 + new |= PSR_AA32_I_BIT; + + // CPSR.F is set upon an exception to FIQ + // CPSR.F is unchanged upon an exception to other modes + // See ARM DDI 0487E.a, pages G1-5515 to G1-5516 + // See ARM DDI 0406C.d, page B1-1182 + new |= (old & PSR_AA32_F_BIT); + if (mode == PSR_AA32_MODE_FIQ) + new |= PSR_AA32_F_BIT; + + // CPSR.T is set to SCTLR.TE upon any exception + // See ARM DDI 0487E.a, page G8-5514 + // See ARM DDI 0406C.d, page B1-1181 + if (sctlr & BIT(30)) + new |= PSR_AA32_T_BIT; - cpsr = mode | PSR_AA32_I_BIT; + new |= mode; - if (sctlr & (1 << 30)) - cpsr |= PSR_AA32_T_BIT; - if (sctlr & (1 << 25)) - cpsr |= PSR_AA32_E_BIT; + return new; +} - *vcpu_cpsr(vcpu) = cpsr; +static void prepare_fault32(struct kvm_vcpu *vcpu, u32 mode, u32 vect_offset) +{ + unsigned long spsr = *vcpu_cpsr(vcpu); + bool is_thumb = (spsr & PSR_AA32_T_BIT); + u32 return_offset = return_offsets[vect_offset >> 2][is_thumb]; + u32 sctlr = vcpu_cp15(vcpu, c1_SCTLR); + + *vcpu_cpsr(vcpu) = get_except32_cpsr(vcpu, mode); /* Note: These now point to the banked copies */ - vcpu_write_spsr(vcpu, new_spsr_value); + vcpu_write_spsr(vcpu, host_spsr_to_spsr32(spsr)); *vcpu_reg32(vcpu, 14) = *vcpu_pc(vcpu) + return_offset; /* Branch to exception vector */ @@ -95,16 +190,18 @@ fsr = &vcpu_cp15(vcpu, c5_DFSR); } - prepare_fault32(vcpu, PSR_AA32_MODE_ABT | PSR_AA32_A_BIT, vect_offset); + prepare_fault32(vcpu, PSR_AA32_MODE_ABT, vect_offset); *far = addr; /* Give the guest an IMPLEMENTATION DEFINED exception */ is_lpae = (vcpu_cp15(vcpu, c2_TTBCR) >> 31); - if (is_lpae) - *fsr = 1 << 9 | 0x34; - else - *fsr = 0x14; + if (is_lpae) { + *fsr = DFSR_LPAE | DFSR_FSC_EXTABT_LPAE; + } else { + /* no need to shuffle FS[4] into DFSR[10] as its 0 */ + *fsr = DFSR_FSC_EXTABT_nLPAE; + } } void kvm_inject_dabt32(struct kvm_vcpu *vcpu, unsigned long addr) diff -Nru linux-4.19.98/virt/kvm/arm/mmio.c linux-4.19.118/virt/kvm/arm/mmio.c --- linux-4.19.98/virt/kvm/arm/mmio.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/virt/kvm/arm/mmio.c 2020-04-23 08:30:24.000000000 +0000 @@ -117,6 +117,9 @@ data = (data ^ mask) - mask; } + if (!vcpu->arch.mmio_decode.sixty_four) + data = data & 0xffffffff; + trace_kvm_mmio(KVM_TRACE_MMIO_READ, len, run->mmio.phys_addr, &data); data = vcpu_data_host_to_guest(vcpu, data, len); @@ -137,6 +140,7 @@ unsigned long rt; int access_size; bool sign_extend; + bool sixty_four; if (kvm_vcpu_dabt_iss1tw(vcpu)) { /* page table accesses IO mem: tell guest to fix its TTBR */ @@ -150,11 +154,13 @@ *is_write = kvm_vcpu_dabt_iswrite(vcpu); sign_extend = kvm_vcpu_dabt_issext(vcpu); + sixty_four = kvm_vcpu_dabt_issf(vcpu); rt = kvm_vcpu_dabt_get_rd(vcpu); *len = access_size; vcpu->arch.mmio_decode.sign_extend = sign_extend; vcpu->arch.mmio_decode.rt = rt; + vcpu->arch.mmio_decode.sixty_four = sixty_four; return 0; } diff -Nru linux-4.19.98/virt/kvm/arm/mmu.c linux-4.19.118/virt/kvm/arm/mmu.c --- linux-4.19.98/virt/kvm/arm/mmu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/virt/kvm/arm/mmu.c 2020-04-23 08:30:24.000000000 +0000 @@ -1925,7 +1925,8 @@ if (!kvm->arch.pgd) return 0; trace_kvm_test_age_hva(hva); - return handle_hva_to_gpa(kvm, hva, hva, kvm_test_age_hva_handler, NULL); + return handle_hva_to_gpa(kvm, hva, hva + PAGE_SIZE, + kvm_test_age_hva_handler, NULL); } void kvm_mmu_free_memory_caches(struct kvm_vcpu *vcpu) diff -Nru linux-4.19.98/virt/kvm/arm/pmu.c linux-4.19.118/virt/kvm/arm/pmu.c --- linux-4.19.98/virt/kvm/arm/pmu.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/virt/kvm/arm/pmu.c 2020-04-23 08:30:24.000000000 +0000 @@ -316,6 +316,9 @@ if (val == 0) return; + if (!(__vcpu_sys_reg(vcpu, PMCR_EL0) & ARMV8_PMU_PMCR_E)) + return; + enable = __vcpu_sys_reg(vcpu, PMCNTENSET_EL0); for (i = 0; i < ARMV8_PMU_CYCLE_IDX; i++) { if (!(val & BIT(i))) diff -Nru linux-4.19.98/virt/kvm/arm/vgic/vgic-its.c linux-4.19.118/virt/kvm/arm/vgic/vgic-its.c --- linux-4.19.98/virt/kvm/arm/vgic/vgic-its.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/virt/kvm/arm/vgic/vgic-its.c 2020-04-23 08:30:24.000000000 +0000 @@ -2292,7 +2292,8 @@ target_addr = (u32)(val >> KVM_ITS_CTE_RDBASE_SHIFT); coll_id = val & KVM_ITS_CTE_ICID_MASK; - if (target_addr >= atomic_read(&kvm->online_vcpus)) + if (target_addr != COLLECTION_NOT_MAPPED && + target_addr >= atomic_read(&kvm->online_vcpus)) return -EINVAL; collection = find_collection(its, coll_id); diff -Nru linux-4.19.98/virt/kvm/async_pf.c linux-4.19.118/virt/kvm/async_pf.c --- linux-4.19.98/virt/kvm/async_pf.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/virt/kvm/async_pf.c 2020-04-23 08:30:24.000000000 +0000 @@ -76,7 +76,7 @@ struct mm_struct *mm = apf->mm; struct kvm_vcpu *vcpu = apf->vcpu; unsigned long addr = apf->addr; - gva_t gva = apf->gva; + gpa_t cr2_or_gpa = apf->cr2_or_gpa; int locked = 1; might_sleep(); @@ -104,7 +104,7 @@ * this point */ - trace_kvm_async_pf_completed(addr, gva); + trace_kvm_async_pf_completed(addr, cr2_or_gpa); if (swq_has_sleeper(&vcpu->wq)) swake_up_one(&vcpu->wq); @@ -177,8 +177,8 @@ } } -int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva, - struct kvm_arch_async_pf *arch) +int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, + unsigned long hva, struct kvm_arch_async_pf *arch) { struct kvm_async_pf *work; @@ -197,7 +197,7 @@ work->wakeup_all = false; work->vcpu = vcpu; - work->gva = gva; + work->cr2_or_gpa = cr2_or_gpa; work->addr = hva; work->arch = *arch; work->mm = current->mm; diff -Nru linux-4.19.98/virt/kvm/kvm_main.c linux-4.19.118/virt/kvm/kvm_main.c --- linux-4.19.98/virt/kvm/kvm_main.c 2020-01-23 07:21:39.000000000 +0000 +++ linux-4.19.118/virt/kvm/kvm_main.c 2020-04-23 08:30:24.000000000 +0000 @@ -1294,14 +1294,14 @@ } EXPORT_SYMBOL_GPL(kvm_is_visible_gfn); -unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn) +unsigned long kvm_host_page_size(struct kvm_vcpu *vcpu, gfn_t gfn) { struct vm_area_struct *vma; unsigned long addr, size; size = PAGE_SIZE; - addr = gfn_to_hva(kvm, gfn); + addr = kvm_vcpu_gfn_to_hva_prot(vcpu, gfn, NULL); if (kvm_is_error_hva(addr)) return PAGE_SIZE; @@ -2024,12 +2024,12 @@ if (slots->generation != ghc->generation) __kvm_gfn_to_hva_cache_init(slots, ghc, ghc->gpa, ghc->len); - if (unlikely(!ghc->memslot)) - return kvm_write_guest(kvm, gpa, data, len); - if (kvm_is_error_hva(ghc->hva)) return -EFAULT; + if (unlikely(!ghc->memslot)) + return kvm_write_guest(kvm, gpa, data, len); + r = __copy_to_user((void __user *)ghc->hva + offset, data, len); if (r) return -EFAULT; @@ -2057,12 +2057,12 @@ if (slots->generation != ghc->generation) __kvm_gfn_to_hva_cache_init(slots, ghc, ghc->gpa, ghc->len); - if (unlikely(!ghc->memslot)) - return kvm_read_guest(kvm, ghc->gpa, data, len); - if (kvm_is_error_hva(ghc->hva)) return -EFAULT; + if (unlikely(!ghc->memslot)) + return kvm_read_guest(kvm, ghc->gpa, data, len); + r = __copy_from_user(data, (void __user *)ghc->hva, len); if (r) return -EFAULT;